@@ -18,14 +18,14 @@ import org.junit.jupiter.api.extension.RegisterExtension
18
18
import org.mockito.Mockito.mockConstruction
19
19
import org.mockito.kotlin.any
20
20
import org.mockito.kotlin.argumentCaptor
21
+ import org.mockito.kotlin.atLeastOnce
21
22
import org.mockito.kotlin.doNothing
22
23
import org.mockito.kotlin.mock
23
24
import org.mockito.kotlin.spy
24
25
import org.mockito.kotlin.timeout
25
26
import org.mockito.kotlin.verify
26
27
import org.mockito.kotlin.verifyNoMoreInteractions
27
28
import org.mockito.kotlin.whenever
28
- import software.amazon.awssdk.regions.Region
29
29
import software.amazon.awssdk.services.ssooidc.SsoOidcClient
30
30
import software.aws.toolkits.core.telemetry.MetricEvent
31
31
import software.aws.toolkits.core.telemetry.TelemetryBatcher
@@ -36,8 +36,6 @@ import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileSsoSessi
36
36
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
37
37
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
38
38
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.InteractiveBearerTokenProvider
39
- import software.aws.toolkits.jetbrains.core.region.MockRegionProviderExtension
40
- import software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule
41
39
import software.aws.toolkits.jetbrains.services.telemetry.NoOpPublisher
42
40
import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
43
41
import software.aws.toolkits.jetbrains.settings.AwsSettings
@@ -51,9 +49,6 @@ class DefaultToolkitAuthManagerTest {
51
49
batcher : TelemetryBatcher
52
50
) : TelemetryService(publisher, batcher)
53
51
54
- @ExtendWith(MockRegionProviderExtension ::class )
55
- val regionProvider = MockRegionProviderRule ()
56
-
57
52
@JvmField
58
53
@RegisterExtension
59
54
val mockClientManager = MockClientManagerExtension ()
@@ -67,9 +62,13 @@ class DefaultToolkitAuthManagerTest {
67
62
@BeforeEach
68
63
fun setUp (@TestDisposable disposable : Disposable ) {
69
64
mockClientManager.create<SsoOidcClient >()
65
+
70
66
sut = DefaultToolkitAuthManager ()
71
67
ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
72
- connectionManager = DefaultToolkitConnectionManager ()
68
+
69
+ connectionManager = DefaultToolkitConnectionManager (projectRule.project)
70
+ projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
71
+
73
72
batcher = mock()
74
73
telemetryService = spy(TestTelemetryService (batcher = batcher))
75
74
ApplicationManager .getApplication().replaceService(TelemetryService ::class .java, telemetryService, disposable)
@@ -222,12 +221,7 @@ class DefaultToolkitAuthManagerTest {
222
221
}
223
222
224
223
@Test
225
- fun `loginSso with an working existing connection` (@TestDisposable disposable : Disposable ) {
226
- val connectionManager: ToolkitConnectionManager = mock()
227
- regionProvider.addRegion(Region .US_EAST_1 )
228
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
229
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
230
-
224
+ fun `loginSso with an working existing connection` () {
231
225
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
232
226
whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
233
227
}.use {
@@ -248,12 +242,7 @@ class DefaultToolkitAuthManagerTest {
248
242
}
249
243
250
244
@Test
251
- fun `loginSso with an existing connection but expired and refresh token is valid, should refreshToken` (@TestDisposable disposable : Disposable ) {
252
- val connectionManager = ToolkitConnectionManager .getInstance(projectRule.project)
253
- regionProvider.addRegion(Region .US_EAST_1 )
254
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
255
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
256
-
245
+ fun `loginSso with an existing connection but expired and refresh token is valid, should refreshToken` () {
257
246
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
258
247
whenever(context.id).thenReturn(" id" )
259
248
whenever(context.state()).thenReturn(BearerTokenAuthState .NEEDS_REFRESH )
@@ -276,13 +265,7 @@ class DefaultToolkitAuthManagerTest {
276
265
}
277
266
278
267
@Test
279
- fun `loginSso with an existing connection that token is invalid and there's no refresh token, should re-authenticate` (
280
- @TestDisposable disposable : Disposable
281
- ) {
282
- val connectionManager = ToolkitConnectionManager .getInstance(projectRule.project)
283
- regionProvider.addRegion(Region .US_EAST_1 )
284
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
285
-
268
+ fun `loginSso with an existing connection that token is invalid and there's no refresh token, should re-authenticate` () {
286
269
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
287
270
whenever(context.state()).thenReturn(BearerTokenAuthState .NOT_AUTHENTICATED )
288
271
}.use {
@@ -305,13 +288,12 @@ class DefaultToolkitAuthManagerTest {
305
288
306
289
@Test
307
290
fun `loginSso reuses connection if requested scopes are subset of existing` (@TestDisposable disposable : Disposable ) {
308
- val connectionManager = ToolkitConnectionManager .getInstance(projectRule.project)
309
- regionProvider.addRegion(Region .US_EAST_1 )
310
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
311
-
312
291
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
313
292
whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
314
293
}.use {
294
+ val connectionManager = spy(connectionManager)
295
+ projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
296
+
315
297
val existingConnection = sut.createConnection(
316
298
ManagedSsoProfile (
317
299
" us-east-1" ,
@@ -328,16 +310,12 @@ class DefaultToolkitAuthManagerTest {
328
310
verify(tokenProvider).state()
329
311
verifyNoMoreInteractions(tokenProvider)
330
312
assertThat(connectionManager.activeConnection()).isEqualTo(existingConnection)
313
+ verify(connectionManager, atLeastOnce()).switchConnection(existingConnection)
331
314
}
332
315
}
333
316
334
317
@Test
335
- fun `loginSso forces reauth if requested scopes are not complete subset` (@TestDisposable disposable : Disposable ) {
336
- regionProvider.addRegion(Region .US_EAST_1 )
337
-
338
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
339
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
340
-
318
+ fun `loginSso forces reauth if requested scopes are not complete subset` () {
341
319
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
342
320
whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
343
321
}.use {
@@ -364,14 +342,12 @@ class DefaultToolkitAuthManagerTest {
364
342
365
343
@Test
366
344
fun `loginSso with a new connection` (@TestDisposable disposable : Disposable ) {
367
- val connectionManager: ToolkitConnectionManager = mock()
368
- ApplicationManager .getApplication().replaceService(ToolkitAuthManager ::class .java, sut, disposable)
369
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
370
-
371
345
mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
372
346
doNothing().whenever(context).reauthenticate()
373
347
whenever(context.state()).thenReturn(BearerTokenAuthState .NOT_AUTHENTICATED )
374
348
}.use {
349
+ val connectionManager = spy(connectionManager)
350
+ projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
375
351
// before
376
352
assertThat(sut.listConnections()).hasSize(0 )
377
353
@@ -399,17 +375,14 @@ class DefaultToolkitAuthManagerTest {
399
375
400
376
@Test
401
377
fun `logoutFromConnection should invalidate the token provider and the connection and invoke callback` (@TestDisposable disposable : Disposable ) {
402
- regionProvider.addRegion(Region .US_EAST_1 )
403
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
404
-
405
378
val profile = ManagedSsoProfile (" us-east-1" , " startUrl000" , listOf (" scopes" ))
406
- val connection = ToolkitAuthManager .getInstance() .createConnection(profile) as ManagedBearerSsoConnection
379
+ val connection = sut .createConnection(profile) as ManagedBearerSsoConnection
407
380
connectionManager.switchConnection(connection)
408
381
409
382
var providerInvalidatedMessageReceived = 0
410
383
var connectionSwitchedMessageReceived = 0
411
384
var callbackInvoked = 0
412
- ApplicationManager .getApplication().messageBus.connect().subscribe(
385
+ ApplicationManager .getApplication().messageBus.connect(disposable ).subscribe(
413
386
BearerTokenProviderListener .TOPIC ,
414
387
object : BearerTokenProviderListener {
415
388
override fun invalidate (providerId : String ) {
@@ -419,7 +392,7 @@ class DefaultToolkitAuthManagerTest {
419
392
}
420
393
}
421
394
)
422
- ApplicationManager .getApplication().messageBus.connect().subscribe(
395
+ ApplicationManager .getApplication().messageBus.connect(disposable ).subscribe(
423
396
ToolkitConnectionManagerListener .TOPIC ,
424
397
object : ToolkitConnectionManagerListener {
425
398
override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
0 commit comments