3
3
* SPDX-License-Identifier: Apache-2.0
4
4
*/
5
5
import sinon from 'sinon'
6
- import { commands , languages } from 'vscode'
6
+ import { CancellationToken , commands , languages , Position } from 'vscode'
7
7
import assert from 'assert'
8
8
import { LanguageClient } from 'vscode-languageclient'
9
- import { InlineCompletionManager } from '../../../../../src/app/inline/completion'
9
+ import { AmazonQInlineCompletionItemProvider , InlineCompletionManager } from '../../../../../src/app/inline/completion'
10
+ import { RecommendationService } from '../../../../../src/app/inline/recommendationService'
11
+ import { SessionManager } from '../../../../../src/app/inline/sessionManager'
12
+ import { createMockDocument , createMockTextEditor } from 'aws-core-vscode/test'
13
+ import {
14
+ ReferenceHoverProvider ,
15
+ ReferenceInlineProvider ,
16
+ ReferenceLogViewProvider ,
17
+ } from 'aws-core-vscode/codewhisperer'
10
18
11
19
describe ( 'InlineCompletionManager' , ( ) => {
12
20
let manager : InlineCompletionManager
@@ -19,6 +27,32 @@ describe('InlineCompletionManager', () => {
19
27
let sandbox : sinon . SinonSandbox
20
28
let getActiveSessionStub : sinon . SinonStub
21
29
let getActiveRecommendationStub : sinon . SinonStub
30
+ let logReferenceStub : sinon . SinonStub
31
+ let getReferenceStub : sinon . SinonStub
32
+ let hoverReferenceStub : sinon . SinonStub
33
+ const mockDocument = createMockDocument ( )
34
+ const mockEditor = createMockTextEditor ( )
35
+ const mockPosition = { line : 0 , character : 0 } as Position
36
+ const mockContext = { triggerKind : 1 , selectedCompletionInfo : undefined }
37
+ const mockToken = { isCancellationRequested : false } as CancellationToken
38
+ const fakeReferences = [
39
+ {
40
+ message : '' ,
41
+ licenseName : 'TEST_LICENSE' ,
42
+ repository : 'TEST_REPO' ,
43
+ recommendationContentSpan : {
44
+ start : 0 ,
45
+ end : 10 ,
46
+ } ,
47
+ } ,
48
+ ]
49
+ const mockSuggestions = [
50
+ {
51
+ itemId : 'test-item' ,
52
+ insertText : 'test' ,
53
+ references : fakeReferences ,
54
+ } ,
55
+ ]
22
56
23
57
beforeEach ( ( ) => {
24
58
sandbox = sinon . createSandbox ( )
@@ -41,6 +75,9 @@ describe('InlineCompletionManager', () => {
41
75
manager = new InlineCompletionManager ( languageClient )
42
76
getActiveSessionStub = sandbox . stub ( manager [ 'sessionManager' ] , 'getActiveSession' )
43
77
getActiveRecommendationStub = sandbox . stub ( manager [ 'sessionManager' ] , 'getActiveRecommendation' )
78
+ getReferenceStub = sandbox . stub ( ReferenceLogViewProvider , 'getReferenceLog' )
79
+ logReferenceStub = sandbox . stub ( ReferenceLogViewProvider . instance , 'addReferenceLog' )
80
+ hoverReferenceStub = sandbox . stub ( ReferenceHoverProvider . instance , 'addCodeReferences' )
44
81
} )
45
82
46
83
afterEach ( ( ) => {
@@ -65,11 +102,16 @@ describe('InlineCompletionManager', () => {
65
102
?. find ( ( call ) => call . args [ 0 ] === 'aws.amazonq.acceptInline' ) ?. args [ 1 ]
66
103
67
104
const sessionId = 'test-session'
68
- const itemId = 'test-item'
69
105
const requestStartTime = Date . now ( ) - 1000
70
106
const firstCompletionDisplayLatency = 500
71
107
72
- await acceptanceHandler ( sessionId , itemId , requestStartTime , firstCompletionDisplayLatency )
108
+ await acceptanceHandler (
109
+ sessionId ,
110
+ mockSuggestions [ 0 ] ,
111
+ mockEditor ,
112
+ requestStartTime ,
113
+ firstCompletionDisplayLatency
114
+ )
73
115
74
116
assert ( sendNotificationStub . calledOnce )
75
117
assert (
@@ -78,7 +120,7 @@ describe('InlineCompletionManager', () => {
78
120
sinon . match ( {
79
121
sessionId,
80
122
completionSessionResult : {
81
- [ itemId ] : {
123
+ [ mockSuggestions [ 0 ] . itemId ] : {
82
124
seen : true ,
83
125
accepted : true ,
84
126
discarded : false ,
@@ -91,6 +133,39 @@ describe('InlineCompletionManager', () => {
91
133
assert ( disposableStub . calledOnce )
92
134
assert ( registerProviderStub . calledTwice ) // Once in constructor, once after acceptance
93
135
} )
136
+
137
+ it ( 'should log reference if there is any' , async ( ) => {
138
+ const acceptanceHandler = registerCommandStub
139
+ . getCalls ( )
140
+ ?. find ( ( call ) => call . args [ 0 ] === 'aws.amazonq.acceptInline' ) ?. args [ 1 ]
141
+
142
+ const sessionId = 'test-session'
143
+ const requestStartTime = Date . now ( ) - 1000
144
+ const firstCompletionDisplayLatency = 500
145
+ const mockReferenceLog = 'test reference log'
146
+ getReferenceStub . returns ( mockReferenceLog )
147
+
148
+ await acceptanceHandler (
149
+ sessionId ,
150
+ mockSuggestions [ 0 ] ,
151
+ mockEditor ,
152
+ requestStartTime ,
153
+ firstCompletionDisplayLatency
154
+ )
155
+
156
+ assert ( getReferenceStub . calledOnce )
157
+ assert (
158
+ getReferenceStub . calledWith (
159
+ mockSuggestions [ 0 ] . insertText ,
160
+ mockSuggestions [ 0 ] . references ,
161
+ mockEditor
162
+ )
163
+ )
164
+ assert ( logReferenceStub . calledOnce )
165
+ assert ( logReferenceStub . calledWith ( mockReferenceLog ) )
166
+ assert ( hoverReferenceStub . calledOnce )
167
+ assert ( hoverReferenceStub . calledWith ( mockSuggestions [ 0 ] . insertText , mockSuggestions [ 0 ] . references ) )
168
+ } )
94
169
} )
95
170
96
171
describe ( 'onInlineRejection' , ( ) => {
@@ -179,4 +254,82 @@ describe('InlineCompletionManager', () => {
179
254
} )
180
255
} )
181
256
} )
257
+
258
+ describe ( 'AmazonQInlineCompletionItemProvider' , ( ) => {
259
+ describe ( 'provideInlineCompletionItems' , ( ) => {
260
+ let mockSessionManager : SessionManager
261
+ let provider : AmazonQInlineCompletionItemProvider
262
+ let getAllRecommendationsStub : sinon . SinonStub
263
+ let recommendationService : RecommendationService
264
+ let setInlineReferenceStub : sinon . SinonStub
265
+
266
+ beforeEach ( ( ) => {
267
+ recommendationService = new RecommendationService ( mockSessionManager )
268
+ setInlineReferenceStub = sandbox . stub ( ReferenceInlineProvider . instance , 'setInlineReference' )
269
+
270
+ mockSessionManager = {
271
+ getActiveSession : getActiveSessionStub ,
272
+ getActiveRecommendation : getActiveRecommendationStub ,
273
+ } as unknown as SessionManager
274
+
275
+ getActiveSessionStub . returns ( {
276
+ sessionId : 'test-session' ,
277
+ suggestions : mockSuggestions ,
278
+ isRequestInProgress : false ,
279
+ requestStartTime : Date . now ( ) ,
280
+ } )
281
+ getActiveRecommendationStub . returns ( mockSuggestions )
282
+ getAllRecommendationsStub = sandbox . stub ( recommendationService , 'getAllRecommendations' )
283
+ getAllRecommendationsStub . resolves ( )
284
+ } ) ,
285
+ it ( 'should call recommendation service to get new suggestions for new sessions' , async ( ) => {
286
+ provider = new AmazonQInlineCompletionItemProvider (
287
+ languageClient ,
288
+ recommendationService ,
289
+ mockSessionManager
290
+ )
291
+ const items = await provider . provideInlineCompletionItems (
292
+ mockDocument ,
293
+ mockPosition ,
294
+ mockContext ,
295
+ mockToken
296
+ )
297
+ assert ( getAllRecommendationsStub . calledOnce )
298
+ assert . deepStrictEqual ( items , mockSuggestions )
299
+ } ) ,
300
+ it ( 'should not call recommendation service for existing sessions' , async ( ) => {
301
+ provider = new AmazonQInlineCompletionItemProvider (
302
+ languageClient ,
303
+ recommendationService ,
304
+ mockSessionManager ,
305
+ false
306
+ )
307
+ const items = await provider . provideInlineCompletionItems (
308
+ mockDocument ,
309
+ mockPosition ,
310
+ mockContext ,
311
+ mockToken
312
+ )
313
+ assert ( getAllRecommendationsStub . notCalled )
314
+ assert . deepStrictEqual ( items , mockSuggestions )
315
+ } ) ,
316
+ it ( 'should handle reference if there is any' , async ( ) => {
317
+ provider = new AmazonQInlineCompletionItemProvider (
318
+ languageClient ,
319
+ recommendationService ,
320
+ mockSessionManager ,
321
+ false
322
+ )
323
+ await provider . provideInlineCompletionItems ( mockDocument , mockPosition , mockContext , mockToken )
324
+ assert ( setInlineReferenceStub . calledOnce )
325
+ assert (
326
+ setInlineReferenceStub . calledWithExactly (
327
+ mockPosition . line ,
328
+ mockSuggestions [ 0 ] . insertText ,
329
+ fakeReferences
330
+ )
331
+ )
332
+ } )
333
+ } )
334
+ } )
182
335
} )
0 commit comments