diff options
Diffstat (limited to 'Firestore/Example/Tests/Core/FSTEventManagerTests.m')
-rw-r--r-- | Firestore/Example/Tests/Core/FSTEventManagerTests.m | 163 |
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 |