create(); $date = Carbon::parse('2025-12-25 14:30:00'); $cart->from_date = $date; $cart->save(); // Reload from database $cart->refresh(); // Should return Carbon instance $this->assertInstanceOf(Carbon::class, $cart->from_date); $this->assertEquals('2025-12-25 14:30:00', $cart->from_date->format('Y-m-d H:i:s')); } /** @test */ public function it_accepts_datetime_interface_and_stores_as_timestamp() { $cart = Cart::factory()->create(); $date = new \DateTime('2025-12-25 14:30:00'); $cart->from_date = $date; $cart->save(); $cart->refresh(); $this->assertInstanceOf(Carbon::class, $cart->from_date); $this->assertEquals('2025-12-25 14:30:00', $cart->from_date->format('Y-m-d H:i:s')); } /** @test */ public function it_accepts_string_and_stores_as_timestamp() { $cart = Cart::factory()->create(); // Standard datetime string $cart->from_date = '2025-12-25 14:30:00'; $cart->save(); $cart->refresh(); $this->assertInstanceOf(Carbon::class, $cart->from_date); $this->assertEquals('2025-12-25 14:30:00', $cart->from_date->format('Y-m-d H:i:s')); } /** @test */ public function it_accepts_html5_datetime_local_format() { $cart = Cart::factory()->create(); // HTML5 datetime-local format (YYYY-MM-DDTHH:MM) $cart->from_date = '2025-12-25T14:30'; $cart->save(); $cart->refresh(); $this->assertInstanceOf(Carbon::class, $cart->from_date); $this->assertEquals('2025-12-25 14:30:00', $cart->from_date->format('Y-m-d H:i:s')); } /** @test */ public function it_can_format_for_html5_input() { $cart = Cart::factory()->create(); $cart->from_date = Carbon::parse('2025-12-25 14:30:00'); $cart->save(); $cart->refresh(); // Can format for HTML5 datetime-local input $htmlFormat = $cart->from_date->format('Y-m-d\TH:i'); $this->assertEquals('2025-12-25T14:30', $htmlFormat); } /** @test */ public function it_handles_null_values() { $cart = Cart::factory()->create(); $cart->from_date = null; $cart->save(); $cart->refresh(); $this->assertNull($cart->from_date); } /** @test */ public function it_works_with_cart_items() { $product = Product::factory()->create(); $cart = Cart::factory()->create(); $item = $cart->items()->create([ 'purchasable_id' => $product->id, 'purchasable_type' => get_class($product), 'quantity' => 1, 'price' => 100, 'subtotal' => 100, 'from' => '2025-12-25T14:30', 'until' => '2025-12-27T10:00', ]); $item->refresh(); $this->assertInstanceOf(Carbon::class, $item->from); $this->assertInstanceOf(Carbon::class, $item->until); $this->assertEquals('2025-12-25T14:30', $item->from->format('Y-m-d\TH:i')); $this->assertEquals('2025-12-27T10:00', $item->until->format('Y-m-d\TH:i')); } /** @test */ public function it_accepts_unix_timestamp() { $cart = Cart::factory()->create(); $timestamp = Carbon::parse('2025-12-25 14:30:00')->timestamp; $cart->from_date = $timestamp; $cart->save(); $cart->refresh(); $this->assertInstanceOf(Carbon::class, $cart->from_date); $this->assertEquals('2025-12-25 14:30:00', $cart->from_date->format('Y-m-d H:i:s')); } /** @test */ public function it_maintains_carbon_methods() { $cart = Cart::factory()->create(); $cart->from_date = Carbon::parse('2025-12-25 14:30:00'); $cart->save(); $cart->refresh(); // All Carbon methods should be available $this->assertTrue($cart->from_date->isAfter(Carbon::parse('2025-12-24'))); $this->assertTrue($cart->from_date->isBefore(Carbon::parse('2025-12-26'))); $this->assertEquals('December', $cart->from_date->format('F')); $this->assertEquals('2025-12-25', $cart->from_date->toDateString()); } }