diff --git a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift index d6297fbd3..540dcca40 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSModelStoreListener.swift @@ -47,7 +47,7 @@ extension OSModelStoreListener { store.changeSubscription.subscribe(self) } - func close() { + public func close() { store.changeSubscription.unsubscribe(self) } diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift index 2a605bc26..f2d971be4 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift @@ -120,7 +120,7 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager { var identityModelRepo = OSIdentityModelRepo() - private var hasCalledStart = false + var hasCalledStart = false private var jwtExpiredHandler: OSJwtExpiredHandler? @@ -139,7 +139,7 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager { return user } - private var _user: OSUserInternal? + var _user: OSUserInternal? // This is a user instance to operate on when there is no app_id and/or privacy consent yet, effectively no-op. // The models are not added to any model stores. diff --git a/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift index e0eb6facd..cedfb6868 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUserMocks/OneSignalUserMocks.swift @@ -36,46 +36,47 @@ public class OneSignalUserMocks: NSObject { public static func reset() { resetStaticUserExecutor() - resetUserManager() + // TODO: Reset Operation Repo first + // OSCoreMocks.resetOperationRepo() + OneSignalUserManagerImpl.sharedInstance.reset() } public static func resetStaticUserExecutor() { OSUserExecutor.userRequestQueue.removeAll() OSUserExecutor.transferSubscriptionRequestQueue.removeAll() } +} + +extension OSIdentityModelRepo { + func reset() { + self.models = [:] + } +} - /** +extension OneSignalUserManagerImpl { + /** User Manager needs to reset between tests until we dependency inject the User Manager. For example, executors it owns may have cached requests or deltas that would have carried over. This is adapting as more data needs to be considered and reset... */ - public static func resetUserManager() { - OneSignalUserManagerImpl.sharedInstance.identityModelRepo.reset() - - OneSignalUserManagerImpl.sharedInstance.identityModelStore.clearModelsFromStore() - OneSignalUserManagerImpl.sharedInstance.propertiesModelStore.clearModelsFromStore() - OneSignalUserManagerImpl.sharedInstance.subscriptionModelStore.clearModelsFromStore() - OneSignalUserManagerImpl.sharedInstance.pushSubscriptionModelStore.clearModelsFromStore() + func reset() { + identityModelRepo.reset() - let propertyExecutor = OSPropertyOperationExecutor() - let identityExecutor = OSIdentityOperationExecutor() - let subscriptionExecutor = OSSubscriptionOperationExecutor() + // Model store listeners unsubscribe to their models + // User Manager start() will subscribe them + identityModelStoreListener.close() + propertiesModelStoreListener.close() + subscriptionModelStoreListener.close() + pushSubscriptionModelStoreListener.close() - OneSignalUserManagerImpl.sharedInstance.propertyExecutor = propertyExecutor - OneSignalUserManagerImpl.sharedInstance.identityExecutor = identityExecutor - OneSignalUserManagerImpl.sharedInstance.subscriptionExecutor = subscriptionExecutor + // Executor instances do no need to be reset, they are initailized in start() - // TODO: Reset Operation Repo first - // OSCoreMocks.resetOperationRepo() + identityModelStore.clearModelsFromStore() + propertiesModelStore.clearModelsFromStore() + subscriptionModelStore.clearModelsFromStore() + pushSubscriptionModelStore.clearModelsFromStore() - OSOperationRepo.sharedInstance.addExecutor(identityExecutor) - OSOperationRepo.sharedInstance.addExecutor(propertyExecutor) - OSOperationRepo.sharedInstance.addExecutor(subscriptionExecutor) - } -} - -extension OSIdentityModelRepo { - func reset() { - self.models = [:] + _user = nil + hasCalledStart = false } }