Skip to content

Commit 521d009

Browse files
Guillaume Martignysindresorhus
Guillaume Martigny
andcommitted
Prevent incorrect detection of AVA functions when accessing through "context" (#231)
Co-authored-by: Sindre Sorhus <[email protected]>
1 parent b8549df commit 521d009

14 files changed

+48
-25
lines changed

rules/assertion-arguments.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ const create = context => {
9494
if (
9595
callee.type !== 'MemberExpression' ||
9696
!callee.property ||
97-
util.nameOfRootObject(callee) !== 't' ||
98-
util.isInContext(callee)
97+
util.getNameOfRootNodeObject(callee) !== 't' ||
98+
util.isPropertyUnderContext(callee)
9999
) {
100100
return;
101101
}

rules/assertion-message.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const create = context => {
3232
return;
3333
}
3434

35-
if (callee.property && util.nameOfRootObject(callee) === 't') {
35+
if (callee.property && util.getNameOfRootNodeObject(callee) === 't') {
3636
const nArgs = nbArguments(callee);
3737

3838
if (nArgs === -1) {

rules/max-asserts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const create = context => {
2525
if (
2626
callee.property &&
2727
!notAssertionMethods.includes(callee.property.name) &&
28-
util.nameOfRootObject(callee) === 't'
28+
util.getNameOfRootNodeObject(callee) === 't'
2929
) {
3030
const members = util.getMembers(callee).filter(name => name !== 'skip');
3131

rules/no-invalid-end.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const create = context => {
1313
])(node => {
1414
if (
1515
node.property.name === 'end' &&
16-
!ava.hasTestModifier('cb') &&
17-
util.nameOfRootObject(node) === 't'
16+
node.object.name === 't' &&
17+
!ava.hasTestModifier('cb')
1818
) {
1919
context.report({
2020
node,

rules/no-skip-assert.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ const create = context => {
1111
ava.isInTestFile,
1212
ava.isInTestNode
1313
])(node => {
14-
if (node.property.name === 'skip' && util.nameOfRootObject(node) === 't') {
15-
context.report({
16-
node,
17-
message: 'No assertions should be skipped.'
18-
});
14+
if (node.property.name === 'skip') {
15+
const root = util.getRootNode(node);
16+
if (root.object.name === 't' && util.assertionMethods.has(root.property.name)) {
17+
context.report({
18+
node,
19+
message: 'No assertions should be skipped.'
20+
});
21+
}
1922
}
2023
})
2124
});

rules/use-t-well.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const create = context => {
5050
ava.isInTestNode
5151
])(node => {
5252
if (node.parent.type === 'MemberExpression' ||
53-
util.nameOfRootObject(node) !== 't') {
53+
util.getNameOfRootNodeObject(node) !== 't') {
5454
return;
5555
}
5656

rules/use-true-false.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const create = context => {
5757
if (
5858
node.callee.type === 'MemberExpression' &&
5959
(node.callee.property.name === 'truthy' || node.callee.property.name === 'falsy') &&
60-
util.nameOfRootObject(node.callee) === 't'
60+
node.callee.object.name === 't'
6161
) {
6262
const arg = node.arguments[0];
6363

test/assertion-arguments.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ ruleTester.run('assertion-arguments', rule, {
5353
testCase(false, 't.true(true, \'message\');'),
5454
testCase(false, 't.truthy(\'unicorn\', \'message\');'),
5555
testCase(false, 't.snapshot(value, \'message\');'),
56+
testCase(false, 't.context.plan();'),
57+
testCase(false, 'foo.t.plan();'),
5658
// Shouldn't be triggered since it's not a test file
5759
testCase(false, 't.true(true);', false, false),
5860

test/max-asserts.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ ruleTester.run('max-asserts', rule, {
3434
options: [2]
3535
},
3636
`${header} test(t => { t.context.bar(); ${nbAssertions(5)} });`,
37+
`${header} test(t => { ${'t.context.is(1, 1); '.repeat(6)}});`,
38+
`${header} test(t => { ${'foo.t.is(1, 1); '.repeat(6)}});`,
3739
// Shouldn't be triggered since it's not a test file
3840
`test(t => { ${nbAssertions(10)} });`
3941
],

test/no-invalid-end.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ ruleTester.run('no-invalid-end', rule, {
2020
header + 'test.cb(t => { t.end.skip(); });',
2121
header + 'test.cb.only(t => { t.end(); });',
2222
header + 'notTest(t => { t.end(); });',
23+
header + 'test(t => { t.context.end(); })',
24+
header + 'test(t => { foo.t.end(); })',
2325
// Shouldn't be triggered since it's not a test file
2426
'test(t => { t.end(); });'
2527
],

test/no-skip-assert.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,29 @@ ruleTester.run('no-skip-assert', rule, {
1515
valid: [
1616
header + 'test(t => { t.is(1, 1); });',
1717
header + 'test.skip(t => { t.is(1, 1); });',
18+
// Not an actual AVA skip
1819
header + 'test(t => { notT.skip.is(1, 1); });',
20+
header + 'test(t => { t.context.is.skip(1, 1); });',
21+
header + 'test(t => { foo.t.is.skip(1, 1); });',
22+
header + 'test(t => { t.skip(); });',
1923
// Shouldn't be triggered since it's not a test file
20-
'test(t => { t.skip.is(1, 1); });'
24+
'test(t => { t.is.skip(1, 1); });'
2125
],
2226
invalid: [
2327
{
24-
code: header + 'test(t => { t.skip.is(1, 1); });',
28+
code: header + 'test(t => { t.is.skip(1, 1); });',
2529
errors
2630
},
2731
{
28-
code: header + 'test.cb(t => { t.skip.is(1, 1); t.end(); });',
32+
code: header + 'test(t => { t.true.skip(1); });',
2933
errors
3034
},
3135
{
32-
code: header + 'test.skip(t => { t.skip.is(1, 1); });',
36+
code: header + 'test.cb(t => { t.is.skip(1, 1); t.end(); });',
37+
errors
38+
},
39+
{
40+
code: header + 'test.skip(t => { t.is.skip(1, 1); });',
3341
errors
3442
}
3543
]

test/use-t-well.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ ruleTester.run('use-t-well', rule, {
6262
testCase('t.plan(1);'),
6363
testCase('t.log(\'Unicorns\');'),
6464
testCase('a.foo();'),
65+
testCase('t.context.foo(a, a);'),
66+
testCase('foo.t.bar(a, a);'),
6567
// Shouldn't be triggered since it's not a test file
6668
testCase('t.foo(a, a);', false),
6769
testCase('t.foo;', false)

test/use-true-false.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ ruleTester.run('use-true-false', rule, {
5353
testCase('t.falsy(value + value)'),
5454
testCase('t.truthy()'),
5555
testCase('t.falsy()'),
56+
testCase('t.context.truthy(true)'),
57+
testCase('t.context.falsy(false)'),
58+
testCase('foo.t.truthy(true)'),
59+
testCase('foo.t.falsy(false)'),
5660
// Shouldn't be triggered since it's not a test file
5761
testCase('t.truthy(value === 1)', false)
5862
],

util.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@ const defaultFiles = [
2222
'**/*.test.js'
2323
];
2424

25-
exports.nameOfRootObject = node => {
25+
exports.getRootNode = node => {
2626
if (node.object.type === 'MemberExpression') {
27-
return exports.nameOfRootObject(node.object);
27+
return exports.getRootNode(node.object);
2828
}
2929

30-
return node.object.name;
30+
return node;
3131
};
3232

33-
exports.isInContext = node => {
34-
if (node.object.type === 'MemberExpression') {
35-
return exports.isInContext(node.object);
36-
}
33+
exports.getNameOfRootNodeObject = node => {
34+
return exports.getRootNode(node).object.name;
35+
};
3736

38-
return node.property.name === 'context';
37+
exports.isPropertyUnderContext = node => {
38+
return exports.getRootNode(node).property.name === 'context';
3939
};
4040

4141
const NO_SUCH_FILE = Symbol('no ava.config.js file');

0 commit comments

Comments
 (0)