Skip to content

Commit a547b54

Browse files
committed
Add no-ignored-test-files rule (fixes #51)
1 parent 19c4582 commit a547b54

File tree

5 files changed

+153
-0
lines changed

5 files changed

+153
-0
lines changed

docs/rules/no-ignored-test-files.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Ensure no tests are written in ignored files
2+
3+
When searching for tests, AVA ignores files contained in folders named `fixtures` or `helpers`.
4+
5+
6+
## Fail
7+
8+
```js
9+
// File: test/foo/fixtures/bar.js
10+
import test from 'ava';
11+
12+
test('foo', t => {
13+
t.pass();
14+
});
15+
16+
// File: test/foo/helpers/bar.js
17+
import test from 'ava';
18+
19+
test('foo', t => {
20+
t.pass();
21+
});
22+
```
23+
24+
25+
## Pass
26+
27+
```js
28+
// File: test/foo/not-fixtures/bar.js
29+
import test from 'ava';
30+
31+
test('foo', t => {
32+
t.pass();
33+
});
34+
35+
// File: test/foo/not-helpers/bar.js
36+
import test from 'ava';
37+
38+
test('foo', t => {
39+
t.pass();
40+
});
41+
```

index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module.exports = {
55
'max-asserts': require('./rules/max-asserts'),
66
'no-cb-test': require('./rules/no-cb-test'),
77
'no-identical-title': require('./rules/no-identical-title'),
8+
'no-ignored-test-files': require('./rules/no-ignored-test-files'),
89
'no-invalid-end': require('./rules/no-invalid-end'),
910
'no-only-test': require('./rules/no-only-test'),
1011
'no-skip-assert': require('./rules/no-skip-assert'),
@@ -31,6 +32,7 @@ module.exports = {
3132
'ava/max-asserts': [0, 5],
3233
'ava/no-cb-test': 0,
3334
'ava/no-identical-title': 2,
35+
'ava/no-ignored-test-files': 2,
3436
'ava/no-invalid-end': 2,
3537
'ava/no-only-test': 2,
3638
'ava/no-skip-assert': 2,

readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Configure it in `package.json`.
3232
"ava/max-asserts": [2, 5],
3333
"ava/no-cb-test": 0,
3434
"ava/no-identical-title": 2,
35+
"ava/no-ignored-test-files": 2,
3536
"ava/no-invalid-end": 2,
3637
"ava/no-only-test": 2,
3738
"ava/no-skip-assert": 2,
@@ -57,6 +58,7 @@ The rules will only activate in test files.
5758
- [max-asserts](docs/rules/max-asserts.md) - Limit the number of assertions in a test.
5859
- [no-cb-test](docs/rules/no-cb-test.md) - Ensure no `test.cb()` is used.
5960
- [no-identical-title](docs/rules/no-identical-title.md) - Ensure no tests have the same title.
61+
- [no-ignored-test-files](docs/rules/no-ignored-test-files.md) - Ensure no tests are written in ignored files.
6062
- [no-invalid-end](docs/rules/no-invalid-end.md) - Ensure `t.end()` is only called inside `test.cb()`.
6163
- [no-only-test](docs/rules/no-only-test.md) - Ensure no `test.only()` are present.
6264
- [no-skip-assert](docs/rules/no-skip-assert.md) - Ensure no assertions are skipped.

rules/no-ignored-test-files.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
var path = require('path');
3+
var createAvaRule = require('../create-ava-rule');
4+
5+
function isInIgnoredFolder(folders) {
6+
if (folders.indexOf('fixtures') !== -1) {
7+
return 'fixtures';
8+
}
9+
10+
if (folders.indexOf('helpers') !== -1) {
11+
return 'helpers';
12+
}
13+
14+
return null;
15+
}
16+
17+
function isIgnored(filename) {
18+
var folders = filename.split(path.sep);
19+
var ignoredFolder = isInIgnoredFolder(folders);
20+
if (!ignoredFolder) {
21+
return null;
22+
}
23+
24+
return 'Test file is ignored because it is inside a `' + ignoredFolder + '` folder';
25+
}
26+
27+
/* eslint quote-props: [2, "as-needed"] */
28+
module.exports = function (context) {
29+
var ava = createAvaRule();
30+
var hasTestCall = false;
31+
32+
return ava.merge({
33+
CallExpression: function (node) {
34+
if (ava.isTestFile && ava.currentTestNode === node) {
35+
hasTestCall = true;
36+
}
37+
},
38+
'Program:exit': function (node) {
39+
if (!hasTestCall) {
40+
return;
41+
}
42+
43+
var ignoredReason = isIgnored(context.getFilename());
44+
if (ignoredReason) {
45+
context.report(node, ignoredReason);
46+
}
47+
hasTestCall = false;
48+
}
49+
});
50+
};

test/no-ignored-test-files.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import test from 'ava';
2+
import {RuleTester} from 'eslint';
3+
import rule from '../rules/no-ignored-test-files';
4+
5+
const ruleTester = new RuleTester({
6+
env: {
7+
es6: true
8+
}
9+
});
10+
11+
const header = `const test = require('ava');\n`;
12+
13+
test(() => {
14+
ruleTester.run('no-ignored-test-files', rule, {
15+
valid: [
16+
{
17+
code: header + 'test(t => { t.pass(); });',
18+
filename: '/foo/bar/baz.js'
19+
},
20+
{
21+
code: header + 'test(t => { t.pass(); });',
22+
filename: '/foo/not-fixtures/bar.js'
23+
},
24+
{
25+
code: header + 'test(t => { t.pass(); });',
26+
filename: '/foo/not-helpers/bar.js'
27+
},
28+
{
29+
code: header + 'foo(t => { t.pass(); });',
30+
filename: '/foo/bar/fixtures/baz.js'
31+
},
32+
{
33+
code: header + 'foo(t => { t.pass(); });',
34+
filename: '/foo/bar/helpers/baz.js'
35+
},
36+
{
37+
code: 'test(t => { t.pass(); });',
38+
filename: '/foo/bar/fixtures/baz.js'
39+
},
40+
{
41+
code: 'test(t => { t.pass(); });',
42+
filename: '/foo/bar/helpers/baz.js'
43+
}
44+
],
45+
invalid: [
46+
{
47+
code: header + 'test(t => { t.pass(); });',
48+
filename: '/foo/bar/fixtures/baz.js',
49+
errors: [{message: 'Test file is ignored because it is inside a `fixtures` folder'}]
50+
},
51+
{
52+
code: header + 'test(t => { t.pass(); });',
53+
filename: '/foo/bar/helpers/baz.js',
54+
errors: [{message: 'Test file is ignored because it is inside a `helpers` folder'}]
55+
}
56+
]
57+
});
58+
});

0 commit comments

Comments
 (0)