Skip to content

Commit

Permalink
test: migrate to vitest (#126)
Browse files Browse the repository at this point in the history
Co-authored-by: A. Román <kyradiscord@gmail.com>
  • Loading branch information
favna and kyranet committed Jun 19, 2022
1 parent e1991cf commit 4d80969
Show file tree
Hide file tree
Showing 28 changed files with 7,641 additions and 7,584 deletions.
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ LICENSE.md @kyranet @favna @vladfrangu
/.vscode/ @favna
/.all-contributorsrc @favna
.npm-deprecaterc.yml @favna
jest.config.mjs @favna
vitest.config.ts @favna
package.json @favna
README.md @favna
Empty file modified .github/husky/commit-msg
100644 → 100755
Empty file.
Empty file modified .github/husky/pre-commit
100644 → 100755
Empty file.
1 change: 1 addition & 0 deletions .github/workflows/continuous-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
name: Unit Tests
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [14, 16, 18]
steps:
Expand Down
16 changes: 0 additions & 16 deletions jest.config.mjs

This file was deleted.

10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
"lint": "eslint src tests --ext ts --fix",
"format": "prettier --write \"{src,tests}/**/*.ts\"",
"docs": "typedoc",
"test": "jest",
"test:watch": "jest --watch",
"test": "vitest run",
"test:watch": "vitest",
"update": "yarn upgrade-interactive",
"build": "tsup && tsc -b src",
"clean": "node scripts/clean.mjs",
Expand All @@ -42,9 +42,10 @@
"@sapphire/prettier-config": "^1.4.3",
"@sapphire/ts-config": "^3.3.4",
"@types/jest": "^28.1.2",
"@types/node": "^17.0.42",
"@types/node": "^18.0.0",
"@typescript-eslint/eslint-plugin": "^5.28.0",
"@typescript-eslint/parser": "^5.28.0",
"c8": "^7.11.3",
"cz-conventional-changelog": "^3.3.0",
"eslint": "^8.18.0",
"eslint-config-prettier": "^8.5.0",
Expand All @@ -59,7 +60,8 @@
"tsup": "^6.1.2",
"typedoc": "^0.22.17",
"typedoc-plugin-mdn-links": "^1.0.6",
"typescript": "^4.7.4"
"typescript": "^4.7.4",
"vitest": "^0.15.1"
},
"repository": {
"type": "git",
Expand Down
8 changes: 4 additions & 4 deletions tests/common/macros/comparators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import {
type BaseValidator
} from '../../../src';

export function expectClonedValidator<T>(expected: BaseValidator<T>, actual: BaseValidator<T>) {
expect(actual).not.toBe(expected);
expect(actual).toBeInstanceOf(expected.constructor);
export function expectClonedValidator<T>(expected: BaseValidator<T>, received: BaseValidator<T>) {
expect(received).not.toBe(expected);
expect(received).toBeInstanceOf(expected.constructor);
}

export function expectIdenticalValidator<T>(expected: BaseValidator<T>, actual: BaseValidator<T>) {
Expand All @@ -35,7 +35,7 @@ export function expectError<T = any>(cb: () => T, expected: BaseError) {
return;
}

fail('Expected to throw, but failed to do so');
throw new Error('Expected to throw, but failed to do so');
}

function expectIdenticalError(actual: BaseError, expected: BaseError) {
Expand Down
5 changes: 0 additions & 5 deletions tests/jest.setup.ts

This file was deleted.

5 changes: 4 additions & 1 deletion tests/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"extends": "../tsconfig.base.json",
"include": ["."],
"references": [{ "path": "../src" }]
"references": [{ "path": "../src" }],
"compilerOptions": {
"types": ["vitest/globals"]
}
}
34 changes: 17 additions & 17 deletions tests/util/common/combinedResultFn.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe('combinedErrorFn', () => {

describe('1 function', () => {
test('GIVEN one function returning null THEN returns null', () => {
const cb = jest.fn().mockReturnValue(null);
const cb = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb);

expect(fn('foo', 'bar')).toBe(null);
Expand All @@ -21,7 +21,7 @@ describe('combinedErrorFn', () => {

test('GIVEN one function returning error THEN returns the same error', () => {
const error = new Error('my precious');
const cb = jest.fn().mockReturnValue(error);
const cb = vi.fn().mockReturnValue(error);
const fn = combinedErrorFn(cb);

expect(fn('foo', 'bar')).toBe(error);
Expand All @@ -33,8 +33,8 @@ describe('combinedErrorFn', () => {

describe('2 functions', () => {
test('GIVEN (null, null) THEN returns null', () => {
const cb0 = jest.fn().mockReturnValue(null);
const cb1 = jest.fn().mockReturnValue(null);
const cb0 = vi.fn().mockReturnValue(null);
const cb1 = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb0, cb1);

expect(fn('foo', 'bar')).toBe(null);
Expand All @@ -48,8 +48,8 @@ describe('combinedErrorFn', () => {

test('GIVEN (null, error) THEN returns error', () => {
const error = new Error('not all those who wander are lost');
const cb0 = jest.fn().mockReturnValue(null);
const cb1 = jest.fn().mockReturnValue(error);
const cb0 = vi.fn().mockReturnValue(null);
const cb1 = vi.fn().mockReturnValue(error);
const fn = combinedErrorFn(cb0, cb1);

expect(fn('foo', 'bar')).toBe(error);
Expand All @@ -63,8 +63,8 @@ describe('combinedErrorFn', () => {

test('GIVEN (error, null) THEN returns error', () => {
const error = new Error('it is a dangerous business');
const cb0 = jest.fn().mockReturnValue(error);
const cb1 = jest.fn().mockReturnValue(null);
const cb0 = vi.fn().mockReturnValue(error);
const cb1 = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb0, cb1);

expect(fn('foo', 'bar')).toBe(error);
Expand All @@ -78,9 +78,9 @@ describe('combinedErrorFn', () => {

describe('3 functions', () => {
test('GIVEN (null, null, null) THEN returns null', () => {
const cb0 = jest.fn().mockReturnValue(null);
const cb1 = jest.fn().mockReturnValue(null);
const cb2 = jest.fn().mockReturnValue(null);
const cb0 = vi.fn().mockReturnValue(null);
const cb1 = vi.fn().mockReturnValue(null);
const cb2 = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb0, cb1, cb2);

expect(fn('foo', 'bar')).toBe(null);
Expand All @@ -97,9 +97,9 @@ describe('combinedErrorFn', () => {

test('GIVEN (null, error, null) THEN returns error', () => {
const error = new Error('go where you must go, and hope!');
const cb0 = jest.fn().mockReturnValue(null);
const cb1 = jest.fn().mockReturnValue(error);
const cb2 = jest.fn().mockReturnValue(null);
const cb0 = vi.fn().mockReturnValue(null);
const cb1 = vi.fn().mockReturnValue(error);
const cb2 = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb0, cb1, cb2);

expect(fn('foo', 'bar')).toBe(error);
Expand All @@ -115,9 +115,9 @@ describe('combinedErrorFn', () => {

test('GIVEN (error, null, null) THEN returns error', () => {
const error = new Error('all is well that ends better');
const cb0 = jest.fn().mockReturnValue(error);
const cb1 = jest.fn().mockReturnValue(null);
const cb2 = jest.fn().mockReturnValue(null);
const cb0 = vi.fn().mockReturnValue(error);
const cb1 = vi.fn().mockReturnValue(null);
const cb2 = vi.fn().mockReturnValue(null);
const fn = combinedErrorFn(cb0, cb1, cb2);

expect(fn('foo', 'bar')).toBe(error);
Expand Down
36 changes: 18 additions & 18 deletions tests/validators/array.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ describe('ArrayValidator', () => {
describe('lengthLessThan', () => {
const lengthLessThanPredicate = s.string.array.lengthLessThan(2);

test.each([[['Hello']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['Hello']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string] | []>(lengthLessThanPredicate.parse(value)).toEqual(value);
});

test.each([[['Hello', 'there']], [['foo', 'bar', 'baaz']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['Hello', 'there']], [['foo', 'bar', 'baaz']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthLessThanPredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthLessThan', 'Invalid Array length', value, 'expected.length < 2')
Expand All @@ -41,11 +41,11 @@ describe('ArrayValidator', () => {
describe('lengthLessThanOrEqual', () => {
const lengthLePredicate = s.string.array.lengthLessThanOrEqual(2);

test.each([[['Hello']], [['Hello', 'there']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['Hello']], [['Hello', 'there']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string, string] | [string] | []>(lengthLePredicate.parse(value)).toEqual(value);
});

test.each([[['foo', 'bar', 'baaz']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['foo', 'bar', 'baaz']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthLePredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthLessThanOrEqual', 'Invalid Array length', value, 'expected.length <= 2')
Expand All @@ -56,11 +56,11 @@ describe('ArrayValidator', () => {
describe('lengthGreaterThan', () => {
const lengthGtPredicate = s.string.array.lengthGreaterThan(2);

test.each([[['foo', 'bar', 'baaz']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['foo', 'bar', 'baaz']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string, string, string, ...string[]]>(lengthGtPredicate.parse(value)).toEqual(value);
});

test.each([[['Hello']], [[]]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['Hello']], [[]]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthGtPredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthGreaterThan', 'Invalid Array length', value, 'expected.length > 2')
Expand All @@ -71,11 +71,11 @@ describe('ArrayValidator', () => {
describe('lengthGreaterThanOrEqual', () => {
const lengthGePredicate = s.string.array.lengthGreaterThanOrEqual(2);

test.each([[['Hello', 'there']], [['foo', 'bar', 'baaz']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['Hello', 'there']], [['foo', 'bar', 'baaz']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string, string, ...string[]]>(lengthGePredicate.parse(value)).toEqual(value);
});

test.each([[[]], [['foo']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[[]], [['foo']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthGePredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthGreaterThanOrEqual', 'Invalid Array length', value, 'expected.length >= 2')
Expand All @@ -86,11 +86,11 @@ describe('ArrayValidator', () => {
describe('lengthEqual', () => {
const lengthPredicate = s.string.array.lengthEqual(2);

test.each([[['Hello', 'there']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['Hello', 'there']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string, string]>(lengthPredicate.parse(value)).toEqual(value);
});

test.each([[[]], [['Hello']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[[]], [['Hello']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthPredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthEqual', 'Invalid Array length', value, 'expected.length === 2')
Expand All @@ -101,11 +101,11 @@ describe('ArrayValidator', () => {
describe('lengthNotEqual', () => {
const lengthNotEqPredicate = s.string.array.lengthNotEqual(2);

test.each([[['foo', 'bar', 'baaz']], [['foo']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['foo', 'bar', 'baaz']], [['foo']]])('GIVEN %j THEN returns given value', (value) => {
expect<string[]>(lengthNotEqPredicate.parse(value)).toEqual(value);
});

test.each([[['Hello', 'there']], [['foo', 'bar']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['Hello', 'there']], [['foo', 'bar']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthNotEqPredicate.parse(value),
new ExpectedConstraintError('s.array(T).lengthNotEqual', 'Invalid Array length', value, 'expected.length !== 2')
Expand All @@ -116,11 +116,11 @@ describe('ArrayValidator', () => {
describe('lengthRange', () => {
const lengthRangePredicate = s.string.array.lengthRange(0, 2);

test.each([[[] as string[]], [['foo']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[[] as string[]], [['foo']]])('GIVEN %j THEN returns given value', (value) => {
expect<[] | [string]>(lengthRangePredicate.parse(value)).toEqual(value);
});

test.each([[['hewwo', 'there']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['hewwo', 'there']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthRangePredicate.parse(value),
new ExpectedConstraintError(
Expand All @@ -136,11 +136,11 @@ describe('ArrayValidator', () => {
describe('lengthRangeInclusive', () => {
const lengthRangeInclusivePredicate = s.string.array.lengthRangeInclusive(0, 2);

test.each([[[] as string[]], [['foo']], [['hewwo', 'there']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[[] as string[]], [['foo']], [['hewwo', 'there']]])('GIVEN %j THEN returns given value', (value) => {
expect<[] | [string] | [string, string]>(lengthRangeInclusivePredicate.parse(value)).toEqual(value);
});

test.each([[['hewwo', 'there', 'buddy']]])('GIVEN %p THEN throws ConstraintError', (value) => {
test.each([[['hewwo', 'there', 'buddy']]])('GIVEN %j THEN throws ConstraintError', (value) => {
expectError(
() => lengthRangeInclusivePredicate.parse(value),
new ExpectedConstraintError(
Expand All @@ -155,12 +155,12 @@ describe('ArrayValidator', () => {
describe('lengthRangeExclusive', () => {
const lengthRangeExclusivePredicate = s.string.array.lengthRangeExclusive(0, 2);

test.each([[['foo']]])('GIVEN %p THEN returns given value', (value) => {
test.each([[['foo']]])('GIVEN %j THEN returns given value', (value) => {
expect<[string]>(lengthRangeExclusivePredicate.parse(value)).toEqual(value);
});

test.each([[[] as string[]], [['hewwo', 'there']], [['hewwo', 'there', 'buddy']]])(
'GIVEN %p THEN throws ConstraintError',
'GIVEN %j THEN throws ConstraintError',
(value) => {
expectError(
() => lengthRangeExclusivePredicate.parse(value),
Expand Down
18 changes: 9 additions & 9 deletions tests/validators/base.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ describe('BaseValidator', () => {
describe('optional', () => {
const optionalPredicate = s.string.optional;

test.each([undefined, 'hello'])('GIVEN %p THEN returns given value', (input) => {
test.each([undefined, 'hello'])('GIVEN %j THEN returns given value', (input) => {
expect<string | undefined>(optionalPredicate.parse(input)).toEqual(input);
});

test.each([null, 0, false, true])('GIVEN %p THEN throws CombinedError', (input) => {
test.each([null, 0, false, true])('GIVEN %o THEN throws CombinedError', (input) => {
expectError(
() => optionalPredicate.parse(input),
new CombinedError([
Expand All @@ -23,11 +23,11 @@ describe('BaseValidator', () => {
describe('nullable', () => {
const nullablePredicate = s.string.nullable;

test.each([null, 'Hello There'])('GIVEN %p THEN returns given value', (input) => {
test.each([null, 'Hello There'])('GIVEN %j THEN returns given value', (input) => {
expect<string | null>(nullablePredicate.parse(input)).toBe(input);
});

test.each([0, false, true])('GIVEN %p THEN throws CombinedError', (input) => {
test.each([0, false, true])('GIVEN %j THEN throws CombinedError', (input) => {
expectError(
() => nullablePredicate.parse(input),
new CombinedError([
Expand All @@ -41,11 +41,11 @@ describe('BaseValidator', () => {
describe('nullish', () => {
const nullishPredicate = s.string.nullish;

test.each(['Hello There', undefined, null])('GIVEN %p THEN returns the given value', (input) => {
test.each(['Hello There', undefined, null])('GIVEN %j THEN returns the given value', (input) => {
expect<string | undefined | null>(nullishPredicate.parse(input)).toBe(input);
});

test.each([0, false, true])('GIVEN %p THEN throws CombinedError', (input) => {
test.each([0, false, true])('GIVEN %j THEN throws CombinedError', (input) => {
expectError(
() => nullishPredicate.parse(input),
new CombinedError([
Expand Down Expand Up @@ -89,11 +89,11 @@ describe('BaseValidator', () => {
describe('or', () => {
const stringOrPredicate = s.string.or(s.number);

test.each(['Hello There', 6])('GIVEN a string or number (%p) THEN returns a string or number', (input) => {
test.each(['Hello There', 6])('GIVEN a string or number (%j) THEN returns a string or number', (input) => {
expect<string | number>(stringOrPredicate.parse(input)).toBe(input);
});

test.each([false, true, null])('GIVEN %p THEN throws CombinedError', (input) => {
test.each([false, true, null])('GIVEN %j THEN throws CombinedError', (input) => {
expectError(
() => stringOrPredicate.parse(input),
new CombinedError([
Expand Down Expand Up @@ -128,7 +128,7 @@ describe('BaseValidator', () => {
expect<string | number>(unionTransformPredicate.parse(6)).toStrictEqual(6);
});

test.each([false, true, null, undefined])('GIVEN %p THEN throws CombinedError', (input) => {
test.each([false, true, null, undefined])('GIVEN %j THEN throws CombinedError', (input) => {
expectError(
() => unionTransformPredicate.parse(input),
new CombinedError([
Expand Down
Loading

0 comments on commit 4d80969

Please sign in to comment.