4
4
package software.aws.toolkits.jetbrains.services.codewhisperer
5
5
6
6
import com.intellij.openapi.application.ApplicationManager
7
- import com.intellij.openapi.util.Disposer
8
7
import com.intellij.openapi.util.SystemInfo
9
8
import com.intellij.testFramework.DisposableRule
10
9
import com.intellij.testFramework.RuleChain
@@ -15,6 +14,7 @@ import org.junit.After
15
14
import org.junit.Before
16
15
import org.junit.Rule
17
16
import org.junit.Test
17
+ import org.junit.jupiter.api.assertThrows
18
18
import org.mockito.kotlin.any
19
19
import org.mockito.kotlin.argThat
20
20
import org.mockito.kotlin.argumentCaptor
@@ -24,7 +24,6 @@ import org.mockito.kotlin.mock
24
24
import org.mockito.kotlin.stub
25
25
import org.mockito.kotlin.times
26
26
import org.mockito.kotlin.verify
27
- import org.mockito.kotlin.whenever
28
27
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
29
28
import software.amazon.awssdk.services.codewhispererruntime.model.ArtifactType
30
29
import software.amazon.awssdk.services.codewhispererruntime.model.CodeAnalysisFindingsSchema
@@ -54,21 +53,22 @@ import software.amazon.awssdk.services.codewhispererruntime.model.SuggestionStat
54
53
import software.amazon.awssdk.services.codewhispererruntime.paginators.GenerateCompletionsIterable
55
54
import software.amazon.awssdk.services.codewhispererruntime.paginators.ListAvailableCustomizationsIterable
56
55
import software.amazon.awssdk.services.ssooidc.SsoOidcClient
57
- import software.aws.toolkits.core.TokenConnectionSettings
58
56
import software.aws.toolkits.core.utils.test.aString
59
57
import software.aws.toolkits.jetbrains.core.MockClientManagerRule
60
58
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
61
59
import software.aws.toolkits.jetbrains.core.credentials.ManagedSsoProfile
62
60
import software.aws.toolkits.jetbrains.core.credentials.MockCredentialManagerRule
63
61
import software.aws.toolkits.jetbrains.core.credentials.MockToolkitAuthManagerRule
64
62
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
63
+ import software.aws.toolkits.jetbrains.core.credentials.logoutFromSsoConnection
64
+ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
65
+ import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
65
66
import software.aws.toolkits.jetbrains.core.credentials.sono.SONO_REGION
66
67
import software.aws.toolkits.jetbrains.services.amazonq.FEATURE_EVALUATION_PRODUCT_NAME
67
68
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.metadata
68
69
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonRequest
69
70
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.pythonResponseWithToken
70
71
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.sdkHttpResponse
71
- import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
72
72
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptorImpl
73
73
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
74
74
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
@@ -93,13 +93,12 @@ class CodeWhispererClientAdaptorTest {
93
93
94
94
@Rule
95
95
@JvmField
96
- val ruleChain = RuleChain (projectRule, mockCredentialRule, mockClientManagerRule, disposableRule)
96
+ val ruleChain = RuleChain (projectRule, mockCredentialRule, mockClientManagerRule, authManagerRule, disposableRule)
97
97
98
98
private lateinit var bearerClient: CodeWhispererRuntimeClient
99
99
private lateinit var ssoClient: SsoOidcClient
100
100
101
- private lateinit var sut: CodeWhispererClientAdaptor
102
- private lateinit var connectionManager: ToolkitConnectionManager
101
+ private lateinit var sut: CodeWhispererClientAdaptorImpl
103
102
private var isTelemetryEnabledDefault: Boolean = false
104
103
105
104
@Before
@@ -117,15 +116,8 @@ class CodeWhispererClientAdaptorTest {
117
116
on { listFeatureEvaluations(any<ListFeatureEvaluationsRequest >()) } doReturn listFeatureEvaluationsResponse
118
117
}
119
118
120
- val mockConnection = mock<AwsBearerTokenConnection >()
121
- whenever(mockConnection.getConnectionSettings()) doReturn mock<TokenConnectionSettings >()
122
-
123
- connectionManager = mock {
124
- on {
125
- activeConnectionForFeature(any())
126
- } doReturn authManagerRule.createConnection(ManagedSsoProfile (" us-east-1" , aString(), listOf (" scopes" ))) as AwsBearerTokenConnection
127
- }
128
- projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposableRule.disposable)
119
+ val conn = authManagerRule.createConnection(ManagedSsoProfile (" us-east-1" , " url" , Q_SCOPES ))
120
+ ToolkitConnectionManager .getInstance(projectRule.project).switchConnection(conn)
129
121
130
122
isTelemetryEnabledDefault = AwsSettings .getInstance().isTelemetryEnabled
131
123
}
@@ -135,16 +127,37 @@ class CodeWhispererClientAdaptorTest {
135
127
AwsSettings .getInstance().isTelemetryEnabled = isTelemetryEnabledDefault
136
128
}
137
129
138
- @After
139
- fun cleanup () {
140
- Disposer .dispose(sut)
141
- }
142
-
143
130
@Test
144
131
fun `Sono region is us-east-1` () {
145
132
assertThat(" us-east-1" ).isEqualTo(SONO_REGION )
146
133
}
147
134
135
+ @Test
136
+ fun `should throw if there is no valid credential, otherwise return codewhispererRuntimeClient` () {
137
+ val connectionManager = ToolkitConnectionManager .getInstance(projectRule.project)
138
+
139
+ assertThat(connectionManager.activeConnectionForFeature(QConnection .getInstance()))
140
+ .isNotNull
141
+ assertThat(sut.bearerClient())
142
+ .isNotNull
143
+ .isInstanceOf(CodeWhispererRuntimeClient ::class .java)
144
+
145
+ logoutFromSsoConnection(projectRule.project, connectionManager.activeConnectionForFeature(QConnection .getInstance()) as AwsBearerTokenConnection )
146
+ assertThat(connectionManager.activeConnectionForFeature(QConnection .getInstance())).isNull()
147
+ assertThrows<Exception >(" attempt to get bearer client while there is no valid credential" ) {
148
+ sut.bearerClient()
149
+ }
150
+
151
+ val anotherQConnection = authManagerRule.createConnection(ManagedSsoProfile (" us-east-1" , aString(), Q_SCOPES ))
152
+ connectionManager.switchConnection(anotherQConnection)
153
+ assertThat(connectionManager.activeConnectionForFeature(QConnection .getInstance()))
154
+ .isNotNull
155
+ .isEqualTo(anotherQConnection)
156
+ assertThat(sut.bearerClient())
157
+ .isNotNull
158
+ .isInstanceOf(CodeWhispererRuntimeClient ::class .java)
159
+ }
160
+
148
161
@Test
149
162
fun `listCustomizations` () {
150
163
val sdkIterable = ListAvailableCustomizationsIterable (bearerClient, ListAvailableCustomizationsRequest .builder().build())
0 commit comments