@@ -57,8 +57,88 @@ - (void)testConvertsNSManagedObjectIDParametersToDocumentIDs {
57
57
XCTAssertEqualObjects (@[@" lovelace" ], [_client convertParameters: @[lovelace.objectID]]);
58
58
}
59
59
60
+ - (void )testMergesChangesForOneToOneRelationshipWithOneWayReferencingWhenReferencedDocumentIsRemovedAndAddedAgainLater {
61
+ [self setNoStorageForRelationshipWithName: @" player" inEntityWithName: @" Avatar" ];
62
+
63
+ [_client.database performUpdatesInLocalCacheWithoutTrackingChanges: ^(METDocumentCache *localCache) {
64
+ [localCache addDocumentWithKey: [METDocumentKey keyWithCollectionName: @" avatars" documentID: @" avatar1" ] fields: @{}];
65
+ [localCache updateDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ] changedFields: @{@" avatarId" : @" avatar1" }];
66
+ }];
67
+
68
+ NSManagedObject *lovelace = [self existingObjectForDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ]];
69
+ NSManagedObject *avatar1 = [self existingObjectForDocumentWithKey: [METDocumentKey keyWithCollectionName: @" avatars" documentID: @" avatar1" ]];
70
+
71
+ XCTAssertEqualObjects (avatar1, [lovelace valueForKey: @" avatar" ]);
72
+ XCTAssertEqualObjects (lovelace, [avatar1 valueForKey: @" player" ]);
73
+
74
+ [self expectationForChangeToObject: avatar1 userInfoKey: NSDeletedObjectsKey ];
75
+
76
+ [_client.database performUpdatesInLocalCache: ^(METDocumentCache *localCache) {
77
+ [localCache removeDocumentWithKey: [METDocumentKey keyWithCollectionName: @" avatars" documentID: @" avatar1" ]];
78
+ }];
79
+
80
+ [self waitForExpectationsWithTimeout: 1.0 handler: nil ];
81
+
82
+ XCTAssertNil ([lovelace valueForKey: @" avatar" ]);
83
+
84
+ [self expectationForChangeToObject: avatar1 userInfoKey: NSInsertedObjectsKey ];
85
+
86
+ [_client.database performUpdatesInLocalCache: ^(METDocumentCache *localCache) {
87
+ [localCache addDocumentWithKey: [METDocumentKey keyWithCollectionName: @" avatars" documentID: @" avatar1" ] fields: @{@" name" : @" test" }];
88
+ }];
89
+
90
+ [self waitForExpectationsWithTimeout: 1.0 handler: nil ];
91
+
92
+ XCTAssertEqualObjects (avatar1, [lovelace valueForKey: @" avatar" ]);
93
+ XCTAssertEqualObjects (lovelace, [avatar1 valueForKey: @" player" ]);
94
+ }
95
+
96
+ - (void )testMergesChangesForOneToManyRelationshipWithReferenceFieldOnTheOneSideWhenReferencedDocumentIsRemovedAndAddedAgainLater {
97
+ [self setNoStorageForRelationshipWithName: @" sentMessages" inEntityWithName: @" Player" ];
98
+
99
+ [_client.database performUpdatesInLocalCacheWithoutTrackingChanges: ^(METDocumentCache *localCache) {
100
+ [localCache addDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ] fields: @{@" name" : @" Ada Lovelace" }];
101
+ [localCache addDocumentWithKey: [METDocumentKey keyWithCollectionName: @" messages" documentID: @" message1" ] fields: @{@" senderId" : @" lovelace" }];
102
+ }];
103
+
104
+ NSManagedObject *lovelace = [self existingObjectForDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ]];
105
+ NSManagedObject *message1 = [self existingObjectForDocumentWithKey: [METDocumentKey keyWithCollectionName: @" messages" documentID: @" message1" ]];
106
+
107
+ XCTAssertEqualObjects (lovelace, [message1 valueForKey: @" sender" ]);
108
+ XCTAssertEqualObjects ([NSSet setWithObject: message1], [lovelace valueForKey: @" sentMessages" ]);
109
+
110
+ [self expectationForChangeToObject: lovelace userInfoKey: NSDeletedObjectsKey ];
111
+
112
+ [_client.database performUpdatesInLocalCache: ^(METDocumentCache *localCache) {
113
+ [localCache removeDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ]];
114
+ }];
115
+
116
+ [self waitForExpectationsWithTimeout: 1.0 handler: nil ];
117
+
118
+ XCTAssertNil ([message1 valueForKey: @" sender" ]);
119
+
120
+ [self expectationForChangeToObject: lovelace userInfoKey: NSInsertedObjectsKey ];
121
+
122
+ [_client.database performUpdatesInLocalCache: ^(METDocumentCache *localCache) {
123
+ [localCache addDocumentWithKey: [METDocumentKey keyWithCollectionName: @" players" documentID: @" lovelace" ] fields: @{@" name" : @" Ada Lovelace" }];
124
+ }];
125
+
126
+ [self waitForExpectationsWithTimeout: 1.0 handler: nil ];
127
+
128
+ NSLog (@" lovelace.sentMessages: %@ " , [lovelace valueForKey: @" sentMessages" ]);
129
+
130
+ XCTAssertEqualObjects (lovelace, [message1 valueForKey: @" sender" ]);
131
+ XCTAssertEqualObjects ([NSSet setWithObject: message1], [lovelace valueForKey: @" sentMessages" ]);
132
+ }
133
+
60
134
#pragma mark - Helper Methods
61
135
136
+ - (void )setNoStorageForRelationshipWithName : (NSString *)relationshipName inEntityWithName : (NSString *)entityName {
137
+ NSEntityDescription *entity = _client.managedObjectModel .entitiesByName [entityName];
138
+ NSRelationshipDescription *relationship = entity.relationshipsByName [relationshipName];
139
+ relationship.userInfo = @{@" storage" : @NO };
140
+ }
141
+
62
142
- (NSManagedObject *)existingObjectWithID : (NSManagedObjectID *)objectID {
63
143
NSError *error;
64
144
NSManagedObject *object = [_client.mainQueueManagedObjectContext existingObjectWithID: objectID error: &error];
@@ -73,4 +153,11 @@ - (NSManagedObject *)existingObjectForDocumentWithKey:(METDocumentKey *)document
73
153
return [self existingObjectWithID: objectID];
74
154
}
75
155
156
+ - (XCTestExpectation *)expectationForChangeToObject : (NSManagedObject *)object userInfoKey : (NSString *)userInfoKey {
157
+ return [self expectationForNotification: NSManagedObjectContextObjectsDidChangeNotification object: object.managedObjectContext handler: ^BOOL (NSNotification *notification) {
158
+ NSSet *changedObjects = notification.userInfo [userInfoKey];
159
+ return [changedObjects containsObject: object];
160
+ }];
161
+ }
162
+
76
163
@end
0 commit comments