Skip to content

Commit 2ea9f7a

Browse files
authored
Add tests on null date casts (#2592)
1 parent 86aa9c7 commit 2ea9f7a

File tree

1 file changed

+57
-136
lines changed

1 file changed

+57
-136
lines changed

tests/ModelTest.php

Lines changed: 57 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Carbon\Carbon;
88
use DateTime;
9-
use DateTimeImmutable;
109
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
1110
use Illuminate\Database\Eloquent\ModelNotFoundException;
1211
use Illuminate\Support\Facades\Date;
@@ -657,161 +656,83 @@ public function testDates(): void
657656
$item = Item::create(['name' => 'sword']);
658657
$json = $item->toArray();
659658
$this->assertEquals($item->created_at->toISOString(), $json['created_at']);
659+
}
660660

661-
/** @var User $user */
662-
//Test with create and standard property
663-
$user = User::create(['name' => 'Jane Doe', 'birthday' => time()]);
664-
$this->assertInstanceOf(Carbon::class, $user->birthday);
665-
666-
$user = User::create(['name' => 'Jane Doe', 'birthday' => Date::now()]);
667-
$this->assertInstanceOf(Carbon::class, $user->birthday);
668-
669-
$user = User::create(['name' => 'Jane Doe', 'birthday' => 'Monday 8th August 2005 03:12:46 PM']);
670-
$this->assertInstanceOf(Carbon::class, $user->birthday);
671-
672-
$user = User::create(['name' => 'Jane Doe', 'birthday' => 'Monday 8th August 1960 03:12:46 PM']);
673-
$this->assertInstanceOf(Carbon::class, $user->birthday);
674-
675-
$user = User::create(['name' => 'Jane Doe', 'birthday' => '2005-08-08']);
676-
$this->assertInstanceOf(Carbon::class, $user->birthday);
677-
678-
$user = User::create(['name' => 'Jane Doe', 'birthday' => '1965-08-08']);
679-
$this->assertInstanceOf(Carbon::class, $user->birthday);
680-
681-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08')]);
682-
$this->assertInstanceOf(Carbon::class, $user->birthday);
683-
684-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08')]);
685-
$this->assertInstanceOf(Carbon::class, $user->birthday);
686-
687-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08 04.08.37')]);
688-
$this->assertInstanceOf(Carbon::class, $user->birthday);
689-
690-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08 04.08.37')]);
691-
$this->assertInstanceOf(Carbon::class, $user->birthday);
692-
693-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08 04.08.37.324')]);
694-
$this->assertInstanceOf(Carbon::class, $user->birthday);
661+
public static function provideDate(): \Generator
662+
{
663+
yield 'int timestamp' => [time()];
664+
yield 'Carbon date' => [Date::now()];
665+
yield 'Date in words' => ['Monday 8th August 2005 03:12:46 PM'];
666+
yield 'Date in words before unix epoch' => ['Monday 8th August 1960 03:12:46 PM'];
667+
yield 'Date' => ['2005-08-08'];
668+
yield 'Date before unix epoch' => ['1965-08-08'];
669+
yield 'DateTime date' => [new DateTime('2010-08-08')];
670+
yield 'DateTime date before unix epoch' => [new DateTime('1965-08-08')];
671+
yield 'DateTime date and time' => [new DateTime('2010-08-08 04.08.37')];
672+
yield 'DateTime date and time before unix epoch' => [new DateTime('1965-08-08 04.08.37')];
673+
yield 'DateTime date, time and ms' => [new DateTime('2010-08-08 04.08.37.324')];
674+
yield 'DateTime date, time and ms before unix epoch' => [new DateTime('1965-08-08 04.08.37.324')];
675+
}
695676

696-
$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08 04.08.37.324')]);
677+
/**
678+
* @dataProvider provideDate
679+
*/
680+
public function testDateInputs($date): void
681+
{
682+
/** @var User $user */
683+
// Test with create and standard property
684+
$user = User::create(['name' => 'Jane Doe', 'birthday' => $date]);
697685
$this->assertInstanceOf(Carbon::class, $user->birthday);
698686

699687
//Test with setAttribute and standard property
700-
$user->setAttribute('birthday', time());
701-
$this->assertInstanceOf(Carbon::class, $user->birthday);
702-
703-
$user->setAttribute('birthday', Date::now());
704-
$this->assertInstanceOf(Carbon::class, $user->birthday);
705-
706-
$user->setAttribute('birthday', 'Monday 8th August 2005 03:12:46 PM');
707-
$this->assertInstanceOf(Carbon::class, $user->birthday);
708-
709-
$user->setAttribute('birthday', 'Monday 8th August 1960 03:12:46 PM');
710-
$this->assertInstanceOf(Carbon::class, $user->birthday);
711-
712-
$user->setAttribute('birthday', '2005-08-08');
713-
$this->assertInstanceOf(Carbon::class, $user->birthday);
714-
715-
$user->setAttribute('birthday', '1965-08-08');
716-
$this->assertInstanceOf(Carbon::class, $user->birthday);
717-
718-
$user->setAttribute('birthday', new DateTime('2010-08-08'));
719-
$this->assertInstanceOf(Carbon::class, $user->birthday);
720-
721-
$user->setAttribute('birthday', new DateTime('1965-08-08'));
722-
$this->assertInstanceOf(Carbon::class, $user->birthday);
723-
724-
$user->setAttribute('birthday', new DateTime('2010-08-08 04.08.37'));
725-
$this->assertInstanceOf(Carbon::class, $user->birthday);
726-
727-
$user->setAttribute('birthday', new DateTime('1965-08-08 04.08.37'));
728-
$this->assertInstanceOf(Carbon::class, $user->birthday);
729-
730-
$user->setAttribute('birthday', new DateTime('2010-08-08 04.08.37.324'));
731-
$this->assertInstanceOf(Carbon::class, $user->birthday);
688+
$user->setAttribute('birthday', null);
689+
$this->assertNull($user->birthday);
732690

733-
$user->setAttribute('birthday', new DateTime('1965-08-08 04.08.37.324'));
691+
$user->setAttribute('birthday', $date);
734692
$this->assertInstanceOf(Carbon::class, $user->birthday);
735693

736-
$user->setAttribute('birthday', new DateTimeImmutable('1965-08-08 04.08.37.324'));
737-
$this->assertInstanceOf(Carbon::class, $user->birthday);
738-
739-
//Test with create and array property
740-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => time()]]);
741-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
742-
743-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => Date::now()]]);
694+
// Test with create and array property
695+
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => $date]]);
744696
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
745697

746-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => 'Monday 8th August 2005 03:12:46 PM']]);
747-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
748-
749-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => 'Monday 8th August 1960 03:12:46 PM']]);
750-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
751-
752-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '2005-08-08']]);
753-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
754-
755-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '1965-08-08']]);
756-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
757-
758-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08')]]);
759-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
760-
761-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08')]]);
762-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
763-
764-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08 04.08.37')]]);
765-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
766-
767-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08 04.08.37')]]);
768-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
769-
770-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08 04.08.37.324')]]);
771-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
772-
773-
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08 04.08.37.324')]]);
774-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
775-
776-
//Test with setAttribute and array property
777-
$user->setAttribute('entry.date', time());
778-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
698+
// Test with setAttribute and array property
699+
$user->setAttribute('entry.date', null);
700+
$this->assertNull($user->birthday);
779701

780-
$user->setAttribute('entry.date', Date::now());
702+
$user->setAttribute('entry.date', $date);
781703
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
782704

783-
$user->setAttribute('entry.date', 'Monday 8th August 2005 03:12:46 PM');
784-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
785-
786-
$user->setAttribute('entry.date', 'Monday 8th August 1960 03:12:46 PM');
787-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
788-
789-
$user->setAttribute('entry.date', '2005-08-08');
790-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
791-
792-
$user->setAttribute('entry.date', '1965-08-08');
793-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
705+
// Test with create and array property
706+
$data = $user->toArray();
707+
$this->assertIsString($data['entry']['date']);
708+
}
794709

795-
$user->setAttribute('entry.date', new DateTime('2010-08-08'));
796-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
710+
public function testDateNull(): void
711+
{
712+
$user = User::create(['name' => 'Jane Doe', 'birthday' => null]);
713+
$this->assertNull($user->birthday);
797714

798-
$user->setAttribute('entry.date', new DateTime('1965-08-08'));
799-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
715+
$user->setAttribute('birthday', new DateTime());
716+
$user->setAttribute('birthday', null);
717+
$this->assertNull($user->birthday);
800718

801-
$user->setAttribute('entry.date', new DateTime('2010-08-08 04.08.37'));
802-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
719+
$user->save();
803720

804-
$user->setAttribute('entry.date', new DateTime('1965-08-08 04.08.37'));
805-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
721+
// Re-fetch to be sure
722+
$user = User::find($user->_id);
723+
$this->assertNull($user->birthday);
806724

807-
$user->setAttribute('entry.date', new DateTime('2010-08-08 04.08.37.324'));
808-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
725+
// Nested field with dot notation
726+
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => null]]);
727+
$this->assertNull($user->getAttribute('entry.date'));
809728

810-
$user->setAttribute('entry.date', new DateTime('1965-08-08 04.08.37.324'));
811-
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
729+
$user->setAttribute('entry.date', new DateTime());
730+
$user->setAttribute('entry.date', null);
731+
$this->assertNull($user->getAttribute('entry.date'));
812732

813-
$data = $user->toArray();
814-
$this->assertIsString($data['entry']['date']);
733+
// Re-fetch to be sure
734+
$user = User::find($user->_id);
735+
$this->assertNull($user->getAttribute('entry.date'));
815736
}
816737

817738
public function testCarbonDateMockingWorks()

0 commit comments

Comments
 (0)