Skip to content

Commit 215bae8

Browse files
committed
avajs#242 - added general tests
1 parent 87aeb8e commit 215bae8

27 files changed

+128
-29
lines changed

readme.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ Configure it in `package.json`.
6262
"error",
6363
"if-multiple"
6464
],
65-
"ava/use-t-well": "error",
6665
"ava/use-t": "error",
66+
"ava/use-t-well": "error",
6767
"ava/use-test": "error",
6868
"ava/use-true-false": "error"
6969
}
@@ -97,8 +97,8 @@ The rules will only activate in test files.
9797
- [prefer-power-assert](docs/rules/prefer-power-assert.md) - Allow only use of the asserts that have no [power-assert](https://github.com/power-assert-js/power-assert) alternative.
9898
- [test-ended](docs/rules/test-ended.md) - Ensure callback tests are explicitly ended.
9999
- [test-title](docs/rules/test-title.md) - Ensure tests have a title.
100-
- [use-t-well](docs/rules/use-t-well.md) - Prevent the incorrect use of `t`.
101100
- [use-t](docs/rules/use-t.md) - Ensure test functions use `t` as their parameter.
101+
- [use-t-well](docs/rules/use-t-well.md) - Prevent the incorrect use of `t`.
102102
- [use-test](docs/rules/use-test.md) - Ensure that AVA is imported with `test` as the variable name.
103103
- [use-true-false](docs/rules/use-true-false.md) - Ensure that `t.true()`/`t.false()` are used instead of `t.truthy()`/`t.falsy()`.
104104

rules/assertion-arguments.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ module.exports = {
152152
docs: {
153153
url: util.getDocsUrl(__filename)
154154
},
155+
type: 'problem',
155156
schema
156157
}
157158
};

rules/max-asserts.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ module.exports = {
6565
docs: {
6666
url: util.getDocsUrl(__filename)
6767
},
68+
type: 'problem',
6869
schema
6970
}
7071
};

rules/no-async-fn-without-await.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ module.exports = {
5454
meta: {
5555
docs: {
5656
url: util.getDocsUrl(__filename)
57-
}
57+
},
58+
type: 'problem'
5859
}
5960
};

rules/no-cb-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = {
2626
meta: {
2727
docs: {
2828
url: util.getDocsUrl(__filename)
29-
}
29+
},
30+
type: 'problem'
3031
}
3132
};

rules/no-duplicate-modifiers.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ module.exports = {
4848
meta: {
4949
docs: {
5050
url: util.getDocsUrl(__filename)
51-
}
51+
},
52+
type: 'problem'
5253
}
5354
};

rules/no-identical-title.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ module.exports = {
6464
meta: {
6565
docs: {
6666
url: util.getDocsUrl(__filename)
67-
}
67+
},
68+
type: 'problem'
6869
}
6970
};

rules/no-ignored-test-files.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ module.exports = {
9494
docs: {
9595
url: util.getDocsUrl(__filename)
9696
},
97+
type: 'problem',
9798
schema
9899
}
99100
};

rules/no-import-test-files.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ module.exports = {
9292
docs: {
9393
url: util.getDocsUrl(__filename)
9494
},
95+
type: 'problem',
9596
schema
9697
}
9798
};

rules/no-invalid-end.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ module.exports = {
3030
meta: {
3131
docs: {
3232
url: util.getDocsUrl(__filename)
33-
}
33+
},
34+
type: 'problem'
3435
}
3536
};

rules/no-nested-tests.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module.exports = {
3535
meta: {
3636
docs: {
3737
url: util.getDocsUrl(__filename)
38-
}
38+
},
39+
type: 'problem'
3940
}
4041
};

rules/no-only-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module.exports = {
3535
docs: {
3636
url: util.getDocsUrl(__filename)
3737
},
38+
type: 'problem',
3839
fixable: 'code'
3940
}
4041
};

rules/no-skip-assert.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module.exports = {
2929
meta: {
3030
docs: {
3131
url: util.getDocsUrl(__filename)
32-
}
32+
},
33+
type: 'problem'
3334
}
3435
};

rules/no-skip-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module.exports = {
3535
docs: {
3636
url: util.getDocsUrl(__filename)
3737
},
38+
type: 'problem',
3839
fixable: 'code'
3940
}
4041
};

rules/no-statement-after-end.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ module.exports = {
9595
meta: {
9696
docs: {
9797
url: util.getDocsUrl(__filename)
98-
}
98+
},
99+
type: 'problem'
99100
}
100101
};

rules/no-todo-implementation.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = {
2626
meta: {
2727
docs: {
2828
url: util.getDocsUrl(__filename)
29-
}
29+
},
30+
type: 'problem'
3031
}
3132
};

rules/no-todo-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = {
2626
meta: {
2727
docs: {
2828
url: util.getDocsUrl(__filename)
29-
}
29+
},
30+
type: 'problem'
3031
}
3132
};

rules/no-unknown-modifiers.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ module.exports = {
4545
meta: {
4646
docs: {
4747
url: util.getDocsUrl(__filename)
48-
}
48+
},
49+
type: 'problem'
4950
}
5051
};

rules/prefer-async-await.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ module.exports = {
5353
meta: {
5454
docs: {
5555
url: util.getDocsUrl(__filename)
56-
}
56+
},
57+
type: 'suggestion'
5758
}
5859
};

rules/prefer-power-assert.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ module.exports = {
8484
meta: {
8585
docs: {
8686
url: util.getDocsUrl(__filename)
87-
}
87+
},
88+
type: 'suggestion'
8889
}
8990
};

rules/test-ended.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ module.exports = {
5757
meta: {
5858
docs: {
5959
url: util.getDocsUrl(__filename)
60-
}
60+
},
61+
type: 'problem'
6162
}
6263
};

rules/test-title.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ module.exports = {
4646
docs: {
4747
url: util.getDocsUrl(__filename)
4848
},
49+
type: 'problem',
4950
schema
5051
}
5152
};

rules/use-t-well.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ module.exports = {
120120
meta: {
121121
docs: {
122122
url: util.getDocsUrl(__filename)
123-
}
123+
},
124+
type: 'problem'
124125
}
125126
};

rules/use-t.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module.exports = {
4242
meta: {
4343
docs: {
4444
url: util.getDocsUrl(__filename)
45-
}
45+
},
46+
type: 'problem'
4647
}
4748
};

rules/use-test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module.exports = {
4242
meta: {
4343
docs: {
4444
url: util.getDocsUrl(__filename)
45-
}
45+
},
46+
type: 'problem'
4647
}
4748
};

rules/use-true-false.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ module.exports = {
8989
meta: {
9090
docs: {
9191
url: util.getDocsUrl(__filename)
92-
}
92+
},
93+
type: 'problem'
9394
}
9495
};

test/package.js

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,94 @@ import test from 'ava';
44
import pify from 'pify';
55
import index from '..';
66

7-
test('Every rule is defined in index file', async t => {
8-
const ruleDir = path.resolve(__dirname, '../rules');
9-
const files = await pify(fs.readdir)(ruleDir);
7+
let ruleFiles;
108

11-
const rules = files.filter(file =>
12-
file.indexOf('.js') === file.length - 3 &&
13-
!fs.readFileSync(path.join(ruleDir, file), 'utf8').includes('deprecated: true'));
9+
test.before(async () => {
10+
const files = await pify(fs.readdir)('rules');
11+
ruleFiles = files.filter(file => path.extname(file) === '.js');
12+
});
13+
14+
const testSorted = (t, actualOrder, sourceName) => {
15+
const sortedOrder = actualOrder.slice(0).sort();
16+
17+
for (const [wantedIndex, name] of sortedOrder.entries()) {
18+
const actualIndex = actualOrder.indexOf(name);
19+
const whereMessage = (wantedIndex === 0) ? '' : `, after '${sortedOrder[wantedIndex - 1]}'`;
20+
t.is(actualIndex, wantedIndex, `${sourceName} should be alphabetically sorted, '${name}' should be placed at index ${wantedIndex}${whereMessage}`);
21+
}
22+
};
23+
24+
test('Every rule is defined in index file in alphabetical order', t => {
25+
for (const file of ruleFiles) {
26+
const name = path.basename(file, '.js');
27+
28+
// Ignoring tests for no-ignored-test-files
29+
if (name === 'no-ignored-test-files') {
30+
return;
31+
}
1432

15-
for (const file of rules) {
16-
const name = file.slice(0, -3);
1733
t.truthy(index.rules[name], `'${name}' is not exported in 'index.js'`);
1834
t.truthy(index.configs.recommended.rules[`ava/${name}`], `'${name}' is not set in the recommended config`);
35+
t.truthy(fs.existsSync(path.join('docs/rules', `${name}.md`)), `There is no documentation for '${name}'`);
36+
t.truthy(fs.existsSync(path.join('test', file)), `There are no tests for '${name}'`);
1937
}
2038

21-
t.is(Object.keys(index.configs.recommended.rules).length, rules.length,
39+
t.is(Object.keys(index.rules).length, ruleFiles.length,
40+
'There are more exported rules than rule files.');
41+
t.is(Object.keys(index.configs.recommended.rules).length, ruleFiles.length,
2242
'There are more exported rules in the recommended config than rule files.');
43+
44+
testSorted(t, Object.keys(index.configs.recommended.rules), 'configs.recommended.rules');
45+
});
46+
47+
test('Every rule is defined in readme.md usage and list of rules in alphabetical order', async t => {
48+
const readme = await pify(fs.readFile)('readme.md', 'utf8');
49+
let usageRules;
50+
try {
51+
const usageRulesMatch = /## Usage.*?"rules": (\{.*?\})/ms.exec(readme);
52+
t.truthy(usageRulesMatch, 'List of rules should be defined in readme.md ## Usage');
53+
usageRules = JSON.parse(usageRulesMatch[1]);
54+
} catch (_) {}
55+
56+
t.truthy(usageRules, 'List of rules should be defined in readme.md ## Usage and be valid JSON');
57+
58+
const rulesMatch = /## Rules(.*?)## Recommended config/ms.exec(readme);
59+
t.truthy(rulesMatch, 'List of rules should be defined in readme.md in ## Rules before ## Recommended config');
60+
const rulesText = rulesMatch[1];
61+
const re = /- \[(.*?)\]\((.*?)\) - (.*)\n/gm;
62+
const rules = [];
63+
let match;
64+
do {
65+
match = re.exec(rulesText);
66+
if (match) {
67+
t.is(match[2], `docs/rules/${match[1]}.md`, `${match[1]} link to docs should be correct`);
68+
t.true(match[3].trim().length > 0, `${match[1]} should have description in readme.md ## Rules`);
69+
rules.push(match[1]);
70+
}
71+
} while (match);
72+
73+
for (const file of ruleFiles) {
74+
const name = path.basename(file, '.js');
75+
t.truthy(usageRules[`ava/${name}`], `'${name}' is not described in the readme.md ## Usage`);
76+
t.truthy(rules.includes(name), `'${name}' is not described in the readme.md ## Rules`);
77+
}
78+
79+
t.is(Object.keys(usageRules).length, ruleFiles.length, 'There are more rules in readme.md ## Usage than rule files.');
80+
t.is(Object.keys(rules).length, ruleFiles.length, 'There are more rules in readme.md ## Rules than rule files.');
81+
82+
testSorted(t, Object.keys(usageRules), 'readme.md ## Usage rules');
83+
testSorted(t, rules, 'readme.md ## Rules');
84+
});
85+
86+
test('Every rule has valid meta.type', t => {
87+
const validTypes = ['problem', 'suggestion', 'layout'];
88+
89+
for (const file of ruleFiles) {
90+
const name = path.basename(file, '.js');
91+
const rule = index.rules[name];
92+
93+
t.true(rule.meta !== null && rule.meta !== undefined, `${name} has no meta`);
94+
t.is(typeof rule.meta.type, 'string', `${name} meta.type is not string`);
95+
t.true(validTypes.includes(rule.meta.type), `${name} meta.type is not one of [${validTypes.join(', ')}]`);
96+
}
2397
});

0 commit comments

Comments
 (0)