ec0lint-plugin-react
Version:
React specific linting rules for ec0lint
105 lines (87 loc) • 2.35 kB
JavaScript
;
const assert = require('assert');
const espree = require('espree');
const jsxUtil = require('../../lib/util/jsx');
const isReturningJSX = jsxUtil.isReturningJSX;
const DEFAULT_CONFIG = {
ecmaVersion: 6,
ecmaFeatures: {
jsx: true,
},
};
const parseCode = (code) => {
const ASTnode = espree.parse(code, DEFAULT_CONFIG);
// Return only first statement
return ASTnode.body[0];
};
const mockContext = {
getScope() {
return {
type: 'global',
upper: null,
childScopes: [],
variables: [],
};
},
};
describe('jsxUtil', () => {
describe('isReturningJSX', () => {
const assertValid = (codeStr) => assert(
isReturningJSX(parseCode(codeStr), mockContext)
);
it('Works when returning JSX', () => {
assertValid(`
function Test() {
return (
<a>something</a>
)
}
`);
assertValid(`
function Test() {
return <a>something</a>;
}
`);
});
it('Works when returning null', () => {
assertValid(`
function Test() {
return null;
}
`);
assertValid(`
function Test({prop}) {
return prop || null;
}
`);
});
it('Works with nested return', () => {
assertValid(`
function Test({prop}) {
if (prop) {
return <a>something</a>
}
}
`);
});
it('Can ignore null', () => {
assertValid(`
function Test() {
return null;
}
`);
});
it('Ignores JSX arguments to function calls used as return value of arrow functions', () => {
let astNode = parseCode(`const obj = {
prop: () => test(<a>something</a>)
}`);
let arrowFunctionExpression = astNode.declarations[0].init.properties[0].value;
assert(!isReturningJSX(() => false, arrowFunctionExpression, mockContext));
astNode = parseCode(`const obj = {
prop: () => { return test(<a>something</a>); }
}`);
arrowFunctionExpression = astNode.declarations[0].init.properties[0].value;
assert(!isReturningJSX(() => false, arrowFunctionExpression, mockContext));
});
});
});