Skip to content

Add tests on null date casts #2592

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 6, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 57 additions & 136 deletions tests/ModelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

use Carbon\Carbon;
use DateTime;
use DateTimeImmutable;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\Date;
Expand Down Expand Up @@ -657,161 +656,83 @@ public function testDates(): void
$item = Item::create(['name' => 'sword']);
$json = $item->toArray();
$this->assertEquals($item->created_at->toISOString(), $json['created_at']);
}

/** @var User $user */
//Test with create and standard property
$user = User::create(['name' => 'Jane Doe', 'birthday' => time()]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => Date::now()]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => 'Monday 8th August 2005 03:12:46 PM']);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => 'Monday 8th August 1960 03:12:46 PM']);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => '2005-08-08']);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => '1965-08-08']);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08')]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08')]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08 04.08.37')]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08 04.08.37')]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('2010-08-08 04.08.37.324')]);
$this->assertInstanceOf(Carbon::class, $user->birthday);
public static function provideDate(): \Generator
{
yield 'int timestamp' => [time()];
yield 'Carbon date' => [Date::now()];
yield 'Date in words' => ['Monday 8th August 2005 03:12:46 PM'];
yield 'Date in words before unix epoch' => ['Monday 8th August 1960 03:12:46 PM'];
yield 'Date' => ['2005-08-08'];
yield 'Date before unix epoch' => ['1965-08-08'];
yield 'DateTime date' => [new DateTime('2010-08-08')];
yield 'DateTime date before unix epoch' => [new DateTime('1965-08-08')];
yield 'DateTime date and time' => [new DateTime('2010-08-08 04.08.37')];
yield 'DateTime date and time before unix epoch' => [new DateTime('1965-08-08 04.08.37')];
yield 'DateTime date, time and ms' => [new DateTime('2010-08-08 04.08.37.324')];
yield 'DateTime date, time and ms before unix epoch' => [new DateTime('1965-08-08 04.08.37.324')];
}

$user = User::create(['name' => 'Jane Doe', 'birthday' => new DateTime('1965-08-08 04.08.37.324')]);
/**
* @dataProvider provideDate
*/
public function testDateInputs($date): void
{
/** @var User $user */
// Test with create and standard property
$user = User::create(['name' => 'Jane Doe', 'birthday' => $date]);
$this->assertInstanceOf(Carbon::class, $user->birthday);

//Test with setAttribute and standard property
$user->setAttribute('birthday', time());
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', Date::now());
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', 'Monday 8th August 2005 03:12:46 PM');
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', 'Monday 8th August 1960 03:12:46 PM');
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', '2005-08-08');
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', '1965-08-08');
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', new DateTime('2010-08-08'));
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', new DateTime('1965-08-08'));
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', new DateTime('2010-08-08 04.08.37'));
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', new DateTime('1965-08-08 04.08.37'));
$this->assertInstanceOf(Carbon::class, $user->birthday);

$user->setAttribute('birthday', new DateTime('2010-08-08 04.08.37.324'));
$this->assertInstanceOf(Carbon::class, $user->birthday);
$user->setAttribute('birthday', null);
$this->assertNull($user->birthday);

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

$user->setAttribute('birthday', new DateTimeImmutable('1965-08-08 04.08.37.324'));
$this->assertInstanceOf(Carbon::class, $user->birthday);

//Test with create and array property
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => time()]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => Date::now()]]);
// Test with create and array property
$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => $date]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => 'Monday 8th August 2005 03:12:46 PM']]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => 'Monday 8th August 1960 03:12:46 PM']]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '2005-08-08']]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => '1965-08-08']]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08 04.08.37')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08 04.08.37')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('2010-08-08 04.08.37.324')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user = User::create(['name' => 'Jane Doe', 'entry' => ['date' => new DateTime('1965-08-08 04.08.37.324')]]);
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

//Test with setAttribute and array property
$user->setAttribute('entry.date', time());
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
// Test with setAttribute and array property
$user->setAttribute('entry.date', null);
$this->assertNull($user->birthday);

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

$user->setAttribute('entry.date', 'Monday 8th August 2005 03:12:46 PM');
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user->setAttribute('entry.date', 'Monday 8th August 1960 03:12:46 PM');
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user->setAttribute('entry.date', '2005-08-08');
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));

$user->setAttribute('entry.date', '1965-08-08');
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
// Test with create and array property
$data = $user->toArray();
$this->assertIsString($data['entry']['date']);
}

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

$user->setAttribute('entry.date', new DateTime('1965-08-08'));
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
$user->setAttribute('birthday', new DateTime());
$user->setAttribute('birthday', null);
$this->assertNull($user->birthday);

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

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

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

$user->setAttribute('entry.date', new DateTime('1965-08-08 04.08.37.324'));
$this->assertInstanceOf(Carbon::class, $user->getAttribute('entry.date'));
$user->setAttribute('entry.date', new DateTime());
$user->setAttribute('entry.date', null);
$this->assertNull($user->getAttribute('entry.date'));

$data = $user->toArray();
$this->assertIsString($data['entry']['date']);
// Re-fetch to be sure
$user = User::find($user->_id);
$this->assertNull($user->getAttribute('entry.date'));
}

public function testCarbonDateMockingWorks()
Expand Down