| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703 |
- /*
- * Copyright 2018 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #import <FirebaseFirestore/FirebaseFirestore.h>
- #import <XCTest/XCTest.h>
- #import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
- #import "Firestore/Source/API/FIRFirestore+Internal.h"
- @interface FIRFirestoreSourceTests : FSTIntegrationTestCase
- @end
- @implementation FIRFirestoreSourceTests
- - (void)testGetDocumentWhileOnlineWithDefaultSource {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key" : @"value"};
- [self writeDocumentRef:doc data:initialData];
- // get doc and ensure that it exists, is *not* from the cache, and matches
- // the initialData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc];
- XCTAssertTrue(result.exists);
- XCTAssertFalse(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, initialData);
- }
- - (void)testGetCollectionWhileOnlineWithDefaultSource {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to known values
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"}
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // get docs and ensure they are *not* from the cache, and match the
- // initialDocs.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col];
- XCTAssertFalse(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(
- FIRQuerySnapshotGetData(result),
- (@[ @{@"key1" : @"value1"}, @{@"key2" : @"value2"}, @{@"key3" : @"value3"} ]));
- XCTAssertEqualObjects(FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3" : @"value3"} ]
- ]));
- }
- - (void)testGetDocumentError {
- FIRDocumentReference *doc = [self.db documentWithPath:@"foo/__invalid__"];
- XCTestExpectation *completed = [self expectationWithDescription:@"get completed"];
- [doc getDocumentWithCompletion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- [completed fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetCollectionError {
- FIRCollectionReference *col = [self.db collectionWithPath:@"__invalid__"];
- XCTestExpectation *completed = [self expectationWithDescription:@"get completed"];
- [col getDocumentsWithCompletion:^(FIRQuerySnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- [completed fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetDocumentWhileOfflineWithDefaultSource {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key1" : @"value1"};
- [self writeDocumentRef:doc data:initialData];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the doc (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- NSDictionary<NSString *, id> *newData = @{@"key2" : @"value2"};
- [doc setData:newData
- completion:^(NSError *) {
- XCTAssertTrue(false, "Because we're offline, this should never occur.");
- }];
- // get doc and ensure it exists, *is* from the cache, and matches the
- // newData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc];
- XCTAssertTrue(result.exists);
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, newData);
- }
- - (void)testGetCollectionWhileOfflineWithDefaultSource {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to known values
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"}
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the docs (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- [[col documentWithPath:@"doc2"] setData:@{@"key2b" : @"value2b"} merge:YES];
- [[col documentWithPath:@"doc3"] setData:@{@"key3b" : @"value3b"}];
- [[col documentWithPath:@"doc4"] setData:@{@"key4" : @"value4"}];
- // get docs and ensure they *are* from the cache, and matches the updated data.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col];
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"}, @{@"key2" : @"value2", @"key2b" : @"value2b"},
- @{@"key3b" : @"value3b"}, @{@"key4" : @"value4"}
- ]));
- XCTAssertEqualObjects(
- FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2", @"key2b" : @"value2b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3b" : @"value3b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc4", @{@"key4" : @"value4"} ]
- ]));
- }
- - (void)testGetDocumentWhileOnlineCacheOnly {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key" : @"value"};
- [self writeDocumentRef:doc data:initialData];
- // get doc and ensure that it exists, *is* from the cache, and matches
- // the initialData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.exists);
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, initialData);
- }
- - (void)testGetCollectionWhileOnlineCacheOnly {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to a known value
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"},
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // get docs and ensure they *are* from the cache, and matches the
- // initialDocs.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"},
- @{@"key2" : @"value2"},
- @{@"key3" : @"value3"},
- ]));
- XCTAssertEqualObjects(FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3" : @"value3"} ]
- ]));
- }
- - (void)testGetDocumentWhileOfflineCacheOnly {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key1" : @"value1"};
- [self writeDocumentRef:doc data:initialData];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the doc (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- NSDictionary<NSString *, id> *newData = @{@"key2" : @"value2"};
- [doc setData:newData
- completion:^(NSError *) {
- XCTFail("Because we're offline, this should never occur.");
- }];
- // get doc and ensure it exists, *is* from the cache, and matches the
- // newData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.exists);
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, newData);
- }
- - (void)testGetCollectionWhileOfflineCacheOnly {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to a known value
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"},
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the docs (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- [[col documentWithPath:@"doc2"] setData:@{@"key2b" : @"value2b"} merge:YES];
- [[col documentWithPath:@"doc3"] setData:@{@"key3b" : @"value3b"}];
- [[col documentWithPath:@"doc4"] setData:@{@"key4" : @"value4"}];
- // get docs and ensure they *are* from the cache, and matches the updated
- // data.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"}, @{@"key2" : @"value2", @"key2b" : @"value2b"},
- @{@"key3b" : @"value3b"}, @{@"key4" : @"value4"}
- ]));
- XCTAssertEqualObjects(
- FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2", @"key2b" : @"value2b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3b" : @"value3b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc4", @{@"key4" : @"value4"} ]
- ]));
- }
- - (void)testGetDocumentWhileOnlineServerOnly {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key" : @"value"};
- [self writeDocumentRef:doc data:initialData];
- // get doc and ensure that it exists, is *not* from the cache, and matches
- // the initialData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc source:FIRFirestoreSourceServer];
- XCTAssertTrue(result.exists);
- XCTAssertFalse(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, initialData);
- }
- - (void)testGetCollectionWhileOnlineServerOnly {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to a known value
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"},
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // get docs and ensure they are *not* from the cache, and matches the
- // initialData.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col source:FIRFirestoreSourceServer];
- XCTAssertFalse(result.metadata.fromCache);
- XCTAssertFalse(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"},
- @{@"key2" : @"value2"},
- @{@"key3" : @"value3"},
- ]));
- XCTAssertEqualObjects(FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3" : @"value3"} ]
- ]));
- }
- - (void)testGetDocumentWhileOfflineServerOnly {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key1" : @"value1"};
- [self writeDocumentRef:doc data:initialData];
- // go offline for the rest of this test
- [self disableNetwork];
- // attempt to get doc and ensure it cannot be retreived
- XCTestExpectation *failedGetDocCompletion = [self expectationWithDescription:@"failedGetDoc"];
- [doc getDocumentWithSource:FIRFirestoreSourceServer
- completion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [failedGetDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetCollectionWhileOfflineServerOnly {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to a known value
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"},
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // go offline for the rest of this test
- [self disableNetwork];
- // attempt to get docs and ensure they cannot be retreived
- XCTestExpectation *failedGetDocsCompletion = [self expectationWithDescription:@"failedGetDocs"];
- [col getDocumentsWithSource:FIRFirestoreSourceServer
- completion:^(FIRQuerySnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [failedGetDocsCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetDocumentWhileOfflineWithDifferentSource {
- FIRDocumentReference *doc = [self documentRef];
- // set document to a known value
- NSDictionary<NSString *, id> *initialData = @{@"key1" : @"value1"};
- [self writeDocumentRef:doc data:initialData];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the doc (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- NSDictionary<NSString *, id> *newData = @{@"key2" : @"value2"};
- [doc setData:newData
- completion:^(NSError *) {
- XCTAssertTrue(false, "Because we're offline, this should never occur.");
- }];
- // Create an initial listener for this query (to attempt to disrupt the gets below) and wait for
- // the listener to deliver its initial snapshot before continuing.
- XCTestExpectation *listenerReady = [self expectationWithDescription:@"listenerReady"];
- [doc addSnapshotListener:^(FIRDocumentSnapshot *, NSError *) {
- [listenerReady fulfill];
- }];
- [self awaitExpectations];
- // get doc (from cache) and ensure it exists, *is* from the cache, and
- // matches the newData.
- FIRDocumentSnapshot *result = [self readDocumentForRef:doc source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.exists);
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, newData);
- // attempt to get doc (with default get source)
- result = [self readDocumentForRef:doc source:FIRFirestoreSourceDefault];
- XCTAssertTrue(result.exists);
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(result.data, newData);
- // attempt to get doc (from the server) and ensure it cannot be retreived
- XCTestExpectation *failedGetDocCompletion = [self expectationWithDescription:@"failedGetDoc"];
- [doc getDocumentWithSource:FIRFirestoreSourceServer
- completion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [failedGetDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetCollectionWhileOfflineWithDifferentSource {
- FIRCollectionReference *col = [self collectionRef];
- // set a few documents to a known value
- NSDictionary<NSString *, NSDictionary<NSString *, id> *> *initialDocs = @{
- @"doc1" : @{@"key1" : @"value1"},
- @"doc2" : @{@"key2" : @"value2"},
- @"doc3" : @{@"key3" : @"value3"},
- };
- [self writeAllDocuments:initialDocs toCollection:col];
- // go offline for the rest of this test
- [self disableNetwork];
- // update the docs (though don't wait for a server response. We're offline; so
- // that ain't happening!). This allows us to further distinguished cached vs
- // server responses below.
- [[col documentWithPath:@"doc2"] setData:@{@"key2b" : @"value2b"} merge:YES];
- [[col documentWithPath:@"doc3"] setData:@{@"key3b" : @"value3b"}];
- [[col documentWithPath:@"doc4"] setData:@{@"key4" : @"value4"}];
- // Create an initial listener for this query (to attempt to disrupt the gets
- // below) and wait for the listener to deliver its initial snapshot before
- // continuing.
- XCTestExpectation *listenerReady = [self expectationWithDescription:@"listenerReady"];
- [col addSnapshotListener:^(FIRQuerySnapshot *, NSError *) {
- [listenerReady fulfill];
- }];
- [self awaitExpectations];
- // get docs (from cache) and ensure they *are* from the cache, and
- // matches the updated data.
- FIRQuerySnapshot *result = [self readDocumentSetForRef:col source:FIRFirestoreSourceCache];
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertTrue(result.metadata.hasPendingWrites);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"}, @{@"key2" : @"value2", @"key2b" : @"value2b"},
- @{@"key3b" : @"value3b"}, @{@"key4" : @"value4"}
- ]));
- XCTAssertEqualObjects(
- FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2", @"key2b" : @"value2b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3b" : @"value3b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc4", @{@"key4" : @"value4"} ]
- ]));
- // attempt to get docs (with default get source)
- result = [self readDocumentSetForRef:col source:FIRFirestoreSourceDefault];
- XCTAssertTrue(result.metadata.fromCache);
- XCTAssertEqualObjects(FIRQuerySnapshotGetData(result), (@[
- @{@"key1" : @"value1"}, @{@"key2" : @"value2", @"key2b" : @"value2b"},
- @{@"key3b" : @"value3b"}, @{@"key4" : @"value4"}
- ]));
- XCTAssertEqualObjects(
- FIRQuerySnapshotGetDocChangesData(result), (@[
- @[ @(FIRDocumentChangeTypeAdded), @"doc1", @{@"key1" : @"value1"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc2", @{@"key2" : @"value2", @"key2b" : @"value2b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc3", @{@"key3b" : @"value3b"} ],
- @[ @(FIRDocumentChangeTypeAdded), @"doc4", @{@"key4" : @"value4"} ]
- ]));
- // attempt to get docs (from the server) and ensure they cannot be retreived
- XCTestExpectation *failedGetDocsCompletion = [self expectationWithDescription:@"failedGetDocs"];
- [col getDocumentsWithSource:FIRFirestoreSourceServer
- completion:^(FIRQuerySnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [failedGetDocsCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetNonExistingDocWhileOnlineWithDefaultSource {
- FIRDocumentReference *doc = [self documentRef];
- // get doc and ensure that it does not exist and is *not* from the cache.
- FIRDocumentSnapshot *snapshot = [self readDocumentForRef:doc];
- XCTAssertFalse(snapshot.exists);
- XCTAssertFalse(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingCollectionWhileOnlineWithDefaultSource {
- FIRCollectionReference *col = [self collectionRef];
- // get collection and ensure it's empty and that it's *not* from the cache.
- FIRQuerySnapshot *snapshot = [self readDocumentSetForRef:col];
- XCTAssertEqual(snapshot.count, 0);
- XCTAssertEqual(snapshot.documentChanges.count, 0ul);
- XCTAssertFalse(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingDocWhileOfflineWithDefaultSource {
- FIRDocumentReference *doc = [self documentRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // Attempt to get doc. This will fail since there's nothing in cache.
- XCTestExpectation *getNonExistingDocCompletion =
- [self expectationWithDescription:@"getNonExistingDoc"];
- [doc getDocumentWithCompletion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [getNonExistingDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- // TODO(b/112267729): We should raise a fromCache=true event with a nonexistent snapshot, but
- // because the default source goes through a normal listener, we do not.
- - (void)xtestGetDeletedDocWhileOfflineWithDefaultSource {
- FIRDocumentReference *doc = [self documentRef];
- // Delete the doc to get a deleted document into our cache.
- [self deleteDocumentRef:doc];
- // Go offline for the rest of this test
- [self disableNetwork];
- // Should get a FIRDocumentSnapshot with exists=false, fromCache=true
- FIRDocumentSnapshot *snapshot = [self readDocumentForRef:doc source:FIRFirestoreSourceDefault];
- XCTAssertNotNil(snapshot);
- XCTAssertFalse(snapshot.exists);
- XCTAssertNil(snapshot.data);
- XCTAssertTrue(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingCollectionWhileOfflineWithDefaultSource {
- FIRCollectionReference *col = [self collectionRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // get collection and ensure it's empty and that it *is* from the cache.
- FIRQuerySnapshot *snapshot = [self readDocumentSetForRef:col];
- XCTAssertEqual(snapshot.count, 0);
- XCTAssertEqual(snapshot.documentChanges.count, 0ul);
- XCTAssertTrue(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingDocWhileOnlineCacheOnly {
- FIRDocumentReference *doc = [self documentRef];
- // Attempt to get doc. This will fail since there's nothing in cache.
- XCTestExpectation *getNonExistingDocCompletion =
- [self expectationWithDescription:@"getNonExistingDoc"];
- [doc getDocumentWithSource:FIRFirestoreSourceCache
- completion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [getNonExistingDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetNonExistingCollectionWhileOnlineCacheOnly {
- FIRCollectionReference *col = [self collectionRef];
- // get collection and ensure it's empty and that it *is* from the cache.
- FIRQuerySnapshot *snapshot = [self readDocumentSetForRef:col source:FIRFirestoreSourceCache];
- XCTAssertEqual(snapshot.count, 0);
- XCTAssertEqual(snapshot.documentChanges.count, 0ul);
- XCTAssertTrue(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingDocWhileOfflineCacheOnly {
- FIRDocumentReference *doc = [self documentRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // Attempt to get doc. This will fail since there's nothing in cache.
- XCTestExpectation *getNonExistingDocCompletion =
- [self expectationWithDescription:@"getNonExistingDoc"];
- [doc getDocumentWithSource:FIRFirestoreSourceCache
- completion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [getNonExistingDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetDeletedDocWhileOfflineCacheOnly {
- FIRDocumentReference *doc = [self documentRef];
- // Delete the doc to get a deleted document into our cache.
- [self deleteDocumentRef:doc];
- // Go offline for the rest of this test
- [self disableNetwork];
- // Should get a FIRDocumentSnapshot with exists=false, fromCache=true
- FIRDocumentSnapshot *snapshot = [self readDocumentForRef:doc source:FIRFirestoreSourceCache];
- XCTAssertNotNil(snapshot);
- XCTAssertFalse(snapshot.exists);
- XCTAssertNil(snapshot.data);
- XCTAssertTrue(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingCollectionWhileOfflineCacheOnly {
- FIRCollectionReference *col = [self collectionRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // get collection and ensure it's empty and that it *is* from the cache.
- FIRQuerySnapshot *snapshot = [self readDocumentSetForRef:col source:FIRFirestoreSourceCache];
- XCTAssertEqual(snapshot.count, 0);
- XCTAssertEqual(snapshot.documentChanges.count, 0ul);
- XCTAssertTrue(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingDocWhileOnlineServerOnly {
- FIRDocumentReference *doc = [self documentRef];
- // get doc and ensure that it does not exist and is *not* from the cache.
- FIRDocumentSnapshot *snapshot = [self readDocumentForRef:doc source:FIRFirestoreSourceServer];
- XCTAssertFalse(snapshot.exists);
- XCTAssertFalse(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingCollectionWhileOnlineServerOnly {
- FIRCollectionReference *col = [self collectionRef];
- // get collection and ensure that it's empty and that it's *not* from the cache.
- FIRQuerySnapshot *snapshot = [self readDocumentSetForRef:col source:FIRFirestoreSourceServer];
- XCTAssertEqual(snapshot.count, 0);
- XCTAssertEqual(snapshot.documentChanges.count, 0ul);
- XCTAssertFalse(snapshot.metadata.fromCache);
- XCTAssertFalse(snapshot.metadata.hasPendingWrites);
- }
- - (void)testGetNonExistingDocWhileOfflineServerOnly {
- FIRDocumentReference *doc = [self documentRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // attempt to get doc. Currently, this is expected to fail. In the future, we
- // might consider adding support for negative cache hits so that we know
- // certain documents *don't* exist.
- XCTestExpectation *getNonExistingDocCompletion =
- [self expectationWithDescription:@"getNonExistingDoc"];
- [doc getDocumentWithSource:FIRFirestoreSourceServer
- completion:^(FIRDocumentSnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [getNonExistingDocCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- - (void)testGetNonExistingCollectionWhileOfflineServerOnly {
- FIRCollectionReference *col = [self collectionRef];
- // go offline for the rest of this test
- [self disableNetwork];
- // attempt to get collection and ensure that it cannot be retreived
- XCTestExpectation *failedGetDocsCompletion = [self expectationWithDescription:@"failedGetDocs"];
- [col getDocumentsWithSource:FIRFirestoreSourceServer
- completion:^(FIRQuerySnapshot *, NSError *error) {
- XCTAssertNotNil(error);
- XCTAssertEqualObjects(error.domain, FIRFirestoreErrorDomain);
- XCTAssertEqual(error.code, FIRFirestoreErrorCodeUnavailable);
- [failedGetDocsCompletion fulfill];
- }];
- [self awaitExpectations];
- }
- @end
|