Skip to content

Commit abd2e7a

Browse files
committed
tst
1 parent 07d854a commit abd2e7a

File tree

2 files changed

+87
-4
lines changed

2 files changed

+87
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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.BeforeEach
16+
import org.junit.jupiter.api.Test
17+
import org.junit.jupiter.api.extension.RegisterExtension
18+
import org.mockito.Mockito.mockConstruction
19+
import org.mockito.kotlin.doReturn
20+
import org.mockito.kotlin.mock
21+
import org.mockito.kotlin.times
22+
import org.mockito.kotlin.verify
23+
import software.aws.toolkits.jetbrains.core.coroutines.EDT
24+
import software.aws.toolkits.jetbrains.services.amazonq.project.EncoderServer
25+
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
26+
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
27+
28+
class ProjectContextControllerTest {
29+
lateinit var sut: ProjectContextController
30+
31+
val project: Project
32+
get() = projectExtension.project
33+
34+
@BeforeEach
35+
fun setup() {}
36+
37+
@Test
38+
fun `should start encoderServer if chat project context is disabled`(@TestDisposable disposable: Disposable) = runTest {
39+
ApplicationManager.getApplication()
40+
.replaceService(
41+
CodeWhispererSettings::class.java,
42+
mock { on { isProjectContextEnabled() } doReturn false },
43+
disposable
44+
)
45+
46+
assertEncoderServerStarted()
47+
}
48+
49+
@Test
50+
fun `should start encoderServer if chat project context is enabled`(@TestDisposable disposable: Disposable) = runTest {
51+
ApplicationManager.getApplication()
52+
.replaceService(
53+
CodeWhispererSettings::class.java,
54+
mock { on { isProjectContextEnabled() } doReturn true },
55+
disposable
56+
)
57+
58+
assertEncoderServerStarted()
59+
}
60+
61+
private fun assertEncoderServerStarted() = runTest {
62+
mockConstruction(EncoderServer::class.java).use {
63+
// val cs = TestScope(context = StandardTestDispatcher()) // not works and the test never finish
64+
val cs = CoroutineScope(EDT) // works
65+
66+
assertThat(it.constructed()).isEmpty()
67+
sut = ProjectContextController(project, cs)
68+
assertThat(it.constructed()).hasSize(1)
69+
70+
// cs.advanceUntilIdle()
71+
sut.initJob.join()
72+
val encoderServer = it.constructed().first()
73+
verify(encoderServer, times(1)).downloadArtifactsAndStartServer()
74+
}
75+
}
76+
77+
private companion object {
78+
@JvmField
79+
@RegisterExtension
80+
val projectExtension = ProjectExtension()
81+
}
82+
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +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
1516

1617
@Service(Service.Level.PROJECT)
1718
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
1820
private val encoderServer: EncoderServer = EncoderServer(project)
1921
private val projectContextProvider: ProjectContextProvider = ProjectContextProvider(project, encoderServer, cs)
20-
init {
21-
cs.launch {
22-
encoderServer.downloadArtifactsAndStartServer()
23-
}
22+
23+
val initJob: Job = cs.launch {
24+
encoderServer.downloadArtifactsAndStartServer()
2425
}
2526

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

0 commit comments

Comments
 (0)