aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Example/Tests
diff options
context:
space:
mode:
authorGravatar Michael Lehenbauer <mikelehen@gmail.com>2018-04-23 10:03:55 -0700
committerGravatar GitHub <noreply@github.com>2018-04-23 10:03:55 -0700
commite4384c3e809556e75907df74cd116307f397472f (patch)
tree98841eba1d45eb94adcb798b6f792c16ba4b8d18 /Firestore/Example/Tests
parent8e70791465f9b5e4bb75dfc18de4a4ed90961974 (diff)
Array Contains Queries (not added to public headers yet). (#1138)
Diffstat (limited to 'Firestore/Example/Tests')
-rw-r--r--Firestore/Example/Tests/Core/FSTQueryTests.mm49
-rw-r--r--Firestore/Example/Tests/Integration/API/FIRQueryTests.mm45
-rw-r--r--Firestore/Example/Tests/Integration/API/FIRValidationTests.mm22
-rw-r--r--Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm24
-rw-r--r--Firestore/Example/Tests/Util/FSTHelpers.h2
-rw-r--r--Firestore/Example/Tests/Util/FSTHelpers.mm2
6 files changed, 138 insertions, 6 deletions
diff --git a/Firestore/Example/Tests/Core/FSTQueryTests.mm b/Firestore/Example/Tests/Core/FSTQueryTests.mm
index 02310aa..6118d0f 100644
--- a/Firestore/Example/Tests/Core/FSTQueryTests.mm
+++ b/Firestore/Example/Tests/Core/FSTQueryTests.mm
@@ -151,6 +151,55 @@ NS_ASSUME_NONNULL_BEGIN
XCTAssertFalse([query2 matchesDocument:doc6]);
}
+- (void)testArrayContainsFilter {
+ FSTQuery *query = [FSTTestQuery("collection")
+ queryByAddingFilter:FSTTestFilter("array", @"array_contains", @42)];
+
+ // not an array.
+ FSTDocument *doc = FSTTestDoc("collection/1", 0, @{ @"array" : @1 }, NO);
+ XCTAssertFalse([query matchesDocument:doc]);
+
+ // empty array.
+ doc = FSTTestDoc("collection/1", 0, @{ @"array" : @[] }, NO);
+ XCTAssertFalse([query matchesDocument:doc]);
+
+ // array without element (and make sure it doesn't match in a nested field or a different field).
+ doc = FSTTestDoc(
+ "collection/1", 0,
+ @{ @"array" : @[ @41, @"42",
+ @{ @"a" : @42,
+ @"b" : @[ @42 ] } ],
+ @"different" : @[ @42 ] },
+ NO);
+ XCTAssertFalse([query matchesDocument:doc]);
+
+ // array with element.
+ doc = FSTTestDoc("collection/1", 0, @{ @"array" : @[ @1, @"2", @42, @{ @"a" : @1 } ] }, NO);
+ XCTAssertTrue([query matchesDocument:doc]);
+}
+
+- (void)testArrayContainsFilterWithObjectValue {
+ // Search for arrays containing the object { a: [42] }
+ FSTQuery *query =
+ [FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("array", @"array_contains",
+ @{ @"a" : @[ @42 ] })];
+
+ // array without element.
+ FSTDocument *doc = FSTTestDoc(
+ "collection/1", 0,
+ @{ @"array" : @[
+ @{ @"a" : @42 },
+ @{ @"a" : @[ @42, @43 ] },
+ @{ @"b" : @[ @42 ] }
+ ] },
+ NO);
+ XCTAssertFalse([query matchesDocument:doc]);
+
+ // array with element.
+ doc = FSTTestDoc("collection/1", 0, @{ @"array" : @[ @1, @"2", @42, @{ @"a" : @[ @42 ] } ] }, NO);
+ XCTAssertTrue([query matchesDocument:doc]);
+}
+
- (void)testNullFilter {
FSTQuery *query =
[FSTTestQuery("collection") queryByAddingFilter:FSTTestFilter("sort", @"==", [NSNull null])];
diff --git a/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm b/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm
index d1c0d75..bdd3df1 100644
--- a/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm
+++ b/Firestore/Example/Tests/Integration/API/FIRQueryTests.mm
@@ -20,8 +20,7 @@
#import "Firestore/Example/Tests/Util/FSTEventAccumulator.h"
#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
-#import "Firestore/Source/API/FIRFirestore+Internal.h"
-#import "Firestore/Source/Core/FSTFirestoreClient.h"
+#import "Firestore/Source/API/FIRQuery+Internal.h"
@interface FIRQueryTests : FSTIntegrationTestCase
@end
@@ -294,4 +293,46 @@
]));
}
+// TODO(array-features): Enable once backend support lands.
+- (void)xtestArrayContainsQueries {
+ NSDictionary *testDocs = @{
+ @"a" : @{@"array" : @[ @42 ]},
+ @"b" : @{@"array" : @[ @"a", @42, @"c" ]},
+ @"c" : @{@"array" : @[ @41.999, @"42",
+ @{ @"a" : @[ @42 ] } ]},
+ @"d" : @{@"array" : @[ @42 ], @"array2" : @[ @"bingo" ]}
+ };
+ FIRCollectionReference *collection = [self collectionRefWithDocuments:testDocs];
+
+ // Search for 42
+ FIRQuerySnapshot *snapshot =
+ [self readDocumentSetForRef:[collection queryWhereField:@"array" arrayContains:@42]];
+ XCTAssertEqualObjects(FIRQuerySnapshotGetData(snapshot), (@[
+ @{ @"array" : @[ @42 ] },
+ @{ @"array" : @[ @"a", @42, @"c" ] },
+ @{ @"array" : @[ @42 ],
+ @"array2" : @[ @"bingo" ] }
+ ]));
+
+ // Search for "array" to contain both @42 and "a".
+ snapshot = [self readDocumentSetForRef:[[collection queryWhereField:@"array" arrayContains:@42]
+ queryWhereField:@"array"
+ arrayContains:@"a"]];
+ XCTAssertEqualObjects(FIRQuerySnapshotGetData(snapshot), (@[
+ @{ @"array" : @[ @"a", @42, @"c" ] },
+ ]));
+
+ // Search two different array fields ("array" contains 42 and "array2" contains "bingo").
+ snapshot = [self readDocumentSetForRef:[[collection queryWhereField:@"array" arrayContains:@42]
+ queryWhereField:@"array2"
+ arrayContains:@"bingo"]];
+ XCTAssertEqualObjects(FIRQuerySnapshotGetData(snapshot), (@[
+ @{ @"array" : @[ @42 ],
+ @"array2" : @[ @"bingo" ] }
+ ]));
+
+ // NOTE: The backend doesn't currently support null, NaN, objects, or arrays, so there isn't much
+ // of anything else interesting to test.
+}
+
@end
diff --git a/Firestore/Example/Tests/Integration/API/FIRValidationTests.mm b/Firestore/Example/Tests/Integration/API/FIRValidationTests.mm
index ee0f386..6d10aba 100644
--- a/Firestore/Example/Tests/Integration/API/FIRValidationTests.mm
+++ b/Firestore/Example/Tests/Integration/API/FIRValidationTests.mm
@@ -19,6 +19,7 @@
#import <XCTest/XCTest.h>
#import "Firestore/Source/API/FIRFieldValue+Internal.h"
+#import "Firestore/Source/API/FIRQuery+Internal.h"
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
@@ -419,14 +420,20 @@
@"Invalid Query. Query limit (-1) is invalid. Limit must be positive.");
}
-- (void)testQueryInequalityOnNullOrNaNFails {
+- (void)testNonEqualityQueriesOnNullOrNaNFail {
FSTAssertThrows([[self collectionRef] queryWhereField:@"a" isGreaterThan:nil],
@"Invalid Query. You can only perform equality comparisons on nil / NSNull.");
FSTAssertThrows([[self collectionRef] queryWhereField:@"a" isGreaterThan:[NSNull null]],
@"Invalid Query. You can only perform equality comparisons on nil / NSNull.");
+ FSTAssertThrows([[self collectionRef] queryWhereField:@"a" arrayContains:nil],
+ @"Invalid Query. You can only perform equality comparisons on nil / NSNull.");
+ FSTAssertThrows([[self collectionRef] queryWhereField:@"a" arrayContains:[NSNull null]],
+ @"Invalid Query. You can only perform equality comparisons on nil / NSNull.");
FSTAssertThrows([[self collectionRef] queryWhereField:@"a" isGreaterThan:@(NAN)],
@"Invalid Query. You can only perform equality comparisons on NaN.");
+ FSTAssertThrows([[self collectionRef] queryWhereField:@"a" arrayContains:@(NAN)],
+ @"Invalid Query. You can only perform equality comparisons on NaN.");
}
- (void)testQueryCannotBeCreatedFromDocumentsMissingSortValues {
@@ -498,6 +505,12 @@
@"Invalid query. When querying by document ID you must provide a valid string or "
"DocumentReference, but it was of type: __NSCFNumber";
FSTAssertThrows([collection queryWhereFieldPath:[FIRFieldPath documentID] isEqualTo:@1], reason);
+
+ reason =
+ @"Invalid query. You can't do arrayContains queries on document ID since document IDs are "
+ @"not arrays.";
+ FSTAssertThrows([collection queryWhereFieldPath:[FIRFieldPath documentID] arrayContains:@1],
+ reason);
}
- (void)testQueryInequalityFieldMustMatchFirstOrderByField {
@@ -526,6 +539,8 @@
XCTAssertNoThrow([base queryWhereField:@"y" isEqualTo:@"cat"],
@"Inequality and equality on different fields works");
+ XCTAssertNoThrow([base queryWhereField:@"y" arrayContains:@"cat"],
+ @"Inequality and array_contains on different fields works");
XCTAssertNoThrow([base queryOrderedByField:@"x"], @"inequality same as order by works");
XCTAssertNoThrow([[coll queryOrderedByField:@"x"] queryWhereField:@"x" isGreaterThan:@32],
@@ -535,6 +550,11 @@
XCTAssertNoThrow([[[coll queryOrderedByField:@"x"] queryOrderedByField:@"y"] queryWhereField:@"x"
isGreaterThan:@32],
@"inequality same as first order by works.");
+
+ XCTAssertNoThrow([[coll queryOrderedByField:@"x"] queryWhereField:@"y" isEqualTo:@"cat"],
+ @"equality different than orderBy works.");
+ XCTAssertNoThrow([[coll queryOrderedByField:@"x"] queryWhereField:@"y" arrayContains:@"cat"],
+ @"array_contains different than orderBy works.");
}
#pragma mark - GeoPoint Validation
diff --git a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
index 8d62b4d..bbb3822 100644
--- a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
+++ b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
@@ -487,6 +487,18 @@ NS_ASSUME_NONNULL_BEGIN
XCTAssertEqualObjects(actual, expected);
}
+- (void)testEncodesArrayContainsFilter {
+ FSTRelationFilter *input = FSTTestFilter("item.tags", @"array_contains", @"food");
+ GCFSStructuredQuery_Filter *actual = [self.serializer encodedRelationFilter:input];
+
+ GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
+ GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
+ prop.field.fieldPath = @"item.tags";
+ prop.op = GCFSStructuredQuery_FieldFilter_Operator_ArrayContains;
+ prop.value.stringValue = @"food";
+ XCTAssertEqualObjects(actual, expected);
+}
+
#pragma mark - encodedQuery
- (void)testEncodesFirstLevelKeyQueries {
@@ -556,9 +568,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)testEncodesMultipleFiltersOnDeeperCollections {
- FSTQuery *q = [[FSTTestQuery("rooms/1/messages/10/attachments")
+ FSTQuery *q = [[[FSTTestQuery("rooms/1/messages/10/attachments")
queryByAddingFilter:FSTTestFilter("prop", @">=", @(42))]
- queryByAddingFilter:FSTTestFilter("author", @"==", @"dimond")];
+ queryByAddingFilter:FSTTestFilter("author", @"==", @"dimond")]
+ queryByAddingFilter:FSTTestFilter("tags", @"array_contains", @"pending")];
FSTQueryData *model = [self queryDataForQuery:q];
GCFSTarget *expected = [GCFSTarget message];
@@ -579,11 +592,18 @@ NS_ASSUME_NONNULL_BEGIN
field2.op = GCFSStructuredQuery_FieldFilter_Operator_Equal;
field2.value.stringValue = @"dimond";
+ GCFSStructuredQuery_Filter *filter3 = [GCFSStructuredQuery_Filter message];
+ GCFSStructuredQuery_FieldFilter *field3 = filter3.fieldFilter;
+ field3.field.fieldPath = @"tags";
+ field3.op = GCFSStructuredQuery_FieldFilter_Operator_ArrayContains;
+ field3.value.stringValue = @"pending";
+
GCFSStructuredQuery_CompositeFilter *composite =
expected.query.structuredQuery.where.compositeFilter;
composite.op = GCFSStructuredQuery_CompositeFilter_Operator_And;
[composite.filtersArray addObject:filter1];
[composite.filtersArray addObject:filter2];
+ [composite.filtersArray addObject:filter3];
[expected.query.structuredQuery.orderByArray
addObject:[GCFSStructuredQuery_Order messageWithProperty:@"prop" ascending:YES]];
diff --git a/Firestore/Example/Tests/Util/FSTHelpers.h b/Firestore/Example/Tests/Util/FSTHelpers.h
index 9b5f96a..131da2d 100644
--- a/Firestore/Example/Tests/Util/FSTHelpers.h
+++ b/Firestore/Example/Tests/Util/FSTHelpers.h
@@ -212,7 +212,7 @@ FSTQuery *FSTTestQuery(const absl::string_view path);
/**
* A convenience method to create a FSTFilter using a string representation for both field
- * and operator (<, <=, ==, >=, >).
+ * and operator (<, <=, ==, >=, >, array_contains).
*/
id<FSTFilter> FSTTestFilter(const absl::string_view field, NSString *op, id value);
diff --git a/Firestore/Example/Tests/Util/FSTHelpers.mm b/Firestore/Example/Tests/Util/FSTHelpers.mm
index e1ed18c..888a45f 100644
--- a/Firestore/Example/Tests/Util/FSTHelpers.mm
+++ b/Firestore/Example/Tests/Util/FSTHelpers.mm
@@ -210,6 +210,8 @@ id<FSTFilter> FSTTestFilter(const absl::string_view field, NSString *opString, i
op = FSTRelationFilterOperatorGreaterThanOrEqual;
} else if ([opString isEqualToString:@">"]) {
op = FSTRelationFilterOperatorGreaterThan;
+ } else if ([opString isEqualToString:@"array_contains"]) {
+ op = FSTRelationFilterOperatorArrayContains;
} else {
FSTCFail(@"Unsupported operator type: %@", opString);
}