Skip to content

Commit

Permalink
patch(vest): remove pending and lagging state
Browse files Browse the repository at this point in the history
  • Loading branch information
ealush committed Nov 10, 2021
1 parent be1cbf6 commit e4e1746
Show file tree
Hide file tree
Showing 22 changed files with 130 additions and 545 deletions.
30 changes: 29 additions & 1 deletion packages/vest/src/__tests__/integration.stateful-async.test.ts
@@ -1,3 +1,5 @@
import wait from 'wait';

import { dummyTest } from '../../testUtils/testDummy';

import * as vest from 'vest';
Expand Down Expand Up @@ -55,7 +57,7 @@ describe('Stateful async tests', () => {
setTimeout(() => {
expect(callback_1).not.toHaveBeenCalled();
expect(callback_2).not.toHaveBeenCalled();
expect(callback_3).toHaveBeenCalled();
expect(callback_3).toHaveBeenCalledTimes(1);
expect(control).toHaveBeenCalled();
done();
}, 50);
Expand Down Expand Up @@ -98,4 +100,30 @@ describe('Stateful async tests', () => {
});
}, 50);
}));

it('Should discard of re-tested async tests', async () => {
const tests = [];
const control = jest.fn();
const suite = vest.create(() => {
tests.push(
vest.test('field_1', async () => {
await wait(100);
throw new Error();
})
);
});
suite().done(() => {
control(0);
});
await wait(5);
suite().done(() => {
control(1);
});
await wait(100);
expect(control).toHaveBeenCalledTimes(1);
expect(control).toHaveBeenCalledWith(1);

expect(tests[0].status).toBe('CANCELED');
expect(tests[1].status).toBe('FAILED');
});
});
3 changes: 0 additions & 3 deletions packages/vest/src/core/state/createStateRef.ts
Expand Up @@ -8,11 +8,8 @@ export default function createStateRef(
{ suiteId }: { suiteId: string }
) {
return {
lagging: state.registerStateKey<VestTest[]>(() => []),
optionalFields: state.registerStateKey<Record<string, boolean>>(() => ({})),
pending: state.registerStateKey<VestTest[]>(() => []),
prevTestObjects: state.registerStateKey<VestTest[]>(() => []),
skippedTests: state.registerStateKey<VestTest[]>(() => []),
suiteId: state.registerStateKey<string>(() => suiteId),
testCallbacks: state.registerStateKey<{
fieldCallbacks: Record<string, Array<(res: TDraftResult) => void>>;
Expand Down
16 changes: 4 additions & 12 deletions packages/vest/src/core/state/stateHooks.ts
Expand Up @@ -6,12 +6,6 @@ import type { TStateRef } from 'createStateRef';
import ctx from 'ctx';
import type { TDraftResult } from 'produceDraft';

export function usePending(): TStateHandlerReturn<VestTest[]> {
return useStateRef().pending();
}
export function useLagging(): TStateHandlerReturn<VestTest[]> {
return useStateRef().lagging();
}
export function useSuiteId(): TStateHandlerReturn<string> {
return useStateRef().suiteId();
}
Expand All @@ -21,9 +15,6 @@ export function useTestCallbacks(): TStateHandlerReturn<{
}> {
return useStateRef().testCallbacks();
}
export function useSkippedTests(): TStateHandlerReturn<VestTest[]> {
return useStateRef().skippedTests();
}
export function useOptionalFields(): TStateHandlerReturn<
Record<string, boolean>
> {
Expand Down Expand Up @@ -90,7 +81,8 @@ export function isOptionalField(fieldName: string): boolean {
}

export function useAllIncomplete(): VestTest[] {
const [pending] = usePending();
const [lagging] = useLagging();
return pending.concat(lagging);
const [testObjects] = useTestObjects();

// TODO: CACHE?
return testObjects.filter(testObject => testObject.isPending());
}
Expand Up @@ -3,11 +3,8 @@
exports[`suite.subscribe Should call handler on suite subscription initialization 1`] = `
Object {
"suiteState": Object {
"lagging": [Function],
"optionalFields": [Function],
"pending": [Function],
"prevTestObjects": [Function],
"skippedTests": [Function],
"suiteId": [Function],
"testCallbacks": [Function],
"testObjects": [Function],
Expand Down
39 changes: 17 additions & 22 deletions packages/vest/src/core/suite/__tests__/hasRemainingTests.test.ts
Expand Up @@ -7,27 +7,22 @@ import runCreateRef from '../../../../testUtils/runCreateRef';
import VestTest from 'VestTest';
import context from 'ctx';
import hasRemainingTests from 'hasRemainingTests';
import { usePending, useLagging } from 'stateHooks';
import { useTestObjects } from 'stateHooks';

let stateRef;
const getCtx = () => ({ stateRef });

const addPendingOrLagging = (
key: 'pending' | 'lagging',
fieldName?: string
) => {
const addPending = (fieldName?: string) => {
context.run({ stateRef }, () => {
const [, setPending] = usePending();
const [, setLagging] = useLagging();
const [, setTestObjects] = useTestObjects();

const setter = key === 'pending' ? setPending : setLagging;
const added = Array.from(
{ length: _.random(1, 3) },
() => new VestTest(fieldName ?? faker.random.word(), jest.fn())
);

setter(() => {
return Array.from(
{ length: _.random(1, 3) },
() => new VestTest(fieldName ?? faker.random.word(), jest.fn())
);
});
setTestObjects(testObjects => testObjects.concat(added));
added.forEach(testObject => testObject.setPending());
});
};

Expand All @@ -51,7 +46,7 @@ describe('hasRemainingTests', () => {
itWithContext(
'pending tests return true',
() => {
addPendingOrLagging('pending');
addPending();

expect(hasRemainingTests()).toBe(true);
},
Expand All @@ -61,7 +56,7 @@ describe('hasRemainingTests', () => {
itWithContext(
'lagging tests return true',
() => {
addPendingOrLagging('lagging');
addPending();

expect(hasRemainingTests()).toBe(true);
},
Expand All @@ -71,8 +66,8 @@ describe('hasRemainingTests', () => {
itWithContext(
'lagging and pending tests return true',
() => {
addPendingOrLagging('lagging');
addPendingOrLagging('pending');
addPending();
addPending();

expect(hasRemainingTests()).toBe(true);
},
Expand Down Expand Up @@ -101,7 +96,7 @@ describe('hasRemainingTests', () => {
itWithContext(
'pending tests return true',
() => {
addPendingOrLagging('pending', fieldName);
addPending(fieldName);
expect(hasRemainingTests()).toBe(true);
},
getCtx
Expand All @@ -110,7 +105,7 @@ describe('hasRemainingTests', () => {
itWithContext(
'lagging tests return true',
() => {
addPendingOrLagging('lagging', fieldName);
addPending(fieldName);
expect(hasRemainingTests()).toBe(true);
},
getCtx
Expand All @@ -119,8 +114,8 @@ describe('hasRemainingTests', () => {
itWithContext(
'lagging and pending tests return true',
() => {
addPendingOrLagging('lagging', fieldName);
addPendingOrLagging('pending', fieldName);
addPending(fieldName);
addPending(fieldName);
expect(hasRemainingTests()).toBe(true);
},
getCtx
Expand Down
12 changes: 1 addition & 11 deletions packages/vest/src/core/suite/create.ts
Expand Up @@ -10,12 +10,7 @@ import context from 'ctx';
import matchingFieldName from 'matchingFieldName';
import { IVestResult, produceFullResult } from 'produce';
import { produceDraft, TDraftResult } from 'produceDraft';
import {
useAllIncomplete,
useTestObjects,
usePrevTestObjects,
useLagging,
} from 'stateHooks';
import { useTestObjects, usePrevTestObjects } from 'stateHooks';

// eslint-disable-next-line max-lines-per-function
export default function create<T extends (...args: any[]) => void>(
Expand Down Expand Up @@ -60,14 +55,9 @@ export default function create<T extends (...args: any[]) => void>(
const [prevTestObjects] = useTestObjects();
const [, setPrevTestObjects] = usePrevTestObjects();

const [, setLagging] = useLagging();
const allIncomplete = useAllIncomplete();
state.reset();
setPrevTestObjects(() => prevTestObjects);

// Move all the active pending tests to the lagging array
setLagging(allIncomplete);

// Run the consumer's callback
suiteCallback(...args);

Expand Down
48 changes: 30 additions & 18 deletions packages/vest/src/core/test/VestTest.ts
@@ -1,6 +1,5 @@
import genId from 'genId';

import { removePending } from 'pending';
import removeTestFromState from 'removeTestFromState';
import shouldUseErrorAsMessage from 'shouldUseErrorAsMessage';

Expand All @@ -13,14 +12,7 @@ export default class VestTest {

id = genId();
warns = false;
status:
| 'UNTESTED'
| 'SKIPPED'
| 'FAILED'
| 'WARNING'
| 'PASSING'
| 'PENDING'
| 'CANCELED' = STATUS_UNTESTED;
status: KStatus = STATUS_UNTESTED;

constructor(
fieldName: string,
Expand All @@ -39,10 +31,6 @@ export default class VestTest {
}
}

setPending() {
this.status = STATUS_PENDING;
}

run(): TTestResult {
let result: TTestResult;
try {
Expand All @@ -61,28 +49,39 @@ export default class VestTest {
return result;
}

setStatus(status: KStatus): void {
if (this.isCanceled()) {
return;
}

this.status = status;
}

setPending() {
this.setStatus(STATUS_PENDING);
}

fail(): void {
this.status = this.warns ? STATUS_WARNING : STATUS_FAILED;
this.setStatus(this.warns ? STATUS_WARNING : STATUS_FAILED);
}

done(): void {
if (this.isWarning() || this.isCanceled() || this.isFailing()) {
return;
}
this.status = STATUS_PASSING;
this.setStatus(STATUS_PASSING);
}

warn(): void {
this.warns = true;
}

skip(): void {
this.status = STATUS_SKIPPED;
this.setStatus(STATUS_SKIPPED);
}

cancel(): void {
this.status = STATUS_CANCELED;
removePending(this);
this.setStatus(STATUS_CANCELED);
removeTestFromState(this);
}

Expand All @@ -94,6 +93,10 @@ export default class VestTest {
return this.isFailing() || this.isWarning();
}

isPending(): boolean {
return this.status === STATUS_PENDING;
}

isTested(): boolean {
return this.hasFailures() || this.isPassing();
}
Expand Down Expand Up @@ -130,3 +133,12 @@ const STATUS_WARNING = 'WARNING';
const STATUS_PASSING = 'PASSING';
const STATUS_PENDING = 'PENDING';
const STATUS_CANCELED = 'CANCELED';

type KStatus =
| 'UNTESTED'
| 'SKIPPED'
| 'FAILED'
| 'WARNING'
| 'PASSING'
| 'PENDING'
| 'CANCELED';

This file was deleted.

0 comments on commit e4e1746

Please sign in to comment.