From e5de4f101be35e06469c17f6a745e1900a3e6448 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 10 Jan 2023 05:19:28 +0800 Subject: [PATCH] workspace: use node:test to replace mocha --- .github/workflows/build.yml | 2 +- package.json | 6 ++---- packages/ui-default/jsconfig.json | 1 + packages/utils/lib/register.js | 6 ++++-- test/entry.js | 3 +++ test/main.ts | 29 ++++++++++++++++------------- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9344c0a4..672cb02a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Node uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn config get cacheFolder)" diff --git a/package.json b/package.json index 37f4b411..e02fcad0 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "build:ui:dev": "node packages/ui-default/build --gulp && node --trace-deprecation packages/ui-default/build --dev", "build:ui:production": "cross-env NODE_OPTIONS=--max_old_space_size=8192 node packages/ui-default/build --gulp && node packages/ui-default/build --production", "build:ui:production:webpack": "cross-env NODE_OPTIONS=--max_old_space_size=8192 node packages/ui-default/build --production", - "test": "mocha", - "benchmark": "cross-env BENCHMARK=true mocha", + "test": "node test/entry.js", + "benchmark": "cross-env BENCHMARK=true node test/entry.js", "lint": "eslint packages plugins --ext ts --fix", "lint:ci": "eslint packages plugins --ext ts", "lint:ui": "yarn workspace @hydrooj/ui-default lint --ext .js,.ts,.jsx,.tsx . --fix", @@ -30,7 +30,6 @@ "devDependencies": { "@types/autocannon": "^7.9.0", "@types/cross-spawn": "^6.0.2", - "@types/mocha": "^10.0.1", "@types/node": "^18.11.9", "@types/semver": "^7.3.13", "@types/supertest": "^2.0.12", @@ -60,7 +59,6 @@ "globby": "13.1.3", "latest-version": "7.0.0", "mini-css-extract-plugin": "^2.7.2", - "mocha": "^10.2.0", "monaco-editor-webpack-plugin": "^7.0.1", "mongodb": "^3.7.3", "mongodb-memory-server": "^8.10.2", diff --git a/packages/ui-default/jsconfig.json b/packages/ui-default/jsconfig.json index 785cd5bc..236c55a3 100644 --- a/packages/ui-default/jsconfig.json +++ b/packages/ui-default/jsconfig.json @@ -8,6 +8,7 @@ "allowSyntheticDefaultImports": true, "target": "ESNext", "baseUrl": ".", + "module": "ESNext", "lib": [ "ES2020" ], diff --git a/packages/utils/lib/register.js b/packages/utils/lib/register.js index 69101191..0aaaddc7 100644 --- a/packages/utils/lib/register.js +++ b/packages/utils/lib/register.js @@ -1,3 +1,4 @@ +/* eslint-disable logical-assignment-operators */ const map = {}; require('source-map-support').install({ handleUncaughtExceptions: false, @@ -17,7 +18,8 @@ const vm = require('vm'); const fs = require('fs-extra'); const esbuild = require('esbuild'); -process.env.NODE_APP_INSTANCE ||= '0'; +// Node14 doesn't support ||= syntax +process.env.NODE_APP_INSTANCE = process.env.NODE_APP_INSTANCE || '0'; const major = +process.version.split('.')[0].split('v')[1]; const minor = +process.version.split('.')[1]; @@ -86,4 +88,4 @@ if (argv.options.debug) { console.log('Debug mode enabled'); process.env.NODE_ENV = 'development'; process.env.DEV = 'on'; -} else process.env.NODE_ENV ||= 'production'; +} else process.env.NODE_ENV = process.env.NODE_ENV || 'production'; diff --git a/test/entry.js b/test/entry.js index fa586802..c0f08b19 100644 --- a/test/entry.js +++ b/test/entry.js @@ -1,3 +1,6 @@ process.env.CI = true; +const version = process.versions.node.split('.'); +version.pop(); +if (+version.join('.') < 18.8) throw new Error('Tests only available in NodeJS>=18.8'); require('hydrooj/bin/hydrooj'); require('./main'); diff --git a/test/main.ts b/test/main.ts index d529d66c..ecaa8766 100644 --- a/test/main.ts +++ b/test/main.ts @@ -1,6 +1,9 @@ import assert from 'assert'; +import { writeFileSync } from 'fs'; import autocannon from 'autocannon'; -import { writeFileSync } from 'fs-extra'; +import { + after, before, describe, it, +} from 'node:test'; import * as supertest from 'supertest'; const Root = { @@ -11,8 +14,7 @@ const Root = { describe('App', () => { let agent: supertest.SuperAgentTest; - before('init', function init(done) { - this.timeout(30000); + before((done) => { let timeout; const resolve = () => setTimeout(() => { clearTimeout(timeout); @@ -24,7 +26,7 @@ describe('App', () => { return send?.(data) || false; })(process.send); timeout = setTimeout(resolve, 20000); - }); + }, { timeout: 30000 }); const routes = ['/', '/api', '/p', '/contest', '/homework', '/user/1', '/training']; routes.forEach((route) => it(`GET ${route}`, () => agent.get(route).expect(200))); @@ -58,10 +60,9 @@ describe('App', () => { // TODO add more tests - const results: Record = {}; if (process.env.BENCHMARK) { - routes.forEach((route) => it(`Performance test ${route}`, async function test() { - this.timeout(60000); + const results: Record = {}; + routes.forEach((route) => it(`Performance test ${route}`, { timeout: 60000 }, async () => { await global.Hydro.model.system.set('limit.global', 99999); const result = await autocannon({ url: `http://localhost:8888${route}` }); assert(result.errors === 0, `test ${route} returns errors`); @@ -70,12 +71,14 @@ describe('App', () => { } after(() => { - const metrics = Object.entries(([k, v]) => ({ - name: `Benchmark - ${k} - Req/sec`, - unit: 'Req/sec', - value: v.requests.average, - })); - writeFileSync('./benchmark.json', JSON.stringify(metrics, null, 2)); + if (process.env.BENCHMARK) { + const metrics = Object.entries(([k, v]) => ({ + name: `Benchmark - ${k} - Req/sec`, + unit: 'Req/sec', + value: v.requests.average, + })); + writeFileSync('./benchmark.json', JSON.stringify(metrics, null, 2)); + } setTimeout(() => process.exit(0), 1000); }); });