diff options
author | Michael Lehenbauer <mikelehen@gmail.com> | 2017-10-19 08:23:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-19 08:23:25 -0700 |
commit | 024788e38a5e506cf4861aa66afda2bc3b9115e1 (patch) | |
tree | 43af440462ae283c1277de040c689a724d047098 /Firestore | |
parent | b561342aa69f30fbd5e66927501def426ba8337e (diff) |
Add isEqual() and port DocumentReference array test. (#380)
* Ports the test for the fix I made for Android for DocumentReference objects in arrays (bug not present in iOS).
* Implements isEqual on FIRQuery and FIRDocumentReference.
Diffstat (limited to 'Firestore')
-rw-r--r-- | Firestore/Example/Tests/Integration/API/FIRDatabaseTests.m | 34 | ||||
-rw-r--r-- | Firestore/Example/Tests/Integration/API/FIRTypeTests.m | 17 | ||||
-rw-r--r-- | Firestore/Source/API/FIRDocumentReference.m | 26 | ||||
-rw-r--r-- | Firestore/Source/API/FIRQuery.m | 27 |
4 files changed, 92 insertions, 12 deletions
diff --git a/Firestore/Example/Tests/Integration/API/FIRDatabaseTests.m b/Firestore/Example/Tests/Integration/API/FIRDatabaseTests.m index d22552a..47ba95b 100644 --- a/Firestore/Example/Tests/Integration/API/FIRDatabaseTests.m +++ b/Firestore/Example/Tests/Integration/API/FIRDatabaseTests.m @@ -680,6 +680,40 @@ XCTAssertEqual(q.firestore, self.db); } +- (void)testDocumentReferenceEquality { + FIRFirestore *firestore = self.db; + FIRDocumentReference *docRef = [firestore documentWithPath:@"foo/bar"]; + XCTAssertEqualObjects([firestore documentWithPath:@"foo/bar"], docRef); + XCTAssertEqualObjects([docRef collectionWithPath:@"blah"].parent, docRef); + + XCTAssertNotEqualObjects([firestore documentWithPath:@"foo/BAR"], docRef); + + FIRFirestore *otherFirestore = [self firestore]; + XCTAssertNotEqualObjects([otherFirestore documentWithPath:@"foo/bar"], docRef); +} + +- (void)testQueryReferenceEquality { + FIRFirestore *firestore = self.db; + FIRQuery *query = + [[[firestore collectionWithPath:@"foo"] queryOrderedByField:@"bar"] queryWhereField:@"baz" + isEqualTo:@42]; + FIRQuery *query2 = + [[[firestore collectionWithPath:@"foo"] queryOrderedByField:@"bar"] queryWhereField:@"baz" + isEqualTo:@42]; + XCTAssertEqualObjects(query, query2); + + FIRQuery *query3 = + [[[firestore collectionWithPath:@"foo"] queryOrderedByField:@"BAR"] queryWhereField:@"baz" + isEqualTo:@42]; + XCTAssertNotEqualObjects(query, query3); + + FIRFirestore *otherFirestore = [self firestore]; + FIRQuery *query4 = [[[otherFirestore collectionWithPath:@"foo"] queryOrderedByField:@"bar"] + queryWhereField:@"baz" + isEqualTo:@42]; + XCTAssertNotEqualObjects(query, query4); +} + - (void)testCanTraverseCollectionsAndDocuments { NSString *expected = @"a/b/c/d"; // doc path from root Firestore. diff --git a/Firestore/Example/Tests/Integration/API/FIRTypeTests.m b/Firestore/Example/Tests/Integration/API/FIRTypeTests.m index f3021dd..4e2c76e 100644 --- a/Firestore/Example/Tests/Integration/API/FIRTypeTests.m +++ b/Firestore/Example/Tests/Integration/API/FIRTypeTests.m @@ -62,18 +62,13 @@ } - (void)testCanReadAndWriteDocumentReferences { - // We can't use assertSuccessfulRoundtrip since FIRDocumentReference doesn't implement isEqual. - FIRDocumentReference *docRef = [self.db documentWithPath:@"rooms/eros"]; - id data = @{ @"a" : @42, @"ref" : docRef }; - [self writeDocumentRef:docRef data:data]; - - FIRDocumentSnapshot *readDoc = [self readDocumentForRef:docRef]; - XCTAssertTrue(readDoc.exists); + FIRDocumentReference *docRef = [self documentRef]; + [self assertSuccessfulRoundtrip:@{ @"a" : @42, @"ref" : docRef }]; +} - XCTAssertEqualObjects(readDoc[@"a"], data[@"a"]); - FIRDocumentReference *readDocRef = readDoc[@"ref"]; - XCTAssertTrue([readDocRef isKindOfClass:[FIRDocumentReference class]]); - XCTAssertEqualObjects(readDocRef.path, docRef.path); +- (void)testCanReadAndWriteDocumentReferencesInArrays { + FIRDocumentReference *docRef = [self documentRef]; + [self assertSuccessfulRoundtrip:@{ @"a" : @42, @"refs" : @[ docRef ] }]; } @end diff --git a/Firestore/Source/API/FIRDocumentReference.m b/Firestore/Source/API/FIRDocumentReference.m index 5515bd6..b750887 100644 --- a/Firestore/Source/API/FIRDocumentReference.m +++ b/Firestore/Source/API/FIRDocumentReference.m @@ -110,6 +110,32 @@ NS_ASSUME_NONNULL_BEGIN return self; } +#pragma mark - NSObject Methods + +- (BOOL)isEqual:(nullable id)other { + if (other == self) return YES; + if (!other || ![[other class] isEqual:[self class]]) return NO; + + return [self isEqualToReference:other]; +} + +- (BOOL)isEqualToReference:(nullable FIRDocumentReference *)reference { + if (self == reference) return YES; + if (reference == nil) return NO; + if (self.firestore != reference.firestore && ![self.firestore isEqual:reference.firestore]) + return NO; + if (self.key != reference.key && ![self.key isEqualToKey:reference.key]) return NO; + return YES; +} + +- (NSUInteger)hash { + NSUInteger hash = [self.firestore hash]; + hash = hash * 31u + [self.key hash]; + return hash; +} + +#pragma mark - Public Methods + - (NSString *)documentID { return [self.key.path lastSegment]; } diff --git a/Firestore/Source/API/FIRQuery.m b/Firestore/Source/API/FIRQuery.m index 63244fd..be64bf5 100644 --- a/Firestore/Source/API/FIRQuery.m +++ b/Firestore/Source/API/FIRQuery.m @@ -93,7 +93,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation FIRQuery -#pragma mark - Public Methods +#pragma mark - Constructor Methods - (instancetype)initWithQuery:(FSTQuery *)query firestore:(FIRFirestore *)firestore { if (self = [super init]) { @@ -103,6 +103,31 @@ NS_ASSUME_NONNULL_BEGIN return self; } +#pragma mark - NSObject Methods + +- (BOOL)isEqual:(nullable id)other { + if (other == self) return YES; + if (!other || ![[other class] isEqual:[self class]]) return NO; + + return [self isEqualToQuery:other]; +} + +- (BOOL)isEqualToQuery:(nullable FIRQuery *)query { + if (self == query) return YES; + if (query == nil) return NO; + if (self.firestore != query.firestore && ![self.firestore isEqual:query.firestore]) return NO; + if (self.query != query.query && ![self.query isEqual:query.query]) return NO; + return YES; +} + +- (NSUInteger)hash { + NSUInteger hash = [self.firestore hash]; + hash = hash * 31u + [self.query hash]; + return hash; +} + +#pragma mark - Public Methods + - (void)getDocumentsWithCompletion:(void (^)(FIRQuerySnapshot *_Nullable snapshot, NSError *_Nullable error))completion { FSTListenOptions *options = [[FSTListenOptions alloc] initWithIncludeQueryMetadataChanges:YES |