Skip to content

Commit e44f080

Browse files
authored
feat(test): validate commands and generators (#317)
* feat(test): validate commands * add generator validation * increase to 60%
1 parent b3e2fbd commit e44f080

File tree

3 files changed

+75
-3
lines changed

3 files changed

+75
-3
lines changed

bin/commands/__tests__/index.test.mjs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import assert from 'node:assert/strict';
2+
import { describe, it } from 'node:test';
3+
4+
import { Option } from 'commander';
5+
6+
import commands from '../index.mjs';
7+
8+
describe('Commands', () => {
9+
it('should have unique command names', () => {
10+
const names = new Set();
11+
12+
commands.forEach(({ name }) => {
13+
assert.equal(names.has(name), false, `Duplicate command name: "${name}"`);
14+
names.add(name);
15+
});
16+
});
17+
18+
it('should use correct option names', () => {
19+
commands.forEach(({ name: cmdName, options }) => {
20+
Object.entries(options).forEach(([optName, { flags }]) => {
21+
const expectedName = new Option(flags.at(-1)).attributeName();
22+
assert.equal(
23+
optName,
24+
expectedName,
25+
`In "${cmdName}" command: option "${flags}" should be named "${expectedName}", not "${optName}"`
26+
);
27+
});
28+
});
29+
});
30+
});

codecov.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ coverage:
99
target: 80%
1010
project:
1111
default:
12-
# TODO(@avivkeller): Once our coverage > 50%,
13-
# increase this to 50%, and increase on increments
14-
target: 40%
12+
# TODO(@avivkeller): Once our coverage > 70%,
13+
# increase this to 70%, and increase on increments
14+
target: 60%
1515

1616
ignore:
1717
- 'eslint.config.mjs'
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import assert from 'node:assert/strict';
2+
import { describe, it } from 'node:test';
3+
4+
import semver from 'semver';
5+
6+
import { allGenerators } from '../index.mjs';
7+
8+
const validDependencies = [...Object.keys(allGenerators), 'ast'];
9+
const generatorEntries = Object.entries(allGenerators);
10+
11+
describe('All Generators', () => {
12+
it('should have keys matching their name property', () => {
13+
generatorEntries.forEach(([key, generator]) => {
14+
assert.equal(
15+
key,
16+
generator.name,
17+
`Generator key "${key}" does not match its name property "${generator.name}"`
18+
);
19+
});
20+
});
21+
22+
it('should have valid semver versions', () => {
23+
generatorEntries.forEach(([key, generator]) => {
24+
const isValid = semver.valid(generator.version);
25+
assert.ok(
26+
isValid,
27+
`Generator "${key}" has invalid semver version: "${generator.version}"`
28+
);
29+
});
30+
});
31+
32+
it('should have valid dependsOn references', () => {
33+
generatorEntries.forEach(([key, generator]) => {
34+
if (generator.dependsOn) {
35+
assert.ok(
36+
validDependencies.includes(generator.dependsOn),
37+
`Generator "${key}" depends on "${generator.dependsOn}" which is not a valid generator or 'ast'`
38+
);
39+
}
40+
});
41+
});
42+
});

0 commit comments

Comments
 (0)