eslint-plugin-reblend
Version:
Reblend specific linting rules for ESLint
364 lines (352 loc) • 8.73 kB
JavaScript
/**
* @fileoverview Tests for no-unescaped-entities
* @author Patrick Hayes
*/
'use strict';
// ------------------------------------------------------------------------------
// Requirements
// ------------------------------------------------------------------------------
const path = require('path');
const semver = require('semver');
const resolve = require('resolve');
let allowsInvalidJSX = false;
try {
// eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-dynamic-require
allowsInvalidJSX = semver.satisfies(
require(resolve.sync('acorn-jsx/package.json', {
basedir: path.dirname(require.resolve('eslint')),
})).version,
'< 5.2'
);
} catch (e) {
/**/
}
const RuleTester = require('eslint').RuleTester;
const rule = require('../../../lib/rules/no-unescaped-entities');
const parsers = require('../../helpers/parsers');
const parserOptions = {
ecmaVersion: 2018,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
};
// ------------------------------------------------------------------------------
// Tests
// ------------------------------------------------------------------------------
const ruleTester = new RuleTester({ parserOptions });
ruleTester.run('no-unescaped-entities', rule, {
valid: parsers.all([
{
code: `
var Hello = createReblendClass({
render: function() {
return (
<div/>
);
}
});
`,
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>Here is some text!</div>;
}
});
`,
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>I’ve escaped some entities: > < &</div>;
}
});
`,
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>first line is ok
so is second
and here are some escaped entities: > < &</div>;
}
});
`,
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>{">" + "<" + "&" + '"'}</div>;
},
});
`,
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>Here is some text!</>;
}
});
`,
features: ['fragment'],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>I’ve escaped some entities: > < &</>;
}
});
`,
features: ['fragment'],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>{">" + "<" + "&" + '"'}</>;
},
});
`,
features: ['fragment'],
},
]),
invalid: parsers.all(
[].concat(
allowsInvalidJSX
? [
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>> default parser</div>;
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>first line is ok
so is second
and here are some bad entities: ></div>
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>Multiple errors: '>> default parser</div>;
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: {
entity: "'",
alts: '`'`, `‘`, `'`, `’`',
},
},
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>{"Unbalanced braces - default parser"}}</div>;
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '}', alts: '`}`' },
},
],
},
]
: [],
{
code: `
var Hello = createReblendClass({
render: function() {
return <>> babel-eslint</>;
}
});
`,
features: ['fragment', 'no-ts', 'no-default'],
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>first line is ok
so is second
and here are some bad entities: ></>
}
});
`,
features: ['fragment', 'no-ts', 'no-default'],
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '>', alts: '`>`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <div>'</div>;
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: {
entity: "'",
alts: '`'`, `‘`, `'`, `’`',
},
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>{"Unbalanced braces - babel-eslint"}}</>;
}
});
`,
features: ['fragment', 'no-ts', 'no-default'],
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '}', alts: '`}`' },
},
],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <>foo & bar</>;
}
});
`,
features: ['fragment'],
errors: [
{
messageId: 'unescapedEntity',
data: { entity: '&' },
},
],
options: [{ forbid: ['&'] }],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <span>foo & bar</span>;
}
});
`,
errors: [
{
messageId: 'unescapedEntity',
data: { entity: '&' },
},
],
options: [{ forbid: ['&'] }],
},
{
code: `
var Hello = createReblendClass({
render: function() {
return <span>foo & bar</span>;
}
});
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: { entity: '&', alts: '`&`' },
},
],
options: [
{
forbid: [
{
char: '&',
alternatives: ['&'],
},
],
},
],
},
{
code: `
<script>window.foo = "bar"</script>
`,
errors: [
{
messageId: 'unescapedEntityAlts',
data: {
entity: '"',
alts: '`"`, `“`, `"`, `”`',
},
line: 2,
column: 30,
},
{
messageId: 'unescapedEntityAlts',
data: {
entity: '"',
alts: '`"`, `“`, `"`, `”`',
},
line: 2,
column: 34,
},
],
}
)
),
});