From 8052c608f0da9a7aa1d6aef1a86a9d4c55515f0c Mon Sep 17 00:00:00 2001 From: Dan Onoshko Date: Mon, 27 Nov 2023 18:42:07 +0700 Subject: [PATCH] test: move test tools to TS (#1170) --- .eslintrc.json | 1 + .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/cli.spec.js | 2 +- .../test/index.spec.js | 2 +- .../test/util.spec.js | 2 +- .../conventional-changelog/test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- packages/git-raw-commits/test/index.spec.js | 2 +- packages/git-semver-tags/test/index.spec.js | 2 +- .../test/index.spec.js | 2 +- packages/standard-changelog/test/cli.spec.js | 2 +- .../standard-changelog/test/index.spec.js | 2 +- tools/.eslintrc.json | 13 ++ tools/test-tools.ts | 191 ++++++++++++++++++ tools/tsconfig.json | 6 + 25 files changed, 232 insertions(+), 21 deletions(-) create mode 100644 tools/.eslintrc.json create mode 100644 tools/test-tools.ts create mode 100644 tools/tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index 389f8d43c..1d2c70b9c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,6 +15,7 @@ }, { "files": [ + "tools/**/*.ts", "packages/**/*.ts" ], "extends": [ diff --git a/packages/conventional-changelog-angular/test/index.spec.js b/packages/conventional-changelog-angular/test/index.spec.js index d8a7b048b..39be0adf2 100644 --- a/packages/conventional-changelog-angular/test/index.spec.js +++ b/packages/conventional-changelog-angular/test/index.spec.js @@ -2,7 +2,7 @@ import path from 'path' import { describe, it, expect } from 'vitest' import BetterThanBefore from 'better-than-before' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' const { setups, preparing, tearsWithJoy } = BetterThanBefore() diff --git a/packages/conventional-changelog-atom/test/index.spec.js b/packages/conventional-changelog-atom/test/index.spec.js index 174cfbb38..cdceed464 100644 --- a/packages/conventional-changelog-atom/test/index.spec.js +++ b/packages/conventional-changelog-atom/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-cli/test/index.spec.js b/packages/conventional-changelog-cli/test/index.spec.js index de43000e1..dba99ac71 100644 --- a/packages/conventional-changelog-cli/test/index.spec.js +++ b/packages/conventional-changelog-cli/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import path from 'path' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' const CLI_PATH = path.join(__dirname, '../cli.js') const FIXTURE_CHANGELOG_PATH = path.join(__dirname, 'fixtures/_CHANGELOG.md') diff --git a/packages/conventional-changelog-codemirror/test/index.spec.js b/packages/conventional-changelog-codemirror/test/index.spec.js index 3a243fc3e..29f24ea4b 100644 --- a/packages/conventional-changelog-codemirror/test/index.spec.js +++ b/packages/conventional-changelog-codemirror/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-conventionalcommits/test/index.spec.js b/packages/conventional-changelog-conventionalcommits/test/index.spec.js index d840612bf..ccebf9e78 100644 --- a/packages/conventional-changelog-conventionalcommits/test/index.spec.js +++ b/packages/conventional-changelog-conventionalcommits/test/index.spec.js @@ -2,7 +2,7 @@ import path from 'path' import { describe, it, expect } from 'vitest' import BetterThanBefore from 'better-than-before' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset, { DEFAULT_COMMIT_TYPES } from '../index.js' const { setups, preparing, tearsWithJoy } = BetterThanBefore() diff --git a/packages/conventional-changelog-core/test/index.spec.js b/packages/conventional-changelog-core/test/index.spec.js index 3f268254c..0dee64b9b 100644 --- a/packages/conventional-changelog-core/test/index.spec.js +++ b/packages/conventional-changelog-core/test/index.spec.js @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest' import BetterThanBefore from 'better-than-before' import path from 'path' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import conventionalChangelogCore from '../index.js' const { setups, preparing, tearsWithJoy } = BetterThanBefore() diff --git a/packages/conventional-changelog-ember/test/index.spec.js b/packages/conventional-changelog-ember/test/index.spec.js index 3c588f7d6..f984bd459 100644 --- a/packages/conventional-changelog-ember/test/index.spec.js +++ b/packages/conventional-changelog-ember/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeEach, afterEach, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-eslint/test/index.spec.js b/packages/conventional-changelog-eslint/test/index.spec.js index 07371c297..3e2d9f0f3 100644 --- a/packages/conventional-changelog-eslint/test/index.spec.js +++ b/packages/conventional-changelog-eslint/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-express/test/index.spec.js b/packages/conventional-changelog-express/test/index.spec.js index d7c20061d..402f3b7e9 100644 --- a/packages/conventional-changelog-express/test/index.spec.js +++ b/packages/conventional-changelog-express/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeEach, afterEach, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-jquery/test/index.spec.js b/packages/conventional-changelog-jquery/test/index.spec.js index 61aa48e82..824279496 100644 --- a/packages/conventional-changelog-jquery/test/index.spec.js +++ b/packages/conventional-changelog-jquery/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeEach, afterEach, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-jshint/test/index.spec.js b/packages/conventional-changelog-jshint/test/index.spec.js index ae980e100..b702e674e 100644 --- a/packages/conventional-changelog-jshint/test/index.spec.js +++ b/packages/conventional-changelog-jshint/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' import conventionalChangelogCore from 'conventional-changelog-core' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import preset from '../index.js' let testTools diff --git a/packages/conventional-changelog-writer/test/cli.spec.js b/packages/conventional-changelog-writer/test/cli.spec.js index 529dd9425..04ae3a828 100644 --- a/packages/conventional-changelog-writer/test/cli.spec.js +++ b/packages/conventional-changelog-writer/test/cli.spec.js @@ -1,7 +1,7 @@ import fs from 'fs' import path from 'path' import { describe, beforeAll, it, expect } from 'vitest' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' const CLI_PATH = path.join(__dirname, './test-cli.cjs') const COMMITS_PATH = 'fixtures/commits.ldjson' diff --git a/packages/conventional-changelog-writer/test/index.spec.js b/packages/conventional-changelog-writer/test/index.spec.js index 3427aec0c..d3cc3f6fe 100644 --- a/packages/conventional-changelog-writer/test/index.spec.js +++ b/packages/conventional-changelog-writer/test/index.spec.js @@ -1,6 +1,6 @@ import dedent from 'dedent' import { describe, it, expect } from 'vitest' -import { delay, throughObj } from '../../../tools/test-tools.js' +import { delay, throughObj } from '../../../tools/test-tools.ts' import conventionalChangelogWriter, { parseArray } from '../index.js' function formatDate (date, timeZone = 'UTC') { diff --git a/packages/conventional-changelog-writer/test/util.spec.js b/packages/conventional-changelog-writer/test/util.spec.js index 49460736b..c89dfbb02 100644 --- a/packages/conventional-changelog-writer/test/util.spec.js +++ b/packages/conventional-changelog-writer/test/util.spec.js @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest' -import { delay } from '../../../tools/test-tools.js' +import { delay } from '../../../tools/test-tools.ts' import { compileTemplates, functionify, diff --git a/packages/conventional-changelog/test/index.spec.js b/packages/conventional-changelog/test/index.spec.js index 079fd6f6f..c602d41ac 100644 --- a/packages/conventional-changelog/test/index.spec.js +++ b/packages/conventional-changelog/test/index.spec.js @@ -1,5 +1,5 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import conventionalChangelog from '../index.js' let testTools diff --git a/packages/conventional-recommended-bump/test/index.spec.js b/packages/conventional-recommended-bump/test/index.spec.js index 0825c7001..50cb2b24d 100644 --- a/packages/conventional-recommended-bump/test/index.spec.js +++ b/packages/conventional-recommended-bump/test/index.spec.js @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest' import BetterThanBefore from 'better-than-before' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import conventionalRecommendedBump from '../index.js' const { setups, preparing, tearsWithJoy } = BetterThanBefore() diff --git a/packages/git-raw-commits/test/index.spec.js b/packages/git-raw-commits/test/index.spec.js index 587b53117..343a64dfd 100644 --- a/packages/git-raw-commits/test/index.spec.js +++ b/packages/git-raw-commits/test/index.spec.js @@ -1,5 +1,5 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' -import { TestTools, delay } from '../../../tools/test-tools.js' +import { TestTools, delay } from '../../../tools/test-tools.ts' import gitRawCommits from '../index.js' let testTools diff --git a/packages/git-semver-tags/test/index.spec.js b/packages/git-semver-tags/test/index.spec.js index f53288ab1..e10d30f28 100644 --- a/packages/git-semver-tags/test/index.spec.js +++ b/packages/git-semver-tags/test/index.spec.js @@ -1,5 +1,5 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import gitSemverTags from '../index.js' let testTools diff --git a/packages/gulp-conventional-changelog/test/index.spec.js b/packages/gulp-conventional-changelog/test/index.spec.js index a4e0550d5..e2c2857f6 100644 --- a/packages/gulp-conventional-changelog/test/index.spec.js +++ b/packages/gulp-conventional-changelog/test/index.spec.js @@ -2,7 +2,7 @@ import { Buffer } from 'safe-buffer' import { describe, beforeAll, afterAll, it, expect } from 'vitest' import { join } from 'path' import Vinyl from 'vinyl' -import { TestTools, through } from '../../../tools/test-tools.js' +import { TestTools, through } from '../../../tools/test-tools.ts' import conventionalChangelog from '../index.js' let testTools diff --git a/packages/standard-changelog/test/cli.spec.js b/packages/standard-changelog/test/cli.spec.js index f58592ec9..604b5f674 100644 --- a/packages/standard-changelog/test/cli.spec.js +++ b/packages/standard-changelog/test/cli.spec.js @@ -1,6 +1,6 @@ import path from 'path' import { describe, beforeAll, beforeEach, afterAll, it, expect } from 'vitest' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' const CLI_PATH = path.join(__dirname, '../cli.js') const FIXTURE_CHANGELOG_PATH = path.join(__dirname, 'fixtures/_CHANGELOG.md') diff --git a/packages/standard-changelog/test/index.spec.js b/packages/standard-changelog/test/index.spec.js index dfd041ab6..af50711fd 100644 --- a/packages/standard-changelog/test/index.spec.js +++ b/packages/standard-changelog/test/index.spec.js @@ -1,5 +1,5 @@ import { describe, beforeAll, afterAll, it, expect } from 'vitest' -import { TestTools } from '../../../tools/test-tools.js' +import { TestTools } from '../../../tools/test-tools.ts' import standardChangelog from '../index.js' let testTools diff --git a/tools/.eslintrc.json b/tools/.eslintrc.json new file mode 100644 index 000000000..ee1047c4b --- /dev/null +++ b/tools/.eslintrc.json @@ -0,0 +1,13 @@ +{ + "extends": [ + "@trigen/eslint-config/typescript", + "@trigen/eslint-config/typescript-requiring-type-checking" + ], + "parserOptions": { + "tsconfigRootDir": "./tools", + "project": ["./tsconfig.json"] + }, + "rules": { + "@typescript-eslint/no-magic-numbers": "off" + } +} diff --git a/tools/test-tools.ts b/tools/test-tools.ts new file mode 100644 index 000000000..cb194c7fc --- /dev/null +++ b/tools/test-tools.ts @@ -0,0 +1,191 @@ +import { execSync, spawn } from 'child_process' +import { Transform } from 'stream' +import { pathToFileURL } from 'url' +import path from 'path' +import fs from 'fs' +// @ts-expect-error 'tmp' has no types +import tmp from 'tmp' + +export function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} + +function fixMessage(message?: string) { + let msg = message + + if (!msg || typeof msg !== 'string') { + msg = 'Test commit' + } + + // we need to escape backtick for bash but not for windows + // probably this should be done in git-dummy-commit or shelljs + if (process.platform !== 'win32') { + msg = msg.replace(/`/g, '\\`') + } + + return `"${msg}"` +} + +function prepareMessageArgs(msg: string | string[]) { + const args = [] + + if (Array.isArray(msg)) { + if (msg.length > 0) { + for (const m of msg) { + args.push('-m', fixMessage(m)) + } + } else { + args.push('-m', fixMessage()) + } + } else { + args.push('-m', fixMessage(msg)) + } + + return args +} + +export function through( + transform = ( + chunk: string | Buffer, + _enc: string, + cb: (err: Error | null, chunk: string | Buffer) => void + ) => cb(null, chunk), + flush?: () => void +) { + return new Transform({ + transform, + flush + }) +} + +export function throughObj( + transform = ( + chunk: string | Buffer, + _enc: string, + cb: (err: Error | null, chunk: string | Buffer) => void + ) => cb(null, chunk), + flush?: () => void +) { + return new Transform({ + objectMode: true, + highWaterMark: 16, + transform, + flush + }) +} + +export class TestTools { + cwd: string + + constructor(cwd: string) { + this.cwd = cwd + + if (!cwd) { + /* eslint-disable */ + this.cwd = fs.realpathSync(tmp.dirSync().name) + tmp.setGracefulCleanup() + /* eslint-enable */ + } + } + + cleanup() { + try { + this.rmSync(this.cwd, { + recursive: true + }) + } catch (err) { + // ignore + } + } + + mkdirSync(dir: string, options?: Parameters[1]) { + return fs.mkdirSync(path.resolve(this.cwd, dir), options) + } + + writeFileSync(file: string, content: string) { + return fs.writeFileSync(path.resolve(this.cwd, file), content) + } + + readFileSync(file: string, options: Parameters[1]) { + return fs.readFileSync(path.resolve(this.cwd, file), options) + } + + rmSync(target: string, options?: Parameters[1]) { + return fs.rmSync(path.resolve(this.cwd, target), options) + } + + exec(command: string) { + return execSync(command, { + cwd: this.cwd, + stdio: 'pipe', + encoding: 'utf-8' + }) + } + + fork(script: string, args: string[] = [], options: Parameters[2] = {}) { + return new Promise<{stdout: string, stderr: string, exitCode: number | null}>((resolve, reject) => { + const finalOptions = { + cwd: this.cwd, + stdio: [ + null, + null, + null + ], + ...options + } + const nodeArgs = [ + '--no-warnings', + '--loader', + pathToFileURL(path.resolve(__dirname, '..', 'node_modules', 'tsm', 'loader.mjs')).toString() + ] + const child = spawn(process.execPath, [ + ...nodeArgs, + script, + ...args + ], finalOptions) + let stdout = '' + let stderr = '' + let exitCode = null + + child.stdout?.on('data', (data: Buffer) => { + stdout += data.toString() + }) + child.stderr?.on('data', (data: Buffer) => { + stderr += data.toString() + }) + child.on('close', (code) => { + exitCode = code + resolve({ + stdout, + stderr, + exitCode + }) + }) + child.on('error', reject) + }) + } + + gitInit() { + this.mkdirSync('git-templates') + return this.exec('git init --template=./git-templates --initial-branch=master') + } + + gitDummyCommit(msg: string | string[]) { + const args = prepareMessageArgs(msg) + + args.push( + '--allow-empty', + '--no-gpg-sign' + ) + + return this.exec(`git commit ${args.join(' ')}`) + } + + gitTails() { + const data = execSync('git rev-list --parents HEAD', { + cwd: this.cwd + }) + + return data.toString().match(/^[a-f0-9]{40}$/gm) + } +} diff --git a/tools/tsconfig.json b/tools/tsconfig.json new file mode 100644 index 000000000..f75e3dba3 --- /dev/null +++ b/tools/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "." + ] +}