@@ -8,10 +8,12 @@ import com.intellij.testFramework.ProjectRule
8
8
import com.intellij.testFramework.RuleChain
9
9
import com.intellij.testFramework.replaceService
10
10
import org.assertj.core.api.Assertions.assertThat
11
+ import org.junit.After
11
12
import org.junit.Before
12
13
import org.junit.Rule
13
14
import org.junit.Test
14
15
import org.mockito.kotlin.any
16
+ import org.mockito.kotlin.argThat
15
17
import org.mockito.kotlin.argumentCaptor
16
18
import org.mockito.kotlin.doReturn
17
19
import org.mockito.kotlin.doReturnConsecutively
@@ -42,6 +44,9 @@ import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysi
42
44
import software.amazon.awssdk.services.codewhispererruntime.model.GetCodeAnalysisResponse
43
45
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest
44
46
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse
47
+ import software.amazon.awssdk.services.codewhispererruntime.model.OptOutPreference
48
+ import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventRequest
49
+ import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventResponse
45
50
import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisRequest
46
51
import software.amazon.awssdk.services.codewhispererruntime.model.StartCodeAnalysisResponse
47
52
import software.amazon.awssdk.services.codewhispererruntime.paginators.GenerateCompletionsIterable
@@ -62,6 +67,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestU
62
67
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.sdkHttpResponse
63
68
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
64
69
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptorImpl
70
+ import software.aws.toolkits.jetbrains.settings.AwsSettings
65
71
66
72
class CodeWhispererClientAdaptorTest {
67
73
val projectRule = ProjectRule ()
@@ -80,6 +86,7 @@ class CodeWhispererClientAdaptorTest {
80
86
81
87
private lateinit var sut: CodeWhispererClientAdaptor
82
88
private lateinit var connectionManager: ToolkitConnectionManager
89
+ private var isTelemetryEnabledDefault: Boolean = false
83
90
84
91
@Before
85
92
fun setup () {
@@ -99,6 +106,7 @@ class CodeWhispererClientAdaptorTest {
99
106
on { startCodeAnalysis(any<StartCodeAnalysisRequest >()) } doReturn startCodeAnalysisResponse
100
107
on { getCodeAnalysis(any<GetCodeAnalysisRequest >()) } doReturn getCodeAnalysisResponse
101
108
on { listCodeAnalysisFindings(any<ListCodeAnalysisFindingsRequest >()) } doReturn listCodeAnalysisFindingsResponse
109
+ on { sendTelemetryEvent(any<SendTelemetryEventRequest >()) } doReturn sendtelemetryEventResponse
102
110
}
103
111
104
112
val mockConnection = mock<BearerSsoConnection >()
@@ -110,6 +118,13 @@ class CodeWhispererClientAdaptorTest {
110
118
} doReturn authManagerRule.createConnection(ManagedSsoProfile (" us-east-1" , aString(), emptyList())) as AwsBearerTokenConnection
111
119
}
112
120
projectRule.project.replaceService(ToolkitConnectionManager ::class .java, connectionManager, disposableRule.disposable)
121
+
122
+ isTelemetryEnabledDefault = AwsSettings .getInstance().isTelemetryEnabled
123
+ }
124
+
125
+ @After
126
+ fun tearDown () {
127
+ AwsSettings .getInstance().isTelemetryEnabled = isTelemetryEnabledDefault
113
128
}
114
129
115
130
@Test
@@ -239,6 +254,55 @@ class CodeWhispererClientAdaptorTest {
239
254
}
240
255
}
241
256
257
+ @Test
258
+ fun `sendTelemetryEvent for userTriggerDecision respects telemetry optin status` () {
259
+ sendTelemetryEventOptOutCheckHelper {
260
+ sut.putUserTriggerDecisionTelemetry(
261
+ aRequestContext(projectRule.project),
262
+ aResponseContext(),
263
+ aCompletionType(),
264
+ aSuggestionState(),
265
+ 0 ,
266
+ 1
267
+ )
268
+ }
269
+ }
270
+
271
+ @Test
272
+ fun `sendTelemetryEvent for codePercentage respects telemetry optin status` () {
273
+ sendTelemetryEventOptOutCheckHelper {
274
+ sut.putCodePercentageTelemetry(aProgrammingLanguage(), 0 , 1 )
275
+ }
276
+ }
277
+
278
+ @Test
279
+ fun `sendTelemetryEvent for codeScan respects telemetry optin status` () {
280
+ sendTelemetryEventOptOutCheckHelper {
281
+ sut.sendCodeScanTelemetry(aProgrammingLanguage(), null )
282
+ }
283
+ }
284
+
285
+ @Test
286
+ fun `sendTelemetryEvent for userModification respects telemetry optin status` () {
287
+ sendTelemetryEventOptOutCheckHelper {
288
+ sut.sendUserModificationTelemetry(aString(), aString(), aProgrammingLanguage(), 0.0 )
289
+ }
290
+ }
291
+
292
+ private fun sendTelemetryEventOptOutCheckHelper (mockApiCall : () -> Unit ) {
293
+ AwsSettings .getInstance().isTelemetryEnabled = true
294
+ mockApiCall()
295
+ verify(bearerClient).sendTelemetryEvent(
296
+ argThat<SendTelemetryEventRequest > { optOutPreference() == OptOutPreference .OPTIN }
297
+ )
298
+
299
+ AwsSettings .getInstance().isTelemetryEnabled = false
300
+ mockApiCall()
301
+ verify(bearerClient).sendTelemetryEvent(
302
+ argThat<SendTelemetryEventRequest > { optOutPreference() == OptOutPreference .OPTOUT }
303
+ )
304
+ }
305
+
242
306
private companion object {
243
307
val createCodeScanRequest = CreateCodeScanRequest .builder()
244
308
.artifacts(mapOf (ArtifactType .SOURCE_CODE to " foo" ))
@@ -294,6 +358,8 @@ class CodeWhispererClientAdaptorTest {
294
358
.sdkHttpResponse(sdkHttpResponse)
295
359
.build() as ListCodeAnalysisFindingsResponse
296
360
361
+ val sendtelemetryEventResponse = SendTelemetryEventResponse .builder().build()
362
+
297
363
private val generateCompletionsPaginatorResponse: GenerateCompletionsIterable = mock()
298
364
299
365
private val createCodeScanUploadUrlResponse: CreateCodeScanUploadUrlResponse = mock()
0 commit comments