@@ -20,6 +20,17 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
20
20
describe ( 'codewhisperer' , async function ( ) {
21
21
let clientSpy : CodeWhispererUserClient
22
22
let telemetryEnabledDefault : boolean
23
+ const userTriggerDecisionPayload : TelemetryEvent = {
24
+ userTriggerDecisionEvent : {
25
+ sessionId : anyString ( ) ,
26
+ requestId : anyString ( ) ,
27
+ programmingLanguage : { languageName : 'python' } ,
28
+ completionType : 'BLOCK' ,
29
+ suggestionState : 'ACCEPT' ,
30
+ recommendationLatencyMilliseconds : 1 ,
31
+ timestamp : new Date ( ) ,
32
+ } ,
33
+ }
23
34
24
35
beforeEach ( async function ( ) {
25
36
sinon . restore ( )
@@ -39,54 +50,71 @@ describe('codewhisperer', async function () {
39
50
} )
40
51
41
52
it ( 'sendTelemetryEvent for userTriggerDecision should respect telemetry optout status' , async function ( ) {
42
- await sendTelemetryEventOptoutCheckHelper ( {
43
- userTriggerDecisionEvent : {
44
- sessionId : anyString ( ) ,
45
- requestId : anyString ( ) ,
46
- programmingLanguage : { languageName : 'python' } ,
47
- completionType : 'BLOCK' ,
48
- suggestionState : 'ACCEPT' ,
49
- recommendationLatencyMilliseconds : 1 ,
50
- timestamp : new Date ( ) ,
51
- } ,
52
- } )
53
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , true , true )
54
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , true , false )
53
55
} )
54
56
55
57
it ( 'sendTelemetryEvent for codeScan should respect telemetry optout status' , async function ( ) {
56
- await sendTelemetryEventOptoutCheckHelper ( {
58
+ const payload = {
57
59
codeScanEvent : {
58
60
programmingLanguage : { languageName : 'python' } ,
59
61
codeScanJobId : anyString ( ) ,
60
62
timestamp : new Date ( ) ,
61
63
} ,
62
- } )
64
+ }
65
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , true )
66
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , false )
63
67
} )
64
68
65
69
it ( 'sendTelemetryEvent for codePercentage should respect telemetry optout status' , async function ( ) {
66
- await sendTelemetryEventOptoutCheckHelper ( {
70
+ const payload = {
67
71
codeCoverageEvent : {
68
72
programmingLanguage : { languageName : 'python' } ,
69
73
acceptedCharacterCount : 0 ,
70
74
totalCharacterCount : 1 ,
71
75
timestamp : new Date ( ) ,
72
76
} ,
73
- } )
77
+ }
78
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , true )
79
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , false )
74
80
} )
75
81
76
82
it ( 'sendTelemetryEvent for userModification should respect telemetry optout status' , async function ( ) {
77
- await sendTelemetryEventOptoutCheckHelper ( {
83
+ const payload = {
78
84
userModificationEvent : {
79
85
sessionId : anyString ( ) ,
80
86
requestId : anyString ( ) ,
81
87
programmingLanguage : { languageName : 'python' } ,
82
88
modificationPercentage : 2.0 ,
83
89
timestamp : new Date ( ) ,
84
90
} ,
85
- } )
91
+ }
92
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , true )
93
+ await sendTelemetryEventOptoutCheckHelper ( payload , true , false )
94
+ } )
95
+
96
+ it ( 'sendTelemetryEvent should be called for SSO user who optin telemetry' , async function ( ) {
97
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , true , true )
86
98
} )
87
99
88
- async function sendTelemetryEventOptoutCheckHelper ( payload : TelemetryEvent ) {
89
- const stub = sinon . stub ( clientSpy , 'sendTelemetryEvent' ) . returns ( {
100
+ it ( 'sendTelemetryEvent should be called for SSO user who optout telemetry' , async function ( ) {
101
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , true , false )
102
+ } )
103
+
104
+ it ( 'sendTelemetryEvent should be called for Builder ID user who optin telemetry' , async function ( ) {
105
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , false , true )
106
+ } )
107
+
108
+ it ( 'sendTelemetryEvent should NOT be called for Builder ID user who optout telemetry' , async function ( ) {
109
+ await sendTelemetryEventOptoutCheckHelper ( userTriggerDecisionPayload , false , false )
110
+ } )
111
+
112
+ async function sendTelemetryEventOptoutCheckHelper (
113
+ payload : TelemetryEvent ,
114
+ isSso : boolean ,
115
+ isTelemetryEnabled : boolean
116
+ ) {
117
+ const clientSpyStub = sinon . stub ( clientSpy , 'sendTelemetryEvent' ) . returns ( {
90
118
promise : ( ) =>
91
119
Promise . resolve ( {
92
120
$response : {
@@ -95,13 +123,16 @@ describe('codewhisperer', async function () {
95
123
} ) ,
96
124
} as Request < SendTelemetryEventResponse , AWSError > )
97
125
98
- sinon . stub ( AuthUtil . instance , 'isValidEnterpriseSsoInUse' ) . returns ( true )
99
- globals . telemetry . telemetryEnabled = true
100
- await codeWhispererClient . sendTelemetryEvent ( { telemetryEvent : payload } )
101
- sinon . assert . calledWith ( stub , sinon . match ( { optOutPreference : 'OPTIN' } ) )
102
-
103
- globals . telemetry . telemetryEnabled = false
126
+ const authUtilStub = sinon . stub ( AuthUtil . instance , 'isValidEnterpriseSsoInUse' ) . returns ( isSso )
127
+ globals . telemetry . telemetryEnabled = isTelemetryEnabled
104
128
await codeWhispererClient . sendTelemetryEvent ( { telemetryEvent : payload } )
105
- sinon . assert . calledWith ( stub , sinon . match ( { optOutPreference : 'OPTOUT' } ) )
129
+ const expectedOptOutPreference = isTelemetryEnabled ? 'OPTIN' : 'OPTOUT'
130
+ if ( isSso || isTelemetryEnabled ) {
131
+ sinon . assert . calledWith ( clientSpyStub , sinon . match ( { optOutPreference : expectedOptOutPreference } ) )
132
+ } else {
133
+ sinon . assert . notCalled ( clientSpyStub )
134
+ }
135
+ clientSpyStub . restore ( )
136
+ authUtilStub . restore ( )
106
137
}
107
138
} )
0 commit comments