mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-09 23:27:28 +02:00
misc: update stylelint rule tester
This commit is contained in:
parent
b4f4057d97
commit
c50df3003c
4 changed files with 72 additions and 85 deletions
120
jest/stylelint-rule-test.js
Normal file
120
jest/stylelint-rule-test.js
Normal file
|
@ -0,0 +1,120 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||
const stylelint = require('stylelint');
|
||||
|
||||
function getOutputCss(output) {
|
||||
const result = output.results[0]._postcssResult;
|
||||
return result.root.toString(result.opts.syntax);
|
||||
}
|
||||
|
||||
global.testStylelintRule = (config, tests) => {
|
||||
describe(tests.ruleName, () => {
|
||||
const checkTestCaseContent = testCase =>
|
||||
testCase.description || testCase.code || 'no description';
|
||||
|
||||
if (tests.accept && tests.accept.length) {
|
||||
describe('accept cases', () => {
|
||||
tests.accept.forEach(testCase => {
|
||||
const spec = testCase.only ? it.only : it;
|
||||
|
||||
spec(checkTestCaseContent(testCase), () => {
|
||||
const options = {
|
||||
code: testCase.code,
|
||||
config,
|
||||
syntax: tests.syntax,
|
||||
};
|
||||
|
||||
return stylelint.lint(options).then(output => {
|
||||
expect(output.results[0].warnings).toEqual([]);
|
||||
|
||||
if (!tests.fix) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check the fix.
|
||||
return stylelint
|
||||
.lint({...options, fix: true})
|
||||
.then(fixedOutput => getOutputCss(fixedOutput))
|
||||
.then(fixedCode => expect(fixedCode).toBe(testCase.fixed));
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (tests.reject && tests.reject.length) {
|
||||
describe('reject cases', () => {
|
||||
tests.reject.forEach(testCase => {
|
||||
const skip = testCase.skip ? it.skip : it;
|
||||
const spec = testCase.only ? it.only : skip;
|
||||
|
||||
spec(checkTestCaseContent(testCase), () => {
|
||||
const options = {
|
||||
code: testCase.code,
|
||||
config,
|
||||
syntax: tests.syntax,
|
||||
};
|
||||
|
||||
return stylelint.lint(options).then(output => {
|
||||
const {warnings} = output.results[0];
|
||||
const warning = warnings[0];
|
||||
|
||||
expect(warnings.length).toBeGreaterThanOrEqual(1);
|
||||
expect(testCase).toHaveMessage();
|
||||
|
||||
if (testCase.message != null) {
|
||||
expect(warning.text).toBe(testCase.message);
|
||||
}
|
||||
|
||||
if (testCase.line != null) {
|
||||
expect(warning.line).toBe(testCase.line);
|
||||
}
|
||||
|
||||
if (testCase.column != null) {
|
||||
expect(warning.column).toBe(testCase.column);
|
||||
}
|
||||
|
||||
if (!tests.fix) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!testCase.fixed) {
|
||||
throw new Error(
|
||||
'If using { fix: true } in test tests, all reject cases must have { fixed: .. }',
|
||||
);
|
||||
}
|
||||
|
||||
// Check the fix.
|
||||
return stylelint
|
||||
.lint({...options, fix: true})
|
||||
.then(fixedOutput => getOutputCss(fixedOutput))
|
||||
.then(fixedCode => expect(fixedCode).toBe(testCase.fixed));
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
expect.extend({
|
||||
toHaveMessage(testCase) {
|
||||
if (testCase.message == null) {
|
||||
return {
|
||||
message: () =>
|
||||
'Expected "reject" test case to have a "message" property',
|
||||
pass: false,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
pass: true,
|
||||
};
|
||||
},
|
||||
});
|
||||
});
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue