forked from parse-community/Parse-SDK-iOS-OSX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LocationManagerMobileTests.m
138 lines (97 loc) · 5.33 KB
/
LocationManagerMobileTests.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
@import CoreLocation;
@import UIKit;
#import <OCMock/OCMock.h>
#import "PFLocationManager.h"
#import "PFUnitTestCase.h"
/**
We do this because OCMock does not allow you to stub -respondsToSelector:, so we force it to bend to our will using a
protocol mock.
TODO: (richardross) Update this to use a traditional mock once OCMock supports it.
*/
@protocol PFTestCLLocationManagerInterfaceWithoutAlwaysAuth <NSObject>
@property (assign, nonatomic) id<CLLocationManagerDelegate> delegate;
- (void)startUpdatingLocation;
- (void)stopUpdatingLocation;
@end
@protocol PFTestCLLocationManagerInterfaceWithAlwaysAuth <PFTestCLLocationManagerInterfaceWithoutAlwaysAuth>
- (void)requestWhenInUseAuthorization;
- (void)requestAlwaysAuthorization;
@end
@interface LocationManagerMobileTests : PFUnitTestCase
@end
@implementation LocationManagerMobileTests
- (void)testAddBlockWithForegroundAuthorization {
CLLocation *expectedLocation = [[CLLocation alloc] initWithLatitude:13.37 longitude:1337];
id mockedApplication = PFStrictClassMock([UIApplication class]);
id mockedBundle = PFStrictClassMock([NSBundle class]);
id mockedSystemLocationManager = PFStrictProtocolMock(@protocol(PFTestCLLocationManagerInterfaceWithAlwaysAuth));
__block __weak id<CLLocationManagerDelegate> delegate = nil;
OCMStub([mockedSystemLocationManager setDelegate:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) {
__unsafe_unretained id argument = nil;
[invocation getArgument:&argument atIndex:2];
delegate = argument;
});
OCMExpect([mockedSystemLocationManager startUpdatingLocation]).andDo(^(NSInvocation *invoke) {
[delegate locationManager:mockedSystemLocationManager didUpdateLocations:@[ expectedLocation ]];
});
OCMExpect([mockedSystemLocationManager stopUpdatingLocation]);
OCMExpect([mockedSystemLocationManager requestWhenInUseAuthorization]);
OCMStub([mockedApplication applicationState]).andReturn(UIApplicationStateActive);
OCMStub([mockedBundle objectForInfoDictionaryKey:[OCMArg checkWithBlock:^BOOL(id obj) {
return [obj isEqualToString:@"NSLocationWhenInUseUsageDescription"];
}]]).andReturn(@"foreground");
PFLocationManager *locationManager = [[PFLocationManager alloc] initWithSystemLocationManager:mockedSystemLocationManager
application:mockedApplication
bundle:mockedBundle];
XCTestExpectation *expectation = [self currentSelectorTestExpectation];
[locationManager addBlockForCurrentLocation:^(CLLocation *location, NSError *error) {
XCTAssertNil(error);
XCTAssertEqual(location.coordinate.latitude, 13.37);
XCTAssertEqual(location.coordinate.longitude, 1337);
[expectation fulfill];
}];
[self waitForTestExpectations];
OCMVerifyAll(mockedSystemLocationManager);
}
- (void)testAddBlockWithBackgroundAuthorization {
CLLocation *expectedLocation = [[CLLocation alloc] initWithLatitude:13.37 longitude:1337];
id mockedApplication = PFStrictClassMock([UIApplication class]);
id mockedBundle = PFStrictClassMock([NSBundle class]);
id mockedSystemLocationManager = PFStrictProtocolMock(@protocol(PFTestCLLocationManagerInterfaceWithAlwaysAuth));
__block __weak id<CLLocationManagerDelegate> delegate = nil;
OCMStub([mockedSystemLocationManager setDelegate:OCMOCK_ANY]).andDo(^(NSInvocation *invocation) {
__unsafe_unretained id argument = nil;
[invocation getArgument:&argument atIndex:2];
delegate = argument;
});
OCMExpect([mockedSystemLocationManager startUpdatingLocation]).andDo(^(NSInvocation *invoke) {
[delegate locationManager:mockedSystemLocationManager didUpdateLocations:@[ expectedLocation ]];
});
OCMExpect([mockedSystemLocationManager stopUpdatingLocation]);
OCMExpect([mockedSystemLocationManager requestAlwaysAuthorization]);
OCMStub([mockedApplication applicationState]).andReturn(UIApplicationStateActive);
OCMStub([mockedBundle objectForInfoDictionaryKey:[OCMArg checkWithBlock:^BOOL(id obj) {
return [obj isEqualToString:@"NSLocationWhenInUseUsageDescription"];
}]]).andReturn(nil);
PFLocationManager *locationManager = [[PFLocationManager alloc] initWithSystemLocationManager:mockedSystemLocationManager
application:mockedApplication
bundle:mockedBundle];
XCTestExpectation *expectation = [self currentSelectorTestExpectation];
[locationManager addBlockForCurrentLocation:^(CLLocation *location, NSError *error) {
XCTAssertNil(error);
XCTAssertEqual(location.coordinate.latitude, 13.37);
XCTAssertEqual(location.coordinate.longitude, 1337);
[expectation fulfill];
}];
[self waitForTestExpectations];
OCMVerifyAll(mockedSystemLocationManager);
}
@end