Skip to content

Commit abc162f

Browse files
committed
Support test.macro()
Fixes #329.
1 parent cf361f1 commit abc162f

9 files changed

+32
-11
lines changed

create-ava-rule.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,13 @@ module.exports = () => { // eslint-disable-line eslint-plugin/prefer-object-rule
216216

217217
return {
218218
hasTestModifier: mod => getTestModifierNames(currentTestNode).includes(mod),
219-
hasNoHookModifier: () => {
219+
hasNoUtilityModifier: () => {
220220
const modifiers = getTestModifierNames(currentTestNode);
221221
return !modifiers.includes('before') &&
222222
!modifiers.includes('beforeEach') &&
223223
!modifiers.includes('after') &&
224-
!modifiers.includes('afterEach');
224+
!modifiers.includes('afterEach') &&
225+
!modifiers.includes('macro');
225226
},
226227
isInTestFile: () => isTestFile,
227228
isInTestNode: () => currentTestNode,

rules/no-identical-title.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const create = context => {
2626
CallExpression: visitIf([
2727
ava.isInTestFile,
2828
ava.isTestNode,
29-
ava.hasNoHookModifier
29+
ava.hasNoUtilityModifier
3030
])(node => {
3131
const args = node.arguments;
3232
const titleNode = args.length > 1 || ava.hasTestModifier('todo') ? args[0] : undefined;

rules/no-unknown-modifiers.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const modifiers = new Set([
1414
'serial',
1515
'skip',
1616
'todo',
17-
'failing'
17+
'failing',
18+
'macro'
1819
]);
1920

2021
const unknownModifiers = node => util.getTestModifiers(node)

rules/test-title-format.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const create = context => {
1717
CallExpression: visitIf([
1818
ava.isInTestFile,
1919
ava.isTestNode,
20-
ava.hasNoHookModifier
20+
ava.hasNoUtilityModifier
2121
])(node => {
2222
const requiredLength = ava.hasTestModifier('todo') ? 1 : 2;
2323
const hasTitle = node.arguments.length >= requiredLength;

rules/test-title.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const create = context => {
1010
CallExpression: visitIf([
1111
ava.isInTestFile,
1212
ava.isTestNode,
13-
ava.hasNoHookModifier
13+
ava.hasNoUtilityModifier
1414
])(node => {
1515
const firstArgumentIsFunction = node.arguments.length === 0 || util.isFunctionExpression(node.arguments[0]);
1616

rules/use-t.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ const create = context => {
1111
ava.isInTestFile,
1212
ava.isTestNode
1313
])(node => {
14-
const functionArgIndex = node.arguments.length - 1;
15-
if (functionArgIndex > 1) {
14+
const index = node.arguments.length - 1;
15+
if (index > 1) {
1616
return;
1717
}
1818

19-
const functionArg = node.arguments[functionArgIndex];
19+
let implementationArg = node.arguments[index];
20+
if (ava.hasTestModifier('macro') && implementationArg.type === 'ObjectExpression') {
21+
const execProperty = implementationArg.properties.find(p => {
22+
return p.key.name === 'exec';
23+
});
24+
implementationArg = execProperty && execProperty.value;
25+
}
2026

21-
if (!functionArg || !functionArg.params || functionArg.params.length === 0) {
27+
if (!implementationArg || !implementationArg.params || implementationArg.params.length === 0) {
2228
return;
2329
}
2430

25-
if (functionArg.params[0].name !== 't') {
31+
if (implementationArg.params[0].name !== 't') {
2632
context.report({
2733
node,
2834
message: 'Test parameter should be named `t`.'

test/no-unknown-modifiers.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ ruleTester.run('no-unknown-modifiers', rule, {
2626
`${header}test.after.always(t => {});`,
2727
`${header}test.afterEach.always(t => {});`,
2828
`${header}test.failing(t => {});`,
29+
`${header}test.macro(t => {});`,
2930
// Shouldn't be triggered since it's not a test file
3031
'test.foo(t => {});'
3132
],

test/test-title.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ ruleTester.run('test-title', rule, {
2222
header + 'test.after(t => {});',
2323
header + 'test.beforeEach(t => {});',
2424
header + 'test.afterEach(t => {});',
25+
header + 'test.macro(t => {});',
2526
header + 'test.cb.before(t => {}); test.before.cb(t => {});',
2627
header + 'notTest(t => { t.pass(); t.end(); });',
2728
header + 'test([], arg1, arg2);',

test/use-t.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ ruleTester.run('use-t', rule, {
2727
header + 'test((t, foo) => {});',
2828
header + 'test(function (t) {});',
2929
header + 'test(testFunction);',
30+
header + 'test.macro(testFunction);',
31+
header + 'test.macro(t => {});',
32+
header + 'test.macro({exec: t => {}, title: () => "title"});',
3033
header + 'test.todo("test name");',
3134
// Shouldn't be triggered since it's not a test file
3235
'test(foo => {});',
@@ -50,6 +53,14 @@ ruleTester.run('use-t', rule, {
5053
{
5154
code: header + 'test(function (foo) {});',
5255
errors: parameterNotNamedTErrors
56+
},
57+
{
58+
code: header + 'test.macro(function (foo) {});',
59+
errors: parameterNotNamedTErrors
60+
},
61+
{
62+
code: header + 'test.macro({ exec(foo) {} });',
63+
errors: parameterNotNamedTErrors
5364
}
5465
]
5566
});

0 commit comments

Comments
 (0)