Skip to content

Commit 6601c0f

Browse files
committed
Fix failing tests
* Fix testPushNotificationToken, observer will be always null if permission consent is required * Fix testCallingMethodsWorks_beforeInit, OneSignalLocationOverrider data needs to be reset * Fix testSubscriptionChangeObserverBasic, testSubscriptionChangeObserverBasic, _registerUserFinished need to be reset
1 parent b1b234b commit 6601c0f

File tree

6 files changed

+35
-10
lines changed

6 files changed

+35
-10
lines changed

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,8 @@ + (void)clearStatics {
489489
_outcomeEventsCache = nil;
490490
_outcomeEventFactory = nil;
491491
_outcomeEventsController = nil;
492+
493+
_registerUserFinished = false;
492494
}
493495

494496
// Set to false as soon as it's read.

iOS_SDK/OneSignalSDK/Source/OneSignalLocation.m

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,13 @@ + (void)internalGetLocation:(bool)prompt fallbackToSettings:(BOOL)fallback {
204204
if ([self started]) {
205205
// We evaluate the following cases after permissions were asked (denied or given)
206206
CLAuthorizationStatus permissionStatus = (int)[clLocationManagerClass performSelector:@selector(authorizationStatus)];
207+
BOOL showSettings = prompt && fallback && permissionStatus == kCLAuthorizationStatusDenied;
208+
[OneSignal onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"internalGetLocation called showSettings: %@", showSettings ? @"YES" : @"NO"]];
207209
// Fallback to settings alert view when the following condition are true:
208210
// - On a prompt flow
209211
// - Fallback to settings is enabled
210212
// - Permission were denied
211-
if (prompt && fallback && permissionStatus == kCLAuthorizationStatusDenied)
213+
if (showSettings)
212214
[self showLocationSettingsAlertController];
213215
else
214216
[self sendCurrentAuthStatusToListeners];
@@ -224,8 +226,10 @@ + (void)internalGetLocation:(bool)prompt fallbackToSettings:(BOOL)fallback {
224226

225227
CLAuthorizationStatus permissionStatus = (int)[clLocationManagerClass performSelector:@selector(authorizationStatus)];
226228
// return if permission not determined and should not prompt
227-
if (permissionStatus == kCLAuthorizationStatusNotDetermined && !prompt)
229+
if (permissionStatus == kCLAuthorizationStatusNotDetermined && !prompt) {
230+
onesignal_Log(ONE_S_LL_DEBUG, @"internalGetLocation kCLAuthorizationStatusNotDetermined.");
228231
return;
232+
}
229233

230234
[self sendCurrentAuthStatusToListeners];
231235
locationManager = [[clLocationManagerClass alloc] init];
@@ -238,7 +242,12 @@ + (void)internalGetLocation:(bool)prompt fallbackToSettings:(BOOL)fallback {
238242
NSArray* backgroundModes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIBackgroundModes"];
239243
NSString* alwaysDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"] ?: [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysAndWhenInUseUsageDescription"];
240244
// use background location updates if always permission granted or prompt allowed
241-
if (backgroundModes && [backgroundModes containsObject:@"location"] && alwaysDescription && (permissionStatus == kCLAuthorizationStatusAuthorizedAlways || prompt)) {
245+
BOOL backgroundLocationEnable = backgroundModes && [backgroundModes containsObject:@"location"] && alwaysDescription;
246+
BOOL permissionEnable = permissionStatus == kCLAuthorizationStatusAuthorizedAlways || prompt;
247+
248+
[OneSignal onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"internalGetLocation called backgroundLocationEnable: %@ permissionEnable: %@", backgroundLocationEnable ? @"YES" : @"NO", permissionEnable ? @"YES" : @"NO"]];
249+
250+
if (backgroundLocationEnable && permissionEnable) {
242251
#pragma clang diagnostic push
243252
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
244253
[locationManager performSelector:NSSelectorFromString(@"requestAlwaysAuthorization")];

iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalLocationOverrider.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
@interface OneSignalLocationOverrider : NSObject
3232

33+
+ (void)reset;
3334
+ (bool)overrideStarted;
3435
+ (void)grantLocationServices;
3536
+ (int)overrideAuthorizationStatus;

iOS_SDK/OneSignalSDK/UnitTests/Shadows/OneSignalLocationOverrider.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ + (void)load {
7373
locations = @[location];
7474
}
7575

76+
+ (void)reset {
77+
// Reset request flags
78+
calledRequestAlwaysAuthorization = false;
79+
calledRequestWhenInUseAuthorization = false;
80+
}
81+
7682
+ (bool)overrideStarted {
7783
return startedMock;
7884
}

iOS_SDK/OneSignalSDK/UnitTests/UnitTestCommonMethods.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#import "OneSignalTrackFirebaseAnalytics.h"
5858
#import "OSMessagingControllerOverrider.h"
5959
#import "OneSignalLifecycleObserver.h"
60+
#import "OneSignalLocationOverrider.h"
6061

6162
NSString * serverUrlWithPath(NSString *path) {
6263
return [OS_API_SERVER_URL stringByAppendingString:path];
@@ -208,6 +209,7 @@ + (void)clearStateForAppRestart:(XCTestCase *)testCase {
208209
[OneSignal setLogLevel:ONE_S_LL_INFO visualLevel:ONE_S_LL_NONE];
209210

210211
[NSTimerOverrider reset];
212+
[OneSignalLocationOverrider reset];
211213

212214
[OSMessagingController.sharedInstance resetState];
213215

@@ -419,6 +421,11 @@ - (void)onOSSubscriptionChanged:(OSSubscriptionStateChanges*)stateChanges {
419421
last = stateChanges;
420422
fireCount++;
421423
}
424+
425+
- (NSString *)description {
426+
return [NSString stringWithFormat:@"OSSubscriptionStateTestObserver last: %@ fireCount: %d", last, fireCount];
427+
}
428+
422429
@end
423430

424431
@implementation OSEmailSubscriptionStateTestObserver

iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,6 +1870,7 @@ - (void)testPushNotificationToken {
18701870
[OneSignal setAppId:@"b2f7f966-d8cc-11e4-bed1-df8f05be55ba"];
18711871
[OneSignal initWithLaunchOptions:nil];
18721872

1873+
// Subscription observer won't be trigger since it needs for register user to fire, register user won't fire due to privacy consent needed
18731874
OSSubscriptionStateTestObserver* observer = [OSSubscriptionStateTestObserver new];
18741875
[OneSignal addSubscriptionObserver:observer];
18751876

@@ -1878,17 +1879,16 @@ - (void)testPushNotificationToken {
18781879
[NSObjectOverrider runPendingSelectors];
18791880
[UnitTestCommonMethods runBackgroundThreads];
18801881

1881-
XCTAssertNil(observer->last.from.userId);
1882-
XCTAssertNil(observer->last.to.userId);
1883-
XCTAssertFalse(observer->last.to.isSubscribed);
1882+
// Chack that observer data is nil
1883+
XCTAssertNil(observer->last);
1884+
XCTAssertEqual(0, observer->fireCount);
18841885

18851886
[OneSignal disablePush:true]; //This should not result in a a change in state because we are waiting on privacy
18861887
[UnitTestCommonMethods runBackgroundThreads];
18871888

1888-
XCTAssertTrue(observer->last.from.isPushDisabled); //Initial from is that push is disabled
1889-
XCTAssertFalse(observer->last.to.isPushDisabled); //Default value after adding an observer is that push is not disabled
1890-
// Device registered with OneSignal so now make pushToken available.
1891-
XCTAssertNil(observer->last.to.pushToken);
1889+
// Chack that observer data is still nil
1890+
XCTAssertNil(observer->last);
1891+
XCTAssertEqual(0, observer->fireCount);
18921892

18931893
[NSBundleOverrider setPrivacyState:false];
18941894
}

0 commit comments

Comments
 (0)