mirror of
https://github.com/morris/vanilla-todo.git
synced 2025-08-20 12:51:43 +02:00
combine unit and e2e coverage, simplify test scripts
This commit is contained in:
13
README.md
13
README.md
@@ -570,12 +570,12 @@ just one dependency.
|
||||
|
||||
Reference:
|
||||
|
||||
- [addItem.test.mjs](./test/e2e/addItem.test.mjs)
|
||||
- [util.test.mjs](./test/unit/util.test.mjs)
|
||||
- [addItem.test.js](./test/e2e/addItem.test.js)
|
||||
- [util.test.js](./test/unit/util.test.js)
|
||||
|
||||
#### 4.3.1. Code Coverage
|
||||
|
||||
I was able to set up code coverage (at least for end-to-end tests) via
|
||||
I was able to set up code coverage for unit _and_ end-to-end tests via
|
||||
[Playwright's code coverage feature](https://playwright.dev/docs/api/class-coverage)
|
||||
and [c8](https://github.com/bcoe/c8). This introduced another dependency and was
|
||||
slightly more involved to get right, e.g. mapping localhost URLs to file URLs.
|
||||
@@ -589,7 +589,7 @@ Note that the implementation is specific to the project structure, e.g.
|
||||
Reference:
|
||||
|
||||
- [test-coverage.sh](./scripts/test-coverage.sh)
|
||||
- [coverage.mjs](./test/coverage.mjs)
|
||||
- [coverage.js](./test/coverage.js)
|
||||
|
||||
### 4.4. Pipeline
|
||||
|
||||
@@ -880,6 +880,11 @@ Thanks!
|
||||
|
||||
## 9. Changelog
|
||||
|
||||
### 01/2024
|
||||
|
||||
- Correctly combine [code coverage](#431-code-coverage) from end-to-end and unit
|
||||
tests
|
||||
|
||||
### 12/2023
|
||||
|
||||
- Added [debugging section](#45-debugging)
|
||||
|
52
package-lock.json
generated
52
package-lock.json
generated
@@ -10,7 +10,7 @@
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.33.0",
|
||||
"c8": "^8.0.1",
|
||||
"c8": "^9.1.0",
|
||||
"eslint": "^8.20.0",
|
||||
"eslint-plugin-compat": "^4.0.2",
|
||||
"mime": "^4.0.0",
|
||||
@@ -670,19 +670,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/c8": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/c8/-/c8-8.0.1.tgz",
|
||||
"integrity": "sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==",
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz",
|
||||
"integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@bcoe/v8-coverage": "^0.2.3",
|
||||
"@istanbuljs/schema": "^0.1.3",
|
||||
"find-up": "^5.0.0",
|
||||
"foreground-child": "^2.0.0",
|
||||
"foreground-child": "^3.1.1",
|
||||
"istanbul-lib-coverage": "^3.2.0",
|
||||
"istanbul-lib-report": "^3.0.1",
|
||||
"istanbul-reports": "^3.1.6",
|
||||
"rimraf": "^3.0.2",
|
||||
"test-exclude": "^6.0.0",
|
||||
"v8-to-istanbul": "^9.0.0",
|
||||
"yargs": "^17.7.2",
|
||||
@@ -692,7 +691,7 @@
|
||||
"c8": "bin/c8.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
"node": ">=14.14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/callsites": {
|
||||
@@ -1336,16 +1335,19 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/foreground-child": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
|
||||
"integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
|
||||
"integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"cross-spawn": "^7.0.0",
|
||||
"signal-exit": "^3.0.2"
|
||||
"signal-exit": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.0.0"
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
@@ -2615,10 +2617,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/signal-exit": {
|
||||
"version": "3.0.7",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
|
||||
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
|
||||
"dev": true
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/slash": {
|
||||
"version": "3.0.0",
|
||||
@@ -3142,18 +3150,6 @@
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/write-file-atomic/node_modules/signal-exit": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.16.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
|
||||
|
@@ -34,7 +34,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.33.0",
|
||||
"c8": "^8.0.1",
|
||||
"c8": "^9.1.0",
|
||||
"eslint": "^8.20.0",
|
||||
"eslint-plugin-compat": "^4.0.2",
|
||||
"mime": "^4.0.0",
|
||||
|
@@ -1,4 +1,3 @@
|
||||
set -e
|
||||
rm -rf coverage
|
||||
COVERAGE=true playwright test $1
|
||||
c8 report --src public --reporter text --reporter lcov
|
||||
c8 --src public --reporter text --reporter lcov playwright test $1
|
||||
|
@@ -5,7 +5,7 @@ import { test } from 'playwright/test';
|
||||
|
||||
// See also https://playwright.dev/docs/api/class-coverage
|
||||
|
||||
if (process.env.COVERAGE) {
|
||||
if (process.env.NODE_V8_COVERAGE) {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.coverage.startJSCoverage();
|
||||
});
|
||||
@@ -20,9 +20,9 @@ if (process.env.COVERAGE) {
|
||||
})),
|
||||
};
|
||||
|
||||
await fs.mkdir('coverage/tmp', { recursive: true });
|
||||
await fs.mkdir(process.env.NODE_V8_COVERAGE, { recursive: true });
|
||||
await fs.writeFile(
|
||||
`coverage/tmp/coverage-${randomUUID()}.json`,
|
||||
path.join(process.env.NODE_V8_COVERAGE, `coverage-${randomUUID()}.json`),
|
||||
JSON.stringify(output),
|
||||
);
|
||||
});
|
||||
|
@@ -139,3 +139,46 @@ test('TodoLogic.moveTodoItem', () => {
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
test('TodoLogic.checkTodoItem', () => {
|
||||
let data = TodoLogic.initTodoData(new Date(0));
|
||||
|
||||
data = {
|
||||
...data,
|
||||
items: [
|
||||
{
|
||||
id: 'a',
|
||||
listId: '1970-01-01',
|
||||
label: 'foo',
|
||||
index: 0,
|
||||
done: false,
|
||||
},
|
||||
{
|
||||
id: 'b',
|
||||
listId: '1970-01-01',
|
||||
label: 'bar',
|
||||
index: 1,
|
||||
done: false,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
data = TodoLogic.checkTodoItem(data, { id: 'a', done: true });
|
||||
|
||||
expect(data.items).toEqual([
|
||||
{
|
||||
id: 'a',
|
||||
listId: '1970-01-01',
|
||||
label: 'foo',
|
||||
index: 0,
|
||||
done: true,
|
||||
},
|
||||
{
|
||||
id: 'b',
|
||||
listId: '1970-01-01',
|
||||
label: 'bar',
|
||||
index: 1,
|
||||
done: false,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
Reference in New Issue
Block a user