From 477a147498cecdc575381aebd6cc085f64ef9e03 Mon Sep 17 00:00:00 2001 From: Karan Date: Fri, 14 Jan 2022 14:45:45 -0800 Subject: [PATCH] chore: fail test suite if node encounters unhandled promise rejection (#5061) --- package.json | 2 +- .../background/injector-controller.test.ts | 1 + .../analyzers/batched-rule-analyzer.test.ts | 53 +++++++++++++------ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index dfe6027d91..4a368e0f5e 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "start:unified": "electron drop/electron/unified-dev/product/bundle/main.bundle.js", "start:unified:dev": "cross-env DEV_MODE=true yarnpkg start:unified", "start:unified:mock-adb": "cross-env ANDROID_HOME=drop/mock-adb yarnpkg start:unified", - "test": "cross-env --max-old-space-size=16384 jest --projects src/tests/unit", + "test": "cross-env NODE_OPTIONS='--unhandled-rejections=strict' --max-old-space-size=16384 jest --projects src/tests/unit", "publish-code-coverage": "npx codecov", "test:e2e": "cross-env --max-old-space-size=16384 jest --projects src/tests/end-to-end --runInBand --forceExit --detectOpenHandles", "test:e2e:docker:build": "docker build -t accessibility-insights-e2e --target web .", diff --git a/src/tests/unit/tests/background/injector-controller.test.ts b/src/tests/unit/tests/background/injector-controller.test.ts index 6e470e0437..af81fb8e08 100644 --- a/src/tests/unit/tests/background/injector-controller.test.ts +++ b/src/tests/unit/tests/background/injector-controller.test.ts @@ -95,6 +95,7 @@ describe('InjectorControllerTest', () => { validator.verifyAll(); validator.resetVerify(); + validator.setupVerifyInjectionCompletedActionCalled(tabId); await validator.invokeInjectedPromise(); validator.verifyAll(); }); diff --git a/src/tests/unit/tests/injected/analyzers/batched-rule-analyzer.test.ts b/src/tests/unit/tests/injected/analyzers/batched-rule-analyzer.test.ts index 43f42f7675..d19c25c573 100644 --- a/src/tests/unit/tests/injected/analyzers/batched-rule-analyzer.test.ts +++ b/src/tests/unit/tests/injected/analyzers/batched-rule-analyzer.test.ts @@ -3,6 +3,7 @@ import { ScopingInputTypes } from 'background/scoping-input-types'; import { ScopingStore } from 'background/stores/global/scoping-store'; import { ScanIncompleteWarningDetector } from 'injected/scan-incomplete-warning-detector'; +import { isEqual } from 'lodash'; import { clone, isFunction } from 'lodash'; import { failTestOnErrorLogger } from 'tests/unit/common/fail-test-on-error-logger'; import { IMock, It, Mock, MockBehavior, Times } from 'typemoq'; @@ -142,9 +143,7 @@ describe('BatchedRuleAnalyzer', () => { scanResultsTwo, ); - const testSubjects = [testSubjectOne, testSubjectTwo]; - - testSubjects.forEach((testSubject, index) => { + [testSubjectOne, testSubjectTwo].forEach(testSubject => { dateMock.reset(); dateMock .setup(mock => mock.getTime()) @@ -152,30 +151,50 @@ describe('BatchedRuleAnalyzer', () => { .verifiable(); testSubject.analyze(); + }); + + /* + BatchedRuleAnalyzer maintains a static list of + RuleAnalyzerConfigurations. After scanning, it + sends a scanCompleted message for each rule-config. + + Because we instantiate two analyzers, each analyzer + has two configs and therefore the scanCallback + produces two scanCompleted messages. + */ + const actualMessages = []; + const expectedMessages = [ + firstExpectedMessage, + secondExpectedMessage, + firstExpectedMessage, + secondExpectedMessage, + ]; + + sendMessageMock + .setup(sm => sm(It.isAny())) + .callback(msg => { + actualMessages.push(msg); + if (isEqual(expectedMessages, actualMessages)) { + done(); + } + }) + .verifiable(Times.exactly(4)); + scanCallbacks.forEach(callback => { dateMock.reset(); dateMock .setup(mock => mock.getTime()) .returns(_ => endTime) .verifiable(); - sendMessageMock.reset(); - sendMessageMock.setup(sm => sm(It.isValue(firstExpectedMessage))).verifiable(); - - sendMessageMock - .setup(sm => sm(It.isValue(secondExpectedMessage))) - .returns(() => { - sendMessageMock.verifyAll(); - if (index + 1 === testSubjects.length) { - done(); - } - }) - .verifiable(); - - scanCallbacks[index](completeRuleResults); + callback(completeRuleResults); }); } + afterEach(() => { + sendMessageMock.verifyAll(); + }); + function setupProcessingMocks( resultProcessorMock: IMock< (results: ScanResults) => DictionaryStringTo