aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm
diff options
context:
space:
mode:
Diffstat (limited to 'Firestore/Example/Tests/SpecTests/FSTSpecTests.mm')
-rw-r--r--Firestore/Example/Tests/SpecTests/FSTSpecTests.mm63
1 files changed, 36 insertions, 27 deletions
diff --git a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm
index c131f7e..7fe6434 100644
--- a/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm
+++ b/Firestore/Example/Tests/SpecTests/FSTSpecTests.mm
@@ -194,25 +194,25 @@ static NSString *const kNoIOSTag = @"no-ios";
[self.driver writeUserMutation:FSTTestDeleteMutation(key)];
}
-- (void)doWatchAck:(NSArray<NSNumber *> *)ackedTargets snapshot:(NSNumber *)watchSnapshot {
+- (void)doWatchAck:(NSArray<NSNumber *> *)ackedTargets {
FSTWatchTargetChange *change =
[FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateAdded
targetIDs:ackedTargets
cause:nil];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
}
-- (void)doWatchCurrent:(NSArray<id> *)currentSpec snapshot:(NSNumber *)watchSnapshot {
+- (void)doWatchCurrent:(NSArray<id> *)currentSpec {
NSArray<NSNumber *> *currentTargets = currentSpec[0];
NSData *resumeToken = [currentSpec[1] dataUsingEncoding:NSUTF8StringEncoding];
FSTWatchTargetChange *change =
[FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateCurrent
targetIDs:currentTargets
resumeToken:resumeToken];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
}
-- (void)doWatchRemove:(NSDictionary *)watchRemoveSpec snapshot:(NSNumber *)watchSnapshot {
+- (void)doWatchRemove:(NSDictionary *)watchRemoveSpec {
NSError *error = nil;
NSDictionary *cause = watchRemoveSpec[@"cause"];
if (cause) {
@@ -226,19 +226,16 @@ static NSString *const kNoIOSTag = @"no-ios";
[FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateRemoved
targetIDs:watchRemoveSpec[@"targetIds"]
cause:error];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
// Unlike web, the FSTMockDatastore detects a watch removal with cause and will remove active
// targets
}
-- (void)doWatchEntity:(NSDictionary *)watchEntity snapshot:(NSNumber *_Nullable)watchSnapshot {
+- (void)doWatchEntity:(NSDictionary *)watchEntity {
if (watchEntity[@"docs"]) {
HARD_ASSERT(!watchEntity[@"doc"], "Exactly one of |doc| or |docs| needs to be set.");
- int count = 0;
NSArray *docs = watchEntity[@"docs"];
for (NSDictionary *doc in docs) {
- count++;
- bool isLast = (count == docs.count);
NSMutableDictionary *watchSpec = [NSMutableDictionary dictionary];
watchSpec[@"doc"] = doc;
if (watchEntity[@"targets"]) {
@@ -247,11 +244,7 @@ static NSString *const kNoIOSTag = @"no-ios";
if (watchEntity[@"removedTargets"]) {
watchSpec[@"removedTargets"] = watchEntity[@"removedTargets"];
}
- NSNumber *_Nullable version = nil;
- if (isLast) {
- version = watchSnapshot;
- }
- [self doWatchEntity:watchSpec snapshot:version];
+ [self doWatchEntity:watchSpec];
}
} else if (watchEntity[@"doc"]) {
NSArray *docSpec = watchEntity[@"doc"];
@@ -270,7 +263,7 @@ static NSString *const kNoIOSTag = @"no-ios";
removedTargetIDs:watchEntity[@"removedTargets"]
documentKey:doc.key
document:doc];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
} else if (watchEntity[@"key"]) {
FSTDocumentKey *docKey = FSTTestDocKey(watchEntity[@"key"]);
FSTWatchChange *change =
@@ -278,13 +271,13 @@ static NSString *const kNoIOSTag = @"no-ios";
removedTargetIDs:watchEntity[@"removedTargets"]
documentKey:docKey
document:nil];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
} else {
HARD_FAIL("Either key, doc or docs must be set.");
}
}
-- (void)doWatchFilter:(NSArray *)watchFilter snapshot:(NSNumber *_Nullable)watchSnapshot {
+- (void)doWatchFilter:(NSArray *)watchFilter {
NSArray<NSNumber *> *targets = watchFilter[0];
HARD_ASSERT(targets.count == 1, "ExistenceFilters currently support exactly one target only.");
@@ -294,15 +287,29 @@ static NSString *const kNoIOSTag = @"no-ios";
FSTExistenceFilter *filter = [FSTExistenceFilter filterWithCount:keyCount];
FSTExistenceFilterWatchChange *change =
[FSTExistenceFilterWatchChange changeWithFilter:filter targetID:targets[0].intValue];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
}
-- (void)doWatchReset:(NSArray<NSNumber *> *)watchReset snapshot:(NSNumber *_Nullable)watchSnapshot {
+- (void)doWatchReset:(NSArray<NSNumber *> *)watchReset {
FSTWatchTargetChange *change =
[FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateReset
targetIDs:watchReset
cause:nil];
- [self.driver receiveWatchChange:change snapshotVersion:[self parseVersion:watchSnapshot]];
+ [self.driver receiveWatchChange:change snapshotVersion:SnapshotVersion::None()];
+}
+
+- (void)doWatchSnapshot:(NSDictionary *)watchSnapshot {
+ // The client will only respond to watchSnapshots if they are on a target change with an empty
+ // set of target IDs.
+ NSArray<NSNumber *> *targetIDs =
+ watchSnapshot[@"targetIds"] ? watchSnapshot[@"targetIds"] : [NSArray array];
+ NSData *resumeToken = [watchSnapshot[@"resumeToken"] dataUsingEncoding:NSUTF8StringEncoding];
+ FSTWatchTargetChange *change =
+ [FSTWatchTargetChange changeWithState:FSTWatchTargetChangeStateNoChange
+ targetIDs:targetIDs
+ resumeToken:resumeToken];
+ [self.driver receiveWatchChange:change
+ snapshotVersion:[self parseVersion:watchSnapshot[@"version"]]];
}
- (void)doWatchStreamClose:(NSDictionary *)closeSpec {
@@ -415,17 +422,19 @@ static NSString *const kNoIOSTag = @"no-ios";
} else if (step[@"userDelete"]) {
[self doDelete:step[@"userDelete"]];
} else if (step[@"watchAck"]) {
- [self doWatchAck:step[@"watchAck"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchAck:step[@"watchAck"]];
} else if (step[@"watchCurrent"]) {
- [self doWatchCurrent:step[@"watchCurrent"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchCurrent:step[@"watchCurrent"]];
} else if (step[@"watchRemove"]) {
- [self doWatchRemove:step[@"watchRemove"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchRemove:step[@"watchRemove"]];
} else if (step[@"watchEntity"]) {
- [self doWatchEntity:step[@"watchEntity"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchEntity:step[@"watchEntity"]];
} else if (step[@"watchFilter"]) {
- [self doWatchFilter:step[@"watchFilter"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchFilter:step[@"watchFilter"]];
} else if (step[@"watchReset"]) {
- [self doWatchReset:step[@"watchReset"] snapshot:step[@"watchSnapshot"]];
+ [self doWatchReset:step[@"watchReset"]];
+ } else if (step[@"watchSnapshot"]) {
+ [self doWatchSnapshot:step[@"watchSnapshot"]];
} else if (step[@"watchStreamClose"]) {
[self doWatchStreamClose:step[@"watchStreamClose"]];
} else if (step[@"watchProto"]) {