aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Example/Tests/Core/FSTEventManagerTests.m
diff options
context:
space:
mode:
Diffstat (limited to 'Firestore/Example/Tests/Core/FSTEventManagerTests.m')
-rw-r--r--Firestore/Example/Tests/Core/FSTEventManagerTests.m163
1 files changed, 163 insertions, 0 deletions
diff --git a/Firestore/Example/Tests/Core/FSTEventManagerTests.m b/Firestore/Example/Tests/Core/FSTEventManagerTests.m
new file mode 100644
index 0000000..85afe58
--- /dev/null
+++ b/Firestore/Example/Tests/Core/FSTEventManagerTests.m
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2017 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 "Core/FSTEventManager.h"
+
+#import <OCMock/OCMock.h>
+#import <XCTest/XCTest.h>
+
+#import "Core/FSTQuery.h"
+#import "Core/FSTSyncEngine.h"
+#import "Model/FSTDocumentSet.h"
+#import "Util/FSTDispatchQueue.h"
+
+#import "FSTHelpers.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+// FSTEventManager implements this delegate privately
+@interface FSTEventManager () <FSTSyncEngineDelegate>
+@end
+
+@interface FSTEventManagerTests : XCTestCase
+@end
+
+@implementation FSTEventManagerTests {
+ FSTDispatchQueue *_testUserQueue;
+}
+
+- (void)setUp {
+ _testUserQueue = [FSTDispatchQueue queueWith:dispatch_get_main_queue()];
+}
+
+- (FSTQueryListener *)noopListenerForQuery:(FSTQuery *)query {
+ return [[FSTQueryListener alloc]
+ initWithQuery:query
+ options:[FSTListenOptions defaultOptions]
+ viewSnapshotHandler:^(FSTViewSnapshot *_Nullable snapshot, NSError *_Nullable error){
+ }];
+}
+
+- (void)testHandlesManyListenersPerQuery {
+ FSTQuery *query = [FSTQuery queryWithPath:FSTTestPath(@"foo/bar")];
+ FSTQueryListener *listener1 = [self noopListenerForQuery:query];
+ FSTQueryListener *listener2 = [self noopListenerForQuery:query];
+
+ FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
+ OCMExpect([syncEngineMock setDelegate:[OCMArg any]]);
+ FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
+
+ OCMExpect([syncEngineMock listenToQuery:query]);
+ [eventManager addListener:listener1];
+ OCMVerifyAll((id)syncEngineMock);
+
+ [eventManager addListener:listener2];
+ [eventManager removeListener:listener2];
+
+ OCMExpect([syncEngineMock stopListeningToQuery:query]);
+ [eventManager removeListener:listener1];
+ OCMVerifyAll((id)syncEngineMock);
+}
+
+- (void)testHandlesUnlistenOnUnknownListenerGracefully {
+ FSTQuery *query = [FSTQuery queryWithPath:FSTTestPath(@"foo/bar")];
+ FSTQueryListener *listener = [self noopListenerForQuery:query];
+
+ FSTSyncEngine *syncEngineMock = OCMStrictClassMock([FSTSyncEngine class]);
+ OCMExpect([syncEngineMock setDelegate:[OCMArg any]]);
+ FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
+
+ [eventManager removeListener:listener];
+ OCMVerifyAll((id)syncEngineMock);
+}
+
+- (FSTQueryListener *)makeMockListenerForQuery:(FSTQuery *)query
+ viewSnapshotHandler:(void (^)())handler {
+ FSTQueryListener *listener = OCMClassMock([FSTQueryListener class]);
+ OCMStub([listener query]).andReturn(query);
+ OCMStub([listener queryDidChangeViewSnapshot:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
+ handler();
+ });
+ return listener;
+}
+
+- (void)testNotifiesListenersInTheRightOrder {
+ FSTQuery *query1 = [FSTQuery queryWithPath:FSTTestPath(@"foo/bar")];
+ FSTQuery *query2 = [FSTQuery queryWithPath:FSTTestPath(@"bar/baz")];
+ NSMutableArray *eventOrder = [NSMutableArray array];
+
+ FSTQueryListener *listener1 = [self makeMockListenerForQuery:query1
+ viewSnapshotHandler:^{
+ [eventOrder addObject:@"listener1"];
+ }];
+
+ FSTQueryListener *listener2 = [self makeMockListenerForQuery:query2
+ viewSnapshotHandler:^{
+ [eventOrder addObject:@"listener2"];
+ }];
+
+ FSTQueryListener *listener3 = [self makeMockListenerForQuery:query1
+ viewSnapshotHandler:^{
+ [eventOrder addObject:@"listener3"];
+ }];
+
+ FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
+ FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
+
+ [eventManager addListener:listener1];
+ [eventManager addListener:listener2];
+ [eventManager addListener:listener3];
+ OCMVerify([syncEngineMock listenToQuery:query1]);
+ OCMVerify([syncEngineMock listenToQuery:query2]);
+
+ FSTViewSnapshot *snapshot1 = OCMClassMock([FSTViewSnapshot class]);
+ OCMStub([snapshot1 query]).andReturn(query1);
+ FSTViewSnapshot *snapshot2 = OCMClassMock([FSTViewSnapshot class]);
+ OCMStub([snapshot2 query]).andReturn(query2);
+
+ [eventManager handleViewSnapshots:@[ snapshot1, snapshot2 ]];
+
+ NSArray *expected = @[ @"listener1", @"listener3", @"listener2" ];
+ XCTAssertEqualObjects(eventOrder, expected);
+}
+
+- (void)testWillForwardOnlineStateChanges {
+ FSTQuery *query = [FSTQuery queryWithPath:FSTTestPath(@"foo/bar")];
+ FSTQueryListener *fakeListener = OCMClassMock([FSTQueryListener class]);
+ NSMutableArray *events = [NSMutableArray array];
+ OCMStub([fakeListener query]).andReturn(query);
+ OCMStub([fakeListener clientDidChangeOnlineState:FSTOnlineStateUnknown])
+ .andDo(^(NSInvocation *invocation) {
+ [events addObject:@(FSTOnlineStateUnknown)];
+ });
+ OCMStub([fakeListener clientDidChangeOnlineState:FSTOnlineStateHealthy])
+ .andDo(^(NSInvocation *invocation) {
+ [events addObject:@(FSTOnlineStateHealthy)];
+ });
+
+ FSTSyncEngine *syncEngineMock = OCMClassMock([FSTSyncEngine class]);
+ OCMExpect([syncEngineMock setDelegate:[OCMArg any]]);
+ FSTEventManager *eventManager = [FSTEventManager eventManagerWithSyncEngine:syncEngineMock];
+
+ [eventManager addListener:fakeListener];
+ XCTAssertEqualObjects(events, @[ @(FSTOnlineStateUnknown) ]);
+ [eventManager watchStreamDidChangeOnlineState:FSTOnlineStateHealthy];
+ XCTAssertEqualObjects(events, (@[ @(FSTOnlineStateUnknown), @(FSTOnlineStateHealthy) ]));
+}
+
+@end
+
+NS_ASSUME_NONNULL_END