Skip to content

Commit 5b5e2c5

Browse files
Enhance upsert functionality to support custom createdAt and updatedAt attributes in DocumentTests
1 parent 4782684 commit 5b5e2c5

2 files changed

Lines changed: 226 additions & 5 deletions

File tree

src/Database/Database.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4993,14 +4993,14 @@ public function createOrUpdateDocumentsWithIncrease(
49934993
$document
49944994
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
49954995
->setAttribute('$collection', $collection->getId())
4996-
->setAttribute('$updatedAt', empty($updatedAt) || !$this->preserveDates ? $time : $updatedAt)
4996+
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
49974997
->removeAttribute('$sequence');
49984998

4999-
if ($old->isEmpty()) {
5000-
$createdAt = $document->getCreatedAt();
5001-
$document->setAttribute('$createdAt', empty($createdAt) || !$this->preserveDates ? $time : $createdAt);
4999+
$createdAt = $document->getCreatedAt();
5000+
if ($createdAt === null || !$this->preserveDates) {
5001+
$document->setAttribute('$createdAt', $old->isEmpty() ? $time : $old->getCreatedAt());
50025002
} else {
5003-
$document['$createdAt'] = $old->getCreatedAt();
5003+
$document->setAttribute('$createdAt', $createdAt);
50045004
}
50055005

50065006
// Force matching optional parameter sets

tests/e2e/Adapter/Scopes/DocumentTests.php

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4834,6 +4834,102 @@ public function testNormalDocumentDateOperations(): void
48344834
$this->assertNotEquals($customDate, $updatedDoc7->getAttribute('$createdAt'));
48354835
$this->assertNotEquals($customDate, $updatedDoc7->getAttribute('$updatedAt'));
48364836

4837+
// Test 9: Upsert operations with custom dates
4838+
$database->setPreserveDates(true);
4839+
4840+
// Test 9.1: Upsert new document with custom createdAt
4841+
$upsertResults = [];
4842+
$database->createOrUpdateDocuments($collection, [
4843+
new Document([
4844+
'$id' => 'upsert1',
4845+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()),Permission::update(Role::any())],
4846+
'string' => 'upsert1_initial',
4847+
'$createdAt' => $createDate
4848+
])
4849+
], onNext: function ($doc) use (&$upsertResults) {
4850+
$upsertResults[] = $doc;
4851+
});
4852+
$upsertDoc1 = $upsertResults[0];
4853+
4854+
$this->assertEquals($createDate, $upsertDoc1->getAttribute('$createdAt'));
4855+
$this->assertNotEquals($createDate, $upsertDoc1->getAttribute('$updatedAt'));
4856+
4857+
// Test 9.2: Upsert existing document with custom updatedAt
4858+
$upsertDoc1->setAttribute('string', 'upsert1_updated');
4859+
$upsertDoc1->setAttribute('$updatedAt', $updateDate);
4860+
$updatedUpsertResults = [];
4861+
$database->createOrUpdateDocuments($collection, [$upsertDoc1], onNext: function ($doc) use (&$updatedUpsertResults) {
4862+
$updatedUpsertResults[] = $doc;
4863+
});
4864+
$updatedUpsertDoc1 = $updatedUpsertResults[0];
4865+
4866+
$this->assertEquals($createDate, $updatedUpsertDoc1->getAttribute('$createdAt'));
4867+
$this->assertEquals($updateDate, $updatedUpsertDoc1->getAttribute('$updatedAt'));
4868+
4869+
// Test 9.3: Upsert new document with both custom dates
4870+
$upsertResults2 = [];
4871+
$database->createOrUpdateDocuments($collection, [
4872+
new Document([
4873+
'$id' => 'upsert2',
4874+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()),Permission::update(Role::any())],
4875+
'string' => 'upsert2_both_dates',
4876+
'$createdAt' => $createDate,
4877+
'$updatedAt' => $updateDate
4878+
])
4879+
], onNext: function ($doc) use (&$upsertResults2) {
4880+
$upsertResults2[] = $doc;
4881+
});
4882+
$upsertDoc2 = $upsertResults2[0];
4883+
4884+
$this->assertEquals($createDate, $upsertDoc2->getAttribute('$createdAt'));
4885+
$this->assertEquals($updateDate, $upsertDoc2->getAttribute('$updatedAt'));
4886+
4887+
// Test 9.4: Upsert existing document with different dates
4888+
$upsertDoc2->setAttribute('string', 'upsert2_updated');
4889+
$upsertDoc2->setAttribute('$createdAt', $date3);
4890+
$upsertDoc2->setAttribute('$updatedAt', $date3);
4891+
$updatedUpsertResults2 = [];
4892+
$database->createOrUpdateDocuments($collection, [$upsertDoc2], onNext: function ($doc) use (&$updatedUpsertResults2) {
4893+
$updatedUpsertResults2[] = $doc;
4894+
});
4895+
$updatedUpsertDoc2 = $updatedUpsertResults2[0];
4896+
4897+
$this->assertEquals($date3, $updatedUpsertDoc2->getAttribute('$createdAt'));
4898+
$this->assertEquals($date3, $updatedUpsertDoc2->getAttribute('$updatedAt'));
4899+
4900+
// Test 9.5: Upsert with preserve dates disabled
4901+
$database->setPreserveDates(false);
4902+
4903+
$upsertResults3 = [];
4904+
$database->createOrUpdateDocuments($collection, [
4905+
new Document([
4906+
'$id' => 'upsert3',
4907+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()),Permission::update(Role::any())],
4908+
'string' => 'upsert3_disabled',
4909+
'$createdAt' => $customDate,
4910+
'$updatedAt' => $customDate
4911+
])
4912+
], onNext: function ($doc) use (&$upsertResults3) {
4913+
$upsertResults3[] = $doc;
4914+
});
4915+
$upsertDoc3 = $upsertResults3[0];
4916+
4917+
$this->assertNotEquals($customDate, $upsertDoc3->getAttribute('$createdAt'));
4918+
$this->assertNotEquals($customDate, $upsertDoc3->getAttribute('$updatedAt'));
4919+
4920+
// Update with custom dates should also be ignored
4921+
$upsertDoc3->setAttribute('string', 'upsert3_updated');
4922+
$upsertDoc3->setAttribute('$createdAt', $customDate);
4923+
$upsertDoc3->setAttribute('$updatedAt', $customDate);
4924+
$updatedUpsertResults3 = [];
4925+
$database->createOrUpdateDocuments($collection, [$upsertDoc3], onNext: function ($doc) use (&$updatedUpsertResults3) {
4926+
$updatedUpsertResults3[] = $doc;
4927+
});
4928+
$updatedUpsertDoc3 = $updatedUpsertResults3[0];
4929+
4930+
$this->assertNotEquals($customDate, $updatedUpsertDoc3->getAttribute('$createdAt'));
4931+
$this->assertNotEquals($customDate, $updatedUpsertDoc3->getAttribute('$updatedAt'));
4932+
48374933
$database->setPreserveDates(false);
48384934
$database->deleteCollection($collection);
48394935
}
@@ -4965,6 +5061,131 @@ public function testBulkDocumentDateOperations(): void
49655061
$countEnabled = $database->updateDocuments($collection, $updateDocEnabled);
49665062
$this->assertEquals(6, $countEnabled);
49675063

5064+
// Test 5: Bulk upsert operations with custom dates
5065+
$database->setPreserveDates(true);
5066+
5067+
// Test 5.1: Bulk upsert with different date configurations
5068+
$upsertDocuments = [
5069+
new Document([
5070+
'$id' => 'upsert1',
5071+
'$permissions' => $permissions,
5072+
'string' => 'upsert1_initial',
5073+
'$createdAt' => $createDate
5074+
]),
5075+
new Document([
5076+
'$id' => 'upsert2',
5077+
'$permissions' => $permissions,
5078+
'string' => 'upsert2_initial',
5079+
'$updatedAt' => $updateDate
5080+
]),
5081+
new Document([
5082+
'$id' => 'upsert3',
5083+
'$permissions' => $permissions,
5084+
'string' => 'upsert3_initial',
5085+
'$createdAt' => $createDate,
5086+
'$updatedAt' => $updateDate
5087+
]),
5088+
new Document([
5089+
'$id' => 'upsert4',
5090+
'$permissions' => $permissions,
5091+
'string' => 'upsert4_initial'
5092+
])
5093+
];
5094+
5095+
$upsertResults = [];
5096+
$database->createOrUpdateDocuments($collection, $upsertDocuments, onNext: function ($doc) use (&$upsertResults) {
5097+
$upsertResults[] = $doc;
5098+
});
5099+
5100+
// Verify initial upsert state
5101+
foreach (['upsert1', 'upsert3'] as $id) {
5102+
$doc = $database->getDocument($collection, $id);
5103+
$this->assertEquals($createDate, $doc->getAttribute('$createdAt'), "createdAt mismatch for $id");
5104+
}
5105+
5106+
foreach (['upsert2', 'upsert3'] as $id) {
5107+
$doc = $database->getDocument($collection, $id);
5108+
$this->assertEquals($updateDate, $doc->getAttribute('$updatedAt'), "updatedAt mismatch for $id");
5109+
}
5110+
5111+
foreach (['upsert4'] as $id) {
5112+
$doc = $database->getDocument($collection, $id);
5113+
$this->assertNotEmpty($doc->getAttribute('$createdAt'), "createdAt missing for $id");
5114+
$this->assertNotEmpty($doc->getAttribute('$updatedAt'), "updatedAt missing for $id");
5115+
}
5116+
5117+
// Test 5.2: Bulk upsert update with custom dates using updateDocuments
5118+
$newDate = '2000-04-01T12:00:00.000+00:00';
5119+
$updateUpsertDoc = new Document([
5120+
'string' => 'upsert_updated',
5121+
'$createdAt' => $newDate,
5122+
'$updatedAt' => $newDate
5123+
]);
5124+
5125+
$upsertIds = [];
5126+
foreach ($upsertDocuments as $doc) {
5127+
$upsertIds[] = $doc->getId();
5128+
}
5129+
5130+
$countUpsert = $database->updateDocuments($collection, $updateUpsertDoc, [
5131+
Query::equal('$id', $upsertIds)
5132+
]);
5133+
$this->assertEquals(4, $countUpsert);
5134+
5135+
foreach ($upsertIds as $id) {
5136+
$doc = $database->getDocument($collection, $id);
5137+
$this->assertEquals($newDate, $doc->getAttribute('$createdAt'), "createdAt mismatch for $id");
5138+
$this->assertEquals($newDate, $doc->getAttribute('$updatedAt'), "updatedAt mismatch for $id");
5139+
$this->assertEquals('upsert_updated', $doc->getAttribute('string'), "string mismatch for $id");
5140+
}
5141+
5142+
// Test 5.3: Bulk upsert operations with createOrUpdateDocuments
5143+
$upsertUpdateDocuments = [];
5144+
foreach ($upsertDocuments as $doc) {
5145+
$updatedDoc = clone $doc;
5146+
$updatedDoc->setAttribute('string', 'upsert_updated_via_upsert');
5147+
$updatedDoc->setAttribute('$createdAt', $newDate);
5148+
$updatedDoc->setAttribute('$updatedAt', $newDate);
5149+
$upsertUpdateDocuments[] = $updatedDoc;
5150+
}
5151+
5152+
$upsertUpdateResults = [];
5153+
$countUpsertUpdate = $database->createOrUpdateDocuments($collection, $upsertUpdateDocuments, onNext: function ($doc) use (&$upsertUpdateResults) {
5154+
$upsertUpdateResults[] = $doc;
5155+
});
5156+
$this->assertEquals(4, $countUpsertUpdate);
5157+
5158+
foreach ($upsertUpdateResults as $doc) {
5159+
$this->assertEquals($newDate, $doc->getAttribute('$createdAt'), "createdAt mismatch for upsert update");
5160+
$this->assertEquals($newDate, $doc->getAttribute('$updatedAt'), "updatedAt mismatch for upsert update");
5161+
$this->assertEquals('upsert_updated_via_upsert', $doc->getAttribute('string'), "string mismatch for upsert update");
5162+
}
5163+
5164+
// Test 5.4: Bulk upsert with preserve dates disabled
5165+
$database->setPreserveDates(false);
5166+
5167+
$customDate = 'should be ignored anyways so no error';
5168+
$upsertDisabledDocuments = [];
5169+
foreach ($upsertDocuments as $doc) {
5170+
$disabledDoc = clone $doc;
5171+
$disabledDoc->setAttribute('string', 'upsert_disabled');
5172+
$disabledDoc->setAttribute('$createdAt', $customDate);
5173+
$disabledDoc->setAttribute('$updatedAt', $customDate);
5174+
$upsertDisabledDocuments[] = $disabledDoc;
5175+
}
5176+
5177+
$upsertDisabledResults = [];
5178+
$countUpsertDisabled = $database->createOrUpdateDocuments($collection, $upsertDisabledDocuments, onNext: function ($doc) use (&$upsertDisabledResults) {
5179+
$upsertDisabledResults[] = $doc;
5180+
});
5181+
$this->assertEquals(4, $countUpsertDisabled);
5182+
5183+
foreach ($upsertDisabledResults as $doc) {
5184+
$this->assertNotEquals($customDate, $doc->getAttribute('$createdAt'), "createdAt should not be custom date when disabled");
5185+
$this->assertNotEquals($customDate, $doc->getAttribute('$updatedAt'), "updatedAt should not be custom date when disabled");
5186+
$this->assertEquals('upsert_disabled', $doc->getAttribute('string'), "string mismatch for disabled upsert");
5187+
}
5188+
49685189
$database->setPreserveDates(false);
49695190
$database->deleteCollection($collection);
49705191
}

0 commit comments

Comments
 (0)