33
44package software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session
55
6+ import com.intellij.openapi.vfs.VirtualFile
67import com.intellij.testFramework.RuleChain
78import io.mockk.coEvery
89import io.mockk.coVerify
@@ -11,6 +12,7 @@ import io.mockk.just
1112import io.mockk.mockk
1213import io.mockk.mockkStatic
1314import io.mockk.runs
15+ import io.mockk.slot
1416import io.mockk.unmockkAll
1517import io.mockk.verify
1618import kotlinx.coroutines.test.runTest
@@ -29,6 +31,8 @@ import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.messages.sendA
2931import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.util.FeatureDevService
3032import software.aws.toolkits.jetbrains.services.cwc.messages.CodeReference
3133import software.aws.toolkits.resources.message
34+ import java.nio.file.Files
35+ import java.nio.file.Paths
3236
3337class CodeGenerationStateTest : FeatureDevTestBase () {
3438 @Rule
@@ -39,13 +43,14 @@ class CodeGenerationStateTest : FeatureDevTestBase() {
3943 private lateinit var messenger: MessagePublisher
4044 private val action = SessionStateAction (" test-task" , userMessage)
4145 private lateinit var featureDevService: FeatureDevService
46+ private lateinit var repoContext: FeatureDevSessionContext
4247
4348 @Before
4449 override fun setup () {
4550 featureDevService = mockk<FeatureDevService >()
4651 every { featureDevService.project } returns projectRule.project
4752 messenger = mock()
48- val repoContext = mock <FeatureDevSessionContext >()
53+ repoContext = mockk <FeatureDevSessionContext >()
4954 val sessionStateConfig = SessionStateConfig (testConversationId, repoContext, featureDevService)
5055
5156 codeGenerationState =
@@ -103,6 +108,66 @@ class CodeGenerationStateTest : FeatureDevTestBase() {
103108 coVerify(exactly = 1 ) { featureDevService.exportTaskAssistArchiveResult(testConversationId) }
104109 }
105110
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+
106171 @Test(expected = FeatureDevException ::class )
107172 fun `test code generation failed` () =
108173 runTest {
0 commit comments