@@ -207,4 +207,131 @@ final class UserExecutorTests: XCTestCase {
207207 XCTAssertTrue ( mocks. client. hasExecutedRequestOfType ( OSRequestCreateUser . self) )
208208 XCTAssertTrue ( mocks. newRecordsState. records. isEmpty)
209209 }
210+
211+ func testCreateUser_IdentityVerificationRequired_butNoToken( ) {
212+ /* Setup */
213+ let mocks = Mocks ( )
214+ mocks. setAuthRequired ( true )
215+
216+ let _ = mocks. setUserManagerInternalUser ( externalId: " " )
217+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_EXTERNAL_ID: userA_EUID] , changeNotifier: OSEventProducer ( ) )
218+ MockUserRequests . setDefaultCreateUserResponses ( with: mocks. client, externalId: userA_EUID)
219+
220+ /* When */
221+ mocks. userExecutor. createUser ( aliasLabel: OS_EXTERNAL_ID, aliasId: userA_EUID, identityModel: newIdentityModel)
222+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
223+
224+ /* Then */
225+ // The executor should not execute this request since identity verification is required, but no token was set
226+ XCTAssertFalse ( mocks. client. hasExecutedRequestOfType ( OSRequestCreateUser . self) )
227+ XCTAssertEqual ( mocks. newRecordsState. records. count, 0 )
228+ }
229+
230+ func testCreateUser_IdentityVerificationRequired_withToken( ) {
231+ /* Setup */
232+ let mocks = Mocks ( )
233+ mocks. setAuthRequired ( true )
234+
235+ let _ = mocks. setUserManagerInternalUser ( externalId: " " )
236+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_EXTERNAL_ID: userA_EUID] , changeNotifier: OSEventProducer ( ) )
237+ newIdentityModel. jwtBearerToken = userA_JwtToken
238+ MockUserRequests . setDefaultCreateUserResponses ( with: mocks. client, externalId: userA_EUID)
239+
240+ /* When */
241+ mocks. userExecutor. createUser ( aliasLabel: OS_EXTERNAL_ID, aliasId: userA_EUID, identityModel: newIdentityModel)
242+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
243+
244+ /* Then */
245+ // The executor should execute this request since identity verification is required and the token was set
246+ XCTAssertTrue ( mocks. client. hasExecutedRequestOfType ( OSRequestCreateUser . self) )
247+ }
248+
249+ func testCreateUser_IdentityVerificationRequired_withInvalidToken( ) {
250+ /* Setup */
251+ let mocks = Mocks ( )
252+ mocks. setAuthRequired ( true )
253+
254+ let _ = mocks. setUserManagerInternalUser ( externalId: userA_EUID)
255+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_EXTERNAL_ID: userA_EUID] , changeNotifier: OSEventProducer ( ) )
256+ newIdentityModel. jwtBearerToken = userA_JwtToken
257+ MockUserRequests . setUnauthorizedCreateUserFailureResponses ( with: mocks. client, externalId: userA_EUID)
258+
259+ var invalidatedCallbackWasCalled = false
260+ OneSignalUserManagerImpl . sharedInstance. User. onJwtInvalidated { event in
261+ XCTAssertTrue ( event. message == " token has invalid claims: token is expired " )
262+ invalidatedCallbackWasCalled = true
263+ }
264+
265+ /* When */
266+ mocks. userExecutor. createUser ( aliasLabel: OS_EXTERNAL_ID, aliasId: userA_EUID, identityModel: newIdentityModel)
267+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
268+
269+ /* Then */
270+ // The executor should execute this request since identity verification is required and the token was set
271+ XCTAssertTrue ( mocks. client. hasExecutedRequestOfType ( OSRequestCreateUser . self) )
272+ XCTAssertTrue ( invalidatedCallbackWasCalled)
273+ }
274+
275+ func testFetchUser_IdentityVerificationRequired_butNoToken( ) {
276+ /* Setup */
277+ let mocks = Mocks ( )
278+ mocks. setAuthRequired ( true )
279+
280+ let _ = mocks. setUserManagerInternalUser ( externalId: " " )
281+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_ONESIGNAL_ID: userA_OSID] , changeNotifier: OSEventProducer ( ) )
282+ MockUserRequests . setDefaultFetchUserResponseForHydration ( with: mocks. client, externalId: userA_EUID)
283+
284+ /* When */
285+ mocks. userExecutor. fetchUser ( onesignalId: userA_OSID, identityModel: newIdentityModel)
286+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
287+
288+ /* Then */
289+ // The executor should not execute this request since identity verification is required, but no token was set
290+ XCTAssertFalse ( mocks. client. hasExecutedRequestOfType ( OSRequestFetchUser . self) )
291+ }
292+
293+ func testFetchUser_IdentityVerificationRequired_withToken( ) {
294+ /* Setup */
295+ let mocks = Mocks ( )
296+ mocks. setAuthRequired ( true )
297+
298+ let _ = mocks. setUserManagerInternalUser ( externalId: " " )
299+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_ONESIGNAL_ID: userA_OSID, OS_EXTERNAL_ID: userA_EUID] , changeNotifier: OSEventProducer ( ) )
300+ newIdentityModel. jwtBearerToken = userA_JwtToken
301+ MockUserRequests . setDefaultFetchUserResponseForHydration ( with: mocks. client, externalId: userA_EUID)
302+
303+ /* When */
304+ mocks. userExecutor. fetchUser ( onesignalId: userA_OSID, identityModel: newIdentityModel)
305+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
306+
307+ /* Then */
308+ // The executor should not execute this request since identity verification is required, but no token was set
309+ XCTAssertTrue ( mocks. client. hasExecutedRequestOfType ( OSRequestFetchUser . self) )
310+ }
311+
312+ func testFetchUser_IdentityVerificationRequired_withInvalidToken( ) {
313+ /* Setup */
314+ let mocks = Mocks ( )
315+ mocks. setAuthRequired ( true )
316+
317+ let _ = mocks. setUserManagerInternalUser ( externalId: userA_EUID)
318+ let newIdentityModel = OSIdentityModel ( aliases: [ OS_ONESIGNAL_ID: userA_OSID, OS_EXTERNAL_ID: userA_EUID] , changeNotifier: OSEventProducer ( ) )
319+ newIdentityModel. jwtBearerToken = userA_JwtToken
320+ MockUserRequests . setUnauthorizedFetchUserFailureResponses ( with: mocks. client, onesignalId: userA_OSID)
321+
322+ var invalidatedCallbackWasCalled = false
323+ OneSignalUserManagerImpl . sharedInstance. User. onJwtInvalidated { event in
324+ XCTAssertTrue ( event. message == " token has invalid claims: token is expired " )
325+ invalidatedCallbackWasCalled = true
326+ }
327+
328+ /* When */
329+ mocks. userExecutor. fetchUser ( onesignalId: userA_OSID, identityModel: newIdentityModel)
330+ OneSignalCoreMocks . waitForBackgroundThreads ( seconds: 0.5 )
331+
332+ /* Then */
333+ // The executor should execute this request since identity verification is required and the token was set
334+ XCTAssertTrue ( mocks. client. hasExecutedRequestOfType ( OSRequestFetchUser . self) )
335+ XCTAssertTrue ( invalidatedCallbackWasCalled)
336+ }
210337}
0 commit comments