@@ -18,14 +18,14 @@ import org.junit.jupiter.api.extension.RegisterExtension
1818import org.mockito.Mockito.mockConstruction
1919import org.mockito.kotlin.any
2020import org.mockito.kotlin.argumentCaptor
21+ import org.mockito.kotlin.atLeastOnce
2122import org.mockito.kotlin.doNothing
2223import org.mockito.kotlin.mock
2324import org.mockito.kotlin.spy
2425import org.mockito.kotlin.timeout
2526import org.mockito.kotlin.verify
2627import org.mockito.kotlin.verifyNoMoreInteractions
2728import org.mockito.kotlin.whenever
28- import software.amazon.awssdk.regions.Region
2929import software.amazon.awssdk.services.ssooidc.SsoOidcClient
3030import software.aws.toolkits.core.telemetry.MetricEvent
3131import software.aws.toolkits.core.telemetry.TelemetryBatcher
@@ -36,8 +36,6 @@ import software.aws.toolkits.jetbrains.core.credentials.profiles.ProfileSsoSessi
3636import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
3737import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
3838import 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
4139import software.aws.toolkits.jetbrains.services.telemetry.NoOpPublisher
4240import software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
4341import software.aws.toolkits.jetbrains.settings.AwsSettings
@@ -51,9 +49,6 @@ class DefaultToolkitAuthManagerTest {
5149 batcher : TelemetryBatcher
5250 ) : TelemetryService(publisher, batcher)
5351
54- @ExtendWith(MockRegionProviderExtension ::class )
55- val regionProvider = MockRegionProviderRule ()
56-
5752 @JvmField
5853 @RegisterExtension
5954 val mockClientManager = MockClientManagerExtension ()
@@ -67,9 +62,13 @@ class DefaultToolkitAuthManagerTest {
6762 @BeforeEach
6863 fun setUp (@TestDisposable disposable : Disposable ) {
6964 mockClientManager.create<SsoOidcClient >()
65+
7066 sut = DefaultToolkitAuthManager ()
7167 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+
7372 batcher = mock()
7473 telemetryService = spy(TestTelemetryService (batcher = batcher))
7574 ApplicationManager .getApplication().replaceService(TelemetryService ::class .java, telemetryService, disposable)
@@ -222,12 +221,7 @@ class DefaultToolkitAuthManagerTest {
222221 }
223222
224223 @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` () {
231225 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
232226 whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
233227 }.use {
@@ -248,12 +242,7 @@ class DefaultToolkitAuthManagerTest {
248242 }
249243
250244 @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` () {
257246 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
258247 whenever(context.id).thenReturn(" id" )
259248 whenever(context.state()).thenReturn(BearerTokenAuthState .NEEDS_REFRESH )
@@ -276,13 +265,7 @@ class DefaultToolkitAuthManagerTest {
276265 }
277266
278267 @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` () {
286269 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
287270 whenever(context.state()).thenReturn(BearerTokenAuthState .NOT_AUTHENTICATED )
288271 }.use {
@@ -305,13 +288,12 @@ class DefaultToolkitAuthManagerTest {
305288
306289 @Test
307290 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-
312291 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
313292 whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
314293 }.use {
294+ val connectionManager = spy(connectionManager)
295+ projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
296+
315297 val existingConnection = sut.createConnection(
316298 ManagedSsoProfile (
317299 " us-east-1" ,
@@ -328,16 +310,12 @@ class DefaultToolkitAuthManagerTest {
328310 verify(tokenProvider).state()
329311 verifyNoMoreInteractions(tokenProvider)
330312 assertThat(connectionManager.activeConnection()).isEqualTo(existingConnection)
313+ verify(connectionManager, atLeastOnce()).switchConnection(existingConnection)
331314 }
332315 }
333316
334317 @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` () {
341319 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
342320 whenever(context.state()).thenReturn(BearerTokenAuthState .AUTHORIZED )
343321 }.use {
@@ -364,14 +342,12 @@ class DefaultToolkitAuthManagerTest {
364342
365343 @Test
366344 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-
371345 mockConstruction(InteractiveBearerTokenProvider ::class .java) { context, _ ->
372346 doNothing().whenever(context).reauthenticate()
373347 whenever(context.state()).thenReturn(BearerTokenAuthState .NOT_AUTHENTICATED )
374348 }.use {
349+ val connectionManager = spy(connectionManager)
350+ projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposable)
375351 // before
376352 assertThat(sut.listConnections()).hasSize(0 )
377353
@@ -399,17 +375,14 @@ class DefaultToolkitAuthManagerTest {
399375
400376 @Test
401377 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-
405378 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
407380 connectionManager.switchConnection(connection)
408381
409382 var providerInvalidatedMessageReceived = 0
410383 var connectionSwitchedMessageReceived = 0
411384 var callbackInvoked = 0
412- ApplicationManager .getApplication().messageBus.connect().subscribe(
385+ ApplicationManager .getApplication().messageBus.connect(disposable ).subscribe(
413386 BearerTokenProviderListener .TOPIC ,
414387 object : BearerTokenProviderListener {
415388 override fun invalidate (providerId : String ) {
@@ -419,7 +392,7 @@ class DefaultToolkitAuthManagerTest {
419392 }
420393 }
421394 )
422- ApplicationManager .getApplication().messageBus.connect().subscribe(
395+ ApplicationManager .getApplication().messageBus.connect(disposable ).subscribe(
423396 ToolkitConnectionManagerListener .TOPIC ,
424397 object : ToolkitConnectionManagerListener {
425398 override fun activeConnectionChanged (newConnection : ToolkitConnection ? ) {
0 commit comments