diff --git a/src/scripts/src/templates.js b/src/scripts/src/templates.js index ed532c7..6ebb390 100644 --- a/src/scripts/src/templates.js +++ b/src/scripts/src/templates.js @@ -40,7 +40,8 @@ export const TEMPLATES = { }, itemList(globalClasses, isSelectOneElement) { const localClasses = classNames( - globalClasses.list, { + globalClasses.list, + { [globalClasses.listSingle]: (isSelectOneElement), [globalClasses.listItems]: (!isSelectOneElement), }, @@ -214,7 +215,8 @@ export const TEMPLATES = { notice(globalClasses, label, type = '') { const localClasses = classNames( globalClasses.item, - globalClasses.itemChoice, { + globalClasses.itemChoice, + { [globalClasses.noResults]: (type === 'no-results'), [globalClasses.noChoices]: (type === 'no-choices'), }, diff --git a/src/scripts/src/templates.test.js b/src/scripts/src/templates.test.js new file mode 100644 index 0000000..21ab07e --- /dev/null +++ b/src/scripts/src/templates.test.js @@ -0,0 +1,593 @@ +import { expect } from 'chai'; +import templates from './templates'; +import { getType, strToEl } from './lib/utils'; + +const stripElement = element => element.outerHTML.replace(/(^|>)\s+|\s+(?=<|$)/g, '$1'); + +describe('templates', () => { + describe('containerOuter', () => { + const classes = { + containerOuter: 'test', + }; + const direction = 'rtl'; + + describe('select element', () => { + describe('search enabled', () => { + it('returns expected html', () => { + const isSelectElement = true; + const isSelectOneElement = false; + const searchEnabled = true; + const passedElementType = 'select-multiple'; + + const expectedOutput = strToEl(` + + `); + const actualOutput = templates.containerOuter( + classes, + direction, + isSelectElement, + isSelectOneElement, + searchEnabled, + passedElementType, + ); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('search disabled', () => { + it('returns expected html', () => { + const isSelectElement = true; + const isSelectOneElement = false; + const searchEnabled = false; + const passedElementType = 'select-multiple'; + + const expectedOutput = strToEl(` + + `); + const actualOutput = templates.containerOuter( + classes, + direction, + isSelectElement, + isSelectOneElement, + searchEnabled, + passedElementType, + ); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('select one element', () => { + it('returns expected html', () => { + const isSelectElement = true; + const isSelectOneElement = true; + const searchEnabled = false; + const passedElementType = 'select-one'; + + const expectedOutput = strToEl(` + + `); + const actualOutput = templates.containerOuter( + classes, + direction, + isSelectElement, + isSelectOneElement, + searchEnabled, + passedElementType, + ); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('non select element', () => { + it('returns expected html', () => { + const isSelectElement = false; + const isSelectOneElement = false; + const searchEnabled = false; + const passedElementType = 'text'; + + const expectedOutput = strToEl(` + + `); + const actualOutput = templates.containerOuter( + classes, + direction, + isSelectElement, + isSelectOneElement, + searchEnabled, + passedElementType, + ); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('containerInner', () => { + it('returns expected html', () => { + const classes = { + containerInner: 'test', + }; + const expectedOutput = strToEl(`
`); + const actualOutput = templates.containerInner(classes); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('itemList', () => { + const classes = { + list: 'test 1', + listSingle: 'test 2', + listItems: 'test 3', + }; + + describe('select one element', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(`
`); + const actualOutput = templates.itemList(classes, true); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('non select one element', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(`
`); + const actualOutput = templates.itemList(classes, false); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('placeholder', () => { + it('returns expected html', () => { + const classes = { + placeholder: 'test', + }; + const value = 'test'; + const expectedOutput = strToEl(` +
${value}
`, + ); + const actualOutput = templates.placeholder(classes, value); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + // describe('item', () => { + + // }); + + describe('choiceList', () => { + const classes = { + list: 'test', + }; + + describe('select one element', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+
+ `); + const actualOutput = templates.choiceList(classes, true); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('non select one element', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+
+ `); + const actualOutput = templates.choiceList(classes, false); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('choiceGroup', () => { + const classes = { + group: 'test 1', + groupHeading: 'test 2', + itemDisabled: 'test 3', + }; + + let data; + + beforeEach(() => { + data = { + id: 1, + value: 'test', + disabled: false, + }; + }); + + describe('enabled state', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+
${data.value}
+
+ `); + const actualOutput = templates.choiceGroup(classes, data); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('disabled state', () => { + beforeEach(() => { + data = { + ...data, + disabled: true, + }; + }); + + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+
${data.value}
+
+ `); + const actualOutput = templates.choiceGroup(classes, data); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('choice', () => { + const classes = { + item: 'test 1', + itemChoice: 'test 2', + itemDisabled: 'test 3', + itemSelectable: 'test 4', + placeholder: 'test 5', + }; + + const itemSelectText = 'test 6'; + + let data; + + beforeEach(() => { + data = { + id: 1, + groupId: -1, + disabled: false, + elementId: 'test', + label: 'test', + value: 'test', + }; + }); + + describe('enabled state', () => { + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+ ${data.label} +
+ `); + const actualOutput = templates.choice(classes, data, itemSelectText); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('disabled state', () => { + beforeEach(() => { + data = { + ...data, + disabled: true, + }; + }); + + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+ ${data.label} +
+ `); + const actualOutput = templates.choice(classes, data, itemSelectText); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('placeholder', () => { + beforeEach(() => { + data = { + ...data, + placeholder: true, + }; + }); + + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+ ${data.label} +
+ `); + const actualOutput = templates.choice(classes, data, itemSelectText); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('child of group', () => { + beforeEach(() => { + data = { + ...data, + groupId: 1 + }; + }); + + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+ ${data.label} +
+ `); + const actualOutput = templates.choice(classes, data, itemSelectText); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + + describe('input', () => { + const classes = { + input: 'test 1', + inputCloned: 'test 2', + }; + + it('returns expected html', () => { + const expectedOutput = strToEl(` + + `); + const actualOutput = templates.input(classes); + + expect(getType(actualOutput)).to.equal('HTMLInputElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('dropdown', () => { + const classes = { + list: 'test 1', + listDropdown: 'test 2', + } + ; + it('returns expected html', () => { + const value = 'test'; + const expectedOutput = strToEl(``); + const actualOutput = templates.dropdown(classes, value); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('notice', () => { + const classes = { + item: 'test 1', + itemChoice: 'test 2', + noResults: 'test 3', + noChoices: 'test 4', + }; + + const label = 'test'; + + it('returns expected html', () => { + const expectedOutput = strToEl(` +
+ ${label} +
+ `); + const actualOutput = templates.notice(classes, label); + + expect(getType(actualOutput)).to.equal('HTMLDivElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + + describe('passing a notice type', () => { + describe('no results', () => { + it('adds no results classname', () => { + const expectedOutput = strToEl(` +
+ ${label} +
+ `); + const actualOutput = templates.notice(classes, label, 'no-results'); + + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + + describe('no choices', () => { + it('adds no choices classname', () => { + const expectedOutput = strToEl(` +
+ ${label} +
+ `); + const actualOutput = templates.notice(classes, label, 'no-choices'); + + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + }); + }); + }); + + describe('option', () => { + let data; + + beforeEach(() => { + data = { + disabled: false, + selected: false, + value: 'test value', + label: 'test label', + }; + }); + + it('returns expected html', () => { + const expectedOutput = strToEl(``); + const actualOutput = templates.option(data); + + expect(getType(actualOutput)).to.equal('HTMLOptionElement'); + expect(stripElement(actualOutput)).to.equal(stripElement(expectedOutput)); + }); + + describe('when selected', () => { + beforeEach(() => { + data = { + ...data, + selected: true, + }; + }); + + it('sets selected attr to true', () => { + const output = templates.option(data); + expect(output.selected).to.equal(true); + }); + }); + + describe('when disabled', () => { + beforeEach(() => { + data = { + ...data, + disabled: true, + }; + }); + + it('sets disabled attr to true', () => { + const output = templates.option(data); + expect(output.disabled).to.equal(true); + }); + }); + }); +});