diff options
Diffstat (limited to 'Example/Database/Tests/Integration/FIRDatabaseQueryTests.m')
-rw-r--r-- | Example/Database/Tests/Integration/FIRDatabaseQueryTests.m | 678 |
1 files changed, 339 insertions, 339 deletions
diff --git a/Example/Database/Tests/Integration/FIRDatabaseQueryTests.m b/Example/Database/Tests/Integration/FIRDatabaseQueryTests.m index a5bff5a..ff4b5dc 100644 --- a/Example/Database/Tests/Integration/FIRDatabaseQueryTests.m +++ b/Example/Database/Tests/Integration/FIRDatabaseQueryTests.m @@ -23,7 +23,7 @@ - (void) testCanCreateBasicQueries { // Just make sure none of these throw anything - + FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; [ref queryLimitedToFirst:10]; @@ -143,7 +143,7 @@ - (void) testInvalidKeys { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; NSArray* badKeys = @[ @".test", @"test.", @"fo$o", @"[what", @"ever]", @"ha#sh", @"/thing", @"th/ing", @"thing/"]; - + for (NSString* badKey in badKeys) { XCTAssertThrows([[ref queryOrderedByPriority] queryStartingAtValue:nil childKey:badKey], @"Setting bad key"); XCTAssertThrows([[ref queryOrderedByPriority] queryEndingAtValue:nil childKey:badKey], @"Setting bad key"); @@ -152,7 +152,7 @@ - (void) testOffCanBeCalledOnDefault { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL called = NO; FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -162,32 +162,32 @@ called = YES; } }]; - + [ref setValue:@{@"a": @5, @"b": @6}]; - + [self waitUntil:^BOOL{ return called; }]; - + called = NO; - + [ref removeAllObservers]; - + __block BOOL complete = NO; [ref setValue:@{@"a": @6, @"b": @7} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { complete = YES; }]; - + [self waitUntil:^BOOL{ return complete; }]; - + XCTAssertFalse(called, @"Should not have been called again"); } - (void) testOffCanBeCalledOnHandle { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL called = NO; FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; FIRDatabaseHandle handle = [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -197,32 +197,32 @@ called = YES; } }]; - + [ref setValue:@{@"a": @5, @"b": @6}]; - + [self waitUntil:^BOOL{ return called; }]; - + called = NO; - + [ref removeObserverWithHandle:handle]; - + __block BOOL complete = NO; [ref setValue:@{@"a": @6, @"b": @7} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { complete = YES; }]; - + [self waitUntil:^BOOL{ return complete; }]; - + XCTAssertFalse(called, @"Should not have been called again"); } - (void) testOffCanBeCalledOnSpecificQuery { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL called = NO; FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; FIRDatabaseHandle handle = [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -232,26 +232,26 @@ called = YES; } }]; - + [ref setValue:@{@"a": @5, @"b": @6}]; - + [self waitUntil:^BOOL{ return called; }]; - + called = NO; - + [query removeObserverWithHandle:handle]; - + __block BOOL complete = NO; [ref setValue:@{@"a": @6, @"b": @7} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { complete = YES; }]; - + [self waitUntil:^BOOL{ return complete; }]; - + XCTAssertFalse(called, @"Should not have been called again"); } @@ -267,7 +267,7 @@ - (void) testOffCanBeCalledWithoutHandle { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL called1 = NO; __block BOOL called2 = NO; FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; @@ -277,51 +277,51 @@ [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { called2 = YES; }]; - + [ref setValue:@{@"a": @5, @"b": @6}]; - + [self waitUntil:^BOOL{ return called1 && called2; }]; - + called1 = NO; called2 = NO; - + [ref removeAllObservers]; - + __block BOOL complete = NO; [ref setValue:@{@"a": @6, @"b": @7} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { complete = YES; }]; - + [self waitUntil:^BOOL{ return complete; }]; - + XCTAssertFalse(called1 || called2, @"Should not have called either callback"); } - (void) testEnsureOnly5ItemsAreKept { __block FIRDataSnapshot * snap = nil; FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; __block int count = 0; [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { snap = snapshot; count++; }]; - + [ref setValue:nil]; for (int i = 0; i < 10; ++i) { [[ref childByAutoId] setValue:[NSNumber numberWithInt:i]]; } - + [self waitUntil:^BOOL{ // The initial set triggers the callback, so we need to wait for 11 events return count == 11; }]; - + count = 5; for (FIRDataSnapshot * snapshot in snap.children) { NSNumber* num = [snapshot value]; @@ -329,26 +329,26 @@ XCTAssertTrue([num isEqualToNumber:current], @"Expect children in order"); count++; } - + XCTAssertTrue(count == 10, @"Expected 5 children"); } - (void) testOnlyLast5SentFromServer { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; __block int count = 0; - + [ref setValue:nil]; - + for (int i = 0; i < 10; ++i) { [[ref childByAutoId] setValue:[NSNumber numberWithInt:i] withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { count++; }]; } - + [self waitUntil:^BOOL{ return count == 10; }]; - + FIRDatabaseQuery * query = [ref queryLimitedToLast:5]; count = 5; [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -359,7 +359,7 @@ count++; } }]; - + [self waitUntil:^BOOL{ return count == 10; }]; @@ -374,17 +374,17 @@ [expectations addQuery:[[[ref queryOrderedByPriority] queryEndingAtValue:nil] queryLimitedToLast:2] withExpectation:@{@"b": @2, @"c": @3}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryEndingAtValue:nil] queryLimitedToLast:3] withExpectation:@{@"a": @1, @"b": @2, @"c": @3}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryEndingAtValue:nil] queryLimitedToLast:4] withExpectation:@{@"a": @1, @"b": @2, @"c": @3}]; - - + + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + [expectations validate]; } @@ -397,51 +397,51 @@ [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:nil childKey:@"b"] queryLimitedToFirst:1] withExpectation:@{@"b": @2}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:nil childKey:@"b"] queryLimitedToFirst:2] withExpectation:@{@"b": @2, @"c": @3}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:nil childKey:@"b"] queryLimitedToFirst:3] withExpectation:@{@"b": @2, @"c": @3}]; - - + + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + [expectations validate]; } - (void) testLimitsAndStartAtWithServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + FTestExpectations* expectations = [[FTestExpectations alloc] initFrom:self]; [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:nil] queryLimitedToFirst:1] withExpectation:@{@"a": @1}]; - + /*params = [[FQueryParams alloc] init]; params = [params setStartPriority:nil andName:@"c"]; params = [params limitTo:1]; [expectations addQuery:[ref queryWithParams:params] withExpectation:@{@"c": @3}]; - + params = [[FQueryParams alloc] init]; params = [params setStartPriority:nil andName:@"b"]; params = [params limitTo:1]; [expectations addQuery:[ref queryWithParams:params] withExpectation:@{@"b": @2}]; - + params = [[FQueryParams alloc] init]; params = [params setStartPriority:nil andName:@"b"]; params = [params limitTo:2]; [expectations addQuery:[ref queryWithParams:params] withExpectation:@{@"b": @2, @"c": @3}]; - + params = [[FQueryParams alloc] init]; params = [params setStartPriority:nil andName:@"b"]; params = [params limitTo:3]; @@ -456,7 +456,7 @@ - (void) testChildEventsAreFiredWhenLimitIsHit { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; NSMutableArray* removed = [[NSMutableArray alloc] init]; [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { @@ -467,30 +467,30 @@ [removed addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"d"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[@"b"]; XCTAssertTrue([removed isEqualToArray:expected], @"Expected to remove b"); expected = @[@"d"]; @@ -500,16 +500,16 @@ - (void) testChildEventsAreFiredWhenLimitIsHitWithServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; NSMutableArray* removed = [[NSMutableArray alloc] init]; FIRDatabaseQuery * query = [ref queryLimitedToLast:2]; @@ -521,25 +521,25 @@ [removed addObject:[snapshot key]]; }]; - + [self waitUntil:^BOOL{ return [added count] == 2; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"d"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[@"b"]; XCTAssertTrue([removed isEqualToArray:expected], @"Expected to remove b"); expected = @[@"d"]; @@ -562,30 +562,30 @@ [removed addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"a", @"b"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"aa"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[@"b"]; XCTAssertTrue([removed isEqualToArray:expected], @"Expected to remove b"); expected = @[@"aa"]; @@ -595,12 +595,12 @@ - (void) testChildEventsAreFiredWhenLimitIsHitWithStartAndServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -616,25 +616,25 @@ [removed addObject:[snapshot key]]; }]; - + [self waitUntil:^BOOL{ return [added count] == 2; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"a", @"b"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"aa"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[@"b"]; XCTAssertTrue([removed isEqualToArray:expected], @"Expected to remove b"); expected = @[@"aa"]; @@ -655,30 +655,30 @@ [removed addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; [ref setValue:@{@"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready && [added count] >= 1; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have one item"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([removed count] == 0, @"Expected to remove nothing"); expected = @[@"b"]; XCTAssertTrue([added isEqualToArray:expected], @"Expected to add b"); @@ -687,12 +687,12 @@ - (void) testStartAndLimitWithIncompleteWindowAndServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{@"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -709,25 +709,25 @@ [removed addObject:[snapshot key]]; }]; - + [self waitUntil:^BOOL{ return [added count] == 1; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have one item"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([removed count] == 0, @"Expected to remove nothing"); expected = @[@"b"]; XCTAssertTrue([added isEqualToArray:expected], @"Expected to add b"); @@ -738,7 +738,7 @@ FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; FIRDatabaseQuery * query = [ref queryLimitedToLast:2]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; NSMutableArray* removed = [[NSMutableArray alloc] init]; [query observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { @@ -748,26 +748,26 @@ [removed addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready && [added count] >= 1; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have one item"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -781,18 +781,18 @@ -(void) testChildEventsAreFiredWhenItemDeletedAtServer { FIRDatabaseReference * ref = [FTestHelpers getRandomNodeWithoutPersistence]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + FIRDatabaseQuery * query = [ref queryLimitedToLast:2]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; NSMutableArray* removed = [[NSMutableArray alloc] init]; [query observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { @@ -803,21 +803,21 @@ [removed addObject:[snapshot key]]; }]; - + [self waitUntil:^BOOL{ return [added count] == 2; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -840,26 +840,26 @@ [removed addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; [ref setValue:@{@"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready && [added count] >= 1; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have one item"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -872,18 +872,18 @@ -(void) testRemoveFiredWhenItemDeletedAtServer { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{@"b": @2, @"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + FIRDatabaseQuery * query = [ref queryLimitedToLast:2]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; NSMutableArray* removed = [[NSMutableArray alloc] init]; [query observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { @@ -894,21 +894,21 @@ [removed addObject:[snapshot key]]; }]; - + [self waitUntil:^BOOL{ return [added count] == 2; }]; - + XCTAssertTrue([removed count] == 0, @"Nothing should be removed from our window"); NSArray* expected = @[@"b", @"c"]; XCTAssertTrue([added isEqualToArray:expected], @"Should have two items"); - + [added removeAllObjects]; ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -922,15 +922,15 @@ - (void) testStartAtPriorityAndEndAtPriorityWork { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; FTestExpectations* expectations = [[FTestExpectations alloc] initFrom:self]; - + [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:@"w"] queryEndingAtValue:@"y"] withExpectation:@{@"b": @2, @"c": @3, @"d": @4}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:@"w"] queryEndingAtValue:@"w"] withExpectation:@{@"d": @4}]; - + __block id nullSnap = @"dummy"; [[[[ref queryOrderedByPriority] queryStartingAtValue:@"a"] queryEndingAtValue:@"c"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { nullSnap = [snapshot value]; }]; - + [ref setValue:@{ @"a": @{@".value": @1, @".priority": @"z"}, @"b": @{@".value": @2, @".priority": @"y"}, @@ -939,13 +939,13 @@ }]; WAIT_FOR(expectations.isReady && [nullSnap isEqual:[NSNull null]]); - + [expectations validate]; } - (void) testStartAtPriorityAndEndAtPriorityWorkWithServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [ref setValue:@{ @"a": @{@".value": @1, @".priority": @"z"}, @@ -957,19 +957,19 @@ }]; WAIT_FOR(ready); - + FTestExpectations* expectations = [[FTestExpectations alloc] initFrom:self]; - + [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:@"w"] queryEndingAtValue:@"y"] withExpectation:@{@"b": @2, @"c": @3, @"d": @4}]; [expectations addQuery:[[[ref queryOrderedByPriority] queryStartingAtValue:@"w"] queryEndingAtValue:@"w"] withExpectation:@{@"d": @4}]; - + __block id nullSnap = @"dummy"; [[[[ref queryOrderedByPriority] queryStartingAtValue:@"a"] queryEndingAtValue:@"c"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { nullSnap = [snapshot value]; }]; - + WAIT_FOR(expectations.isReady && [nullSnap isEqual:[NSNull null]]); - + [expectations validate]; } @@ -985,16 +985,16 @@ query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"c"] queryEndingAtValue:@2]; [expectations addQuery:query withExpectation:@{@"c": @3, @"d": @4}]; - + [ref setValue:@{ @"a": @{@".value": @1, @".priority": @1}, @"b": @{@".value": @2, @".priority": @1}, @"c": @{@".value": @3, @".priority": @2}, @"d": @{@".value": @4, @".priority": @2} }]; - + WAIT_FOR(expectations.isReady); - + [expectations validate]; } @@ -1009,9 +1009,9 @@ } withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + WAIT_FOR(ready); - + FTestExpectations* expectations = [[FTestExpectations alloc] initFrom:self]; FIRDatabaseQuery * query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"a"] queryEndingAtValue:@2 childKey:@"d"]; @@ -1022,9 +1022,9 @@ query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"c"] queryEndingAtValue:@2]; [expectations addQuery:query withExpectation:@{@"c": @3, @"d": @4}]; - + WAIT_FOR(expectations.isReady); - + [expectations validate]; } @@ -1040,16 +1040,16 @@ query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"e"] queryEndingAtValue:@2]; [expectations addQuery:query withExpectation:@{@"a": @1, @"b": @2}]; - + [ref setValue:@{ @"c": @{@".value": @3, @".priority": @1}, @"d": @{@".value": @4, @".priority": @1}, @"a": @{@".value": @1, @".priority": @2}, @"b": @{@".value": @2, @".priority": @2} }]; - + WAIT_FOR(expectations.isReady); - + [expectations validate]; } @@ -1064,9 +1064,9 @@ } withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + WAIT_FOR(ready); - + FTestExpectations* expectations = [[FTestExpectations alloc] initFrom:self]; FIRDatabaseQuery * query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"c"] queryEndingAtValue:@2 childKey:@"b"]; @@ -1077,9 +1077,9 @@ query = [[[ref queryOrderedByPriority] queryStartingAtValue:@1 childKey:@"e"] queryEndingAtValue:@2]; [expectations addQuery:query withExpectation:@{@"a": @1, @"b": @2}]; - + WAIT_FOR(expectations.isReady); - + [expectations validate]; } @@ -1190,7 +1190,7 @@ - (void) testPrevNameWorks { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSMutableArray* added = [[NSMutableArray alloc] init]; [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeChildAdded andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *snapshot, NSString *prevName) { @@ -1202,31 +1202,31 @@ } }]; - + [[ref child:@"a"] setValue:@1]; [self waitUntil:^BOOL{ NSArray* expected = @[@"a", @"null"]; return [added isEqualToArray:expected]; }]; - + [added removeAllObjects]; - + [[ref child:@"c"] setValue:@3]; [self waitUntil:^BOOL{ NSArray* expected = @[@"c", @"a"]; return [added isEqualToArray:expected]; }]; - + [added removeAllObjects]; - + [[ref child:@"b"] setValue:@2]; [self waitUntil:^BOOL{ NSArray* expected = @[@"b", @"null"]; return [added isEqualToArray:expected]; }]; - + [added removeAllObjects]; - + [[ref child:@"d"] setValue:@3]; [self waitUntil:^BOOL{ NSArray* expected = @[@"d", @"c"]; @@ -1238,7 +1238,7 @@ - (void) testPrevNameWorksWithMoves { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSMutableArray* moved = [[NSMutableArray alloc] init]; [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeChildMoved andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *snapshot, NSString *prevName) { @@ -1249,56 +1249,56 @@ [moved addObject:@"null"]; } }]; - + [ref setValue:@{ @"a": @{@".value": @"a", @".priority": @10}, @"b": @{@".value": @"b", @".priority": @20}, @"c": @{@".value": @"c", @".priority": @30}, @"d": @{@".value": @"d", @".priority": @40} }]; - + __block BOOL ready = NO; [[ref child:@"c"] setPriority:@50 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSArray* expected = @[@"c", @"d"]; XCTAssertTrue([moved isEqualToArray:expected], @"Expected changed node and prevChild"); - + [moved removeAllObjects]; ready = NO; [[ref child:@"c"] setPriority:@35 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[@"c", @"null"]; XCTAssertTrue([moved isEqualToArray:expected], @"Expected changed node and prevChild"); - + [moved removeAllObjects]; ready = NO; [[ref child:@"b"] setPriority:@33 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + expected = @[]; XCTAssertTrue([moved isEqualToArray:expected], @"Expected changed node and prevChild to be empty"); } - (void) testLocalEvents { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSMutableArray* events = [[NSMutableArray alloc] init]; [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { NSString *eventString = [NSString stringWithFormat:@"%@ added", [snapshot value]]; @@ -1309,7 +1309,7 @@ NSString *eventString = [NSString stringWithFormat:@"%@ removed", [snapshot value]]; [events addObject:eventString]; }]; - + __block BOOL ready = NO; for (int i = 0; i < 5; ++i) { [[ref childByAutoId] setValue:[NSNumber numberWithInt:i] withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { @@ -1318,11 +1318,11 @@ } }]; } - + [self waitUntil:^BOOL{ return ready; }]; - + NSArray* expected = @[@"0 added", @"1 added", @"0 removed", @"2 added", @"1 removed", @"3 added", @"2 removed", @"4 added"]; XCTAssertTrue([events isEqualToArray:expected], @"Expecting window to stay at two nodes"); } @@ -1331,7 +1331,7 @@ FTupleFirebase* pair = [FTestHelpers getRandomNodePair]; FIRDatabaseReference * writer = pair.one; FIRDatabaseReference * reader = pair.two; - + NSMutableArray* events = [[NSMutableArray alloc] init]; [[reader queryLimitedToLast:2] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { @@ -1343,11 +1343,11 @@ NSString *oldEventString = [NSString stringWithFormat:@"%@ added", [snapshot value]]; [events removeObject:oldEventString]; }]; - + for (int i = 0; i < 5; ++i) { [[writer childByAutoId] setValue:[NSNumber numberWithInt:i]]; } - + NSArray* expected = @[@"3 added", @"4 added"]; [self waitUntil:^BOOL{ return [events isEqualToArray:expected]; @@ -1356,12 +1356,12 @@ - (void) testLimitOnEmptyNodeFiresValue { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; [[ref queryLimitedToLast:1] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -1369,7 +1369,7 @@ - (void) testFilteringToNullPriorities { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + // Note: cannot set nil in a dictionary, just leave out priority [ref setValue:@{ @"a": @0, @@ -1378,7 +1378,7 @@ @"d": @{@".priority": @3, @".value": @3}, @"e": @{@".priority": @"hi", @".value": @4} }]; - + __block BOOL ready = NO; [[[[ref queryOrderedByPriority] queryStartingAtValue:nil] queryEndingAtValue:nil] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { NSDictionary *expected = @{@"a" : @0, @"b" : @1}; @@ -1386,7 +1386,7 @@ XCTAssertTrue([val isEqualToDictionary:expected], @"Expected only null priority keys"); ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -1394,7 +1394,7 @@ - (void) testNullPrioritiesIncludedInEndAt { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + // Note: cannot set nil in a dictionary, just leave out priority [ref setValue:@{ @"a": @0, @@ -1403,7 +1403,7 @@ @"d": @{@".priority": @3, @".value": @3}, @"e": @{@".priority": @"hi", @".value": @4} }]; - + __block BOOL ready = NO; [[[ref queryOrderedByPriority] queryEndingAtValue:@2] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { NSDictionary *expected = @{@"a" : @0, @"b" : @1, @"c" : @2}; @@ -1411,7 +1411,7 @@ XCTAssertTrue([val isEqualToDictionary:expected], @"Expected up to priority 2"); ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -1462,7 +1462,7 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected child listener"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1476,7 +1476,7 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected parent listener"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1489,11 +1489,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Child listener should be back"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [[ref child:@"a"] removeAllObservers]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1501,10 +1501,10 @@ XCTAssertTrue(listens.count == 0, @"No more listeners"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; - }]; + }]; } - (void) testDedupeListensOnGrandchild { @@ -1520,7 +1520,7 @@ [ref observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { }]; - + dispatch_async([FIRDatabaseQuery sharedQueue], ^{ listens = [self dumpListensForRef:ref]; NSSet* expected = [self expectDefaultListenerAtPath:[FPath empty]]; @@ -1565,7 +1565,7 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected grandchild"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1582,7 +1582,7 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected two grandchildren"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1596,11 +1596,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected parent listener to override"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [ref removeAllObservers]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1612,11 +1612,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected grandchild listeners to return"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [[ref child:@"a/aa"] removeAllObservers]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1625,11 +1625,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Expected one listener"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [[ref child:@"a/bb"] removeAllObservers]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1637,7 +1637,7 @@ XCTAssertTrue(listens.count == 0, @"No more listeners"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1647,7 +1647,7 @@ FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; __block NSSet* listens = [self dumpListensForRef:ref]; XCTAssertTrue(listens.count == 0, @"No Listens yet"); - + __block BOOL ready = NO; FIRDatabaseQuery * aLim1 = [[ref child:@"a"] queryLimitedToLast:1]; FIRDatabaseHandle handle1 = [aLim1 observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -1660,11 +1660,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Single query"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; FIRDatabaseQuery * rootLim1 = [ref queryLimitedToLast:1]; FIRDatabaseHandle handle2 = [rootLim1 observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -1680,11 +1680,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Two queries"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; FIRDatabaseQuery * aLim5 = [[ref child:@"a"] queryLimitedToLast:5]; FIRDatabaseHandle handle3 = [aLim5 observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -1694,7 +1694,7 @@ FQueryParams* expectedParams1 = [[FQueryParams alloc] init]; expectedParams1 = [expectedParams1 limitTo:1]; NSSet* rootExpected = [self expectParams:expectedParams1 atPath:[FPath empty]]; - + FQueryParams* expectedParams2 = [[FQueryParams alloc] init]; expectedParams2 = [expectedParams2 limitTo:5]; NSSet* childExpected = [self expectParamssetValue:[NSSet setWithObjects:expectedParams1, expectedParams2, nil] atPath:[FPath pathWithString:@"/a"]]; @@ -1703,11 +1703,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Three queries"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [ref removeObserverWithHandle:handle2]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1720,11 +1720,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Two queries"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [aLim1 removeObserverWithHandle:handle1]; [aLim5 removeObserverWithHandle:handle3]; ready = NO; @@ -1733,7 +1733,7 @@ XCTAssertTrue(listens.count == 0, @"No more listeners"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1743,7 +1743,7 @@ FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; __block NSSet* listens = [self dumpListensForRef:ref]; XCTAssertTrue(listens.count == 0, @"No Listens yet"); - + __block BOOL ready = NO; FIRDatabaseQuery * aLim1 = [[ref child:@"a"] queryLimitedToLast:1]; FIRDatabaseHandle handle1 = [aLim1 observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -1756,11 +1756,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Single query"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; FIRDatabaseQuery * bLim1 = [[ref child:@"b"] queryLimitedToLast:1]; FIRDatabaseHandle handle2 = [bLim1 observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -1776,11 +1776,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Two queries"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; FIRDatabaseHandle handle3 = [ref observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { }]; @@ -1790,11 +1790,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Parent should override"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + // remove in slightly random order [aLim1 removeObserverWithHandle:handle1]; ready = NO; @@ -1804,11 +1804,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Parent should override"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + [ref removeObserverWithHandle:handle3]; ready = NO; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1819,11 +1819,11 @@ XCTAssertTrue([expected isEqualToSet:listens], @"Single query"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; [bLim1 removeObserverWithHandle:handle2]; dispatch_async([FIRDatabaseQuery sharedQueue], ^{ @@ -1831,7 +1831,7 @@ XCTAssertTrue(listens.count == 0, @"No more listeners"); ready = YES; }); - + [self waitUntil:^BOOL{ return ready; }]; @@ -1839,13 +1839,13 @@ -(void) testLimitWithMixOfNullAndNonNullPriorities { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSMutableArray* children = [[NSMutableArray alloc] init]; [[ref queryLimitedToLast:5] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { [children addObject:[snapshot key]]; }]; - + __block BOOL ready = NO; NSDictionary* toSet = @{ @"Vikrum": @{@".priority": @1000, @"score": @1000, @"name": @"Vikrum"}, @@ -1855,23 +1855,23 @@ @"Sally": @{@".priority": @-7, @"score": @-7, @"name": @"Sally"}, @"Fred": @{@"score": @0, @"name": @"Fred"} }; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSArray* expected = @[@"Sally", @"James", @"Andrew", @"Mike", @"Vikrum"]; XCTAssertTrue([children isEqualToArray:expected], @"Null priority should be left out"); - + } -(void) testLimitWithMixOfNullAndNonNullPrioritiesOnServerData { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; NSDictionary* toSet = @{ @"Vikrum": @{@".priority": @1000, @"score": @1000, @"name": @"Vikrum"}, @@ -1881,15 +1881,15 @@ @"Sally": @{@".priority": @-7, @"score": @-7, @"name": @"Sally"}, @"Fred": @{@"score": @0, @"name": @"Fred"} }; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + __block int count = 0; NSMutableArray* children = [[NSMutableArray alloc] init]; @@ -1897,15 +1897,15 @@ [children addObject:[snapshot key]]; count++; }]; - + [self waitUntil:^BOOL{ return count == 5; }]; - - + + NSArray* expected = @[@"Sally", @"James", @"Andrew", @"Mike", @"Vikrum"]; XCTAssertTrue([children isEqualToArray:expected], @"Null priority should be left out"); - + } // Skipping context tests. Context is not implemented on iOS @@ -1915,9 +1915,9 @@ just the modified children? Not sure. - (void) testHandleUpdateThatDeletesEntireWindow { Firebase* ref = [FTestHelpers getRandomNode]; - + NSMutableArray* snaps = [[NSMutableArray alloc] init]; - + [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { id val = [snapshot value]; if (val == nil) { @@ -1926,25 +1926,25 @@ [snaps addObject:val]; } }]; - + NSDictionary* toSet = @{ @"a": @{@".priority": @1, @".value": @1}, @"b": @{@".priority": @2, @".value": @2}, @"c": @{@".priority": @3, @".value": @3} }; - + [ref setValue:toSet]; - + __block BOOL ready = NO; toSet = @{@"b": [NSNull null], @"c": [NSNull null]}; [ref updateChildValues:toSet withCompletionBlock:^(NSError* err, Firebase* ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSArray* expected = @[@{@"b": @2, @"c": @3}, [NSNull null], @{@"a": @1}]; STAssertTrue([snaps isEqualToArray:expected], @"Expected %@ to equal %@", snaps, expected); } @@ -1952,41 +1952,41 @@ - (void) testHandlesAnOutOfViewQueryOnAChild { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block NSDictionary* parent = nil; [[ref queryLimitedToLast:1] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { parent = [snapshot value]; }]; - + __block NSNumber* child = nil; [[ref child:@"a"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { child = [snapshot value]; }]; - + __block BOOL ready = NO; NSDictionary* toSet = @{@"a": @1, @"b": @2}; [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSDictionary* parentExpected = @{@"b": @2}; NSNumber* childExpected = [NSNumber numberWithInt:1]; XCTAssertTrue([parent isEqualToDictionary:parentExpected], @"Expected last element"); XCTAssertTrue([child isEqualToNumber:childExpected], @"Expected value of a"); - + ready = NO; [ref updateChildValues:@{@"c": @3} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + parentExpected = @{@"c": @3}; XCTAssertTrue([parent isEqualToDictionary:parentExpected], @"Expected last element"); XCTAssertTrue([child isEqualToNumber:childExpected], @"Expected value of a"); @@ -1994,50 +1994,50 @@ - (void) testHandlesAChildQueryGoingOutOfViewOfTheParent { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block NSDictionary* parent = nil; [[ref queryLimitedToLast:1] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { parent = [snapshot value]; }]; - + __block NSNumber* child = nil; [[ref child:@"a"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { child = [snapshot value]; }]; - + __block BOOL ready = NO; NSDictionary* toSet = @{@"a": @1}; [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + WAIT_FOR(ready); - + NSDictionary* parentExpected = @{@"a": @1}; NSNumber* childExpected = [NSNumber numberWithInt:1]; XCTAssertTrue([parent isEqualToDictionary:parentExpected], @"Expected last element"); XCTAssertTrue([child isEqualToNumber:childExpected], @"Expected value of a"); - + ready = NO; [[ref child:@"b"] setValue:@2 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + WAIT_FOR(ready); - + parentExpected = @{@"b": @2}; XCTAssertTrue([parent isEqualToDictionary:parentExpected], @"Expected last element"); XCTAssertTrue([child isEqualToNumber:childExpected], @"Expected value of a"); - + ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + parentExpected = @{@"a": @1}; XCTAssertTrue([parent isEqualToDictionary:parentExpected], @"Expected last element"); XCTAssertTrue([child isEqualToNumber:childExpected], @"Expected value of a"); @@ -2045,7 +2045,7 @@ - (void) testHandlesDivergingViews { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block NSDictionary* cVal = nil; FIRDatabaseQuery * query = [[[ref queryOrderedByPriority] queryEndingAtValue:nil childKey:@"c"] queryLimitedToLast:1]; [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -2063,24 +2063,24 @@ [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSDictionary* expected = @{@"c": @3}; XCTAssertTrue([cVal isEqualToDictionary:expected], @"should be c"); XCTAssertTrue([dVal isEqualToDictionary:expected], @"should be c"); - + ready = NO; [[ref child:@"d"] setValue:@4 withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([cVal isEqualToDictionary:expected], @"should be c"); expected = @{@"d": @4}; XCTAssertTrue([dVal isEqualToDictionary:expected], @"should be d"); @@ -2088,7 +2088,7 @@ - (void) testHandlesRemovingAQueriedElement { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block NSNumber* val = nil; [[ref queryLimitedToLast:1] observeEventType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { id newVal = [snapshot value]; @@ -2096,27 +2096,27 @@ val = [snapshot value]; } }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([val isEqualToNumber:@2], @"Expected last element in window"); - + ready = NO; [[ref child:@"b"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([val isEqualToNumber:@1], @"Should now be the next element in the window"); } @@ -2131,16 +2131,16 @@ val = [snapshot value]; } }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([val isEqualToNumber:@1], @"Expected first element in window"); } @@ -2156,50 +2156,50 @@ val = [snapshot value]; } }]; - + __block BOOL ready = NO; [ref setValue:@{@"a": @1, @"b": @2} withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([val isEqualToNumber:@1], @"Expected first element in window"); - + ready = NO; [[ref child:@"a"] removeValueWithCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([val isEqualToNumber:@2], @"Expected next element in window"); } // See case 1169 - (void) testStartAtWithTwoArgumentsWorks { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; NSMutableArray* children = [[NSMutableArray alloc] init]; - + NSDictionary* toSet = @{ @"Walker": @{@"name": @"Walker", @"score": @20, @".priority": @20}, @"Michael": @{@"name": @"Michael", @"score": @100, @".priority": @100} }; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; FIRDatabaseQuery * query = [[[ref queryOrderedByPriority] queryStartingAtValue:@20 childKey:@"Walker"] queryLimitedToFirst:2]; [query observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -2209,32 +2209,32 @@ } ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSArray* expected = @[@"Walker", @"Michael"]; XCTAssertTrue([children isEqualToArray:expected], @"Expected both children"); } - (void) testHandlesMultipleQueriesOnSameNode { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; - + NSDictionary* toSet = @{ @"a": @1, @"b": @2, @"c": @3, @"d": @4, @"e": @5, @"f": @6 }; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; __block BOOL called = NO; [[ref queryLimitedToLast:2] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -2243,11 +2243,11 @@ called = YES; ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; __block NSDictionary* snap = nil; // now do nested once calls @@ -2258,95 +2258,95 @@ ready = YES; }]; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSDictionary* expected = @{@"f": @6}; XCTAssertTrue([snap isEqualToDictionary:expected], @"Expected the correct data"); } - (void) testHandlesOnceCalledOnNodeWithDefaultListener { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; - + NSDictionary* toSet = @{ @"a": @1, @"b": @2, @"c": @3, @"d": @4, @"e": @5, @"f": @6 }; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; [ref observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // we got the initial data ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; - + __block NSNumber* snap = nil; [[ref queryLimitedToLast:1] observeSingleEventOfType:FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot *snapshot) { snap = [snapshot value]; ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + XCTAssertTrue([snap isEqualToNumber:@6], @"Got once response"); } - (void) testHandlesOnceCalledOnNodeWithDefaultListenerAndNonCompleteLimit { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL ready = NO; - + NSDictionary* toSet = @{@"a": @1, @"b": @2, @"c": @3}; - + [ref setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; // do first listen [ref observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; - + __block NSDictionary* snap = nil; [[ref queryLimitedToLast:5] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { snap = [snapshot value]; ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + NSDictionary* expected = @{@"a": @1, @"b": @2, @"c": @3}; XCTAssertTrue([snap isEqualToDictionary:expected], @"Got once response"); } @@ -2355,19 +2355,19 @@ FTupleFirebase* tuple = [FTestHelpers getRandomNodePair]; FIRDatabaseReference * writer = tuple.one; FIRDatabaseReference * reader = tuple.two; - + __block BOOL ready = NO; - + NSDictionary* toSet = @{@"a": @"a", @"b": @"b", @"c": @"c", @"d": @"d", @"e": @"e"}; - + [writer setValue:toSet withCompletionBlock:^(NSError* err, FIRDatabaseReference * ref) { ready = YES; }]; - + [self waitUntil:^BOOL{ return ready; }]; - + ready = NO; __block int count = 0; @@ -2386,7 +2386,7 @@ ready = YES; } }]; - + [self waitUntil:^BOOL{ return ready; }]; @@ -2394,7 +2394,7 @@ - (void) testEndingAtNameReturnsCorrectChildren { FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + NSDictionary* toSet = @{ @"a": @"a", @"b": @"b", @@ -2633,9 +2633,9 @@ - (void) testItemsPulledIntoLimitCorrectly { FIRDatabaseReference *ref = [FTestHelpers getRandomNode]; - + NSMutableArray* snaps = [[NSMutableArray alloc] init]; - + // Just so everything is cached locally. [ref observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { @@ -2645,20 +2645,20 @@ id val = [snapshot value]; [snaps addObject:val]; }]; - + [ref setValue:@{ @"a": @{@".value": @1, @".priority": @1}, @"b": @{@".value": @2, @".priority": @2}, @"c": @{@".value": @3, @".priority": @3} }]; - + __block BOOL ready = NO; [[ref child:@"b"] setValue:[NSNull null] withCompletionBlock:^(NSError *error, FIRDatabaseReference *ref) { ready = YES; }]; WAIT_FOR(ready); - + NSArray* expected = @[@{@"b": @2, @"c": @3}, @{@"a": @1, @"c": @3}]; XCTAssertEqualObjects(snaps, expected, @"Incorrect snapshots."); } @@ -2753,23 +2753,23 @@ // one-time listener. Event removal code path wasn't removing the listener because it stopped as soon as it // found the default view. This left the zombie one-time listener and check failed on the second attempt to // create a listener for the same path (asana#61028598952586). - + FIRDatabaseReference * ref = [FTestHelpers getRandomNode]; - + __block BOOL done = NO; - + [[ref child:@"child"] setValue:@{@"name": @"John"}]; [[[ref queryOrderedByChild:@"name"] queryEqualToValue:@"John"] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { done = YES; }]; WAIT_FOR(done); - + done = NO; [[[ref child:@"child"] child:@"favoriteToy"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { done = YES; }]; WAIT_FOR(done); - + done = NO; [[[ref child:@"child"] child:@"favoriteToy"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { done = YES; |