44package software.aws.toolkits.jetbrains.services.codewhisperer
55
66import com.intellij.openapi.application.ApplicationManager
7+ import com.intellij.openapi.application.runReadAction
78import com.intellij.openapi.ui.popup.JBPopup
89import com.intellij.psi.PsiFile
910import com.intellij.testFramework.DisposableRule
1011import com.intellij.testFramework.replaceService
1112import com.intellij.testFramework.runInEdtAndWait
1213import kotlinx.coroutines.async
14+ import kotlinx.coroutines.runBlocking
1315import kotlinx.coroutines.test.runTest
1416import org.assertj.core.api.Assertions.assertThat
17+ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
1518import org.junit.Before
1619import org.junit.Ignore
1720import org.junit.Rule
1821import org.junit.Test
22+ import org.mockito.Mockito.mock
1923import org.mockito.kotlin.any
2024import org.mockito.kotlin.argumentCaptor
2125import org.mockito.kotlin.doReturn
@@ -31,6 +35,12 @@ import software.amazon.awssdk.services.codewhispererruntime.model.ProgrammingLan
3135import software.amazon.awssdk.services.codewhispererruntime.model.SupplementalContext
3236import software.aws.toolkits.jetbrains.core.credentials.AwsConnectionManager
3337import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
38+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer
39+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
40+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionListWithReferences
41+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind
42+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams
43+ import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString
3444import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
3545import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
3646import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
@@ -51,6 +61,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhis
5161import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextProvider
5262import software.aws.toolkits.jetbrains.utils.rules.JavaCodeInsightTestFixtureRule
5363import software.aws.toolkits.telemetry.CodewhispererTriggerType
64+ import java.util.concurrent.CompletableFuture
5465
5566class CodeWhispererServiceTest {
5667 @Rule
@@ -229,6 +240,46 @@ class CodeWhispererServiceTest {
229240 assertThat(firstValue.supplementalContexts()).isEqualTo(mockSupContext.toSdkModel())
230241 }
231242 }
243+
244+ @Test
245+ fun `test handleInlineCompletion creates correct params and sends to server` () = runTest {
246+ val mockLspServer = mock(AmazonQLanguageServer ::class .java)
247+ val mockLspService = mock(AmazonQLspService ::class .java)
248+ val project = projectRule.project
249+
250+ project.replaceService(
251+ AmazonQLspService ::class .java,
252+ mockLspService,
253+ disposableRule.disposable
254+ )
255+ whenever(mockLspService.executeSync<CompletableFuture <ResponseMessage >>(any())).thenAnswer { invocation ->
256+ val func = invocation.getArgument< suspend AmazonQLspService .(AmazonQLanguageServer ) -> CompletableFuture <ResponseMessage >>(0 )
257+ runBlocking {
258+ func.invoke(mockLspService, mockLspServer)
259+ }
260+ }
261+
262+ val mockEditor = projectRule.fixture.editor
263+ val mockCompletableFuture = CompletableFuture <InlineCompletionListWithReferences >()
264+
265+ whenever(mockLspServer.inlineCompletionWithReferences(any())).thenReturn(mockCompletableFuture)
266+ val paramsCaptor = argumentCaptor<InlineCompletionWithReferencesParams >()
267+
268+ sut.handleLspInlineCompletion(
269+ mockEditor,
270+ TriggerTypeInfo (CodewhispererTriggerType .OnDemand , CodeWhispererAutomatedTriggerType .Unknown ())
271+ )
272+
273+ verify(mockLspServer).inlineCompletionWithReferences(paramsCaptor.capture())
274+
275+ runReadAction {
276+ val capturedParams = paramsCaptor.firstValue
277+ assertThat(capturedParams.textDocument.uri).isEqualTo(toUriString(file.virtualFile))
278+ assertThat(capturedParams.position.line).isEqualTo(mockEditor.caretModel.primaryCaret.visualPosition.line)
279+ assertThat(capturedParams.position.character).isEqualTo(mockEditor.caretModel.primaryCaret.offset)
280+ assertThat(capturedParams.context.triggerKind).isEqualTo(InlineCompletionTriggerKind .Invoke )
281+ }
282+ }
232283}
233284
234285private fun CodeWhispererProgrammingLanguage.toSdkModel (): ProgrammingLanguage = ProgrammingLanguage .builder()
0 commit comments