Skip to content

Commit a61aae0

Browse files
committed
Add tests for dirty detection with dates, enums, and scalar type changes
1 parent 91e3cb5 commit a61aae0

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/Eloquent/DocumentModel.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,15 @@ public function originalIsEquivalent($key)
392392
return false;
393393
}
394394

395+
if ($this->isDateAttribute($key)) {
396+
$attribute = $attribute instanceof UTCDateTime ? $this->asDateTime($attribute) : $attribute;
397+
$original = $original instanceof UTCDateTime ? $this->asDateTime($original) : $original;
398+
399+
// Comparison on DateTimeInterface values
400+
// phpcs:disable SlevomatCodingStandard.Operators.DisallowEqualOperators.DisallowedEqualOperator
401+
return $attribute == $original;
402+
}
403+
395404
if (is_scalar($attribute) || is_scalar($original)) {
396405
return false;
397406
}

tests/ModelTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,45 @@ public function testGetDirtyEmbeddedDocument(): void
11201120
$this->assertTrue($user->isDirty('address'));
11211121
}
11221122

1123+
public function testGetDirtyDatetimeCast(): void
1124+
{
1125+
$user = User::create(['name' => 'John Doe', 'birthday' => new DateTime('1989-08-19 12:00:00')]);
1126+
$user = User::find($user->id);
1127+
$this->assertFalse($user->isDirty());
1128+
1129+
// Same date via Carbon: not dirty
1130+
$user->birthday = Carbon::parse('1989-08-19 12:00:00');
1131+
$this->assertFalse($user->isDirty('birthday'));
1132+
1133+
// Same date via DateTime: not dirty
1134+
$user->birthday = new DateTime('1989-08-19 12:00:00');
1135+
$this->assertFalse($user->isDirty('birthday'));
1136+
1137+
// Different date: dirty
1138+
$user->birthday = new DateTime('1990-01-01 00:00:00');
1139+
$this->assertTrue($user->isDirty('birthday'));
1140+
1141+
// Null vs date: dirty
1142+
$user->save();
1143+
$user->birthday = null;
1144+
$this->assertTrue($user->isDirty('birthday'));
1145+
}
1146+
1147+
public function testGetDirtyEnumCast(): void
1148+
{
1149+
$user = User::create(['name' => 'John Doe', 'member_status' => MemberStatus::Member]);
1150+
$user = User::find($user->id);
1151+
$this->assertFalse($user->isDirty());
1152+
1153+
// Same enum value: not dirty
1154+
$user->member_status = MemberStatus::Member;
1155+
$this->assertFalse($user->isDirty('member_status'));
1156+
1157+
// Setting null: dirty
1158+
$user->member_status = null;
1159+
$this->assertTrue($user->isDirty('member_status'));
1160+
}
1161+
11231162
public function testChunkById(): void
11241163
{
11251164
User::create(['name' => 'fork', 'tags' => ['sharp', 'pointy']]);

0 commit comments

Comments
 (0)