Skip to content

Commit

Permalink
Fix no-async-fn-without-await when used with default parser (fixes #147)
Browse files Browse the repository at this point in the history
  • Loading branch information
jfmengels committed Oct 12, 2016
1 parent 27284f6 commit 4f0f366
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 47 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -75,7 +75,7 @@
"ava": "*",
"babel-eslint": "^6.1.2",
"coveralls": "^2.11.9",
"eslint": "^3.0.1",
"eslint": "^3.7.1",
"eslint-ava-rule-tester": "^2.0.0",
"js-combinatorics": "^0.5.0",
"nyc": "^7.1.0",
Expand Down
13 changes: 8 additions & 5 deletions rules/no-async-fn-without-await.js
Expand Up @@ -7,6 +7,12 @@ const create = context => {
let testIsAsync = false;
let testUsed = false;

const registerUseOfAwait = () => {
if (testIsAsync) {
testUsed = true;
}
};

return ava.merge({
CallExpression: visitIf([
ava.isInTestFile,
Expand All @@ -15,11 +21,8 @@ const create = context => {
const implementationFn = node.arguments[0];
testIsAsync = implementationFn && implementationFn.async;
}),
YieldExpression: () => {
if (testIsAsync) {
testUsed = true;
}
},
AwaitExpression: registerUseOfAwait,
YieldExpression: registerUseOfAwait,
'CallExpression:exit': visitIf([
ava.isInTestFile,
ava.isTestNode
Expand Down
94 changes: 53 additions & 41 deletions test/no-async-fn-without-await.js
Expand Up @@ -2,52 +2,64 @@ import test from 'ava';
import avaRuleTester from 'eslint-ava-rule-tester';
import rule from '../rules/no-async-fn-without-await';

const ruleTester = avaRuleTester(test, {
parser: 'babel-eslint',
env: {
es6: true
}
});

const error = {
ruleId: 'no-async-fn-without-await',
message: 'Function was declared as `async` but doesn\'t use `await`'
};
const header = `const test = require('ava');\n`;

ruleTester.run('no-async-fn-without-await', rule, {
valid: [
`${header} test(fn);`,
`${header} test(t => {});`,
`${header} test(function(t) {});`,
`${header} test(async t => { await foo(); });`,
`${header} test(async t => { t.is(await foo(), 1); });`,
`${header} test(async function(t) { await foo(); });`,
`${header} test(async t => { if (bar) { await foo(); } });`,
`${header} test(async t => { if (bar) {} else { await foo(); } });`,
// shouldn't be triggered since it's not a test file
'test(async t => {});'
],
invalid: [
{
code: `${header} test(async t => {});`,
errors: [error]
},
{
code: `${header} test(async function(t) {});`,
errors: [error]
},
{
code: `${header} test(async t => {}); test(async t => {});`,
errors: [error, error]
},
{
code: `${header} test(async t => {}); test(async t => { await foo(); });`,
errors: [error]
},
{
code: `${header} test(async t => { await foo(); }); test(async t => {});`,
errors: [error]
const ruleTesterOptions = [
{
parserOptions: {
ecmaVersion: 2017
}
},
{
parser: 'babel-eslint',
env: {
es6: true
}
]
}
];

ruleTesterOptions.forEach(options => {
const ruleTester = avaRuleTester(test, options);

ruleTester.run(`no-async-fn-without-await`, rule, {
valid: [
`${header} test(fn);`,
`${header} test(t => {});`,
`${header} test(function(t) {});`,
`${header} test(async t => { await foo(); });`,
`${header} test(async t => { t.is(await foo(), 1); });`,
`${header} test(async function(t) { await foo(); });`,
`${header} test(async t => { if (bar) { await foo(); } });`,
`${header} test(async t => { if (bar) {} else { await foo(); } });`,
`${header} test.after(async () => { await foo(); });`,
// shouldn't be triggered since it's not a test file
'test(async t => {});'
],
invalid: [
{
code: `${header} test(async t => {});`,
errors: [error]
},
{
code: `${header} test(async function(t) {});`,
errors: [error]
},
{
code: `${header} test(async t => {}); test(async t => {});`,
errors: [error, error]
},
{
code: `${header} test(async t => {}); test(async t => { await foo(); });`,
errors: [error]
},
{
code: `${header} test(async t => { await foo(); }); test(async t => {});`,
errors: [error]
}
]
});
});

0 comments on commit 4f0f366

Please sign in to comment.