Skip to content

Commit fa44967

Browse files
authored
test(amazonq) patch aws#4978 (aws#4999)
1 parent 0c30f6e commit fa44967

File tree

2 files changed

+84
-7
lines changed

2 files changed

+84
-7
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.workspace.context
5+
6+
import com.intellij.openapi.Disposable
7+
import com.intellij.openapi.application.ApplicationManager
8+
import com.intellij.openapi.project.Project
9+
import com.intellij.testFramework.ProjectExtension
10+
import com.intellij.testFramework.junit5.TestDisposable
11+
import com.intellij.testFramework.replaceService
12+
import kotlinx.coroutines.CoroutineScope
13+
import kotlinx.coroutines.test.runTest
14+
import org.assertj.core.api.Assertions.assertThat
15+
import org.junit.jupiter.api.Test
16+
import org.junit.jupiter.api.extension.RegisterExtension
17+
import org.mockito.Mockito.mockConstruction
18+
import org.mockito.kotlin.doReturn
19+
import org.mockito.kotlin.mock
20+
import org.mockito.kotlin.times
21+
import org.mockito.kotlin.verify
22+
import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext
23+
import software.aws.toolkits.jetbrains.services.amazonq.project.EncoderServer
24+
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
25+
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
26+
27+
class ProjectContextControllerTest {
28+
lateinit var sut: ProjectContextController
29+
30+
val project: Project
31+
get() = projectExtension.project
32+
33+
private companion object {
34+
@JvmField
35+
@RegisterExtension
36+
val projectExtension = ProjectExtension()
37+
}
38+
39+
@Test
40+
fun `should start encoderServer if chat project context is disabled`(@TestDisposable disposable: Disposable) = runTest {
41+
ApplicationManager.getApplication()
42+
.replaceService(
43+
CodeWhispererSettings::class.java,
44+
mock { on { isProjectContextEnabled() } doReturn false },
45+
disposable
46+
)
47+
48+
assertEncoderServerStarted()
49+
}
50+
51+
@Test
52+
fun `should start encoderServer if chat project context is enabled`(@TestDisposable disposable: Disposable) = runTest {
53+
ApplicationManager.getApplication()
54+
.replaceService(
55+
CodeWhispererSettings::class.java,
56+
mock { on { isProjectContextEnabled() } doReturn true },
57+
disposable
58+
)
59+
60+
assertEncoderServerStarted()
61+
}
62+
63+
private fun assertEncoderServerStarted() = runTest {
64+
mockConstruction(EncoderServer::class.java).use {
65+
// TODO: figure out how to make this testScope work
66+
// val cs = TestScope(context = StandardTestDispatcher()) // not works and the test never finish
67+
val cs = CoroutineScope(getCoroutineBgContext()) // works
68+
69+
assertThat(it.constructed()).isEmpty()
70+
sut = ProjectContextController(project, cs)
71+
assertThat(it.constructed()).hasSize(1)
72+
73+
// cs.advanceUntilIdle()
74+
sut.initJob.join()
75+
val encoderServer = it.constructed().first()
76+
verify(encoderServer, times(1)).downloadArtifactsAndStartServer()
77+
}
78+
}
79+
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextController.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,19 @@ import com.intellij.openapi.components.service
99
import com.intellij.openapi.project.Project
1010
import com.intellij.openapi.util.Disposer
1111
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.Job
1213
import kotlinx.coroutines.launch
1314
import software.aws.toolkits.core.utils.getLogger
1415
import software.aws.toolkits.core.utils.warn
15-
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
1616

1717
@Service(Service.Level.PROJECT)
1818
class ProjectContextController(private val project: Project, private val cs: CoroutineScope) : Disposable {
19+
// TODO: Ideally we should inject dependencies via constructor for easier testing, refer to how [TelemetryService] inject publisher and batcher
1920
private val encoderServer: EncoderServer = EncoderServer(project)
2021
private val projectContextProvider: ProjectContextProvider = ProjectContextProvider(project, encoderServer, cs)
21-
init {
22-
cs.launch {
23-
if (CodeWhispererSettings.getInstance().isProjectContextEnabled()) {
24-
encoderServer.downloadArtifactsAndStartServer()
25-
}
26-
}
22+
23+
val initJob: Job = cs.launch {
24+
encoderServer.downloadArtifactsAndStartServer()
2725
}
2826

2927
fun getProjectContextIndexComplete() = projectContextProvider.isIndexComplete.get()

0 commit comments

Comments
 (0)