Skip to content

Commit

Permalink
add integration test
Browse files Browse the repository at this point in the history
  • Loading branch information
mattseddon committed Jun 9, 2022
1 parent afeac42 commit 8f26e72
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 10 deletions.
4 changes: 2 additions & 2 deletions extension/src/experiments/model/filterBy/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { definedAndNonEmpty, joinTruthyItems } from '../../../util/array'
import { createTreeView, getRootItem } from '../../../vscode/tree'
import { Disposable } from '../../../class/dispose'

type FilterItem = {
export type FilterItem = {
description: string
dvcRoot: string
id: string
Expand Down Expand Up @@ -173,7 +173,7 @@ export class ExperimentsFilterByTree
this.getDescriptionText('Experiment', filtered.experiments),
this.getDescriptionText('Checkpoint', filtered.checkpoints)
],
','
', '
)

if (!combinedText) {
Expand Down
110 changes: 107 additions & 3 deletions extension/src/test/suite/experiments/model/filterBy/tree.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { afterEach, beforeEach, describe, it, suite } from 'mocha'
import { expect } from 'chai'
import { stub, spy, restore } from 'sinon'
import { window, commands, MessageItem } from 'vscode'
import { addFilterViaQuickInput } from './util'
import { window, commands, MessageItem, EventEmitter, TreeView } from 'vscode'
import { addFilterViaQuickInput, mockQuickInputFilter } from './util'
import { Disposable } from '../../../../../extension'
import columnsFixture from '../../../../fixtures/expShow/columns'
import rowsFixture from '../../../../fixtures/expShow/rows'
Expand All @@ -12,7 +12,7 @@ import {
getFilterId,
Operator
} from '../../../../../experiments/model/filterBy'
import { dvcDemoPath } from '../../../../util'
import { buildMockMemento, dvcDemoPath } from '../../../../util'
import { experimentsUpdatedEvent } from '../../../util'
import { buildMetricOrParamPath } from '../../../../../experiments/columns/paths'
import { RegisteredCommands } from '../../../../../commands/external'
Expand All @@ -25,6 +25,10 @@ import { WEBVIEW_TEST_TIMEOUT } from '../../../timeouts'
import { Response } from '../../../../../vscode/response'
import { ExperimentsModel } from '../../../../../experiments/model'
import { Title } from '../../../../../vscode/title'
import {
ExperimentsFilterByTree,
FilterItem
} from '../../../../../experiments/model/filterBy/tree'

suite('Experiments Filter By Tree Test Suite', () => {
const disposable = Disposable.fn()
Expand Down Expand Up @@ -345,5 +349,105 @@ suite('Experiments Filter By Tree Test Suite', () => {
'should not call get repository in removeFilters without a root'
).not.to.be.called
})

it('should update the description when a filter is added or removed', async () => {
const { experiments, internalCommands } = buildExperiments(disposable)
await experiments.isReady()

const workspaceExperiments = disposable.track(
new WorkspaceExperiments(
internalCommands,
disposable.track(new EventEmitter()),
buildMockMemento(),
{ [dvcDemoPath]: experiments },
disposable.track(new EventEmitter())
)
)
disposable.track(
experiments.onDidChangeExperiments(() =>
workspaceExperiments.experimentsChanged.fire()
)
)

const mockTreeView = {
description: undefined,
dispose: stub()
} as unknown as TreeView<string | FilterItem>
stub(window, 'createTreeView').returns(mockTreeView)

stub(internalCommands, 'registerExternalCommand').returns(undefined)
disposable.track(
new ExperimentsFilterByTree(workspaceExperiments, internalCommands)
)
const getUpdateEvent = () =>
new Promise(resolve =>
disposable.track(
workspaceExperiments.onDidChangeExperiments(() =>
resolve(undefined)
)
)
)

const tableFilterAdded = getUpdateEvent()

const filter = {
operator: Operator.EQUAL,
path: buildMetricOrParamPath(
ColumnType.METRICS,
'summary.json',
'loss'
),
value: '0'
}

mockQuickInputFilter(filter)
experiments.addFilter()
await tableFilterAdded

expect(experiments.getFilteredCounts()).to.deep.equal({
checkpoints: 9,
experiments: 3
})

expect(mockTreeView.description).to.equal(
'3 Experiments, 9 Checkpoints Filtered'
)

const tableFilterRemoved = getUpdateEvent()
experiments.removeFilter(getFilterId(filter))

await tableFilterRemoved

expect(experiments.getFilteredCounts()).to.deep.equal({
checkpoints: 0,
experiments: 0
})

expect(mockTreeView.description).to.be.undefined

stub(experiments, 'getFilteredCounts')
.onFirstCall()
.returns({
checkpoints: 1,
experiments: 0
})
.onSecondCall()
.returns({
checkpoints: 0,
experiments: 1
})

const allButOneCheckpointFilteredEvent = getUpdateEvent()
workspaceExperiments.experimentsChanged.fire()
await allButOneCheckpointFilteredEvent

expect(mockTreeView.description).to.equal('1 Checkpoint Filtered')

const allButOneExperimentFilteredEvent = getUpdateEvent()
workspaceExperiments.experimentsChanged.fire()
await allButOneExperimentFilteredEvent

expect(mockTreeView.description).to.equal('1 Experiment Filtered')
})
})
})
18 changes: 13 additions & 5 deletions extension/src/test/suite/experiments/model/filterBy/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,11 @@ import { experimentsUpdatedEvent } from '../../../util'
import { Experiments } from '../../../../../experiments'
import { RegisteredCommands } from '../../../../../commands/external'

export const addFilterViaQuickInput = (
experiments: Experiments,
export const mockQuickInputFilter = (
fixtureFilter: FilterDefinition,
mockShowQuickPick = stub(window, 'showQuickPick'),
mockShowInputBox = stub(window, 'showInputBox')
) => {
mockShowQuickPick.resetHistory()
mockShowInputBox.resetHistory()

const column = columnsFixture.find(
column => column.path === fixtureFilter.path
)
Expand All @@ -25,6 +21,18 @@ export const addFilterViaQuickInput = (
value: fixtureFilter.operator
} as unknown as QuickPickItem)
mockShowInputBox.onFirstCall().resolves(fixtureFilter.value as string)
}

export const addFilterViaQuickInput = (
experiments: Experiments,
fixtureFilter: FilterDefinition,
mockShowQuickPick = stub(window, 'showQuickPick'),
mockShowInputBox = stub(window, 'showInputBox')
) => {
mockShowQuickPick.resetHistory()
mockShowInputBox.resetHistory()

mockQuickInputFilter(fixtureFilter, mockShowQuickPick, mockShowInputBox)

const tableFilterAdded = experimentsUpdatedEvent(experiments)

Expand Down

0 comments on commit 8f26e72

Please sign in to comment.