mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-08-28 09:11:06 +00:00
feat(CI): modular testing and linting system + cursor rule
This commit is contained in:
@@ -33,14 +33,8 @@ outputs:
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Use Node.js 22.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22.x
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: npm install --legacy-peer-deps
|
||||
- name: Setup Node and dependencies
|
||||
uses: ./.github/actions/setup-node-deps
|
||||
|
||||
- name: Read version
|
||||
id: version
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
name: Run lint
|
||||
description: Run ESLint on src.
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Lint
|
||||
shell: bash
|
||||
run: npm run lint
|
||||
env:
|
||||
ESLINT_USE_FLAT_CONFIG: "false"
|
||||
@@ -0,0 +1,9 @@
|
||||
name: Run smoke tests
|
||||
description: Verify built extension dist output.
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Smoke tests
|
||||
shell: bash
|
||||
run: npm run test:smoke
|
||||
@@ -0,0 +1,9 @@
|
||||
name: Run unit tests
|
||||
description: Run Jest unit tests.
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Unit tests
|
||||
shell: bash
|
||||
run: npm run test:unit
|
||||
@@ -0,0 +1,14 @@
|
||||
name: Setup Node and dependencies
|
||||
description: Install Node.js 22.x and npm dependencies.
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Use Node.js 22.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22.x
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: npm install --legacy-peer-deps
|
||||
@@ -1,36 +0,0 @@
|
||||
name: NodeJS Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
npm run build
|
||||
|
||||
- name: Zip dist folder
|
||||
run: |
|
||||
zip -r dist.zip dist
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dist-zip
|
||||
path: dist.zip
|
||||
+31
-16
@@ -1,11 +1,13 @@
|
||||
name: PR CI
|
||||
name: CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["main"]
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
lint:
|
||||
# windows-latest: Vite/Svelte build fails on Linux CI for layerchart vendor .svelte (see nightly.yml).
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
@@ -14,21 +16,34 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js 22.x
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22.x
|
||||
- name: Setup Node and dependencies
|
||||
uses: ./.github/actions/setup-node-deps
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --legacy-peer-deps
|
||||
- name: Run lint
|
||||
uses: ./.github/actions/run-lint
|
||||
|
||||
- name: Lint
|
||||
run: npm run lint
|
||||
env:
|
||||
ESLINT_USE_FLAT_CONFIG: "false"
|
||||
unit-tests:
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Unit tests
|
||||
run: npm test
|
||||
- name: Setup Node and dependencies
|
||||
uses: ./.github/actions/setup-node-deps
|
||||
|
||||
- name: Run unit tests
|
||||
uses: ./.github/actions/run-unit-tests
|
||||
|
||||
build-and-smoke:
|
||||
needs: [lint, unit-tests]
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Build extension
|
||||
id: build
|
||||
@@ -44,5 +59,5 @@ jobs:
|
||||
${{ steps.build.outputs.chrome_zip }}
|
||||
${{ steps.build.outputs.firefox_zip }}
|
||||
|
||||
- name: Smoke tests
|
||||
run: npm run test:smoke
|
||||
- name: Run smoke tests
|
||||
uses: ./.github/actions/run-smoke-tests
|
||||
|
||||
@@ -17,6 +17,7 @@ export default {
|
||||
'^@/(.*)$': '<rootDir>/src/$1',
|
||||
'^webextension-polyfill$': '<rootDir>/src/test/mocks/webextension-polyfill.ts',
|
||||
},
|
||||
setupFilesAfterEnv: ['<rootDir>/src/test/jest.setup.ts'],
|
||||
moduleFileExtensions: ['ts', 'js', 'json'],
|
||||
collectCoverageFrom: [
|
||||
'src/**/*.ts',
|
||||
|
||||
+4
-1
@@ -19,8 +19,10 @@
|
||||
"convert:safari": "xcrun safari-web-extension-converter dist/safari --project-location . --app-name $npm_package_name-safari",
|
||||
"dependency-graph": "depcruise src --include-only \"^src\" --output-type dot | dot -T svg > dependency-graph.svg",
|
||||
"lint": "cross-env ESLINT_USE_FLAT_CONFIG=false eslint \"src/**/*.{js,ts}\"",
|
||||
"test": "jest",
|
||||
"test": "npm run test:unit",
|
||||
"test:unit": "jest",
|
||||
"test:smoke": "node scripts/smoke-test.mjs",
|
||||
"test:ci": "npm run test:unit && npm run build && npm run test:smoke",
|
||||
"release": "gh release create $npm_package_version --repo BetterSEQTA/BetterSEQTA-Plus ./dist/*.zip --generate-notes",
|
||||
"publish": "bun lib/publish.js --b",
|
||||
"zip": "bedframe zip"
|
||||
@@ -58,6 +60,7 @@
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"glob": "^11.0.1",
|
||||
"jest": "^30.4.2",
|
||||
"jest-environment-jsdom": "^30.4.1",
|
||||
"mime-types": "^3.0.1",
|
||||
"prettier": "^3.5.3",
|
||||
"process": "^0.11.10",
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* @jest-environment jsdom
|
||||
*/
|
||||
import { runGlobalSearchSelfTests } from "./selfTests";
|
||||
|
||||
describe("globalSearch selfTests", () => {
|
||||
it("all in-process cases pass", async () => {
|
||||
const report = await runGlobalSearchSelfTests();
|
||||
expect(report.failed).toBe(0);
|
||||
expect(report.failures).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -22,12 +22,10 @@ import {
|
||||
/**
|
||||
* Lightweight in-process self-tests for the global-search overhaul.
|
||||
*
|
||||
* The repository does not (yet) ship with a test runner, so we instead
|
||||
* expose a deterministic suite of assertions over the pure helpers that
|
||||
* back active jobs and the passive observer. This is intentionally
|
||||
* dependency-free so it can run inside the extension page (`window.
|
||||
* globalSearchDebug.runSelfTests()`) and from any future Vitest harness
|
||||
* without modification.
|
||||
* Exposes a deterministic suite of assertions over the pure helpers that
|
||||
* back active jobs and the passive observer. Runs in Jest via
|
||||
* `selfTests.test.ts`, and inside the extension page via
|
||||
* `window.globalSearchDebug.runSelfTests()`.
|
||||
*/
|
||||
|
||||
interface TestCase {
|
||||
|
||||
@@ -141,7 +141,7 @@ export function htmlToPlainText(rawHtml: string): string {
|
||||
}
|
||||
});
|
||||
|
||||
let text = body.innerText || "";
|
||||
let text = body.textContent || body.innerText || "";
|
||||
|
||||
text = text
|
||||
.replace(/\u00A0/g, " ")
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import { __resetBrowserStorageMock } from "./mocks/webextension-polyfill";
|
||||
|
||||
afterEach(() => {
|
||||
__resetBrowserStorageMock();
|
||||
});
|
||||
@@ -23,8 +23,16 @@ const local = {
|
||||
}),
|
||||
};
|
||||
|
||||
const onChanged = {
|
||||
addListener: jest.fn(),
|
||||
removeListener: jest.fn(),
|
||||
};
|
||||
|
||||
export default {
|
||||
storage: { local },
|
||||
storage: { local, onChanged },
|
||||
runtime: {
|
||||
sendMessage: jest.fn(async () => undefined),
|
||||
},
|
||||
};
|
||||
|
||||
export function __resetBrowserStorageMock() {
|
||||
@@ -32,4 +40,6 @@ export function __resetBrowserStorageMock() {
|
||||
local.get.mockClear();
|
||||
local.set.mockClear();
|
||||
local.remove.mockClear();
|
||||
onChanged.addListener.mockClear();
|
||||
onChanged.removeListener.mockClear();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user