Skip to content

Commit 4bb422c

Browse files
committed
rule prevent-errortype
1 parent 0ded4b5 commit 4bb422c

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

docs/rules/prevent-errortype.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Prevent specifying error type in `t.notThrows()`
2+
3+
AVA will fail if error type is specified with `t.notThrows()`.
4+
5+
6+
## Fail
7+
8+
```js
9+
const test = require('ava');
10+
11+
test('some test', t => {
12+
t.notThrows(() => {
13+
t.pass();
14+
}, TypeError);
15+
});
16+
```
17+
18+
19+
## Pass
20+
21+
```js
22+
const test = require('ava');
23+
24+
test('some test', t => {
25+
t.notThrows(() => {
26+
t.pass();
27+
});
28+
});
29+
30+
test('some test', t => {
31+
t.throws(() => {
32+
t.pass();
33+
}, TypeError);
34+
});
35+
```

rules/prevent-errortype.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
const {visitIf} = require('enhance-visitors');
3+
const util = require('../util');
4+
const createAvaRule = require('../create-ava-rule');
5+
6+
const nameRegexp = /^(?:[A-Z][a-z0-9]*)*Error$/;
7+
8+
const create = context => {
9+
const ava = createAvaRule();
10+
11+
return ava.merge({
12+
CallExpression: visitIf([
13+
ava.isInTestFile,
14+
ava.isInTestNode
15+
])(node => {
16+
const functionArgIndex = node.arguments.length - 1;
17+
let functionArgName;
18+
19+
if (typeof node.callee.property === 'undefined') {
20+
return;
21+
}
22+
23+
const calleeProperty = node.callee.property.name;
24+
25+
if (functionArgIndex === 1) {
26+
functionArgName = node.arguments[1].name;
27+
} else {
28+
return;
29+
}
30+
31+
if (calleeProperty === 'notThrows') {
32+
if (nameRegexp.test(functionArgName)) {
33+
context.report({
34+
node,
35+
message: 'Do not specify Error in t.notThrows()'
36+
});
37+
}
38+
}
39+
})
40+
});
41+
};
42+
43+
module.exports = {
44+
create,
45+
meta: {
46+
docs: {
47+
url: util.getDocsUrl(__filename)
48+
}
49+
}
50+
};

test/prevent-errortype.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import test from 'ava';
2+
import avaRuleTester from 'eslint-ava-rule-tester';
3+
import rule from '../rules/prevent-errortype';
4+
5+
const ruleTester = avaRuleTester(test, {
6+
env: {
7+
es6: true
8+
}
9+
});
10+
11+
const errors = [{ruleId: 'prevent-errortype'}];
12+
13+
const header = 'const test = require(\'ava\');\n';
14+
15+
ruleTester.run('prevent-errortype', rule, {
16+
valid: [
17+
header + 'test(\'some test\',t => {t.notThrows(() => {t.pass();});});',
18+
header + 'test(t => {t.notThrows(() => {t.pass();});});',
19+
header + 'test(t => {t.throws(() => {t.pass();}, TypeError);});',
20+
header + 'test(t => {t.end(); });'
21+
],
22+
invalid: [
23+
{
24+
code: header + 'test(t => {t.notThrows(() => {t.pass();}, TypeError);});',
25+
errors
26+
},
27+
{
28+
code: header + 'test(\'some test\',t => {t.notThrows(() => {t.pass();}, TypeError);});',
29+
errors
30+
}
31+
]
32+
});

0 commit comments

Comments
 (0)