diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 65959c9b..79e3fa3e 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -35,9 +35,14 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} + check-latest: true - name: Install dependencies run: npm install - name: Run tests - run: npm run coverage-all + if: matrix.node-version == '16.x' + run: npm run test-unit + - name: Run tests + if: matrix.node-version != '16.x' + run: npm run coverage:ci - name: Upload coverage report to Codecov uses: codecov/codecov-action@v3 diff --git a/package.json b/package.json index 3623db68..51f5b9a5 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,10 @@ }, "scripts": { "test": "npm run test-unit && npm run lint", - "test-unit": "mocha --timeout 60000 test/unit/*.test.js --exit", - "test-all": "mocha --timeout 60000 test/**/*.test.js --exit", + "test-unit": "node --test test/unit", + "test:reporters": "node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=@reporters/github --test-reporter-destination=stdout test/unit", "coverage": "c8 --reporter=html --reporter=text --reporter=text-summary npm test", - "coverage-all": "c8 --reporter=lcov --reporter=text --reporter=text-summary npm run test-all", + "coverage:ci": "c8 --reporter=lcov --reporter=text --reporter=text-summary npm run test:reporters", "lint": "eslint . --cache", "lint-fix": "eslint . --fix" }, @@ -55,13 +55,13 @@ "yargs": "^17.7.1" }, "devDependencies": { + "@reporters/github": "^1.1.2", "c8": "^7.13.0", "eslint": "^8.35.0", "eslint-config-standard": "^17.0.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-n": "^15.6.1", "eslint-plugin-promise": "^6.1.1", - "mocha": "^10.2.0", "sinon": "^15.0.1" } } diff --git a/test/.eslintrc b/test/.eslintrc deleted file mode 100644 index 8a30ebae..00000000 --- a/test/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "env": { - "node": true, - "mocha": true - } -} diff --git a/test/unit/auth.test.js b/test/unit/auth.test.js index 6e13b9dc..3bc7d948 100644 --- a/test/unit/auth.test.js +++ b/test/unit/auth.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import { spawn } from 'node:child_process'; import path from 'node:path'; import fs from 'node:fs'; @@ -18,7 +19,6 @@ const MOCKED_TOKEN = JSON.stringify({ describe('auth', async function() { it('asks for auth data if no ncurc is found', async function() { - this.timeout(2000); await runAuthScript( undefined, [FIRST_TIME_MSG, MOCKED_TOKEN] @@ -26,7 +26,6 @@ describe('auth', async function() { }); it('asks for auth data if ncurc is invalid json', async function() { - this.timeout(2000); await runAuthScript( { HOME: 'this is not json' }, [FIRST_TIME_MSG, MOCKED_TOKEN] @@ -34,7 +33,6 @@ describe('auth', async function() { }); it('returns ncurc data if valid in HOME', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: '0123456789abcdef' } }, [MOCKED_TOKEN] @@ -42,7 +40,6 @@ describe('auth', async function() { }); it('returns ncurc data if valid in XDG_CONFIG_HOME', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: '0123456789abcdef' } }, [MOCKED_TOKEN] @@ -50,7 +47,6 @@ describe('auth', async function() { }); it('prefers XDG_CONFIG_HOME/ncurc to HOME/.ncurc', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'notnyancat', token: 'somewrongtoken' }, @@ -61,7 +57,6 @@ describe('auth', async function() { }); it("prints an error message if it can't generate a token", async function() { - this.timeout(2000); await runAuthScript( {}, [FIRST_TIME_MSG], @@ -70,7 +65,6 @@ describe('auth', async function() { }); it('does not accept a non-string username', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: {}, token: '0123456789abcdef' } }, [], @@ -79,7 +73,6 @@ describe('auth', async function() { }); it('does not accept a non-string token', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: 42 } }, [], @@ -88,7 +81,6 @@ describe('auth', async function() { }); it('does not accept an invalid username format', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: ' ^^^ ', token: '0123456789abcdef' } }, [], @@ -98,7 +90,6 @@ describe('auth', async function() { }); it('does not accept an invalid token format', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: '@fhqwhgads' } }, [], @@ -107,7 +98,6 @@ describe('auth', async function() { }); it('permits capital letters in token format', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: '0123456789ABCDEF' } }, ['{"github":"bnlhbmNhdDowMTIzNDU2Nzg5QUJDREVG"}'] @@ -115,7 +105,6 @@ describe('auth', async function() { }); it('permits underscores in token format', async function() { - this.timeout(2000); await runAuthScript( { HOME: { username: 'nyancat', token: 'ghp_0123456789ABCDEF' } }, ['{"github":"bnlhbmNhdDpnaHBfMDEyMzQ1Njc4OUFCQ0RFRg=="}'] diff --git a/test/unit/cache.test.js b/test/unit/cache.test.js index 4461b651..4b518206 100644 --- a/test/unit/cache.test.js +++ b/test/unit/cache.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import path from 'node:path'; import fs from 'node:fs'; import assert from 'node:assert'; diff --git a/test/unit/ci_failure_parser.test.js b/test/unit/ci_failure_parser.test.js index 7ad63233..3db73546 100644 --- a/test/unit/ci_failure_parser.test.js +++ b/test/unit/ci_failure_parser.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import CIFailureParser from '../../lib/ci/ci_failure_parser.js'; diff --git a/test/unit/ci_result_parser.test.js b/test/unit/ci_result_parser.test.js index 20489c51..2450bcc5 100644 --- a/test/unit/ci_result_parser.test.js +++ b/test/unit/ci_result_parser.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { fileURLToPath } from 'node:url'; import path from 'node:path'; diff --git a/test/unit/ci_start.test.js b/test/unit/ci_start.test.js index 65154f5a..4c8eea9f 100644 --- a/test/unit/ci_start.test.js +++ b/test/unit/ci_start.test.js @@ -1,3 +1,4 @@ +import { describe, it, before } from 'node:test'; import assert from 'assert'; import sinon from 'sinon'; diff --git a/test/unit/ci_type_parser.test.js b/test/unit/ci_type_parser.test.js index 50c28c53..89eaceb2 100644 --- a/test/unit/ci_type_parser.test.js +++ b/test/unit/ci_type_parser.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { diff --git a/test/unit/cli.test.js b/test/unit/cli.test.js index cdbb0cfe..fc13ec7d 100644 --- a/test/unit/cli.test.js +++ b/test/unit/cli.test.js @@ -1,3 +1,4 @@ +import { describe, it, beforeEach, afterEach } from 'node:test'; import assert from 'node:assert'; import CLI from '../../lib/cli.js'; @@ -40,6 +41,8 @@ describe('cli', () => { describe('spinners', () => { beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); cli.startSpinner('foo'); }); @@ -58,13 +61,23 @@ describe('cli', () => { }); describe('write', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should write in stream', () => { + const stream = new LogStream(); + const cli = new CLI(stream); cli.write('Getting commits...'); - assert.strictEqual(logResult(), 'Getting commits...'); + assert.strictEqual(strip(stream.toString()), 'Getting commits...'); }); }); describe('log', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should write in stream', () => { cli.log('Getting commits...'); assert.strictEqual(logResult(), 'Getting commits...\n'); @@ -72,6 +85,10 @@ describe('cli', () => { }); describe('table', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print the first element with bold style and padding', () => { cli.table('Title', 'description'); assert.strictEqual(logResult(), @@ -80,6 +97,10 @@ describe('cli', () => { }); describe('separator', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print a separator line with the specified text', () => { cli.separator('Separator'); assert.strictEqual( @@ -105,6 +126,10 @@ describe('cli', () => { }); describe('ok', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print a success message', () => { cli.ok('Perfect!'); assert.strictEqual(logResult(), ` ${success} Perfect!\n`); @@ -118,6 +143,10 @@ describe('cli', () => { }); describe('warn', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print a warning message', () => { cli.warn('Warning!'); assert.strictEqual(logResult(), ` ${warning} Warning!\n`); @@ -131,6 +160,10 @@ describe('cli', () => { }); describe('info', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print an info message', () => { cli.info('Info!'); assert.strictEqual(logResult(), ` ${info} Info!\n`); @@ -143,6 +176,10 @@ describe('cli', () => { }); describe('error', () => { + beforeEach(() => { + stream = new LogStream(); + cli = new CLI(stream); + }); it('should print an error message', () => { cli.error('Error!'); assert.strictEqual(logResult(), ` ${error} Error!\n`); @@ -183,6 +220,7 @@ describe('cli', () => { questionType: cli.QUESTION_TYPE.INPUT }); assert.strictEqual(cli.spinner.isSpinning, true); + cli.stopSpinner('foo'); }); }); diff --git a/test/unit/collaborators.test.js b/test/unit/collaborators.test.js index 754efe7f..89baff89 100644 --- a/test/unit/collaborators.test.js +++ b/test/unit/collaborators.test.js @@ -1,3 +1,4 @@ +import { describe, it, beforeEach } from 'node:test'; import { fileURLToPath } from 'node:url'; import assert from 'node:assert'; diff --git a/test/unit/comp.test.js b/test/unit/comp.test.js index cef5373c..5469560f 100644 --- a/test/unit/comp.test.js +++ b/test/unit/comp.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { ascending, descending } from '../../lib/utils.js'; diff --git a/test/unit/links.test.js b/test/unit/links.test.js index 71d582af..d3b064b6 100644 --- a/test/unit/links.test.js +++ b/test/unit/links.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { LinkParser, parsePRFromURL } from '../../lib/links.js'; diff --git a/test/unit/metadata_gen.test.js b/test/unit/metadata_gen.test.js index 790db37f..8eda702d 100644 --- a/test/unit/metadata_gen.test.js +++ b/test/unit/metadata_gen.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import MetadataGenerator from '../../lib/metadata_gen.js'; diff --git a/test/unit/pr_checker.test.js b/test/unit/pr_checker.test.js index 441200e5..b577a1aa 100644 --- a/test/unit/pr_checker.test.js +++ b/test/unit/pr_checker.test.js @@ -1,3 +1,4 @@ +import { describe, it, before, after, afterEach } from 'node:test'; import assert from 'node:assert'; import sinon from 'sinon'; diff --git a/test/unit/pr_data.test.js b/test/unit/pr_data.test.js index 638dffe5..f2468e0d 100644 --- a/test/unit/pr_data.test.js +++ b/test/unit/pr_data.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import sinon from 'sinon'; diff --git a/test/unit/pr_summary.test.js b/test/unit/pr_summary.test.js index 6d846f2e..cb1f760c 100644 --- a/test/unit/pr_summary.test.js +++ b/test/unit/pr_summary.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import PRSummary from '../../lib/pr_summary.js'; import { diff --git a/test/unit/prepare_release.test.js b/test/unit/prepare_release.test.js index 950c1aa7..318802f6 100644 --- a/test/unit/prepare_release.test.js +++ b/test/unit/prepare_release.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { readFileSync } from 'node:fs'; diff --git a/test/unit/reviews.test.js b/test/unit/reviews.test.js index f72c6686..1295a063 100644 --- a/test/unit/reviews.test.js +++ b/test/unit/reviews.test.js @@ -1,3 +1,4 @@ +import { describe, it } from 'node:test'; import assert from 'node:assert'; import { ReviewAnalyzer } from '../../lib/reviews.js'; diff --git a/test/unit/team_info.test.js b/test/unit/team_info.test.js index b9b34bf0..5ba5b1fe 100644 --- a/test/unit/team_info.test.js +++ b/test/unit/team_info.test.js @@ -1,3 +1,4 @@ +import { describe, it, before, after } from 'node:test'; import assert from 'node:assert'; import sinon from 'sinon';