From 14ee628fee8e756900d1758be3d609dae8a13ddf Mon Sep 17 00:00:00 2001 From: volatilization Date: Sat, 20 Apr 2024 11:15:26 +0300 Subject: [PATCH] add coverage checking to node and bun runner --- .github/workflows/npm-publish.yml | 2 +- .github/workflows/{npm-test.yml => test.yml} | 9 +++-- dist/{prepareToPublish.js => prepublish.js} | 0 package.json | 8 ++-- src/js/client/response/InputResponse.js | 6 +-- src/test/static/bun/coverageCheck.js | 40 ++++++++++++++++++++ src/test/static/coverageCheck.js | 31 +++++++++++++++ 7 files changed, 85 insertions(+), 11 deletions(-) rename .github/workflows/{npm-test.yml => test.yml} (58%) rename dist/{prepareToPublish.js => prepublish.js} (100%) create mode 100644 src/test/static/bun/coverageCheck.js create mode 100644 src/test/static/coverageCheck.js diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 29eb901..20cd7ac 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -23,7 +23,7 @@ jobs: with: node-version: 21 registry-url: https://registry.npmjs.org/ - - run: npm run prepareToPublish + - run: npm run prepublishOnly env: RELEASE: ${{github.event.release.name}} - run: npm publish diff --git a/.github/workflows/npm-test.yml b/.github/workflows/test.yml similarity index 58% rename from .github/workflows/npm-test.yml rename to .github/workflows/test.yml index c303d84..e323be9 100644 --- a/.github/workflows/npm-test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,9 @@ jobs: - uses: oven-sh/setup-bun@v1 with: bun-version: 1.1.4 - - run: node --test **/test/**/[!b][!u][!n]*/**/*.js - - run: bun test **/test/**/bun/**/** - + - run: npm run testWithCoverageCheck + env: + COVERAGE_MIN_PERCENT: ${{vars.coverage_min_percent}} + - run: bun run bunTestWithCoverageCheck + env: + COVERAGE_MIN_PERCENT: ${{vars.coverage_min_percent}} \ No newline at end of file diff --git a/dist/prepareToPublish.js b/dist/prepublish.js similarity index 100% rename from dist/prepareToPublish.js rename to dist/prepublish.js diff --git a/package.json b/package.json index b3b8c6c..aeb617e 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ "oop" ], "scripts": { - "prepareToPublish": "node dist/prepareToPublish.js", - "test": "node --test **/test/**/[!b][!u][!n]*/**/*.js", - "testBun": "bun test **/test/**/bun/**/**" + "prepublishOnly": "node dist/prepublish.js", + "test": "node --test --experimental-test-coverage --test-reporter=spec **/test/**/[!b][!u][!n]*/**/*.js **/test/**/[!b][!u][!n]*/*.js", + "testWithCoverageCheck": "node src/test/static/coverageCheck.js", + "bunTest": "bun test --coverage **/test/**/bun/**/**", + "bunTestWithCoverageCheck": "bun src/test/static/bun/coverageCheck.js" }, "author": { "name": "volatilization", diff --git a/src/js/client/response/InputResponse.js b/src/js/client/response/InputResponse.js index ac4c68f..835400e 100644 --- a/src/js/client/response/InputResponse.js +++ b/src/js/client/response/InputResponse.js @@ -14,9 +14,7 @@ module.exports = class InputResponse { flush() { try { return new Promise((resolve, reject) => { - this.#inputStream.once('error', (e) => - reject(new Error(e.message, {cause: 'INVALID_RESPONSE'})) - ); + this.#inputStream.once('error', (e) => reject(new Error(e.message, {cause: 'INVALID_RESPONSE'}))); let chunks = []; this.#inputStream.on('data', (chunk) => chunks.push(chunk)); @@ -30,7 +28,7 @@ module.exports = class InputResponse { }); } catch (e) { - throw new Error(e.message, {cause: 'INVALID_RESPONSE'}) + throw new Error(e.message, {cause: 'INVALID_RESPONSE'}); } } diff --git a/src/test/static/bun/coverageCheck.js b/src/test/static/bun/coverageCheck.js new file mode 100644 index 0000000..ef33684 --- /dev/null +++ b/src/test/static/bun/coverageCheck.js @@ -0,0 +1,40 @@ +const testRunnerResult = Bun.spawnSync(["bun", "run", "bunTest"]); +console.log(testRunnerResult.stderr.toString()); + +const codeCoverageResultTableHeaderLine = testRunnerResult.stderr.toString() + .split('\n') + .filter(line => line.includes('Funcs')) + .filter(line => line.includes('Funcs')) + .filter(line => line.includes('Lines')) + .filter(line => line.includes('Uncovered Line')) + .findLast(line => line.length > 0); + +if (codeCoverageResultTableHeaderLine == null) { + console.error('no code coverage result'); + process.exit(2); +} + +const coveragePercent = testRunnerResult.stderr.toString() + .split(codeCoverageResultTableHeaderLine)[1] + .split('\n') + .filter(line => line.includes('.js')) + .filter(line => line.includes('/bun/')) + .filter(line => !line.includes('/test/')) + .map(line => Number(line.split('|')[2].trim())) + .reduce((prevPercent, currPercent, currIndex, array) => { + if (currIndex === 0) { + return currPercent; + } + if (currIndex === (array.length - 1)) { + return (prevPercent + currPercent) / array.length; + } + return prevPercent + currPercent; + }); + +if (coveragePercent < Number(process.env.COVERAGE_MIN_PERCENT)) { + console.error(`${coveragePercent} is not enough coverage percent`); + process.exit(1); +} + +console.log(`${coveragePercent} is enough coverage percent`); +process.exit(0); diff --git a/src/test/static/coverageCheck.js b/src/test/static/coverageCheck.js new file mode 100644 index 0000000..50819fb --- /dev/null +++ b/src/test/static/coverageCheck.js @@ -0,0 +1,31 @@ +const execSync = require('child_process').execSync; + +const testResult = execSync('npm run test').toString(); +console.log(testResult); + +const coveragePercent = testResult + .split('start of coverage report')[1] + .split('end of coverage report')[0] + .split('\n') + .filter(line => line.includes('.js')) + .filter(line => !line.includes('/bun/')) + .filter(line => !line.includes('/test/')) + .map(line => Number(line.split('|')[1].trim())) + .reduce((prevPercent, currPercent, currIndex, array) => { + if (currIndex === 0) { + return currPercent; + } + if (currIndex === (array.length - 1)) { + return (prevPercent + currPercent) / array.length; + } + return prevPercent + currPercent; + }); + +if (coveragePercent < Number(process.env.COVERAGE_MIN_PERCENT)) { + console.error(`${coveragePercent} is not enough coverage percent`); + process.exit(1); +} + +console.log(`${coveragePercent} is enough coverage percent`); +process.exit(0); +