mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-29 10:17:55 +02:00
184 lines
4.2 KiB
JavaScript
184 lines
4.2 KiB
JavaScript
/**
|
|
* 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.
|
|
*/
|
|
|
|
const stylelint = require('stylelint');
|
|
const path = require('path');
|
|
const rule = require('..');
|
|
|
|
const {ruleName, messages} = rule;
|
|
|
|
function getOutputCss(output) {
|
|
const result = output.results[0]._postcssResult;
|
|
return result.root.toString(result.opts.syntax);
|
|
}
|
|
|
|
function 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,
|
|
};
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
testStylelintRule(
|
|
{
|
|
plugins: [path.join(__dirname, '..')],
|
|
rules: {
|
|
[ruleName]: [true, {header: '*\n * Copyright'}],
|
|
},
|
|
},
|
|
{
|
|
ruleName,
|
|
fix: false,
|
|
accept: [
|
|
{
|
|
code: `
|
|
/**
|
|
* Copyright
|
|
*/
|
|
|
|
.foo {}`,
|
|
},
|
|
],
|
|
reject: [
|
|
{
|
|
code: `
|
|
/**
|
|
* copyright
|
|
*/
|
|
|
|
.foo {}`,
|
|
message: messages.rejected,
|
|
line: 1,
|
|
column: 1,
|
|
},
|
|
{
|
|
code: `
|
|
/**
|
|
* Copyleft
|
|
*/
|
|
|
|
.foo {}`,
|
|
message: messages.rejected,
|
|
line: 1,
|
|
column: 1,
|
|
},
|
|
{
|
|
code: `
|
|
/**
|
|
* Copyleft
|
|
*/
|
|
|
|
/**
|
|
* Copyright
|
|
*/
|
|
.foo {}`,
|
|
message: messages.rejected,
|
|
line: 1,
|
|
column: 1,
|
|
},
|
|
],
|
|
},
|
|
);
|