@@ -8,8 +8,11 @@ import assert from 'assert'
88import sinon from 'sinon'
99import { DocPrepareCodeGenState } from '../../../amazonqDoc'
1010import { createMockSessionStateAction } from '../../amazonq/utils'
11-
1211import { createTestContext , setupTestHooks } from '../../amazonq/session/testSetup'
12+ import * as filesModule from '../../../amazonq/util/files'
13+ import { CodeGenBase } from '../../../amazonq/session/sessionState'
14+ import { RunCommandLogFileName } from '../../../amazonq/session/sessionState'
15+ import { info } from 'console'
1316
1417describe ( 'sessionStateDoc' , ( ) => {
1518 const context = createTestContext ( )
@@ -26,4 +29,162 @@ describe('sessionStateDoc', () => {
2629 } )
2730 } )
2831 } )
32+
33+ describe ( 'CodeGenBase generateCode log file handling' , ( ) => {
34+ class TestCodeGen extends CodeGenBase {
35+ public generatedFiles : any [ ] = [ ]
36+ constructor ( config : any , tabID : string ) {
37+ super ( config , tabID )
38+ }
39+ protected handleProgress ( _messenger : any ) : void {
40+ // No-op for test.
41+ }
42+ protected getScheme ( ) : string {
43+ return 'file'
44+ }
45+ protected getTimeoutErrorCode ( ) : string {
46+ return 'test_timeout'
47+ }
48+ protected handleGenerationComplete ( _messenger : any , newFileInfo : any [ ] ) : void {
49+ this . generatedFiles = newFileInfo
50+ }
51+ protected handleError ( _messenger : any , _codegenResult : any ) : Error {
52+ throw new Error ( 'handleError called' )
53+ }
54+ }
55+
56+ let fakeProxyClient : any
57+ let testConfig : any
58+ let fsMock : any
59+ let messengerMock : any
60+ let telemetryMock : any
61+ let loggerMock : any
62+ let testAction : any
63+ let registerNewFilesStub : any
64+
65+ beforeEach ( ( ) => {
66+ fakeProxyClient = {
67+ getCodeGeneration : sinon . stub ( ) . resolves ( {
68+ codeGenerationStatus : { status : 'Complete' } ,
69+ codeGenerationRemainingIterationCount : 0 ,
70+ codeGenerationTotalIterationCount : 1 ,
71+ } ) ,
72+ exportResultArchive : sinon . stub ( ) ,
73+ }
74+
75+ testConfig = {
76+ conversationId : 'conv_test' ,
77+ uploadId : 'upload_test' ,
78+ workspaceRoots : [ '/workspace' ] ,
79+ proxyClient : fakeProxyClient ,
80+ }
81+
82+ fsMock = {
83+ writeFile : sinon . stub ( ) . resolves ( ) ,
84+ }
85+
86+ messengerMock = { sendAnswer : sinon . spy ( ) }
87+
88+ telemetryMock = {
89+ setCodeGenerationResult : sinon . spy ( ) ,
90+ setNumberOfFilesGenerated : sinon . spy ( ) ,
91+ setAmazonqNumberOfReferences : sinon . spy ( ) ,
92+ setGenerateCodeIteration : sinon . spy ( ) ,
93+ setGenerateCodeLastInvocationTime : sinon . spy ( ) ,
94+ recordUserCodeGenerationTelemetry : sinon . spy ( ) ,
95+ }
96+
97+ loggerMock = {
98+ // addContent: sinon.spy(),
99+ info : sinon . spy ( ) ,
100+ }
101+
102+ testAction = {
103+ fs : fsMock ,
104+ messenger : messengerMock ,
105+ logger : loggerMock ,
106+ tokenSource : { token : { isCancellationRequested : false , onCancellationRequested : ( ) => { } } } ,
107+ }
108+
109+ registerNewFilesStub = sinon
110+ . stub ( filesModule , 'registerNewFiles' )
111+ . callsFake ( ( _ , newFileContents : any [ ] ) => {
112+ return newFileContents
113+ } )
114+ } )
115+
116+ afterEach ( ( ) => {
117+ sinon . restore ( )
118+ } )
119+
120+ it ( 'adds the log content to logger if present and excludes it from new files' , async ( ) => {
121+ const logFileInfo = {
122+ zipFilePath : RunCommandLogFileName ,
123+ fileContent : 'newLog' ,
124+ }
125+ const otherFile = { zipFilePath : 'other.ts' , fileContent : 'other content' }
126+ fakeProxyClient . exportResultArchive . resolves ( {
127+ newFileContents : [ logFileInfo , otherFile ] ,
128+ deletedFiles : [ ] ,
129+ references : [ ] ,
130+ } )
131+
132+ const testCodeGen = new TestCodeGen ( testConfig , 'tab1' )
133+
134+ const result = await testCodeGen . generateCode ( {
135+ messenger : messengerMock ,
136+ fs : fsMock ,
137+ codeGenerationId : 'codegen1' ,
138+ telemetry : telemetryMock ,
139+ workspaceFolders : [ ] as any ,
140+ action : testAction ,
141+ } )
142+
143+ sinon . assert . calledWith ( loggerMock . info , `Run Command logs: \n ${ logFileInfo . fileContent } ` )
144+
145+ sinon . assert . calledWith (
146+ registerNewFilesStub ,
147+ fsMock ,
148+ [ otherFile ] ,
149+ testConfig . uploadId ,
150+ [ ] as any ,
151+ testConfig . conversationId ,
152+ 'file'
153+ )
154+
155+ assert . deepStrictEqual ( result . newFiles , [ otherFile ] )
156+ } )
157+
158+ it ( 'skips log file handling if log file is not present' , async ( ) => {
159+ const file1 = { zipFilePath : 'file1.ts' , fileContent : 'content1' }
160+ fakeProxyClient . exportResultArchive . resolves ( {
161+ newFileContents : [ file1 ] ,
162+ deletedFiles : [ ] ,
163+ references : [ ] ,
164+ } )
165+
166+ const testCodeGen = new TestCodeGen ( testConfig , 'tab1' )
167+
168+ const result = await testCodeGen . generateCode ( {
169+ messenger : messengerMock ,
170+ fs : fsMock ,
171+ codeGenerationId : 'codegen2' ,
172+ telemetry : telemetryMock ,
173+ workspaceFolders : [ ] as any ,
174+ action : testAction ,
175+ } )
176+
177+ sinon . assert . notCalled ( loggerMock . info )
178+ sinon . assert . calledWith (
179+ registerNewFilesStub ,
180+ fsMock ,
181+ [ file1 ] ,
182+ testConfig . uploadId ,
183+ [ ] as any ,
184+ testConfig . conversationId ,
185+ 'file'
186+ )
187+ assert . deepStrictEqual ( result . newFiles , [ file1 ] )
188+ } )
189+ } )
29190} )
0 commit comments