From 1b443667e0a5a3b48a96ff6d8208192b3b954082 Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Mon, 15 Feb 2021 01:09:29 +0100 Subject: [PATCH] =?UTF-8?q?feat(betterer=20=E2=9C=A8):=20use=20prettier=20?= =?UTF-8?q?with=20default=20printer=20for=20nicer=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goldens/api/@betterer/betterer.d.ts | 4 +- package.json | 2 +- packages/betterer/package.json | 4 +- packages/betterer/src/results/result.ts | 2 +- packages/betterer/src/results/types.ts | 4 +- packages/betterer/src/test/config.ts | 29 ++++--- packages/betterer/src/test/types.ts | 2 +- .../betterer-better.spec.ts.snap | 6 +- .../betterer-config-ts-esm.spec.ts.snap | 3 +- .../betterer-config-ts.spec.ts.snap | 3 +- .../betterer-deadline.spec.ts.snap | 6 +- .../betterer-named-exports.spec.ts.snap | 3 +- test/__snapshots__/betterer-only.spec.ts.snap | 9 ++- .../betterer-printer.spec.ts.snap | 55 +++++++++++++ test/__snapshots__/betterer-same.spec.ts.snap | 6 +- test/__snapshots__/betterer-skip.spec.ts.snap | 3 +- .../__snapshots__/betterer-worse.spec.ts.snap | 6 +- test/betterer-printer.spec.ts | 81 +++++++++++++++++++ yarn.lock | 7 +- 19 files changed, 201 insertions(+), 34 deletions(-) create mode 100644 test/__snapshots__/betterer-printer.spec.ts.snap create mode 100644 test/betterer-printer.spec.ts diff --git a/goldens/api/@betterer/betterer.d.ts b/goldens/api/@betterer/betterer.d.ts index d9c83dd9b..1ef7600af 100644 --- a/goldens/api/@betterer/betterer.d.ts +++ b/goldens/api/@betterer/betterer.d.ts @@ -143,10 +143,10 @@ export declare type BettererResult = { export declare type BettererResultValue = BettererResultValueBasic | BettererResultValueComplex; -export declare type BettererResultValueBasic = number; +export declare type BettererResultValueBasic = unknown; export declare type BettererResultValueComplex = { - value: number; + value: unknown; }; export declare type BettererRun = { diff --git a/package.json b/package.json index 99188008a..e18a9b287 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "lerna": "^3.22.1", "npm-run-all": "^4.1.5", "react": "^16.13.1", - "prettier": "^2.1.1", + "prettier": "^2.2.1", "ts-api-guardian": "^0.5.0", "ts-jest": "^26.3.0", "ts-node": "^9.0.0", diff --git a/packages/betterer/package.json b/packages/betterer/package.json index a47a781cf..8ded78c99 100644 --- a/packages/betterer/package.json +++ b/packages/betterer/package.json @@ -40,10 +40,12 @@ "globby": "^11.0.1", "lines-and-columns": "^1.1.6", "minimatch": "^3.0.4", + "prettier": "^2.2.1", "ts-node": "^9.0.0", "tslib": "^2.0.3" }, "devDependencies": { - "@types/callsite": "^1.0.30" + "@types/callsite": "^1.0.30", + "@types/prettier": "^1.12.0" } } diff --git a/packages/betterer/src/results/result.ts b/packages/betterer/src/results/result.ts index 1c39d1c16..92d45dac5 100644 --- a/packages/betterer/src/results/result.ts +++ b/packages/betterer/src/results/result.ts @@ -19,7 +19,7 @@ export class BettererResultΩ implements BettererResult { return this._isNew; } - public get value(): number { + public get value(): unknown { const result = this.result; return isComplexBettererResult(result) ? result.value : result; } diff --git a/packages/betterer/src/results/types.ts b/packages/betterer/src/results/types.ts index 7580d2874..15c6e60c6 100644 --- a/packages/betterer/src/results/types.ts +++ b/packages/betterer/src/results/types.ts @@ -3,9 +3,9 @@ export type BettererExpectedResult = { }; export type BettererExpectedResults = Record; -export type BettererResultValueBasic = number; +export type BettererResultValueBasic = unknown; export type BettererResultValueComplex = { - value: number; + value: unknown; }; export type BettererResultValue = BettererResultValueBasic | BettererResultValueComplex; diff --git a/packages/betterer/src/test/config.ts b/packages/betterer/src/test/config.ts index 05271582f..35c141ce2 100644 --- a/packages/betterer/src/test/config.ts +++ b/packages/betterer/src/test/config.ts @@ -1,5 +1,7 @@ import { BettererError } from '@betterer/errors'; import { BettererLogger, diffΔ } from '@betterer/logger'; +import { format } from 'prettier'; + import { BettererResultValue } from '../results'; import { isFunction } from '../utils'; import { @@ -12,7 +14,7 @@ import { export function createTestConfig( config: BettererTestConfigPartial -): BettererTestConfig | BettererTestConfig { +): BettererTestConfig | BettererTestConfig { if (config.constraint == null) { throw new BettererError('for a test to work, it must have a `constraint` function. ❌'); } @@ -27,7 +29,11 @@ export function createTestConfig; + return { + ...config, + deadline, + printer: config.printer || defaultPrinter + } as BettererTestConfig; } const goal = createGoal(config); @@ -35,10 +41,13 @@ export function createTestConfig; + } as BettererTestConfig; } function createDeadline( @@ -70,10 +79,10 @@ function isComplex ): config is BettererTestConfigComplexPartial { const maybeComplex = config as BettererTestConfigComplexPartial; - return !!(maybeComplex.differ && maybeComplex.printer && maybeComplex.serialiser); + return !!(maybeComplex.differ && maybeComplex.serialiser); } -export function defaultDiffer(expected: number, result: number): BettererDiff { +export function defaultDiffer(expected: unknown, result: unknown): BettererDiff { return { expected, result, @@ -87,14 +96,14 @@ export function defaultDiffer(expected: number, result: number): BettererDiff; test: BettererTestFunction; differ: BettererDiffer; - printer: BettererPrinter; + printer?: BettererPrinter; serialiser: BettererSerialiser; goal: DeserialisedType | BettererTestGoal; deadline?: Date | string; diff --git a/test/__snapshots__/betterer-better.spec.ts.snap b/test/__snapshots__/betterer-better.spec.ts.snap index 3daa5d326..d089c2d77 100644 --- a/test/__snapshots__/betterer-better.spec.ts.snap +++ b/test/__snapshots__/betterer-better.spec.ts.snap @@ -342,11 +342,13 @@ Array [ exports[`betterer should work when a test gets better 2`] = ` "// BETTERER RESULTS V2. exports[\`should shrink\`] = { - value: \`1\` + value: \`1 +\` }; exports[\`should grow\`] = { - value: \`1\` + value: \`1 +\` }; " `; diff --git a/test/__snapshots__/betterer-config-ts-esm.spec.ts.snap b/test/__snapshots__/betterer-config-ts-esm.spec.ts.snap index 5010cf224..492f1ae40 100644 --- a/test/__snapshots__/betterer-config-ts-esm.spec.ts.snap +++ b/test/__snapshots__/betterer-config-ts-esm.spec.ts.snap @@ -157,7 +157,8 @@ Array [ exports[`betterer should work with a .betterer.ts file that uses ES modules 2`] = ` "// BETTERER RESULTS V2. exports[\`gets better\`] = { - value: \`1\` + value: \`1 +\` }; " `; diff --git a/test/__snapshots__/betterer-config-ts.spec.ts.snap b/test/__snapshots__/betterer-config-ts.spec.ts.snap index e5a49ba3a..dbc1c96e3 100644 --- a/test/__snapshots__/betterer-config-ts.spec.ts.snap +++ b/test/__snapshots__/betterer-config-ts.spec.ts.snap @@ -138,7 +138,8 @@ Array [ exports[`betterer should work with a .betterer.ts file 2`] = ` "// BETTERER RESULTS V2. exports[\`gets better\`] = { - value: \`1\` + value: \`1 +\` }; " `; diff --git a/test/__snapshots__/betterer-deadline.spec.ts.snap b/test/__snapshots__/betterer-deadline.spec.ts.snap index 75f1516f2..e9637518d 100644 --- a/test/__snapshots__/betterer-deadline.spec.ts.snap +++ b/test/__snapshots__/betterer-deadline.spec.ts.snap @@ -73,7 +73,8 @@ Array [ exports[`betterer should do nothing when a test is not past its deadline 2`] = ` "// BETTERER RESULTS V2. exports[\`should grow\`] = { - value: \`0\` + value: \`0 +\` }; " `; @@ -179,7 +180,8 @@ Array [ exports[`betterer should mark a test as expired when is is past its deadline 2`] = ` "// BETTERER RESULTS V2. exports[\`should grow\`] = { - value: \`0\` + value: \`0 +\` }; " `; diff --git a/test/__snapshots__/betterer-named-exports.spec.ts.snap b/test/__snapshots__/betterer-named-exports.spec.ts.snap index 87c528daf..f91e388d5 100644 --- a/test/__snapshots__/betterer-named-exports.spec.ts.snap +++ b/test/__snapshots__/betterer-named-exports.spec.ts.snap @@ -138,7 +138,8 @@ Array [ exports[`betterer should work with named exports in the config file 2`] = ` "// BETTERER RESULTS V2. exports[\`getsBetter\`] = { - value: \`1\` + value: \`1 +\` }; " `; diff --git a/test/__snapshots__/betterer-only.spec.ts.snap b/test/__snapshots__/betterer-only.spec.ts.snap index 51a6b5e95..76dde69c0 100644 --- a/test/__snapshots__/betterer-only.spec.ts.snap +++ b/test/__snapshots__/betterer-only.spec.ts.snap @@ -331,15 +331,18 @@ Array [ exports[`betterer should run specific tests 2`] = ` "// BETTERER RESULTS V2. exports[\`test 1\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`test 2\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`test 3\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`test 4\`] = { diff --git a/test/__snapshots__/betterer-printer.spec.ts.snap b/test/__snapshots__/betterer-printer.spec.ts.snap new file mode 100644 index 000000000..8830e0d2d --- /dev/null +++ b/test/__snapshots__/betterer-printer.spec.ts.snap @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`betterer should handle printing for pathological cases 1`] = ` +"// BETTERER RESULTS V2. +exports[\`big array\`] = { + value: \`[ + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\", + \\"./some/long/path/to/some/file\\" +] +\` +}; + +exports[\`big object\`] = { + value: \`{ + \\"a\\": \\"./some/long/path/to/some/file\\", + \\"b\\": \\"./some/long/path/to/some/file\\", + \\"c\\": \\"./some/long/path/to/some/file\\", + \\"d\\": \\"./some/long/path/to/some/file\\", + \\"e\\": \\"./some/long/path/to/some/file\\", + \\"f\\": \\"./some/long/path/to/some/file\\", + \\"g\\": \\"./some/long/path/to/some/file\\", + \\"h\\": \\"./some/long/path/to/some/file\\", + \\"i\\": \\"./some/long/path/to/some/file\\", + \\"j\\": \\"./some/long/path/to/some/file\\", + \\"k\\": \\"./some/long/path/to/some/file\\", + \\"l\\": \\"./some/long/path/to/some/file\\", + \\"m\\": \\"./some/long/path/to/some/file\\", + \\"n\\": \\"./some/long/path/to/some/file\\", + \\"o\\": \\"./some/long/path/to/some/file\\", + \\"p\\": \\"./some/long/path/to/some/file\\", + \\"q\\": \\"./some/long/path/to/some/file\\", + \\"r\\": \\"./some/long/path/to/some/file\\", + \\"s\\": \\"./some/long/path/to/some/file\\" +} +\` +}; +" +`; diff --git a/test/__snapshots__/betterer-same.spec.ts.snap b/test/__snapshots__/betterer-same.spec.ts.snap index 8b6ee5cb9..af40d9cb6 100644 --- a/test/__snapshots__/betterer-same.spec.ts.snap +++ b/test/__snapshots__/betterer-same.spec.ts.snap @@ -673,11 +673,13 @@ Array [ exports[`betterer should work when a test is the same 2`] = ` "// BETTERER RESULTS V2. exports[\`doesn't get bigger\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`doesn't get smaller\`] = { - value: \`0\` + value: \`0 +\` }; " `; diff --git a/test/__snapshots__/betterer-skip.spec.ts.snap b/test/__snapshots__/betterer-skip.spec.ts.snap index 3782c1ccb..7577da694 100644 --- a/test/__snapshots__/betterer-skip.spec.ts.snap +++ b/test/__snapshots__/betterer-skip.spec.ts.snap @@ -194,7 +194,8 @@ Array [ exports[`betterer should skip a test 2`] = ` "// BETTERER RESULTS V2. exports[\`test 1\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`test 2\`] = { diff --git a/test/__snapshots__/betterer-worse.spec.ts.snap b/test/__snapshots__/betterer-worse.spec.ts.snap index 2d8a717ab..16413b2df 100644 --- a/test/__snapshots__/betterer-worse.spec.ts.snap +++ b/test/__snapshots__/betterer-worse.spec.ts.snap @@ -645,11 +645,13 @@ Run \`betterer --update\` to force an update of the results file. 🆙 exports[`betterer should work when a test gets worse 2`] = ` "// BETTERER RESULTS V2. exports[\`should shrink\`] = { - value: \`0\` + value: \`0 +\` }; exports[\`should grow\`] = { - value: \`2\` + value: \`2 +\` }; " `; diff --git a/test/betterer-printer.spec.ts b/test/betterer-printer.spec.ts new file mode 100644 index 000000000..fb446ed8d --- /dev/null +++ b/test/betterer-printer.spec.ts @@ -0,0 +1,81 @@ +import { betterer } from '@betterer/betterer'; + +import { createFixture } from './fixture'; + +describe('betterer', () => { + it('should handle printing for pathological cases', async () => { + const { paths, readFile, cleanup } = await createFixture('test-betterer-printer-pathological', { + '.betterer.js': ` +const { smaller } = require('@betterer/constraints'); + +const paths = [ + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', + './some/long/path/to/some/file', +]; + +const map = { + a: './some/long/path/to/some/file', + b: './some/long/path/to/some/file', + c: './some/long/path/to/some/file', + d: './some/long/path/to/some/file', + e: './some/long/path/to/some/file', + f: './some/long/path/to/some/file', + g: './some/long/path/to/some/file', + h: './some/long/path/to/some/file', + i: './some/long/path/to/some/file', + j: './some/long/path/to/some/file', + k: './some/long/path/to/some/file', + l: './some/long/path/to/some/file', + m: './some/long/path/to/some/file', + n: './some/long/path/to/some/file', + o: './some/long/path/to/some/file', + p: './some/long/path/to/some/file', + q: './some/long/path/to/some/file', + r: './some/long/path/to/some/file', + s: './some/long/path/to/some/file', +}; + +module.exports = { + 'big array': { + test: () => paths, + constraint: () => 'same', + goal: 0 + }, + 'big object': { + test: () => map, + constraint: () => 'same', + goal: 0 + } +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await betterer({ configPaths, resultsPath }); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/yarn.lock b/yarn.lock index 6de061d63..1a5718d2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1911,6 +1911,11 @@ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prettier@^1.12.0": + version "1.19.1" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== + "@types/prettier@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" @@ -7653,7 +7658,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.1.1: +prettier@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==