Skip to content

Commit b800067

Browse files
committed
DRY up tests
1 parent d2d51c7 commit b800067

33 files changed

Lines changed: 798 additions & 1219 deletions

test/assertion-arguments.js

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
1-
import test from 'ava';
2-
import AvaRuleTester from 'eslint-ava-rule-tester';
1+
import RuleTester from './helpers/rule-tester.js';
32
import rule from '../rules/assertion-arguments.js';
43

5-
const ruleTester = new AvaRuleTester(test, {
6-
languageOptions: {
7-
ecmaVersion: 'latest',
8-
},
9-
});
4+
const ruleTester = new RuleTester();
105

116
const missingError = {messageId: 'missing-message'};
127
const foundError = {messageId: 'found-message'};
@@ -20,16 +15,12 @@ const outOfOrderError = (line, column, endLine, endColumn) => ({
2015
const messageIsNotStringError = {messageId: 'not-string-message'};
2116
const regexFirstError = {messageId: 'regex-first-argument'};
2217

23-
const header = 'const test = require(\'ava\');';
24-
25-
function testCode(content, useHeader) {
26-
const testFunction = `
18+
function testCode(content) {
19+
return `
2720
test(t => {
2821
${content}
2922
});
3023
`;
31-
const code = (useHeader === false ? '' : header) + testFunction;
32-
return code;
3324
}
3425

3526
function offsetError(error, line, column) {
@@ -55,24 +46,28 @@ function offsetError(error, line, column) {
5546
}
5647

5748
function testCase(message, content, errors = [], {
58-
useHeader, output = null,
49+
noHeader, output = null,
5950
} = {}) {
6051
if (!Array.isArray(errors)) {
6152
errors = [errors];
6253
}
6354

64-
const offset = useHeader === false ? [1, 3] : [2, 3];
55+
const offset = noHeader ? [2, 3] : [3, 3];
6556

6657
errors = errors.map(error => offsetError(error, ...offset));
6758

6859
const result = {
6960
options: message ? [{message}] : [],
70-
code: testCode(content, useHeader),
61+
code: testCode(content),
7162
};
7263

64+
if (noHeader) {
65+
result.noHeader = true;
66+
}
67+
7368
if (errors.length > 0) {
7469
result.errors = errors;
75-
result.output = output === null ? null : testCode(output, useHeader);
70+
result.output = output === null ? null : testCode(output);
7671
}
7772

7873
return result;
@@ -157,9 +152,6 @@ const dynamics = [
157152
];
158153

159154
ruleTester.run('assertion-arguments', rule, {
160-
assertionOptions: {
161-
requireMessage: true,
162-
},
163155
valid: [
164156
testCase(false, 't.plan(1);'),
165157
testCase(false, 't.plan(0);'),
@@ -194,7 +186,7 @@ ruleTester.run('assertion-arguments', rule, {
194186
testCase(false, 't.timeout(100, \'message\');'),
195187
testCase(false, 'foo.t.plan();'),
196188
// Shouldn't be triggered since it's not a test file
197-
testCase(false, 't.true(true);', [], {useHeader: false}),
189+
testCase(false, 't.true(true);', [], {noHeader: true}),
198190

199191
testCase(false, 't.assert(true);'),
200192
testCase(false, 't.deepEqual({}, {});'),
@@ -221,7 +213,7 @@ ruleTester.run('assertion-arguments', rule, {
221213
testCase(false, 't.truthy(\'unicorn\');'),
222214
testCase(false, 't.snapshot(value);'),
223215
// Shouldn't be triggered since it's not a test file
224-
testCase(false, 't.true(true, \'message\');', [], {useHeader: false}),
216+
testCase(false, 't.true(true, \'message\');', [], {noHeader: true}),
225217

226218
testCase(false, 't.context.a(1, 2, 3, 4);'),
227219
testCase(false, 't.context.is(1, 2, 3, 4);'),
@@ -257,7 +249,7 @@ ruleTester.run('assertion-arguments', rule, {
257249
testCase('always', 't.try(\'title\', tt => tt.pass(\'ok\'), 1, 2);'),
258250

259251
// Shouldn't be triggered since it's not a test file
260-
testCase('always', 't.true(true);', [], {useHeader: false}),
252+
testCase('always', 't.true(true);', [], {noHeader: true}),
261253

262254
testCase('always', 't.context.a(1, 2, 3, 4);'),
263255
testCase('always', 't.context.is(1, 2, 3, 4);'),
@@ -295,7 +287,7 @@ ruleTester.run('assertion-arguments', rule, {
295287
testCase('never', 't.try(\'title\', tt => tt.pass(), 1, 2);'),
296288

297289
// Shouldn't be triggered since it's not a test file
298-
testCase('never', 't.true(true, \'message\');', [], {useHeader: false}),
290+
testCase('never', 't.true(true, \'message\');', [], {noHeader: true}),
299291

300292
testCase('never', 't.context.a(1, 2, 3, 4);'),
301293
testCase('never', 't.context.is(1, 2, 3, 4);'),

test/create-ava-rule.js

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import test from 'ava';
2-
import AvaRuleTester from 'eslint-ava-rule-tester';
1+
import RuleTester from './helpers/rule-tester.js';
32
import tsParser from '@typescript-eslint/parser';
43
import createAvaRule from '../create-ava-rule.js';
54

@@ -17,14 +16,10 @@ const rule = {
1716
},
1817
};
1918

20-
const ruleTester = new AvaRuleTester(test, {
21-
languageOptions: {
22-
ecmaVersion: 'latest',
23-
sourceType: 'module',
24-
},
25-
});
19+
const ruleTester = new RuleTester({autoHeader: false});
2620

27-
const typescriptRuleTester = new AvaRuleTester(test, {
21+
const typescriptRuleTester = new RuleTester({
22+
autoHeader: false,
2823
languageOptions: {
2924
parser: tsParser,
3025
},
@@ -37,9 +32,6 @@ const errors = [
3732
];
3833

3934
ruleTester.run('rule-fixture', rule, {
40-
assertionOptions: {
41-
requireMessage: true,
42-
},
4335
valid: [
4436
// `require` patterns
4537
'const test = require(\'ava\');',
@@ -76,9 +68,6 @@ ruleTester.run('rule-fixture', rule, {
7668
});
7769

7870
typescriptRuleTester.run('rule-fixture-ts', rule, {
79-
assertionOptions: {
80-
requireMessage: true,
81-
},
8271
valid: [
8372
// TypeScript re-assignment patterns
8473
{name: 'as assertion', code: 'import anyTest from \'ava\';\nconst test = anyTest as any;'},

test/failing-test-url.js

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,43 @@
1-
import test from 'ava';
2-
import AvaRuleTester from 'eslint-ava-rule-tester';
1+
import RuleTester from './helpers/rule-tester.js';
32
import rule from '../rules/failing-test-url.js';
43

5-
const ruleTester = new AvaRuleTester(test, {
6-
languageOptions: {
7-
ecmaVersion: 'latest',
8-
},
9-
});
4+
const ruleTester = new RuleTester();
105

116
const messageId = 'failing-test-url';
12-
const header = 'const test = require(\'ava\');\n';
137

148
ruleTester.run('failing-test-url', rule, {
159
valid: [
16-
header + 'test("my test name", t => { t.pass(); });',
17-
header + '// https://github.com/avajs/ava/issues/123\ntest.failing(t => { t.pass(); });',
18-
header + '/* https://github.com/avajs/ava/issues/123 */\ntest.failing(t => { t.pass(); });',
19-
header + '// See http://example.com/issue\ntest.failing(t => { t.pass(); });',
20-
header + '// Tracking issue: https://github.com/avajs/ava/issues/123\ntest.failing(t => { t.pass(); });',
21-
header + '// https://github.com/avajs/ava/issues/123\ntest.serial.failing(t => { t.pass(); });',
10+
'test("my test name", t => { t.pass(); });',
11+
'// https://github.com/avajs/ava/issues/123\ntest.failing(t => { t.pass(); });',
12+
'/* https://github.com/avajs/ava/issues/123 */\ntest.failing(t => { t.pass(); });',
13+
'// See http://example.com/issue\ntest.failing(t => { t.pass(); });',
14+
'// Tracking issue: https://github.com/avajs/ava/issues/123\ntest.failing(t => { t.pass(); });',
15+
'// https://github.com/avajs/ava/issues/123\ntest.serial.failing(t => { t.pass(); });',
2216
// Not a test file
23-
'test.failing(t => { t.pass(); });',
17+
{code: 'test.failing(t => { t.pass(); });', noHeader: true},
2418
// Not a test call
25-
header + 'notTest.failing();',
19+
'notTest.failing();',
2620
],
2721
invalid: [
2822
{
29-
code: header + 'test.failing(t => { t.pass(); });',
23+
code: 'test.failing(t => { t.pass(); });',
3024
errors: [{messageId, line: 2, column: 6}],
3125
},
3226
{
33-
code: header + '// TODO: fix this\ntest.failing(t => { t.pass(); });',
27+
code: '// TODO: fix this\ntest.failing(t => { t.pass(); });',
3428
errors: [{messageId, line: 3, column: 6}],
3529
},
3630
{
37-
code: header + 'test.serial.failing(t => { t.pass(); });',
31+
code: 'test.serial.failing(t => { t.pass(); });',
3832
errors: [{messageId, line: 2, column: 13}],
3933
},
4034
{
41-
code: header + '// See issue #123\ntest.failing(t => { t.pass(); });',
35+
code: '// See issue #123\ntest.failing(t => { t.pass(); });',
4236
errors: [{messageId, line: 3, column: 6}],
4337
},
4438
{
4539
// URL comment separated by code should not count
46-
code: header + '// https://github.com/avajs/ava/issues/123\nconst foo = 1;\ntest.failing(t => { t.pass(); });',
40+
code: '// https://github.com/avajs/ava/issues/123\nconst foo = 1;\ntest.failing(t => { t.pass(); });',
4741
errors: [{messageId, line: 4, column: 6}],
4842
},
4943
],

test/helpers/rule-tester.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import path from 'node:path';
2+
import test from 'ava';
3+
import AvaRuleTester from 'eslint-ava-rule-tester';
4+
5+
const header = 'import test from \'ava\';\n';
6+
7+
function addHeaderToCase(testCase) {
8+
if (typeof testCase === 'string') {
9+
return header + testCase;
10+
}
11+
12+
if (testCase.noHeader) {
13+
const {noHeader, ...rest} = testCase;
14+
return rest;
15+
}
16+
17+
const result = {...testCase, code: header + testCase.code};
18+
19+
if (typeof result.output === 'string') {
20+
result.output = header + result.output;
21+
}
22+
23+
result.errors &&= result.errors.map(error => {
24+
if (!error.suggestions) {
25+
return error;
26+
}
27+
28+
return {
29+
...error,
30+
suggestions: error.suggestions.map(suggestion => typeof suggestion.output === 'string'
31+
? {...suggestion, output: header + suggestion.output}
32+
: suggestion),
33+
};
34+
});
35+
36+
return result;
37+
}
38+
39+
const defaultConfig = {
40+
languageOptions: {
41+
ecmaVersion: 'latest',
42+
sourceType: 'module',
43+
},
44+
};
45+
46+
export default class RuleTester extends AvaRuleTester {
47+
#autoHeader;
48+
49+
constructor({autoHeader, ...config} = {}) {
50+
super(test, {
51+
...defaultConfig,
52+
...config,
53+
languageOptions: {
54+
...defaultConfig.languageOptions,
55+
...config.languageOptions,
56+
},
57+
});
58+
this.#autoHeader = autoHeader ?? true;
59+
}
60+
61+
run(name, rule, tests) {
62+
const processed = this.#autoHeader
63+
? {
64+
valid: tests.valid.map(testCase => addHeaderToCase(testCase)),
65+
invalid: tests.invalid.map(testCase => addHeaderToCase(testCase)),
66+
}
67+
: {};
68+
69+
return super.run(name, rule, {
70+
assertionOptions: {requireMessage: true},
71+
...tests,
72+
...processed,
73+
});
74+
}
75+
}
76+
77+
export function testCase(contents) {
78+
return `test(t => { ${contents} });`;
79+
}
80+
81+
export function asyncTestCase(contents) {
82+
return `test(async t => { ${contents} });`;
83+
}
84+
85+
export const toPath = subPath => path.join(path.dirname(path.dirname(import.meta.dirname)), subPath);
86+
87+
export {header};

0 commit comments

Comments
 (0)