33 * SPDX-License-Identifier: Apache-2.0
44 */
55import sinon from 'sinon'
6- import { commands , languages } from 'vscode'
6+ import { CancellationToken , commands , languages , Position } from 'vscode'
77import assert from 'assert'
88import { 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'
1018
1119describe ( 'InlineCompletionManager' , ( ) => {
1220 let manager : InlineCompletionManager
@@ -19,6 +27,32 @@ describe('InlineCompletionManager', () => {
1927 let sandbox : sinon . SinonSandbox
2028 let getActiveSessionStub : sinon . SinonStub
2129 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+ ]
2256
2357 beforeEach ( ( ) => {
2458 sandbox = sinon . createSandbox ( )
@@ -41,6 +75,9 @@ describe('InlineCompletionManager', () => {
4175 manager = new InlineCompletionManager ( languageClient )
4276 getActiveSessionStub = sandbox . stub ( manager [ 'sessionManager' ] , 'getActiveSession' )
4377 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' )
4481 } )
4582
4683 afterEach ( ( ) => {
@@ -65,11 +102,16 @@ describe('InlineCompletionManager', () => {
65102 ?. find ( ( call ) => call . args [ 0 ] === 'aws.amazonq.acceptInline' ) ?. args [ 1 ]
66103
67104 const sessionId = 'test-session'
68- const itemId = 'test-item'
69105 const requestStartTime = Date . now ( ) - 1000
70106 const firstCompletionDisplayLatency = 500
71107
72- await acceptanceHandler ( sessionId , itemId , requestStartTime , firstCompletionDisplayLatency )
108+ await acceptanceHandler (
109+ sessionId ,
110+ mockSuggestions [ 0 ] ,
111+ mockEditor ,
112+ requestStartTime ,
113+ firstCompletionDisplayLatency
114+ )
73115
74116 assert ( sendNotificationStub . calledOnce )
75117 assert (
@@ -78,7 +120,7 @@ describe('InlineCompletionManager', () => {
78120 sinon . match ( {
79121 sessionId,
80122 completionSessionResult : {
81- [ itemId ] : {
123+ [ mockSuggestions [ 0 ] . itemId ] : {
82124 seen : true ,
83125 accepted : true ,
84126 discarded : false ,
@@ -91,6 +133,39 @@ describe('InlineCompletionManager', () => {
91133 assert ( disposableStub . calledOnce )
92134 assert ( registerProviderStub . calledTwice ) // Once in constructor, once after acceptance
93135 } )
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+ } )
94169 } )
95170
96171 describe ( 'onInlineRejection' , ( ) => {
@@ -179,4 +254,82 @@ describe('InlineCompletionManager', () => {
179254 } )
180255 } )
181256 } )
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+ } )
182335} )
0 commit comments