3
3
4
4
package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session
5
5
6
+ import com.intellij.openapi.vfs.VirtualFile
6
7
import com.intellij.testFramework.RuleChain
7
8
import io.mockk.coEvery
8
9
import io.mockk.coVerify
@@ -11,6 +12,7 @@ import io.mockk.just
11
12
import io.mockk.mockk
12
13
import io.mockk.mockkStatic
13
14
import io.mockk.runs
15
+ import io.mockk.slot
14
16
import io.mockk.unmockkAll
15
17
import io.mockk.verify
16
18
import kotlinx.coroutines.test.runTest
@@ -29,6 +31,8 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendA
29
31
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.FeatureDevService
30
32
import software.aws.toolkits.jetbrains.services.cwc.messages.CodeReference
31
33
import software.aws.toolkits.resources.message
34
+ import java.nio.file.Files
35
+ import java.nio.file.Paths
32
36
33
37
class CodeGenerationStateTest : FeatureDevTestBase () {
34
38
@Rule
@@ -39,13 +43,14 @@ class CodeGenerationStateTest : FeatureDevTestBase() {
39
43
private lateinit var messenger: MessagePublisher
40
44
private val action = SessionStateAction (" test-task" , userMessage)
41
45
private lateinit var featureDevService: FeatureDevService
46
+ private lateinit var repoContext: FeatureDevSessionContext
42
47
43
48
@Before
44
49
override fun setup () {
45
50
featureDevService = mockk<FeatureDevService >()
46
51
every { featureDevService.project } returns projectRule.project
47
52
messenger = mock()
48
- val repoContext = mock <FeatureDevSessionContext >()
53
+ repoContext = mockk <FeatureDevSessionContext >()
49
54
val sessionStateConfig = SessionStateConfig (testConversationId, repoContext, featureDevService)
50
55
51
56
codeGenerationState =
@@ -103,6 +108,66 @@ class CodeGenerationStateTest : FeatureDevTestBase() {
103
108
coVerify(exactly = 1 ) { featureDevService.exportTaskAssistArchiveResult(testConversationId) }
104
109
}
105
110
111
+ @Test
112
+ fun `test code generated is complete with run_command log contents verification` () {
113
+ val action = SessionStateAction (" test-task" , userMessage)
114
+
115
+ val tempDir = Files .createTempDirectory(" testRepo" )
116
+ val mockedFile = mockk<VirtualFile >()
117
+ every { mockedFile.exists() } returns true
118
+ every { mockedFile.isDirectory } returns true
119
+ every { mockedFile.path } returns tempDir.toAbsolutePath().toString()
120
+ every { mockedFile.toNioPath() } returns tempDir
121
+
122
+ val pathSlot = slot<String >()
123
+ every { mockedFile.findFileByRelativePath(capture(pathSlot)) } answers {
124
+ val path = pathSlot.captured
125
+ val filePath = tempDir.resolve(path)
126
+ if (! Files .exists(filePath)) {
127
+ Files .createFile(filePath)
128
+ }
129
+ val file = mockk<VirtualFile >()
130
+ every { file.exists() } returns true
131
+ every { file.isDirectory } returns Files .isDirectory(filePath)
132
+ every { file.path } returns filePath.toAbsolutePath().toString()
133
+ file
134
+ }
135
+
136
+ every { repoContext.addressableRoot } returns mockedFile
137
+
138
+ every { featureDevService.getTaskAssistCodeGeneration(any(), any()) } returns exampleCompleteGetTaskAssistCodeGenerationResponse
139
+ every { featureDevService.startTaskAssistCodeGeneration(any(), any(), any(), any(), any()) } returns exampleStartTaskAssistConversationResponse
140
+ coEvery { featureDevService.exportTaskAssistArchiveResult(any()) } returns
141
+ CodeGenerationStreamResult (testLogPath, testDeletedFiles, testReferences)
142
+
143
+ runTest {
144
+ val actual = codeGenerationState.interact(action)
145
+ assertThat(actual.nextState).isInstanceOf(PrepareCodeGenerationState ::class .java)
146
+ val nextState = actual.nextState as PrepareCodeGenerationState
147
+ assertThat(nextState.phase).isEqualTo(SessionStatePhase .CODEGEN )
148
+ assertThat(nextState.filePaths).doesNotContain(
149
+ NewFileZipInfo (testRunCommandLogPath, " This is a log" , rejected = false , changeApplied = false )
150
+ )
151
+ assertThat(nextState.filePaths.size).isEqualTo(0 )
152
+ assertThat(nextState.deletedFiles).isEqualTo(
153
+ listOf (DeletedFileInfo (" deleted.ts" , rejected = false , changeApplied = false ))
154
+ )
155
+ assertThat(nextState.references).isEqualTo(testReferences)
156
+ assertThat(nextState.codeGenerationRemainingIterationCount).isEqualTo(2 )
157
+ assertThat(nextState.codeGenerationTotalIterationCount).isEqualTo(3 )
158
+ assertThat(actual.interaction.interactionSucceeded).isEqualTo(true )
159
+ assertThat(actual.interaction.content).isEqualTo(" " )
160
+ assertThat(mockedFile.findFileByRelativePath(testRunCommandLogPath)).isNotNull
161
+ val file = requireNotNull(mockedFile.findFileByRelativePath(testRunCommandLogPath)) { " File not found" }
162
+ assertThat(Files .readString(Paths .get(file.path))).isEqualTo(" This is a log" )
163
+ }
164
+
165
+ assertThat(codeGenerationState.phase).isEqualTo(SessionStatePhase .CODEGEN )
166
+ coVerify(exactly = 1 ) { messenger.sendAnswerPart(testTabId, message(" amazonqFeatureDev.code_generation.generating_code" )) }
167
+ verify(exactly = 1 ) { featureDevService.getTaskAssistCodeGeneration(testConversationId, codeGenerationId) }
168
+ coVerify(exactly = 1 ) { featureDevService.exportTaskAssistArchiveResult(testConversationId) }
169
+ }
170
+
106
171
@Test(expected = FeatureDevException ::class )
107
172
fun `test code generation failed` () =
108
173
runTest {
0 commit comments