Skip to content

Commit 63dfa18

Browse files
authored
Use instance spies to test plots webview messages (#4394)
1 parent a5eae9d commit 63dfa18

File tree

3 files changed

+105
-91
lines changed

3 files changed

+105
-91
lines changed

extension/src/test/suite/experiments/util.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ export const buildExperimentsWebview = async (inputs: {
144144
const { experiments, messageSpy } = all
145145
await experiments.isReady()
146146
const webview = await experiments.showWebview()
147+
await webview.isReady()
147148
messageSpy.restore()
148149
const instanceMessageSpy: typeof messageSpy = spy(webview, 'show')
149150
// eslint-disable-next-line @typescript-eslint/no-explicit-any

extension/src/test/suite/plots/index.test.ts

Lines changed: 44 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { expect } from 'chai'
44
import { restore, spy, stub } from 'sinon'
55
import { commands, TextDocument, Uri, window } from 'vscode'
66
import isEqual from 'lodash.isequal'
7-
import { buildPlots } from '../plots/util'
7+
import { buildPlots, buildPlotsWebview } from '../plots/util'
88
import { Disposable } from '../../../extension'
99
import expShowFixtureWithoutErrors from '../../fixtures/expShow/base/noErrors'
1010
import gitLogFixture from '../../fixtures/expShow/base/gitLog'
@@ -19,8 +19,8 @@ import {
1919
bypassProcessManagerDebounce,
2020
closeAllEditors,
2121
getFirstArgOfLastCall,
22-
getMockNow,
23-
getMessageReceivedEmitter
22+
getMessageReceivedEmitter,
23+
getMockNow
2424
} from '../util'
2525
import { dvcDemoPath } from '../../util'
2626
import {
@@ -169,12 +169,11 @@ suite('Plots Test Suite', () => {
169169
})
170170

171171
it('should handle a section resized message from the webview', async () => {
172-
const { plots, plotsModel } = await buildPlots({ disposer: disposable })
173-
174-
const webview = await plots.showWebview()
172+
const { mockMessageReceived, plotsModel } = await buildPlotsWebview({
173+
disposer: disposable
174+
})
175175

176176
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
177-
const mockMessageReceived = getMessageReceivedEmitter(webview)
178177

179178
const mockSetPlotSize = stub(
180179
plotsModel,
@@ -208,14 +207,12 @@ suite('Plots Test Suite', () => {
208207
}).timeout(WEBVIEW_TEST_TIMEOUT)
209208

210209
it('should handle a section collapsed message from the webview', async () => {
211-
const { plots, plotsModel, messageSpy } = await buildPlots({
212-
disposer: disposable
213-
})
214-
215-
const webview = await plots.showWebview()
210+
const { mockMessageReceived, plotsModel, messageSpy } =
211+
await buildPlotsWebview({
212+
disposer: disposable
213+
})
216214

217215
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
218-
const mockMessageReceived = getMessageReceivedEmitter(webview)
219216

220217
const mockSetSectionCollapsed = spy(plotsModel, 'setSectionCollapsed')
221218
const mockSectionCollapsed = { [PlotsSection.CUSTOM_PLOTS]: true }
@@ -249,15 +246,13 @@ suite('Plots Test Suite', () => {
249246
}).timeout(WEBVIEW_TEST_TIMEOUT)
250247

251248
it('should handle a comparison revisions reordered message from the webview', async () => {
252-
const { plots, plotsModel, messageSpy } = await buildPlots({
253-
disposer: disposable,
254-
plotsDiff: plotsDiffFixture
255-
})
256-
257-
const webview = await plots.showWebview()
249+
const { messageSpy, mockMessageReceived, plotsModel } =
250+
await buildPlotsWebview({
251+
disposer: disposable,
252+
plotsDiff: plotsDiffFixture
253+
})
258254

259255
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
260-
const mockMessageReceived = getMessageReceivedEmitter(webview)
261256

262257
const mockSetComparisonOrder = spy(plotsModel, 'setComparisonOrder')
263258
const mockComparisonOrder = [
@@ -301,15 +296,13 @@ suite('Plots Test Suite', () => {
301296
}).timeout(WEBVIEW_TEST_TIMEOUT)
302297

303298
it('should handle a comparison rows reordered message from the webview', async () => {
304-
const { plots, pathsModel, messageSpy } = await buildPlots({
305-
disposer: disposable,
306-
plotsDiff: plotsDiffFixture
307-
})
308-
309-
const webview = await plots.showWebview()
299+
const { messageSpy, mockMessageReceived, pathsModel } =
300+
await buildPlotsWebview({
301+
disposer: disposable,
302+
plotsDiff: plotsDiffFixture
303+
})
310304

311305
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
312-
const mockMessageReceived = getMessageReceivedEmitter(webview)
313306

314307
const mockSetComparisonPathsOrder = spy(
315308
pathsModel,
@@ -354,15 +347,13 @@ suite('Plots Test Suite', () => {
354347
}).timeout(WEBVIEW_TEST_TIMEOUT)
355348

356349
it('should handle a template plots reordered message from the webview', async () => {
357-
const { pathsModel, plots, messageSpy } = await buildPlots({
358-
disposer: disposable,
359-
plotsDiff: plotsDiffFixture
360-
})
361-
362-
const webview = await plots.showWebview()
350+
const { pathsModel, messageSpy, mockMessageReceived } =
351+
await buildPlotsWebview({
352+
disposer: disposable,
353+
plotsDiff: plotsDiffFixture
354+
})
363355

364356
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
365-
const mockMessageReceived = getMessageReceivedEmitter(webview)
366357

367358
const mockSetTemplateOrder = spy(pathsModel, 'setTemplateOrder')
368359
const mockTemplateOrder = [
@@ -404,15 +395,12 @@ suite('Plots Test Suite', () => {
404395
}).timeout(WEBVIEW_TEST_TIMEOUT)
405396

406397
it('should handle a plot zoomed message from the webview', async () => {
407-
const { plots } = await buildPlots({
398+
const { mockMessageReceived } = await buildPlotsWebview({
408399
disposer: disposable,
409400
plotsDiff: plotsDiffFixture
410401
})
411402

412-
const webview = await plots.showWebview()
413-
414403
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
415-
const mockMessageReceived = getMessageReceivedEmitter(webview)
416404

417405
mockMessageReceived.fire({
418406
type: MessageFromWebviewType.ZOOM_PLOT
@@ -427,16 +415,13 @@ suite('Plots Test Suite', () => {
427415
}).timeout(WEBVIEW_TEST_TIMEOUT)
428416

429417
it('should handle a plot zoomed message from the webview for an image', async () => {
430-
const { plots } = await buildPlots({
418+
const { mockMessageReceived, webview } = await buildPlotsWebview({
431419
disposer: disposable,
432420
plotsDiff: plotsDiffFixture
433421
})
434422
stub(FileSystem, 'openImageFileInEditor').resolves(true)
435423

436-
const webview = await plots.showWebview()
437-
438424
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
439-
const mockMessageReceived = getMessageReceivedEmitter(webview)
440425

441426
mockMessageReceived.fire({
442427
payload: webview.getWebviewUri('a/path.jpg'),
@@ -452,17 +437,15 @@ suite('Plots Test Suite', () => {
452437
}).timeout(WEBVIEW_TEST_TIMEOUT)
453438

454439
it('should open an image when receiving a plot zoomed message from the webview with a payload', async () => {
455-
const { plots } = await buildPlots({
440+
const { webview, mockMessageReceived } = await buildPlotsWebview({
456441
disposer: disposable,
457442
plotsDiff: plotsDiffFixture
458443
})
459444

460-
const webview = await plots.showWebview()
461445
const imagePath = 'some/path/image.jpg'
462446

463447
stub(Telemetry, 'sendTelemetryEvent')
464448
const mockExecuteCommands = stub(commands, 'executeCommand')
465-
const mockMessageReceived = getMessageReceivedEmitter(webview)
466449

467450
mockMessageReceived.fire({
468451
payload: webview.getWebviewUri(imagePath),
@@ -476,14 +459,12 @@ suite('Plots Test Suite', () => {
476459
}).timeout(WEBVIEW_TEST_TIMEOUT)
477460

478461
it('should handle an export plot data as json message from the webview', async () => {
479-
const { plots } = await buildPlots({
462+
const { mockMessageReceived } = await buildPlotsWebview({
480463
disposer: disposable,
481464
plotsDiff: plotsDiffFixture
482465
})
483466

484-
const webview = await plots.showWebview()
485467
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
486-
const mockMessageReceived = getMessageReceivedEmitter(webview)
487468
const customPlot = customPlotsFixture.plots[0]
488469
const mockShowSaveDialog = stub(window, 'showSaveDialog')
489470
const mockWriteJson = stub(FileSystem, 'writeJson')
@@ -522,14 +503,12 @@ suite('Plots Test Suite', () => {
522503
}).timeout(WEBVIEW_TEST_TIMEOUT)
523504

524505
it('should handle an export plot data as csv message from the webview', async () => {
525-
const { plots } = await buildPlots({
506+
const { mockMessageReceived } = await buildPlotsWebview({
526507
disposer: disposable,
527508
plotsDiff: plotsDiffFixture
528509
})
529510

530-
const webview = await plots.showWebview()
531511
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
532-
const mockMessageReceived = getMessageReceivedEmitter(webview)
533512
const mockShowSaveDialog = stub(window, 'showSaveDialog')
534513
const mockWriteCsv = stub(FileSystem, 'writeCsv')
535514
const mockOpenFile = stub(FileSystem, 'openFileInEditor')
@@ -567,14 +546,12 @@ suite('Plots Test Suite', () => {
567546
}).timeout(WEBVIEW_TEST_TIMEOUT)
568547

569548
it('should handle an export plot data as tsv message from the webview', async () => {
570-
const { plots } = await buildPlots({
549+
const { mockMessageReceived } = await buildPlotsWebview({
571550
disposer: disposable,
572551
plotsDiff: plotsDiffFixture
573552
})
574553

575-
const webview = await plots.showWebview()
576554
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
577-
const mockMessageReceived = getMessageReceivedEmitter(webview)
578555
const mockShowSaveDialog = stub(window, 'showSaveDialog')
579556
const mockWriteTsv = stub(FileSystem, 'writeTsv')
580557
const mockOpenFile = stub(FileSystem, 'openFileInEditor')
@@ -612,14 +589,12 @@ suite('Plots Test Suite', () => {
612589
}).timeout(WEBVIEW_TEST_TIMEOUT)
613590

614591
it('should handle export data messages from the webview when the file is cancelled or errors are thrown during file writing', async () => {
615-
const { plots } = await buildPlots({
592+
const { mockMessageReceived } = await buildPlotsWebview({
616593
disposer: disposable,
617594
plotsDiff: plotsDiffFixture
618595
})
619596

620-
const webview = await plots.showWebview()
621597
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
622-
const mockMessageReceived = getMessageReceivedEmitter(webview)
623598
const mockShowSaveDialog = stub(window, 'showSaveDialog')
624599
const mockWriteCsv = stub(FileSystem, 'writeCsv')
625600
const mockOpenFile = stub(FileSystem, 'openFileInEditor')
@@ -666,12 +641,11 @@ suite('Plots Test Suite', () => {
666641
}).timeout(WEBVIEW_TEST_TIMEOUT)
667642

668643
it('should handle a custom plots reordered message from the webview', async () => {
669-
const { plots, plotsModel, messageSpy } = await buildPlots({
670-
disposer: disposable,
671-
plotsDiff: plotsDiffFixture
672-
})
673-
674-
const webview = await plots.showWebview()
644+
const { plotsModel, messageSpy, mockMessageReceived } =
645+
await buildPlotsWebview({
646+
disposer: disposable,
647+
plotsDiff: plotsDiffFixture
648+
})
675649

676650
const mockNewCustomPlotsOrder = [
677651
'custom-summary.json:accuracy-params.yaml:epochs',
@@ -683,7 +657,6 @@ suite('Plots Test Suite', () => {
683657
.returns(customPlotsFixture)
684658

685659
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
686-
const mockMessageReceived = getMessageReceivedEmitter(webview)
687660
const mockSetCustomPlotsOrder = stub(plotsModel, 'setCustomPlotsOrder')
688661
mockSetCustomPlotsOrder.returns(undefined)
689662

@@ -715,7 +688,7 @@ suite('Plots Test Suite', () => {
715688
}).timeout(WEBVIEW_TEST_TIMEOUT)
716689

717690
it('should handle a select experiments message from the webview', async () => {
718-
const { plots, experiments } = await buildPlots({
691+
const { experiments, mockMessageReceived } = await buildPlotsWebview({
719692
disposer: disposable,
720693
plotsDiff: plotsDiffFixture
721694
})
@@ -725,10 +698,7 @@ suite('Plots Test Suite', () => {
725698
'selectExperimentsToPlot'
726699
).resolves(undefined)
727700

728-
const webview = await plots.showWebview()
729-
730701
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
731-
const mockMessageReceived = getMessageReceivedEmitter(webview)
732702

733703
mockMessageReceived.fire({
734704
type: MessageFromWebviewType.SELECT_EXPERIMENTS
@@ -744,7 +714,7 @@ suite('Plots Test Suite', () => {
744714
}).timeout(WEBVIEW_TEST_TIMEOUT)
745715

746716
it('should handle a select plots message from the webview', async () => {
747-
const { plots } = await buildPlots({
717+
const { mockMessageReceived, plots } = await buildPlotsWebview({
748718
disposer: disposable,
749719
plotsDiff: plotsDiffFixture
750720
})
@@ -753,10 +723,7 @@ suite('Plots Test Suite', () => {
753723
undefined
754724
)
755725

756-
const webview = await plots.showWebview()
757-
758726
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
759-
const mockMessageReceived = getMessageReceivedEmitter(webview)
760727

761728
mockMessageReceived.fire({
762729
type: MessageFromWebviewType.SELECT_PLOTS
@@ -818,14 +785,11 @@ suite('Plots Test Suite', () => {
818785
}).timeout(WEBVIEW_TEST_TIMEOUT)
819786

820787
it('should be able to make the plots webview visible', async () => {
821-
const { plots, messageSpy, mockPlotsDiff } = await buildPlots({
788+
const { messageSpy, mockPlotsDiff, webview } = await buildPlotsWebview({
822789
disposer: disposable,
823790
plotsDiff: plotsDiffFixture
824791
})
825792

826-
const webview = await plots.showWebview()
827-
await webview.isReady()
828-
829793
expect(mockPlotsDiff).to.be.called
830794

831795
const {
@@ -1019,7 +983,7 @@ suite('Plots Test Suite', () => {
1019983
}).timeout(WEBVIEW_TEST_TIMEOUT)
1020984

1021985
it('should handle a toggle experiment message from the webview', async () => {
1022-
const { plots, experiments } = await buildPlots({
986+
const { experiments, mockMessageReceived } = await buildPlotsWebview({
1023987
disposer: disposable,
1024988
plotsDiff: plotsDiffFixture
1025989
})
@@ -1029,10 +993,7 @@ suite('Plots Test Suite', () => {
1029993
'toggleExperimentStatus'
1030994
).resolves(undefined)
1031995

1032-
const webview = await plots.showWebview()
1033-
1034996
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
1035-
const mockMessageReceived = getMessageReceivedEmitter(webview)
1036997

1037998
mockMessageReceived.fire({
1038999
payload: 'main',
@@ -1049,13 +1010,11 @@ suite('Plots Test Suite', () => {
10491010
}).timeout(WEBVIEW_TEST_TIMEOUT)
10501011

10511012
it('should handle an add custom plot message from the webview', async () => {
1052-
const { plots } = await buildPlots({
1013+
const { mockMessageReceived } = await buildPlotsWebview({
10531014
disposer: disposable,
10541015
plotsDiff: plotsDiffFixture
10551016
})
10561017

1057-
const webview = await plots.showWebview()
1058-
const mockMessageReceived = getMessageReceivedEmitter(webview)
10591018
const executeCommandSpy = spy(commands, 'executeCommand')
10601019

10611020
mockMessageReceived.fire({
@@ -1069,13 +1028,11 @@ suite('Plots Test Suite', () => {
10691028
})
10701029

10711030
it('should handle a remove custom plot message from the webview', async () => {
1072-
const { plots } = await buildPlots({
1031+
const { mockMessageReceived } = await buildPlotsWebview({
10731032
disposer: disposable,
10741033
plotsDiff: plotsDiffFixture
10751034
})
10761035

1077-
const webview = await plots.showWebview()
1078-
const mockMessageReceived = getMessageReceivedEmitter(webview)
10791036
const executeCommandSpy = spy(commands, 'executeCommand')
10801037

10811038
mockMessageReceived.fire({
@@ -1089,14 +1046,12 @@ suite('Plots Test Suite', () => {
10891046
})
10901047

10911048
it('should handle an update smooth plot values message from the webview', async () => {
1092-
const { plots, plotsModel } = await buildPlots({
1049+
const { mockMessageReceived, plotsModel } = await buildPlotsWebview({
10931050
disposer: disposable,
10941051
plotsDiff: plotsDiffFixture
10951052
})
10961053
const templatePlot = templatePlotsFixture.plots[0].entries[0]
10971054

1098-
const webview = await plots.showWebview()
1099-
const mockMessageReceived = getMessageReceivedEmitter(webview)
11001055
const mockSendTelemetryEvent = stub(Telemetry, 'sendTelemetryEvent')
11011056
const mockSetSmoothPlotValues = stub(plotsModel, 'setSmoothPlotValues')
11021057

0 commit comments

Comments
 (0)