Skip to content

Commit 46f2a8f

Browse files
authored
test(Amazon Q FeatureDev): insertChanges #4594
Problem No tests for #4556 Solution: Add a test. TODO: rework the tests to actually test the real codepaths instead of over-using stubs/mocks.
1 parent 77bf844 commit 46f2a8f

File tree

3 files changed

+118
-9
lines changed

3 files changed

+118
-9
lines changed

packages/core/src/test/amazonqFeatureDev/controllers/chat/controller.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,14 +307,14 @@ describe('Controller', () => {
307307
}, {})
308308
return getSessionStub.getCall(0).returnValue
309309
}
310-
it('This test case verifies that when a customer clicks on the "Reject File" button, the state of the file is updated correctly to "rejected: true".', async () => {
310+
it('clicking the "Reject File" button updates the file state to "rejected: true"', async () => {
311311
const session = await createCodeGenState()
312312
const getSessionStub = sinon.stub(controllerSetup.sessionStorage, 'getSession').resolves(session)
313313

314314
const rejectFile = await fileClicked(getSessionStub, 'reject-change')
315315
assert.strictEqual(rejectFile.state.filePaths?.find(i => i.relativePath === filePath)?.rejected, true)
316316
})
317-
it('This test case verifies that when a customer clicks on the "Reject File" button and then clicks on the "Revert Reject File" button the state of the file is updated correctly to "rejected: false".', async () => {
317+
it('clicking the "Reject File" button and then "Revert Reject File", updates the file state to "rejected: false"', async () => {
318318
const session = await createCodeGenState()
319319
const getSessionStub = sinon.stub(controllerSetup.sessionStorage, 'getSession').resolves(session)
320320

packages/core/src/test/amazonqFeatureDev/session/session.test.ts

Lines changed: 96 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,34 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import * as vscode from 'vscode'
7+
import * as assert from 'assert'
8+
69
import sinon from 'sinon'
7-
import { createMessenger, createSession } from '../utils'
8-
import { Session } from '../../../amazonqFeatureDev/session/session'
10+
11+
import {
12+
ControllerSetup,
13+
createController,
14+
createMessenger,
15+
createSession,
16+
generateVirtualMemoryUri,
17+
sessionRegisterProvider,
18+
sessionWriteFile,
19+
} from '../utils'
20+
import { CurrentWsFolders } from '../../../amazonqFeatureDev/types'
21+
import { CodeGenState } from '../../../amazonqFeatureDev/session/sessionState'
22+
import { FeatureDevClient } from '../../../amazonqFeatureDev/client/featureDev'
23+
import path from 'path'
924
import { assertTelemetry } from '../../testUtil'
25+
import { Messenger } from '../../../amazonqFeatureDev/controllers/chat/messenger/messenger'
26+
import { FileSystemCommon } from '../../../srcShared/fs'
1027

1128
describe('session', () => {
1229
const conversationID = '12345'
30+
let messenger: Messenger
1331

14-
let session: Session
15-
16-
beforeEach(async () => {
17-
const messenger = createMessenger()
18-
session = await createSession({ messenger, conversationID })
32+
beforeEach(() => {
33+
messenger = createMessenger()
1934
})
2035

2136
afterEach(() => {
@@ -24,11 +39,85 @@ describe('session', () => {
2439

2540
describe('preloader', () => {
2641
it('emits start chat telemetry', async () => {
42+
const session = await createSession({ messenger, conversationID })
43+
2744
await session.preloader('implement twosum in typescript')
2845

2946
assertTelemetry('amazonq_startConversationInvoke', {
3047
amazonqConversationId: conversationID,
3148
})
3249
})
3350
})
51+
describe('insertChanges', async () => {
52+
afterEach(() => {
53+
sinon.restore()
54+
})
55+
56+
let workspaceFolderUriFsPath: string
57+
const notRejectedFileName = 'notRejectedFile.js'
58+
const notRejectedFileContent = 'notrejectedFileContent'
59+
let uri: vscode.Uri
60+
let encodedContent: Uint8Array
61+
62+
async function createCodeGenState() {
63+
const controllerSetup: ControllerSetup = await createController()
64+
65+
const uploadID = '789'
66+
const tabID = '123'
67+
const testApproach = 'test-approach'
68+
const workspaceFolders = [controllerSetup.workspaceFolder] as CurrentWsFolders
69+
workspaceFolderUriFsPath = controllerSetup.workspaceFolder.uri.fsPath
70+
uri = generateVirtualMemoryUri(uploadID, notRejectedFileName)
71+
72+
const testConfig = {
73+
conversationId: conversationID,
74+
proxyClient: {} as unknown as FeatureDevClient,
75+
sourceRoots: [''],
76+
uploadId: uploadID,
77+
workspaceFolders,
78+
}
79+
80+
const codeGenState = new CodeGenState(
81+
testConfig,
82+
testApproach,
83+
[
84+
{
85+
zipFilePath: notRejectedFileName,
86+
relativePath: notRejectedFileName,
87+
fileContent: notRejectedFileContent,
88+
rejected: false,
89+
virtualMemoryUri: uri,
90+
workspaceFolder: controllerSetup.workspaceFolder,
91+
},
92+
{
93+
zipFilePath: 'rejectedFile.js',
94+
relativePath: 'rejectedFile.js',
95+
fileContent: 'rejectedFileContent',
96+
rejected: true,
97+
virtualMemoryUri: generateVirtualMemoryUri(uploadID, 'rejectedFile.js'),
98+
workspaceFolder: controllerSetup.workspaceFolder,
99+
},
100+
],
101+
[],
102+
[],
103+
tabID,
104+
0
105+
)
106+
const session = await createSession({ messenger, sessionState: codeGenState, conversationID })
107+
encodedContent = new TextEncoder().encode(notRejectedFileContent)
108+
await sessionRegisterProvider(session, uri, encodedContent)
109+
return session
110+
}
111+
it('only insert non rejected files', async () => {
112+
const fsSpyWriteFile = sinon.spy(FileSystemCommon.instance, 'writeFile')
113+
const session = await createCodeGenState()
114+
await sessionWriteFile(session, uri, encodedContent)
115+
await session.insertChanges()
116+
117+
const absolutePath = path.join(workspaceFolderUriFsPath, notRejectedFileName)
118+
119+
assert.ok(fsSpyWriteFile.calledOnce)
120+
assert.ok(fsSpyWriteFile.calledWith(absolutePath, notRejectedFileContent))
121+
})
122+
})
34123
})

packages/core/src/test/amazonqFeatureDev/utils.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import { createSessionConfig } from '../../amazonqFeatureDev/session/sessionConf
1515
import { Session } from '../../amazonqFeatureDev/session/session'
1616
import { SessionState } from '../../amazonqFeatureDev/types'
1717
import { FeatureDevClient } from '../../amazonqFeatureDev/client/featureDev'
18+
import { VirtualMemoryFile } from '../../shared/virtualMemoryFile'
19+
import path from 'path'
20+
import { featureDevScheme } from '../../amazonqFeatureDev/constants'
1821

1922
export function createMessenger(): Messenger {
2023
return new Messenger(
@@ -70,6 +73,23 @@ export async function createSession({
7073
return session
7174
}
7275

76+
export async function sessionRegisterProvider(session: Session, uri: vscode.Uri, fileContents: Uint8Array) {
77+
session.config.fs.registerProvider(uri, new VirtualMemoryFile(fileContents))
78+
}
79+
80+
export function generateVirtualMemoryUri(uploadID: string, filePath: string) {
81+
const generationFilePath = path.join(uploadID, filePath)
82+
const uri = vscode.Uri.from({ scheme: featureDevScheme, path: generationFilePath })
83+
return uri
84+
}
85+
86+
export async function sessionWriteFile(session: Session, uri: vscode.Uri, encodedContent: Uint8Array) {
87+
await session.config.fs.writeFile(uri, encodedContent, {
88+
create: true,
89+
overwrite: true,
90+
})
91+
}
92+
7393
export async function createController(): Promise<ControllerSetup> {
7494
const messenger = createMessenger()
7595

0 commit comments

Comments
 (0)