@@ -17,13 +17,15 @@ import ConcurrencyExtras
1717
1818final class AuthClientTests : XCTestCase {
1919 var eventEmitter : MockEventEmitter !
20+ var sessionManager : MockSessionManager !
2021
2122 var sut : AuthClient !
2223
2324 override func setUp( ) {
2425 super. setUp ( )
2526
2627 eventEmitter = MockEventEmitter ( )
28+ sessionManager = MockSessionManager ( )
2729 sut = makeSUT ( )
2830 }
2931
@@ -38,66 +40,60 @@ final class AuthClientTests: XCTestCase {
3840
3941 sut = nil
4042 eventEmitter = nil
43+ sessionManager = nil
4144 }
4245
4346 func testOnAuthStateChanges( ) async {
4447 let session = Session . validSession
48+ sessionManager. returnSession = . success( session)
4549
4650 let events = LockIsolated ( [ AuthChangeEvent] ( ) )
4751
48- await withDependencies {
49- $0. sessionManager. session = { @Sendable _ in session }
50- } operation: {
51- let handle = await sut. onAuthStateChange { event, _ in
52- events. withValue {
53- $0. append ( event)
54- }
52+ let handle = await sut. onAuthStateChange { event, _ in
53+ events. withValue {
54+ $0. append ( event)
5555 }
56- addTeardownBlock { [ weak handle] in
57- XCTAssertNil ( handle, " handle should be deallocated " )
58- }
59-
60- XCTAssertEqual ( events. value, [ . initialSession] )
6156 }
57+ addTeardownBlock { [ weak handle] in
58+ XCTAssertNil ( handle, " handle should be deallocated " )
59+ }
60+
61+ XCTAssertEqual ( events. value, [ . initialSession] )
6262 }
6363
6464 func testAuthStateChanges( ) async throws {
6565 let session = Session . validSession
66+ sessionManager. returnSession = . success( session)
6667
6768 let events = ActorIsolated ( [ AuthChangeEvent] ( ) )
6869
6970 let ( stream, continuation) = AsyncStream< Void> . makeStream( )
7071
71- await withDependencies {
72- $0. sessionManager. session = { @Sendable _ in session }
73- } operation: {
74- let authStateStream = await sut. authStateChanges
75-
76- let streamTask = Task {
77- for await (event, _) in authStateStream {
78- await events. withValue {
79- $0. append ( event)
80- }
72+ let authStateStream = await sut. authStateChanges
8173
82- continuation. yield ( )
74+ let streamTask = Task {
75+ for await (event, _) in authStateStream {
76+ await events. withValue {
77+ $0. append ( event)
8378 }
79+
80+ continuation. yield ( )
8481 }
82+ }
8583
86- _ = await stream. first { _ in true }
84+ _ = await stream. first { _ in true }
8785
88- let events = await events. value
89- XCTAssertEqual ( events , [ . initialSession] )
86+ let receivedEvents = await events. value
87+ XCTAssertEqual ( receivedEvents , [ . initialSession] )
9088
91- streamTask. cancel ( )
92- }
89+ streamTask. cancel ( )
9390 }
9491
9592 func testSignOut( ) async throws {
93+ sessionManager. returnSession = . success( . validSession)
94+
9695 try await withDependencies {
9796 $0. api. execute = { _ in . stub( ) }
98- $0. sessionManager = . live
99- $0. sessionStorage = . inMemory
100- try $0. sessionStorage. storeSession ( StoredSession ( session: . validSession) )
10197 } operation: {
10298 try await sut. signOut ( )
10399
@@ -108,30 +104,27 @@ final class AuthClientTests: XCTestCase {
108104 XCTFail ( " Unexpected error. " )
109105 }
110106
111- XCTAssertEqual ( eventEmitter. emitReceivedParams. value . map ( \. 0 ) , [ . signedOut] )
107+ XCTAssertEqual ( eventEmitter. emitReceivedParams. map ( \. 0 ) , [ . signedOut] )
112108 }
113109 }
114110
115111 func testSignOutWithOthersScopeShouldNotRemoveLocalSession( ) async throws {
112+ sessionManager. returnSession = . success( . validSession)
113+
116114 try await withDependencies {
117115 $0. api. execute = { _ in . stub( ) }
118- $0. sessionManager = . live
119- $0. sessionStorage = . inMemory
120- try $0. sessionStorage. storeSession ( StoredSession ( session: . validSession) )
121116 } operation: {
122117 try await sut. signOut ( scope: . others)
123118
124- // Session should still be valid.
125- _ = try await sut. session
119+ XCTAssertFalse ( sessionManager. removeCalled)
126120 }
127121 }
128122
129123 func testSignOutShouldRemoveSessionIfUserIsNotFound( ) async throws {
130- try await withDependencies {
124+ sessionManager. returnSession = . success( . validSession)
125+
126+ await withDependencies {
131127 $0. api. execute = { _ in throw AuthError . api ( AuthError . APIError ( code: 404 ) ) }
132- $0. sessionManager = . live
133- $0. sessionStorage = . inMemory
134- try $0. sessionStorage. storeSession ( StoredSession ( session: . validSession) )
135128 } operation: {
136129 do {
137130 try await sut. signOut ( )
@@ -140,23 +133,23 @@ final class AuthClientTests: XCTestCase {
140133 XCTFail ( " Unexpected error: \( error) " )
141134 }
142135
143- let emitedParams = eventEmitter. emitReceivedParams. value
136+ let emitedParams = eventEmitter. emitReceivedParams
144137 let emitedEvents = emitedParams. map ( \. 0 )
145138 let emitedSessions = emitedParams. map ( \. 1 )
146139
147140 XCTAssertEqual ( emitedEvents, [ . signedOut] )
148141 XCTAssertEqual ( emitedSessions. count, 1 )
149142 XCTAssertNil ( emitedSessions [ 0 ] )
150- XCTAssertNil ( try Dependencies . current. value!. sessionStorage. getSession ( ) )
143+
144+ XCTAssertEqual ( sessionManager. removeCallCount, 1 )
151145 }
152146 }
153147
154148 func testSignOutShouldRemoveSessionIfJWTIsInvalid( ) async throws {
155- try await withDependencies {
149+ sessionManager. returnSession = . success( . validSession)
150+
151+ await withDependencies {
156152 $0. api. execute = { _ in throw AuthError . api ( AuthError . APIError ( code: 401 ) ) }
157- $0. sessionManager = . live
158- $0. sessionStorage = . inMemory
159- try $0. sessionStorage. storeSession ( StoredSession ( session: . validSession) )
160153 } operation: {
161154 do {
162155 try await sut. signOut ( )
@@ -165,14 +158,15 @@ final class AuthClientTests: XCTestCase {
165158 XCTFail ( " Unexpected error: \( error) " )
166159 }
167160
168- let emitedParams = eventEmitter. emitReceivedParams. value
161+ let emitedParams = eventEmitter. emitReceivedParams
169162 let emitedEvents = emitedParams. map ( \. 0 )
170163 let emitedSessions = emitedParams. map ( \. 1 )
171164
172165 XCTAssertEqual ( emitedEvents, [ . signedOut] )
173166 XCTAssertEqual ( emitedSessions. count, 1 )
174167 XCTAssertNil ( emitedSessions [ 0 ] )
175- XCTAssertNil ( try Dependencies . current. value!. sessionStorage. getSession ( ) )
168+
169+ XCTAssertEqual ( sessionManager. removeCallCount, 1 )
176170 }
177171 }
178172
@@ -186,7 +180,7 @@ final class AuthClientTests: XCTestCase {
186180
187181 let sut = AuthClient (
188182 configuration: configuration,
189- sessionManager: . mock ,
183+ sessionManager: sessionManager ,
190184 codeVerifierStorage: . mock,
191185 api: . mock,
192186 eventEmitter: eventEmitter,
0 commit comments