@@ -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