/**
* @fileoverview Enforce label tags have htmlFor attribute.
* @author Ethan Cohen
*/
// -----------------------------------------------------------------------------
// Requirements
// -----------------------------------------------------------------------------
import { RuleTester } from 'eslint';
import assign from 'object.assign';
import parserOptionsMapper from '../../__util__/parserOptionsMapper';
import parsers from '../../__util__/helpers/parsers';
import rule from '../../../src/rules/label-has-for';
// -----------------------------------------------------------------------------
// Tests
// -----------------------------------------------------------------------------
const ruleTester = new RuleTester();
const expectedNestingError = {
message: 'Form label must have the following type of associated control: nesting',
type: 'JSXOpeningElement',
};
const expectedSomeError = {
message: 'Form label must have ANY of the following types of associated control: nesting, id',
type: 'JSXOpeningElement',
};
const expectedEveryError = {
message: 'Form label must have ALL of the following types of associated control: nesting, id',
type: 'JSXOpeningElement',
};
const optionsComponents = [{
components: ['Label', 'Descriptor'],
}];
const optionsRequiredNesting = [{
required: 'nesting',
}];
const optionsRequiredSome = [{
required: { some: ['nesting', 'id'] },
}];
const optionsRequiredEvery = [{
required: { every: ['nesting', 'id'] },
}];
const optionsChildrenAllowed = [{
allowChildren: true,
}];
ruleTester.run('label-has-for', rule, {
valid: parsers.all([].concat(
// DEFAULT ELEMENT 'label' TESTS
{ code: '
' },
{ code: '' },
{ code: '' },
{ code: '' }, // lower-case convention refers to real HTML elements.
{ code: '' },
{ code: '' },
{ code: 'Test!' },
{ code: 'test' },
// CUSTOM ELEMENT ARRAY OPTION TESTS
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: optionsComponents },
{ code: '', options: optionsComponents },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: 'Test!', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredSome },
{ code: '', options: optionsRequiredNesting },
{ code: '', options: optionsRequiredEvery },
{ code: '', options: optionsChildrenAllowed },
{ code: 'Test!', options: [assign({}, optionsComponents, optionsChildrenAllowed)] },
{ code: '', options: optionsChildrenAllowed },
{ code: '', options: optionsChildrenAllowed },
{ code: '', options: optionsChildrenAllowed },
{ code: '', options: optionsChildrenAllowed },
{ code: '', options: optionsRequiredEvery },
{ code: '', options: optionsRequiredEvery },
)).map(parserOptionsMapper),
invalid: parsers.all([].concat(
// DEFAULT ELEMENT 'label' TESTS
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
{ code: '', errors: [expectedEveryError], options: optionsRequiredEvery },
//
// // CUSTOM ELEMENT ARRAY OPTION TESTS
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: '',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{
code: 'Test!',
errors: [expectedEveryError],
options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
},
{ code: '', errors: [expectedEveryError], options: optionsComponents },
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{ code: '', errors: [expectedEveryError], options: optionsComponents },
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{ code: '', errors: [expectedEveryError], options: optionsComponents },
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{
code: '',
errors: [expectedEveryError],
options: optionsComponents,
},
{
code: 'First Name',
errors: [expectedEveryError],
options: optionsComponents,
},
{
code: 'Foo',
errors: [expectedEveryError],
options: optionsComponents,
},
{ code: '', errors: [expectedEveryError], options: optionsComponents },
{ code: '', errors: [expectedNestingError], options: optionsRequiredNesting },
{ code: '', errors: [expectedNestingError], options: optionsRequiredNesting },
{ code: '', errors: [expectedSomeError], options: optionsRequiredSome },
{ code: '', errors: [expectedSomeError], options: optionsRequiredSome },
{ code: '', errors: [expectedNestingError], options: optionsRequiredNesting },
{
code: '',
errors: [expectedEveryError],
options: optionsRequiredEvery,
},
{
code: '',
errors: [expectedEveryError],
options: optionsRequiredEvery,
},
)).map(parserOptionsMapper),
});