aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore
diff options
context:
space:
mode:
authorGravatar Michael Lehenbauer <mikelehen@gmail.com>2017-10-19 08:23:25 -0700
committerGravatar GitHub <noreply@github.com>2017-10-19 08:23:25 -0700
commit024788e38a5e506cf4861aa66afda2bc3b9115e1 (patch)
tree43af440462ae283c1277de040c689a724d047098 /Firestore
parentb561342aa69f30fbd5e66927501def426ba8337e (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.m34
-rw-r--r--Firestore/Example/Tests/Integration/API/FIRTypeTests.m17
-rw-r--r--Firestore/Source/API/FIRDocumentReference.m26
-rw-r--r--Firestore/Source/API/FIRQuery.m27
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