Skip to content

Commit d257f81

Browse files
authored
test: increase coverage for assessment store (#1930)
We have some missing tests for the assessment store, This PR add those tests and gets the coverage to 99.52% (statements) * normalize imports. improve some names. update some mock creation * minor improvements * simplify logic (remove for, use find) * true-up test for continue previous assessment action on the store * add missing test for add result description * fix typos
1 parent dffce6d commit d257f81

File tree

3 files changed

+82
-79
lines changed

3 files changed

+82
-79
lines changed

src/background/stores/assessment-store.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,29 @@
22
// Licensed under the MIT License.
33
import { AssessmentsProvider } from 'assessments/types/assessments-provider';
44
import { IndexedDBDataKeys } from 'background/IndexedDBDataKeys';
5-
import { forEach, isEmpty } from 'lodash';
6-
7-
import { BrowserAdapter } from '../../common/browser-adapters/browser-adapter';
8-
import { IndexedDBAPI } from '../../common/indexedDB/indexedDB';
9-
import { StoreNames } from '../../common/stores/store-names';
10-
import { DetailsViewPivotType } from '../../common/types/details-view-pivot-type';
11-
import { ManualTestStatus } from '../../common/types/manual-test-status';
5+
import { BrowserAdapter } from 'common/browser-adapters/browser-adapter';
6+
import { IndexedDBAPI } from 'common/indexedDB/indexedDB';
7+
import { StoreNames } from 'common/stores/store-names';
8+
import { DetailsViewPivotType } from 'common/types/details-view-pivot-type';
9+
import { ManualTestStatus } from 'common/types/manual-test-status';
1210
import {
1311
AssessmentData,
1412
AssessmentStoreData,
1513
GeneratedAssessmentInstance,
1614
TestStepResult,
1715
UserCapturedInstance,
18-
} from '../../common/types/store-data/assessment-result-data';
16+
} from 'common/types/store-data/assessment-result-data';
17+
import { VisualizationType } from 'common/types/visualization-type';
1918
import {
2019
ScanBasePayload,
2120
ScanCompletedPayload,
2221
ScanUpdatePayload,
23-
} from '../../injected/analyzers/analyzer';
24-
import { DictionaryStringTo } from '../../types/common-types';
22+
} from 'injected/analyzers/analyzer';
23+
import { forEach, isEmpty } from 'lodash';
24+
import { DictionaryStringTo } from 'types/common-types';
2525
import { AddResultDescriptionPayload, SelectRequirementPayload } from '../actions/action-payloads';
2626
import { AssessmentDataConverter } from '../assessment-data-converter';
2727
import { InitialAssessmentStoreDataGenerator } from '../initial-assessment-store-data-generator';
28-
import { VisualizationType } from './../../common/types/visualization-type';
2928
import {
3029
AddFailureInstancePayload,
3130
AssessmentActionInstancePayload,
@@ -216,16 +215,17 @@ export class AssessmentStore extends BaseStoreImpl<AssessmentStoreData> {
216215
const config = this.assessmentsProvider
217216
.forType(payload.test)
218217
.getVisualizationConfiguration();
218+
219219
const assessmentData = config.getAssessmentData(this.state);
220-
const instances = assessmentData.manualTestStepResultMap[payload.requirement].instances;
221-
for (let instanceIndex = 0; instanceIndex < instances.length; instanceIndex++) {
222-
const instance = instances[instanceIndex];
223-
if (instance.id === payload.id) {
224-
instance.description = payload.instanceData.failureDescription;
225-
instance.html = payload.instanceData.snippet;
226-
instance.selector = payload.instanceData.path;
227-
break;
228-
}
220+
const requirementInstances =
221+
assessmentData.manualTestStepResultMap[payload.requirement].instances;
222+
223+
const instanceToEdit = requirementInstances.find(instance => instance.id === payload.id);
224+
225+
if (instanceToEdit) {
226+
instanceToEdit.description = payload.instanceData.failureDescription;
227+
instanceToEdit.html = payload.instanceData.snippet;
228+
instanceToEdit.selector = payload.instanceData.path;
229229
}
230230

231231
this.emitChanged();
@@ -236,13 +236,13 @@ export class AssessmentStore extends BaseStoreImpl<AssessmentStoreData> {
236236
.forType(payload.test)
237237
.getVisualizationConfiguration();
238238
const assessmentData = config.getAssessmentData(this.state);
239-
assessmentData.manualTestStepResultMap[
240-
payload.requirement
241-
].instances = assessmentData.manualTestStepResultMap[payload.requirement].instances.filter(
242-
instance => {
243-
return instance.id !== payload.id;
244-
},
239+
240+
const requirement = assessmentData.manualTestStepResultMap[payload.requirement];
241+
242+
requirement.instances = requirement.instances.filter(
243+
instance => instance.id !== payload.id,
245244
);
245+
246246
this.updateManualTestStepStatus(assessmentData, payload.requirement, payload.test);
247247

248248
this.emitChanged();
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`AssessmentStoreTest onContinuePreviousAssessment 1`] = `"tab with Id 1000 not found"`;
4-
53
exports[`AssessmentStoreTest onResetAllAssessmentsData 1`] = `"tab with Id 1000 not found"`;
64

75
exports[`AssessmentStoreTest onUpdateTargetTabId 1`] = `"tab with Id 1000 not found"`;

src/tests/unit/tests/background/stores/assessment-store.test.ts

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
3-
import { AssessmentsProviderImpl } from 'assessments/assessments-provider';
43
import { AssessmentsProvider } from 'assessments/types/assessments-provider';
54
import { Assessment } from 'assessments/types/iassessment';
65
import {
76
AddFailureInstancePayload,
7+
AddResultDescriptionPayload,
88
ChangeInstanceSelectionPayload,
99
ChangeInstanceStatusPayload,
1010
ChangeRequirementStatusPayload,
@@ -19,28 +19,28 @@ import { AssessmentDataConverter } from 'background/assessment-data-converter';
1919
import { AssessmentDataRemover } from 'background/assessment-data-remover';
2020
import { InitialAssessmentStoreDataGenerator } from 'background/initial-assessment-store-data-generator';
2121
import { AssessmentStore } from 'background/stores/assessment-store';
22-
import { cloneDeep } from 'lodash';
23-
import { IMock, It, Mock, MockBehavior, Times } from 'typemoq';
24-
import { BrowserAdapter } from '../../../../../common/browser-adapters/browser-adapter';
25-
import { AssessmentVisualizationConfiguration } from '../../../../../common/configs/assessment-visualization-configuration';
26-
import { IndexedDBAPI } from '../../../../../common/indexedDB/indexedDB';
27-
import { Tab } from '../../../../../common/itab';
28-
import { StoreNames } from '../../../../../common/stores/store-names';
29-
import { DetailsViewPivotType } from '../../../../../common/types/details-view-pivot-type';
30-
import { ManualTestStatus, ManualTestStatusData, TestStepData } from '../../../../../common/types/manual-test-status';
22+
import { BrowserAdapter } from 'common/browser-adapters/browser-adapter';
23+
import { AssessmentVisualizationConfiguration } from 'common/configs/assessment-visualization-configuration';
24+
import { IndexedDBAPI } from 'common/indexedDB/indexedDB';
25+
import { Tab } from 'common/itab';
26+
import { StoreNames } from 'common/stores/store-names';
27+
import { DetailsViewPivotType } from 'common/types/details-view-pivot-type';
28+
import { ManualTestStatus, ManualTestStatusData, TestStepData } from 'common/types/manual-test-status';
3129
import {
3230
AssessmentData,
3331
AssessmentStoreData,
3432
GeneratedAssessmentInstance,
3533
ManualTestStepResult,
3634
PersistedTabInfo,
3735
TestStepResult,
38-
} from '../../../../../common/types/store-data/assessment-result-data';
39-
import { VisualizationType } from '../../../../../common/types/visualization-type';
40-
import { ScanBasePayload, ScanCompletedPayload, ScanUpdatePayload } from '../../../../../injected/analyzers/analyzer';
41-
import { TabStopEvent } from '../../../../../injected/tab-stops-listener';
42-
import { ScanResults } from '../../../../../scanner/iruleresults';
43-
import { DictionaryStringTo } from '../../../../../types/common-types';
36+
} from 'common/types/store-data/assessment-result-data';
37+
import { VisualizationType } from 'common/types/visualization-type';
38+
import { ScanBasePayload, ScanCompletedPayload, ScanUpdatePayload } from 'injected/analyzers/analyzer';
39+
import { TabStopEvent } from 'injected/tab-stops-listener';
40+
import { cloneDeep, isFunction } from 'lodash';
41+
import { ScanResults } from 'scanner/iruleresults';
42+
import { IMock, It, Mock, MockBehavior, Times } from 'typemoq';
43+
import { DictionaryStringTo } from 'types/common-types';
4444
import { AssessmentDataBuilder } from '../../../common/assessment-data-builder';
4545
import { AssessmentsStoreDataBuilder } from '../../../common/assessment-store-data-builder';
4646
import { AssessmentStoreTester } from '../../../common/assessment-store-tester';
@@ -76,24 +76,18 @@ describe('AssessmentStoreTest', () => {
7676
} as AssessmentVisualizationConfiguration;
7777

7878
assessmentsProvider = CreateTestAssessmentProvider();
79-
assessmentsProviderMock = Mock.ofType(AssessmentsProviderImpl, MockBehavior.Strict);
79+
assessmentsProviderMock = Mock.ofType<AssessmentsProvider>(undefined, MockBehavior.Strict);
8080
assessmentMock = Mock.ofInstance({
8181
getVisualizationConfiguration: () => {
8282
return null;
8383
},
8484
} as Assessment);
8585
assessmentDataConverterMock
86-
.setup(adcm => adcm.getNewManualTestStepResult(It.isAny()))
86+
.setup(dataConverter => dataConverter.getNewManualTestStepResult(It.isAny()))
8787
.returns(step => getDefaultManualTestStepResult(step));
8888

89-
indexDBInstanceMock = Mock.ofInstance(
90-
{
91-
setItem: (key, value) => null,
92-
getItem: key => null,
93-
} as IndexedDBAPI,
94-
MockBehavior.Strict,
95-
);
96-
initialAssessmentStoreDataGeneratorMock = Mock.ofType(InitialAssessmentStoreDataGenerator);
89+
indexDBInstanceMock = Mock.ofType<IndexedDBAPI>(undefined, MockBehavior.Strict);
90+
initialAssessmentStoreDataGeneratorMock = Mock.ofType<InitialAssessmentStoreDataGenerator>();
9791
});
9892

9993
afterEach(() => {
@@ -242,7 +236,7 @@ describe('AssessmentStoreTest', () => {
242236
} as AssessmentVisualizationConfiguration;
243237

244238
getVisualizationConfigurationMock
245-
.setup(gvcm => gvcm())
239+
.setup(configGetter => configGetter())
246240
.returns(() => {
247241
return visualizationConfigStub;
248242
});
@@ -289,7 +283,7 @@ describe('AssessmentStoreTest', () => {
289283
} as AssessmentVisualizationConfiguration;
290284

291285
getVisualizationConfigurationMock
292-
.setup(gvcm => gvcm())
286+
.setup(configGetter => configGetter())
293287
.returns(() => {
294288
return visualizationConfigStub;
295289
});
@@ -339,7 +333,7 @@ describe('AssessmentStoreTest', () => {
339333
} as AssessmentVisualizationConfiguration;
340334

341335
getVisualizationConfigurationMock
342-
.setup(gvcm => gvcm())
336+
.setup(configGetter => configGetter())
343337
.returns(() => {
344338
return visualizationConfigStub;
345339
});
@@ -415,27 +409,20 @@ describe('AssessmentStoreTest', () => {
415409
url,
416410
title,
417411
};
418-
let onReject;
419-
browserMock
420-
.setup(b => b.getTab(tabId, It.isAny(), It.isAny()))
421-
.returns((id, cb, reject) => {
422-
onReject = reject;
423-
cb(tab);
424-
})
425-
.verifiable();
426412
assessmentsProviderMock.setup(apm => apm.all()).returns(() => assessmentsProvider.all());
413+
browserMock.setup(adapter => adapter.getTab(tabId, It.is(isFunction), It.is(isFunction))).callback((id, resolve) => resolve(tab));
414+
427415
const initialState = new AssessmentsStoreDataBuilder(assessmentsProvider, assessmentDataConverterMock.object)
428416
.withTargetTab(oldTabId, null, null, true)
429417
.build();
418+
430419
const finalState = new AssessmentsStoreDataBuilder(assessmentsProvider, assessmentDataConverterMock.object)
431420
.withTargetTab(tabId, url, title, false)
432421
.build();
433-
setupDataGeneratorMock(null, getDefaultState());
434422

435-
createStoreTesterForAssessmentActions('resetAllAssessmentsData')
423+
createStoreTesterForAssessmentActions('continuePreviousAssessment')
436424
.withActionParam(tabId)
437425
.testListenerToBeCalledOnce(initialState, finalState);
438-
expect(() => onReject()).toThrowErrorMatchingSnapshot();
439426
});
440427

441428
test('onScanCompleted', () => {
@@ -472,17 +459,17 @@ describe('AssessmentStoreTest', () => {
472459

473460
const finalState = getStateWithAssessment(assessmentData);
474461

475-
assessmentsProviderMock.setup(apm => apm.all()).returns(() => assessmentsProvider.all());
462+
assessmentsProviderMock.setup(provider => provider.all()).returns(() => assessmentsProvider.all());
476463

477-
assessmentsProviderMock.setup(apm => apm.getStepMap(assessmentType)).returns(() => stepMapStub);
464+
assessmentsProviderMock.setup(provider => provider.getStepMap(assessmentType)).returns(() => stepMapStub);
478465

479-
assessmentsProviderMock.setup(apm => apm.getStep(assessmentType, 'assessment-1-step-1')).returns(() => stepConfig);
466+
assessmentsProviderMock.setup(provider => provider.getStep(assessmentType, 'assessment-1-step-1')).returns(() => stepConfig);
480467

481-
assessmentsProviderMock.setup(apm => apm.forType(payload.testType)).returns(() => assessmentMock.object);
468+
assessmentsProviderMock.setup(provider => provider.forType(payload.testType)).returns(() => assessmentMock.object);
482469

483470
assessmentMock.setup(am => am.getVisualizationConfiguration()).returns(() => configStub);
484471

485-
getInstanceIdentiferGeneratorMock.setup(giim => giim(requirementKey)).returns(() => instanceIdentifierGeneratorStub);
472+
getInstanceIdentiferGeneratorMock.setup(idGetter => idGetter(requirementKey)).returns(() => instanceIdentifierGeneratorStub);
486473

487474
assessmentDataConverterMock
488475
.setup(a =>
@@ -530,19 +517,21 @@ describe('AssessmentStoreTest', () => {
530517

531518
const finalState = getStateWithAssessment(assessmentData);
532519

533-
assessmentsProviderMock.setup(apm => apm.all()).returns(() => assessmentsProvider.all());
520+
assessmentsProviderMock.setup(provider => provider.all()).returns(() => assessmentsProvider.all());
534521

535-
assessmentsProviderMock.setup(apm => apm.getStepMap(assessmentType)).returns(() => assessmentsProvider.getStepMap(assessmentType));
522+
assessmentsProviderMock
523+
.setup(provider => provider.getStepMap(assessmentType))
524+
.returns(() => assessmentsProvider.getStepMap(assessmentType));
536525

537526
assessmentsProviderMock
538-
.setup(apm => apm.getStep(assessmentType, requirementKey))
527+
.setup(provider => provider.getStep(assessmentType, requirementKey))
539528
.returns(() => assessmentsProvider.getStep(assessmentType, requirementKey));
540529

541-
assessmentsProviderMock.setup(apm => apm.forType(payload.testType)).returns(() => assessmentMock.object);
530+
assessmentsProviderMock.setup(provider => provider.forType(payload.testType)).returns(() => assessmentMock.object);
542531

543532
assessmentMock.setup(am => am.getVisualizationConfiguration()).returns(() => configStub);
544533

545-
getInstanceIdentiferGeneratorMock.setup(giim => giim(requirementKey)).returns(() => instanceIdentifierGeneratorStub);
534+
getInstanceIdentiferGeneratorMock.setup(getter => getter(requirementKey)).returns(() => instanceIdentifierGeneratorStub);
546535

547536
assessmentDataConverterMock
548537
.setup(a =>
@@ -1407,11 +1396,27 @@ describe('AssessmentStoreTest', () => {
14071396
assessmentsProviderMock.verifyAll();
14081397
});
14091398

1410-
test('verify the MaunalTestStatus Priorities', () => {
1399+
test('verify the ManualTestStatus Priorities', () => {
14111400
expect(ManualTestStatus.PASS < ManualTestStatus.UNKNOWN).toBeTruthy();
14121401
expect(ManualTestStatus.UNKNOWN < ManualTestStatus.FAIL).toBeTruthy();
14131402
});
14141403

1404+
test('onAddResultDescription', () => {
1405+
const payload: AddResultDescriptionPayload = {
1406+
description: 'new-test-description',
1407+
};
1408+
1409+
const initialState = new AssessmentsStoreDataBuilder(assessmentsProvider, assessmentDataConverterMock.object).build();
1410+
1411+
const finalState = new AssessmentsStoreDataBuilder(assessmentsProvider, assessmentDataConverterMock.object)
1412+
.with('resultDescription', payload.description)
1413+
.build();
1414+
1415+
createStoreTesterForAssessmentActions('addResultDescription')
1416+
.withActionParam(payload)
1417+
.testListenerToBeCalledOnce(initialState, finalState);
1418+
});
1419+
14151420
function setupDataGeneratorMock(persistedData: AssessmentStoreData, initialData: AssessmentStoreData): void {
14161421
initialAssessmentStoreDataGeneratorMock
14171422
.setup(im => im.generateInitialState(persistedData))

0 commit comments

Comments
 (0)