Skip to content

Commit 05d4664

Browse files
committed
test(amazonq): adding unit test for covering multi tab /doc execution
1 parent 5100dbd commit 05d4664

File tree

1 file changed

+105
-25
lines changed

1 file changed

+105
-25
lines changed

packages/core/src/test/amazonqDoc/controller.test.ts

Lines changed: 105 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,25 @@ import { FileSystem } from '../../shared/fs/fs'
2525
import { ReadmeBuilder } from './mockContent'
2626
import * as path from 'path'
2727
describe(`Controller - Doc Generation`, () => {
28-
const tabID = '123'
29-
const conversationID = '456'
30-
const uploadID = '789'
28+
const firstTabID = '123'
29+
const firstConversationID = '123'
30+
const firstUploadID = '123'
31+
32+
const secondTabID = '456'
33+
const secondConversationID = '456'
34+
const secondUploadID = '456'
3135

3236
let controllerSetup: ControllerSetup
3337
let session: Session
3438
let sendDocTelemetrySpy: sinon.SinonStub
39+
let sendDocTelemetrySpyForSecondTab: sinon.SinonStub
3540
let mockGetCodeGeneration: sinon.SinonStub
3641
let getSessionStub: sinon.SinonStub
3742
let modifiedReadme: string
3843
const generatedReadme = ReadmeBuilder.createBaseReadme()
3944
let sandbox: sinon.SinonSandbox
4045

41-
const getFilePaths = (controllerSetup: ControllerSetup): NewFileInfo[] => [
46+
const getFilePaths = (controllerSetup: ControllerSetup, uploadID: string): NewFileInfo[] => [
4247
{
4348
zipFilePath: path.normalize('README.md'),
4449
relativePath: path.normalize('README.md'),
@@ -50,7 +55,12 @@ describe(`Controller - Doc Generation`, () => {
5055
},
5156
]
5257

53-
async function createCodeGenState(sandbox: sinon.SinonSandbox) {
58+
async function createCodeGenState(
59+
sandbox: sinon.SinonSandbox,
60+
tabID: string,
61+
conversationID: string,
62+
uploadID: string
63+
) {
5464
mockGetCodeGeneration = sandbox.stub().resolves({ codeGenerationStatus: { status: 'Complete' } })
5565

5666
const workspaceFolders = [controllerSetup.workspaceFolder] as CurrentWsFolders
@@ -69,7 +79,15 @@ describe(`Controller - Doc Generation`, () => {
6979
workspaceFolders,
7080
}
7181

72-
const codeGenState = new DocCodeGenState(testConfig, getFilePaths(controllerSetup), [], [], tabID, 0, {})
82+
const codeGenState = new DocCodeGenState(
83+
testConfig,
84+
getFilePaths(controllerSetup, uploadID),
85+
[],
86+
[],
87+
tabID,
88+
0,
89+
{}
90+
)
7391
return createSession({
7492
messenger: controllerSetup.messenger,
7593
sessionState: codeGenState,
@@ -80,7 +98,7 @@ describe(`Controller - Doc Generation`, () => {
8098
sandbox,
8199
})
82100
}
83-
async function fireFollowUps(followUpTypes: FollowUpTypes[], stub: sinon.SinonStub) {
101+
async function fireFollowUps(followUpTypes: FollowUpTypes[], stub: sinon.SinonStub, tabID: string) {
84102
for (const type of followUpTypes) {
85103
controllerSetup.emitters.followUpClicked.fire({
86104
tabID,
@@ -97,7 +115,9 @@ describe(`Controller - Doc Generation`, () => {
97115
async function performAction(
98116
action: 'generate' | 'update' | 'makeChanges' | 'accept' | 'edit',
99117
getSessionStub: sinon.SinonStub,
100-
message?: string
118+
message?: string,
119+
tabID = firstTabID,
120+
conversationID = firstConversationID
101121
) {
102122
const sequences = {
103123
generate: FollowUpSequences.generateReadme,
@@ -107,7 +127,7 @@ describe(`Controller - Doc Generation`, () => {
107127
accept: FollowUpSequences.acceptContent,
108128
}
109129

110-
await fireFollowUps(sequences[action], getSessionStub)
130+
await fireFollowUps(sequences[action], getSessionStub, tabID)
111131

112132
if ((action === 'makeChanges' || action === 'edit') && message) {
113133
controllerSetup.emitters.processHumanChatMessage.fire({
@@ -119,14 +139,14 @@ describe(`Controller - Doc Generation`, () => {
119139
}
120140
}
121141

122-
async function setupTest(sandbox: sinon.SinonSandbox) {
142+
async function setupTest(sandbox: sinon.SinonSandbox, isMultiTabs?: boolean) {
123143
controllerSetup = await createController(sandbox)
124-
session = await createCodeGenState(sandbox)
144+
session = await createCodeGenState(sandbox, firstTabID, firstConversationID, firstUploadID)
125145
sendDocTelemetrySpy = sandbox.stub(session, 'sendDocTelemetryEvent').resolves()
126146
sandbox.stub(session, 'preloader').resolves()
127147
sandbox.stub(session, 'send').resolves()
128148
Object.defineProperty(session, '_conversationId', {
129-
value: conversationID,
149+
value: firstConversationID,
130150
writable: true,
131151
configurable: true,
132152
})
@@ -137,7 +157,30 @@ describe(`Controller - Doc Generation`, () => {
137157
amazonQ: 'connected',
138158
})
139159
sandbox.stub(FileSystem.prototype, 'exists').resolves(false)
140-
getSessionStub = sandbox.stub(controllerSetup.sessionStorage, 'getSession').resolves(session)
160+
if (isMultiTabs) {
161+
const secondSession = await createCodeGenState(sandbox, secondTabID, secondConversationID, secondUploadID)
162+
sendDocTelemetrySpyForSecondTab = sandbox.stub(secondSession, 'sendDocTelemetryEvent').resolves()
163+
sandbox.stub(secondSession, 'preloader').resolves()
164+
sandbox.stub(secondSession, 'send').resolves()
165+
Object.defineProperty(secondSession, '_conversationId', {
166+
value: secondConversationID,
167+
writable: true,
168+
configurable: true,
169+
})
170+
getSessionStub = sandbox
171+
.stub(controllerSetup.sessionStorage, 'getSession')
172+
.callsFake(async (tabId: string): Promise<Session> => {
173+
if (tabId === firstTabID) {
174+
return session
175+
}
176+
if (tabId === secondTabID) {
177+
return secondSession
178+
}
179+
throw new Error(`Unknown tab ID: ${tabId}`)
180+
})
181+
} else {
182+
getSessionStub = sandbox.stub(controllerSetup.sessionStorage, 'getSession').resolves(session)
183+
}
141184
modifiedReadme = ReadmeBuilder.createReadmeWithRepoStructure()
142185
sandbox
143186
.stub(vscode.workspace, 'openTextDocument')
@@ -158,6 +201,7 @@ describe(`Controller - Doc Generation`, () => {
158201

159202
const retryTest = async (
160203
testMethod: () => Promise<void>,
204+
isMultiTabs?: boolean,
161205
maxRetries: number = 3,
162206
delayMs: number = 1000
163207
): Promise<void> => {
@@ -166,7 +210,7 @@ describe(`Controller - Doc Generation`, () => {
166210
for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
167211
sandbox = sinon.createSandbox()
168212
try {
169-
await setupTest(sandbox)
213+
await setupTest(sandbox, isMultiTabs)
170214
await testMethod()
171215
sandbox.restore()
172216
return
@@ -199,7 +243,7 @@ describe(`Controller - Doc Generation`, () => {
199243
type: 'generation',
200244
...EventMetrics.INITIAL_README,
201245
interactionType: 'GENERATE_README',
202-
conversationId: conversationID,
246+
conversationId: firstConversationID,
203247
})
204248

205249
await assertTelemetry({
@@ -217,7 +261,7 @@ describe(`Controller - Doc Generation`, () => {
217261
type: 'generation',
218262
...EventMetrics.INITIAL_README,
219263
interactionType: 'GENERATE_README',
220-
conversationId: conversationID,
264+
conversationId: firstConversationID,
221265
})
222266

223267
await assertTelemetry({
@@ -227,14 +271,14 @@ describe(`Controller - Doc Generation`, () => {
227271
sandbox,
228272
})
229273

230-
await updateFilePaths(session, modifiedReadme, uploadID, docScheme, controllerSetup.workspaceFolder)
274+
await updateFilePaths(session, modifiedReadme, firstUploadID, docScheme, controllerSetup.workspaceFolder)
231275
await performAction('makeChanges', getSessionStub, 'add repository structure section')
232276

233277
const secondExpectedEvent = createExpectedEvent({
234278
type: 'generation',
235279
...EventMetrics.REPO_STRUCTURE,
236280
interactionType: 'GENERATE_README',
237-
conversationId: conversationID,
281+
conversationId: firstConversationID,
238282
})
239283

240284
await assertTelemetry({
@@ -255,7 +299,7 @@ describe(`Controller - Doc Generation`, () => {
255299
type: 'acceptance',
256300
...EventMetrics.INITIAL_README,
257301
interactionType: 'GENERATE_README',
258-
conversationId: conversationID,
302+
conversationId: firstConversationID,
259303
})
260304

261305
await performAction('accept', getSessionStub)
@@ -276,7 +320,7 @@ describe(`Controller - Doc Generation`, () => {
276320
type: 'generation',
277321
...EventMetrics.REPO_STRUCTURE,
278322
interactionType: 'UPDATE_README',
279-
conversationId: conversationID,
323+
conversationId: firstConversationID,
280324
})
281325

282326
await assertTelemetry({
@@ -293,15 +337,15 @@ describe(`Controller - Doc Generation`, () => {
293337
await new Promise((resolve) => setTimeout(resolve, 100))
294338

295339
modifiedReadme = ReadmeBuilder.createReadmeWithDataFlow()
296-
await updateFilePaths(session, modifiedReadme, uploadID, docScheme, controllerSetup.workspaceFolder)
340+
await updateFilePaths(session, modifiedReadme, firstUploadID, docScheme, controllerSetup.workspaceFolder)
297341

298342
await performAction('makeChanges', getSessionStub, 'add data flow section')
299343

300344
const expectedEvent = createExpectedEvent({
301345
type: 'generation',
302346
...EventMetrics.DATA_FLOW,
303347
interactionType: 'UPDATE_README',
304-
conversationId: conversationID,
348+
conversationId: firstConversationID,
305349
callIndex: 1,
306350
})
307351

@@ -324,7 +368,7 @@ describe(`Controller - Doc Generation`, () => {
324368
type: 'acceptance',
325369
...EventMetrics.REPO_STRUCTURE,
326370
interactionType: 'UPDATE_README',
327-
conversationId: conversationID,
371+
conversationId: firstConversationID,
328372
})
329373

330374
await performAction('accept', getSessionStub)
@@ -346,7 +390,7 @@ describe(`Controller - Doc Generation`, () => {
346390
type: 'generation',
347391
...EventMetrics.REPO_STRUCTURE,
348392
interactionType: 'EDIT_README',
349-
conversationId: conversationID,
393+
conversationId: firstConversationID,
350394
})
351395

352396
await assertTelemetry({
@@ -366,7 +410,7 @@ describe(`Controller - Doc Generation`, () => {
366410
type: 'acceptance',
367411
...EventMetrics.REPO_STRUCTURE,
368412
interactionType: 'EDIT_README',
369-
conversationId: conversationID,
413+
conversationId: firstConversationID,
370414
})
371415

372416
await performAction('accept', getSessionStub)
@@ -379,4 +423,40 @@ describe(`Controller - Doc Generation`, () => {
379423
})
380424
})
381425
})
426+
it('should emit separate telemetry events when executing /doc in different tabs', async () => {
427+
await retryTest(async () => {
428+
const firstSession = await getSessionStub(firstTabID)
429+
const secondSession = await getSessionStub(secondTabID)
430+
await performAction('generate', firstSession)
431+
await performAction('update', secondSession, undefined, secondTabID, secondConversationID)
432+
433+
const expectedEvent = createExpectedEvent({
434+
type: 'generation',
435+
...EventMetrics.INITIAL_README,
436+
interactionType: 'GENERATE_README',
437+
conversationId: firstConversationID,
438+
})
439+
440+
await assertTelemetry({
441+
spy: sendDocTelemetrySpy,
442+
expectedEvent,
443+
type: 'generation',
444+
sandbox,
445+
})
446+
447+
const expectedEventForSecondTab = createExpectedEvent({
448+
type: 'generation',
449+
...EventMetrics.REPO_STRUCTURE,
450+
interactionType: 'UPDATE_README',
451+
conversationId: secondConversationID,
452+
})
453+
454+
await assertTelemetry({
455+
spy: sendDocTelemetrySpyForSecondTab,
456+
expectedEvent: expectedEventForSecondTab,
457+
type: 'generation',
458+
sandbox,
459+
})
460+
}, true)
461+
})
382462
})

0 commit comments

Comments
 (0)