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