From bd1d2ae3f6db33c1ecf9f437280dee2dd6513de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Wed, 24 Apr 2024 11:54:50 +0200 Subject: [PATCH 1/3] Add test on updateOrCreate --- tests/ModelTest.php | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 324b77605..bf32108f3 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -28,6 +28,7 @@ use MongoDB\Laravel\Tests\Models\Soft; use MongoDB\Laravel\Tests\Models\SqlUser; use MongoDB\Laravel\Tests\Models\User; +use PHPUnit\Framework\Attributes\TestWith; use function abs; use function array_keys; @@ -1100,4 +1101,46 @@ public function testCreateOrFirstRequiresFilter() $this->expectExceptionMessage('You must provide attributes to check for duplicates'); User::createOrFirst([]); } + + #[TestWith([new ObjectID()])] + #[TestWith(['foo'])] + public function testUpdateOrCreate(mixed $id) + { + Carbon::setTestNow('2010-01-01'); + //$createdAt = Carbon::now()->getTimestamp(); + + // Create + $user = User::updateOrCreate( + ['_id' => $id], + ['email' => 'john.doe@example.com', 'birthday' => new DateTime('1987-05-28')], + ); + $this->assertInstanceOf(User::class, $user); + $this->assertEquals('john.doe@example.com', $user->email); + $this->assertEquals(new DateTime('1987-05-28'), $user->birthday); + //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); + //$this->assertEquals($createdAt, $user->updated_at->getTimestamp()); + + Carbon::setTestNow('2010-02-01'); + $updatedAt = Carbon::now()->getTimestamp(); + + // Update + $user = User::updateOrCreate( + ['_id' => $id], + ['birthday' => new DateTime('1990-01-12'), 'foo' => 'bar'], + ); + + $this->assertInstanceOf(User::class, $user); + $this->assertEquals('john.doe@example.com', $user->email); + $this->assertEquals(new DateTime('1990-01-12'), $user->birthday); + //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); + $this->assertEquals($updatedAt, $user->updated_at->getTimestamp()); + + // Stored data + $checkUser = User::find($id)->first(); + $this->assertInstanceOf(User::class, $checkUser); + $this->assertEquals('john.doe@example.com', $checkUser->email); + $this->assertEquals(new DateTime('1990-01-12'), $checkUser->birthday); + //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); + $this->assertEquals($updatedAt, $checkUser->updated_at->getTimestamp()); + } } From 27d10b3b86b9b0ada094e9014128cd1063d91d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Thu, 25 Apr 2024 14:15:58 +0200 Subject: [PATCH 2/3] Add tests on timestamps and non-fillable field --- tests/ModelTest.php | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/tests/ModelTest.php b/tests/ModelTest.php index bf32108f3..7c216a37a 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -1102,45 +1102,52 @@ public function testCreateOrFirstRequiresFilter() User::createOrFirst([]); } - #[TestWith([new ObjectID()])] - #[TestWith(['foo'])] - public function testUpdateOrCreate(mixed $id) + #[TestWith([['_id' => new ObjectID()]])] + #[TestWith([['foo' => 'bar']])] + public function testUpdateOrCreate(array $criteria) { + // Insert data to ensure we filter on the correct criteria, and not getting + // the first document randomly. + User::insert([ + ['email' => 'fixture@example.com'], + ['email' => 'john.doe@example.com'], + ]); + Carbon::setTestNow('2010-01-01'); - //$createdAt = Carbon::now()->getTimestamp(); + $createdAt = Carbon::now()->getTimestamp(); // Create $user = User::updateOrCreate( - ['_id' => $id], + $criteria, ['email' => 'john.doe@example.com', 'birthday' => new DateTime('1987-05-28')], ); $this->assertInstanceOf(User::class, $user); $this->assertEquals('john.doe@example.com', $user->email); $this->assertEquals(new DateTime('1987-05-28'), $user->birthday); - //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); - //$this->assertEquals($createdAt, $user->updated_at->getTimestamp()); + $this->assertEquals($createdAt, $user->created_at->getTimestamp()); + $this->assertEquals($createdAt, $user->updated_at->getTimestamp()); Carbon::setTestNow('2010-02-01'); $updatedAt = Carbon::now()->getTimestamp(); // Update $user = User::updateOrCreate( - ['_id' => $id], + $criteria, ['birthday' => new DateTime('1990-01-12'), 'foo' => 'bar'], ); $this->assertInstanceOf(User::class, $user); $this->assertEquals('john.doe@example.com', $user->email); $this->assertEquals(new DateTime('1990-01-12'), $user->birthday); - //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); + $this->assertEquals($createdAt, $user->created_at->getTimestamp()); $this->assertEquals($updatedAt, $user->updated_at->getTimestamp()); // Stored data - $checkUser = User::find($id)->first(); + $checkUser = User::where($criteria)->first(); $this->assertInstanceOf(User::class, $checkUser); $this->assertEquals('john.doe@example.com', $checkUser->email); $this->assertEquals(new DateTime('1990-01-12'), $checkUser->birthday); - //$this->assertEquals($createdAt, $user->created_at->getTimestamp()); + $this->assertEquals($createdAt, $checkUser->created_at->getTimestamp()); $this->assertEquals($updatedAt, $checkUser->updated_at->getTimestamp()); } } From ad9d04f0013258c75d69dd9b52b985e3b91bacf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Thu, 25 Apr 2024 14:24:38 +0200 Subject: [PATCH 3/3] Reset Carbon date after test --- tests/ModelTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 7c216a37a..baa731799 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -47,6 +47,7 @@ class ModelTest extends TestCase { public function tearDown(): void { + Carbon::setTestNow(); User::truncate(); Soft::truncate(); Book::truncate();