Skip to content

Commit 7d5db5e

Browse files
committed
Update tests after JWT listener API change
1 parent b5ae642 commit 7d5db5e

File tree

6 files changed

+109
-87
lines changed

6 files changed

+109
-87
lines changed

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
3C4F9E4428A4466C009F453A /* OSOperationRepo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4F9E4328A4466C009F453A /* OSOperationRepo.swift */; };
9090
3C5117172B15C31E00563465 /* OSUserState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5117162B15C31E00563465 /* OSUserState.swift */; };
9191
3C5929E32CAD9EC50020D6FF /* OneSignalUserManagerImpl+OSLoggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5929E22CAD9EC50020D6FF /* OneSignalUserManagerImpl+OSLoggable.swift */; };
92+
3C5929E52CAE523E0020D6FF /* MockUserJwtInvalidatedListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C5929E42CAE523E0020D6FF /* MockUserJwtInvalidatedListener.swift */; };
9293
3C62999F2BEEA34800649187 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C62999E2BEEA34800649187 /* PrivacyInfo.xcprivacy */; };
9394
3C6299A12BEEA38100649187 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C6299A02BEEA38100649187 /* PrivacyInfo.xcprivacy */; };
9495
3C6299A32BEEA3CC00649187 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3C6299A22BEEA3CC00649187 /* PrivacyInfo.xcprivacy */; };
@@ -1251,6 +1252,7 @@
12511252
3C4F9E4328A4466C009F453A /* OSOperationRepo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSOperationRepo.swift; sourceTree = "<group>"; };
12521253
3C5117162B15C31E00563465 /* OSUserState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSUserState.swift; sourceTree = "<group>"; };
12531254
3C5929E22CAD9EC50020D6FF /* OneSignalUserManagerImpl+OSLoggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OneSignalUserManagerImpl+OSLoggable.swift"; sourceTree = "<group>"; };
1255+
3C5929E42CAE523E0020D6FF /* MockUserJwtInvalidatedListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUserJwtInvalidatedListener.swift; sourceTree = "<group>"; };
12541256
3C62999E2BEEA34800649187 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
12551257
3C6299A02BEEA38100649187 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
12561258
3C6299A22BEEA3CC00649187 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
@@ -2210,6 +2212,7 @@
22102212
3C8706712BDEE076000D8CD2 /* MockUserDefines.swift */,
22112213
3CC063E52B6D7F96002BB07F /* OneSignalUserMocks.swift */,
22122214
DE3568EB2C88F5BD00AF447C /* OneSignalExecutorMocks.swift */,
2215+
3C5929E42CAE523E0020D6FF /* MockUserJwtInvalidatedListener.swift */,
22132216
);
22142217
path = OneSignalUserMocks;
22152218
sourceTree = "<group>";
@@ -4167,6 +4170,7 @@
41674170
3C8706702BDE0957000D8CD2 /* MockUserRequests.swift in Sources */,
41684171
3C8706722BDEE076000D8CD2 /* MockUserDefines.swift in Sources */,
41694172
3CC063E62B6D7F96002BB07F /* OneSignalUserMocks.swift in Sources */,
4173+
3C5929E52CAE523E0020D6FF /* MockUserJwtInvalidatedListener.swift in Sources */,
41704174
DE3568EC2C88F5BD00AF447C /* OneSignalExecutorMocks.swift in Sources */,
41714175
);
41724176
runOnlyForDeploymentPostprocessing = 0;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
Modified MIT License
3+
4+
Copyright 2024 OneSignal
5+
6+
Permission is hereby granted, free of charge, to any person obtaining a copy
7+
of this software and associated documentation files (the "Software"), to deal
8+
in the Software without restriction, including without limitation the rights
9+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
copies of the Software, and to permit persons to whom the Software is
11+
furnished to do so, subject to the following conditions:
12+
13+
1. The above copyright notice and this permission notice shall be included in
14+
all copies or substantial portions of the Software.
15+
16+
2. All copies of substantial portions of the Software may only be used in connection
17+
with services provided by OneSignal.
18+
19+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
THE SOFTWARE.
26+
*/
27+
28+
import OneSignalUser
29+
30+
public class MockUserJwtInvalidatedListener: OSUserJwtInvalidatedListener {
31+
public var invalidatedCallbackWasCalled = false
32+
private var callback: (() -> Void)?
33+
34+
public init() { }
35+
36+
public func setCallback(_ callback: @escaping () -> Void) {
37+
self.callback = callback
38+
}
39+
40+
public func onUserJwtInvalidated(event: OSUserJwtInvalidatedEvent) {
41+
invalidatedCallbackWasCalled = true
42+
43+
guard let callback = callback else { return }
44+
callback()
45+
}
46+
}

iOS_SDK/OneSignalSDK/OneSignalUserTests/Executors/IdentityExecutorTests.swift

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,16 @@ final class IdentityExecutorTests: XCTestCase {
125125
MockUserRequests.setUnauthorizedAddAliasFailureResponse(with: mocks.client, aliases: aliases)
126126
mocks.identityExecutor.enqueueDelta(OSDelta(name: OS_ADD_ALIAS_DELTA, identityModelId: user.identityModel.modelId, model: user.identityModel, property: "aliases", value: aliases))
127127

128-
var invalidatedCallbackWasCalled = false
129-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
130-
invalidatedCallbackWasCalled = true
131-
}
128+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
129+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
132130

133131
/* When */
134132
mocks.identityExecutor.processDeltaQueue(inBackground: false)
135133
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
136134

137135
/* Then */
138136
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestAddAliases.self))
139-
XCTAssertTrue(invalidatedCallbackWasCalled)
137+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
140138
}
141139

142140
func testRemoveAlias_IdentityVerificationRequired_withInvalidToken_firesCallback() {
@@ -151,18 +149,16 @@ final class IdentityExecutorTests: XCTestCase {
151149
MockUserRequests.setUnauthorizedRemoveAliasFailureResponse(with: mocks.client, aliasLabel: userA_AliasLabel)
152150
mocks.identityExecutor.enqueueDelta(OSDelta(name: OS_REMOVE_ALIAS_DELTA, identityModelId: user.identityModel.modelId, model: user.identityModel, property: "aliases", value: aliases))
153151

154-
var invalidatedCallbackWasCalled = false
155-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
156-
invalidatedCallbackWasCalled = true
157-
}
152+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
153+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
158154

159155
/* When */
160156
mocks.identityExecutor.processDeltaQueue(inBackground: false)
161157
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
162158

163159
/* Then */
164160
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestRemoveAlias.self))
165-
XCTAssertTrue(invalidatedCallbackWasCalled)
161+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
166162
}
167163

168164
func testAddAliasRequests_Retry_OnTokenUpdate() {
@@ -182,20 +178,20 @@ final class IdentityExecutorTests: XCTestCase {
182178
MockUserRequests.setUnauthorizedAddAliasFailureResponse(with: mocks.client, aliases: userA_Aliases)
183179
executor.enqueueDelta(OSDelta(name: OS_ADD_ALIAS_DELTA, identityModelId: user.identityModel.modelId, model: user.identityModel, property: "aliases", value: aliases))
184180

185-
var invalidatedCallbackWasCalled = false
186-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
187-
invalidatedCallbackWasCalled = true
181+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
182+
userJwtInvalidatedListener.setCallback {
188183
MockUserRequests.setAddAliasesResponse(with: mocks.client, aliases: aliases)
189184
OneSignalUserManagerImpl.sharedInstance.updateUserJwt(externalId: userA_EUID, token: userA_ValidJwtToken)
190185
}
186+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
191187

192188
/* When */
193189
executor.processDeltaQueue(inBackground: false)
194190
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
195191

196192
/* Then */
197193
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestAddAliases.self))
198-
XCTAssertTrue(invalidatedCallbackWasCalled)
194+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
199195
XCTAssertEqual(mocks.client.networkRequestCount, 2)
200196
}
201197

@@ -219,10 +215,8 @@ final class IdentityExecutorTests: XCTestCase {
219215
executor.enqueueDelta(OSDelta(name: OS_ADD_ALIAS_DELTA, identityModelId: userA.identityModel.modelId, model: userA.identityModel, property: "aliases", value: aliases))
220216
executor.enqueueDelta(OSDelta(name: OS_ADD_ALIAS_DELTA, identityModelId: userB.identityModel.modelId, model: userB.identityModel, property: "aliases", value: aliases))
221217

222-
var invalidatedCallbackWasCalled = false
223-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
224-
invalidatedCallbackWasCalled = true
225-
}
218+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
219+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
226220

227221
/* When */
228222
executor.processDeltaQueue(inBackground: false)
@@ -236,7 +230,7 @@ final class IdentityExecutorTests: XCTestCase {
236230
/* Then */
237231
// The executor should execute this request since identity verification is required and the token was set
238232
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestAddAliases.self))
239-
XCTAssertTrue(invalidatedCallbackWasCalled)
233+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
240234
let addAliasRequests = mocks.client.executedRequests.filter { request in
241235
request.isKind(of: OSRequestAddAliases.self)
242236
}
@@ -263,10 +257,8 @@ final class IdentityExecutorTests: XCTestCase {
263257
executor.enqueueDelta(OSDelta(name: OS_REMOVE_ALIAS_DELTA, identityModelId: userA.identityModel.modelId, model: userA.identityModel, property: "aliases", value: aliases))
264258
executor.enqueueDelta(OSDelta(name: OS_REMOVE_ALIAS_DELTA, identityModelId: userB.identityModel.modelId, model: userB.identityModel, property: "aliases", value: aliases))
265259

266-
var invalidatedCallbackWasCalled = false
267-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
268-
invalidatedCallbackWasCalled = true
269-
}
260+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
261+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
270262

271263
/* When */
272264
executor.processDeltaQueue(inBackground: false)
@@ -279,7 +271,7 @@ final class IdentityExecutorTests: XCTestCase {
279271
/* Then */
280272
// The executor should execute this request since identity verification is required and the token was set
281273
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestRemoveAlias.self))
282-
XCTAssertTrue(invalidatedCallbackWasCalled)
274+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
283275
let removeAliasRequests = mocks.client.executedRequests.filter { request in
284276
request.isKind(of: OSRequestRemoveAlias.self)
285277
}

iOS_SDK/OneSignalSDK/OneSignalUserTests/Executors/PropertyExecutorTests.swift

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,16 @@ final class PropertyExecutorTests: XCTestCase {
126126
MockUserRequests.setUnauthorizedUpdatePropertiesFailureResponses(with: mocks.client, tags: tags)
127127
mocks.propertyExecutor.enqueueDelta(OSDelta(name: OS_UPDATE_PROPERTIES_DELTA, identityModelId: user.identityModel.modelId, model: OSPropertiesModel(changeNotifier: OSEventProducer()), property: "tags", value: tags))
128128

129-
var invalidatedCallbackWasCalled = false
130-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
131-
invalidatedCallbackWasCalled = true
132-
}
129+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
130+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
133131

134132
/* When */
135133
mocks.propertyExecutor.processDeltaQueue(inBackground: false)
136134
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
137135

138136
/* Then */
139137
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestUpdateProperties.self))
140-
XCTAssertTrue(invalidatedCallbackWasCalled)
138+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
141139
}
142140

143141
func testUpdateRequests_Retry_OnTokenUpdate() {
@@ -157,20 +155,20 @@ final class PropertyExecutorTests: XCTestCase {
157155
MockUserRequests.setUnauthorizedUpdatePropertiesFailureResponses(with: mocks.client, tags: tags)
158156
executor.enqueueDelta(OSDelta(name: OS_UPDATE_PROPERTIES_DELTA, identityModelId: user.identityModel.modelId, model: OSPropertiesModel(changeNotifier: OSEventProducer()), property: "tags", value: tags))
159157

160-
var invalidatedCallbackWasCalled = false
161-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
162-
invalidatedCallbackWasCalled = true
158+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
159+
userJwtInvalidatedListener.setCallback {
163160
MockUserRequests.setAddTagsResponse(with: mocks.client, tags: tags)
164161
OneSignalUserManagerImpl.sharedInstance.updateUserJwt(externalId: userA_EUID, token: userA_ValidJwtToken)
165162
}
163+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
166164

167165
/* When */
168166
executor.processDeltaQueue(inBackground: false)
169167
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
170168

171169
/* Then */
172170
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestUpdateProperties.self))
173-
XCTAssertTrue(invalidatedCallbackWasCalled)
171+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
174172
XCTAssertEqual(mocks.client.networkRequestCount, 2)
175173
}
176174

@@ -194,10 +192,8 @@ final class PropertyExecutorTests: XCTestCase {
194192
executor.enqueueDelta(OSDelta(name: OS_UPDATE_PROPERTIES_DELTA, identityModelId: userA.identityModel.modelId, model: OSPropertiesModel(changeNotifier: OSEventProducer()), property: "tags", value: tags))
195193
executor.enqueueDelta(OSDelta(name: OS_UPDATE_PROPERTIES_DELTA, identityModelId: userB.identityModel.modelId, model: OSPropertiesModel(changeNotifier: OSEventProducer()), property: "tags", value: tags))
196194

197-
var invalidatedCallbackWasCalled = false
198-
OneSignalUserManagerImpl.sharedInstance.User.onJwtInvalidated { _ in
199-
invalidatedCallbackWasCalled = true
200-
}
195+
let userJwtInvalidatedListener = MockUserJwtInvalidatedListener()
196+
OneSignalUserManagerImpl.sharedInstance.addUserJwtInvalidatedListener(userJwtInvalidatedListener)
201197

202198
/* When */
203199
executor.processDeltaQueue(inBackground: false)
@@ -211,7 +207,7 @@ final class PropertyExecutorTests: XCTestCase {
211207
/* Then */
212208
// The executor should execute this request since identity verification is required and the token was set
213209
XCTAssertTrue(mocks.client.hasExecutedRequestOfType(OSRequestUpdateProperties.self))
214-
XCTAssertTrue(invalidatedCallbackWasCalled)
210+
XCTAssertTrue(userJwtInvalidatedListener.invalidatedCallbackWasCalled)
215211
let updateRequests = mocks.client.executedRequests.filter { request in
216212
request.isKind(of: OSRequestUpdateProperties.self)
217213
}

0 commit comments

Comments
 (0)