44package software.aws.toolkits.jetbrains.services.amazonq.lsp.auth
55
66import com.intellij.openapi.Disposable
7+ import com.intellij.openapi.components.service
78import com.intellij.openapi.components.serviceIfCreated
89import com.intellij.openapi.project.Project
10+ import com.intellij.testFramework.ProjectExtension
911import com.intellij.util.messages.MessageBus
1012import com.intellij.util.messages.MessageBusConnection
1113import io.mockk.every
1214import io.mockk.just
1315import io.mockk.mockk
1416import io.mockk.runs
17+ import io.mockk.spyk
1518import io.mockk.verify
1619import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
17- import org.junit.Before
18- import org.junit.Test
20+ import org.junit.jupiter.api.BeforeEach
21+ import org.junit.jupiter.api.Test
22+ import org.junit.jupiter.api.extension.RegisterExtension
23+ import software.aws.toolkits.core.TokenConnectionSettings
24+ import software.aws.toolkits.core.credentials.ToolkitBearerTokenProvider
25+ import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
26+ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
27+ import software.aws.toolkits.jetbrains.core.credentials.sso.PKCEAuthorizationGrantToken
28+ import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.InteractiveBearerTokenProvider
1929import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
2030import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
2131import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
32+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.UpdateCredentialsPayload
33+ import java.time.Instant
2234import java.util.concurrent.CompletableFuture
2335
2436class DefaultAuthCredentialsServiceTest {
37+ companion object {
38+ @JvmField
39+ @RegisterExtension
40+ val projectExtension = ProjectExtension ()
41+ }
42+
2543 private lateinit var project: Project
2644 private lateinit var mockLanguageServer: AmazonQLanguageServer
2745 private lateinit var mockEncryptionManager: JwtEncryptionManager
2846 private lateinit var sut: DefaultAuthCredentialsService
2947
30- @Before
48+ // maybe better to use real project via junit extension
49+ @BeforeEach
3150 fun setUp () {
32- project = mockk< Project >( )
51+ project = spyk(projectExtension.project )
3352 mockLanguageServer = mockk<AmazonQLanguageServer >()
3453 mockEncryptionManager = mockk<JwtEncryptionManager >()
3554 every { mockEncryptionManager.encrypt(any()) } returns " mock-encrypted-data"
@@ -54,6 +73,32 @@ class DefaultAuthCredentialsServiceTest {
5473 every { messageBus.connect(any<Disposable >()) } returns mockConnection
5574 every { mockConnection.subscribe(any(), any()) } just runs
5675
76+ // Mock ToolkitConnectionManager
77+ val connectionManager = mockk<ToolkitConnectionManager >()
78+ val connection = mockk<AwsBearerTokenConnection >()
79+ val connectionSettings = mockk<TokenConnectionSettings >()
80+ val provider = mockk<ToolkitBearerTokenProvider >()
81+ val tokenDelegate = mockk<InteractiveBearerTokenProvider >()
82+ val token = PKCEAuthorizationGrantToken (
83+ issuerUrl = " https://example.com" ,
84+ refreshToken = " refreshToken" ,
85+ accessToken = " accessToken" ,
86+ expiresAt = Instant .MAX ,
87+ createdAt = Instant .now(),
88+ region = " us-fake-1" ,
89+ )
90+
91+ every { project.service<ToolkitConnectionManager >() } returns connectionManager
92+ every { connectionManager.activeConnectionForFeature(any()) } returns connection
93+ every { connection.getConnectionSettings() } returns connectionSettings
94+ every { connectionSettings.tokenProvider } returns provider
95+ every { provider.delegate } returns tokenDelegate
96+ every { tokenDelegate.currentToken() } returns token
97+
98+ every {
99+ mockLanguageServer.updateTokenCredentials(any())
100+ } returns CompletableFuture .completedFuture(ResponseMessage ())
101+
57102 sut = DefaultAuthCredentialsService (project, this .mockEncryptionManager, mockk())
58103 }
59104
@@ -62,17 +107,15 @@ class DefaultAuthCredentialsServiceTest {
62107 val token = " unencryptedToken"
63108 val isEncrypted = false
64109
65- every {
66- mockLanguageServer.updateTokenCredentials(any())
67- } returns CompletableFuture .completedFuture(ResponseMessage ())
68-
69110 sut.updateTokenCredentials(token, isEncrypted)
70111
71- verify(exactly = 0 ) {
72- mockEncryptionManager.decrypt(any())
73- }
74112 verify(exactly = 1 ) {
75- mockLanguageServer.updateTokenCredentials(any())
113+ mockLanguageServer.updateTokenCredentials(
114+ UpdateCredentialsPayload (
115+ token,
116+ isEncrypted
117+ )
118+ )
76119 }
77120 }
78121
@@ -82,16 +125,18 @@ class DefaultAuthCredentialsServiceTest {
82125 val decryptedToken = " decryptedToken"
83126 val isEncrypted = true
84127
85- every { mockEncryptionManager.decrypt(encryptedToken) } returns decryptedToken
86- every { mockEncryptionManager.encrypt(any()) } returns " mock-encrypted-data"
87- every {
88- mockLanguageServer.updateTokenCredentials(any())
89- } returns CompletableFuture .completedFuture(ResponseMessage ())
128+ every { mockEncryptionManager.encrypt(any()) } returns encryptedToken
90129
91- sut.updateTokenCredentials(encryptedToken , isEncrypted)
130+ sut.updateTokenCredentials(decryptedToken , isEncrypted)
92131
93- verify(exactly = 1 ) { mockEncryptionManager.decrypt(encryptedToken) }
94- verify(exactly = 1 ) { mockLanguageServer.updateTokenCredentials(any()) }
132+ verify(atLeast = 1 ) {
133+ mockLanguageServer.updateTokenCredentials(
134+ UpdateCredentialsPayload (
135+ encryptedToken,
136+ isEncrypted
137+ )
138+ )
139+ }
95140 }
96141
97142 @Test
@@ -102,4 +147,9 @@ class DefaultAuthCredentialsServiceTest {
102147
103148 verify(exactly = 1 ) { mockLanguageServer.deleteTokenCredentials() }
104149 }
150+
151+ @Test
152+ fun `init results in token update` () {
153+ verify(exactly = 1 ) { mockLanguageServer.updateTokenCredentials(any()) }
154+ }
105155}
0 commit comments