UNPKG

punchcard-content-types

Version:

Combines with input plugins to create forms with validation. Creates forms for Punchcard CMS.

176 lines (142 loc) 8.64 kB
import test from 'ava'; import includes from 'lodash/includes'; import types from '../lib/content-types'; import form from '../lib/form'; import config from './fixtures/config/default'; import barInput from './fixtures/objects/bar-expected.js'; test('All Form Goodies', t => { t.is(typeof form, 'function', 'Form exports a function'); t.is(typeof form.validate, 'function', 'Submodule `validate` exists and is a function'); }); test('Form Generation', t => { return types.only('foo', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); }); }); test('Form Generation, Again', t => { return types.only('foo', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); }); }); test('Form Generation, Again Again', t => { return types.only('bar', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); }); }); test('Form Generation, with required attributes and inputs', t => { return types.only('baz', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); t.true(includes(rendered.html, 'name="input-required-save--text" aria-required="true" required', 'input gets required--save')); t.true(includes(rendered.html, '<mark class="required--save">required to save</mark>', 'mark gets added after label text')); }); }); test('Form Generation, with identifier automatically required', t => { return types.only('foo', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); t.true(includes(rendered.html, 'name="new-text-thing--text" aria-required="true" required', 'input gets required--save')); t.true(includes(rendered.html, '<mark class="required--save">required to save</mark>', 'mark gets added after label text')); }); }); test('Form Generation, with required, with classes on a label', t => { return types.only('baz', {}, '', config).then(rslt => { const result = rslt; result.attributes[0].html = '<label for="{{text.id}}" class="I-am-a-test this-must__still_be123-here">{{text.label}} <mark class="required--{{text.required}}">required to {{text.required}}</mark></label><input type="{{text.type}}" id="{{text.id}}" name="{{text.name}}" value="{{text.value}}" placeholder="{{text.placeholder}}" />'; result.attributes[2].html = '<label class="I-am-a-test this-must__still_be123-here" for="{{text.id}}">{{text.label}} <mark class="required--{{text.required}}">required to {{text.required}}</mark></label><input type="{{text.type}}" id="{{text.id}}" name="{{text.name}}" value="{{text.value}}" placeholder="{{text.placeholder}}" />'; return form(result); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); t.true(includes(rendered.html, '<mark class="required--save">required to save</mark>', 'mark gets added after label text')); }); }); test('Form Generation, with required attributes and inputs that have wrong levels', t => { return types.only('baz', {}, '', config).then(rslt => { const result = rslt; result.attributes[5].html = '<label for="{{text.id}}" class="I-am-a-test-of-bad-level">{{text.label}} <mark class="required--{{text.required}}">required to {{text.required}}</mark></label><input type="{{text.type}}" id="{{text.id}}" name="{{text.name}}" value="{{text.value}}" placeholder="{{text.placeholder}}" />'; return form(result); }).then(rendered => { t.true(includes(rendered.html, 'class="I-am-a-test-of-bad-level">Input required bad level', 'bad level adds zero classes')); t.true(includes(rendered.html, 'name="plugin-required-bad-level--text"', 'bad level adds zero attributes to input')); }); }); test('Form Generation, required knows publish vs save', t => { return types.only('baz', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(includes(rendered.html, '<mark class="required--save">required to save</mark>', 'determines save for plugin')); t.true(includes(rendered.html, '<mark class="required--publish">required to publish</mark>', 'determines publish for plugin')); }); }); test('Form Generation, with errors', t => { let errorMsg; return types.only('foo', {}, '', config).then(result => { const errors = { [result.attributes[1].inputs.email.name]: 'I am a test error', }; errorMsg = `<p class="form--alert" role="alert" for="${result.attributes[1].inputs.email.id}">I am a test error</p>`; return form(result, errors); }).then(rendered => { t.true(rendered.hasOwnProperty('scripts'), 'Form JS generated'); t.true(rendered.hasOwnProperty('html'), 'HTML generated'); t.is(typeof rendered.scripts, 'string', 'Scripts is a string'); t.is(typeof rendered.html, 'string', 'HTML is a string'); t.true(includes(rendered.html, errorMsg, 'error adds error message')); t.true(includes(rendered.html, 'name="email-field--email" aria-invalid="true"', 'error adds aria-invalid')); }); }); test('Form Generation, with ux scripts', t => { return types.only('baz', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(includes(rendered.scripts, 'function selectsRelatedScript(', 'includes ux scripts')); }); }); test('Form Generation, overrides options in select', t => { return types.only('baz', {}, '', config).then(result => { return form(result); }).then(rendered => { t.true(includes(rendered.html, '<option value="option1" >Option 1</option>', 'determines existence of option1')); t.true(includes(rendered.html, '<option value="option2" >Option 2</option>', 'determines existence of option2')); t.false(includes(rendered.html, '<option value="mike" >Michaelangelo</option>', 'determines non-existence of default option 1')); t.false(includes(rendered.html, '<option value="leo" >Leonardo</option>', 'determines non-existence of default option 2')); t.false(includes(rendered.html, '<option value="ralph" >Raphael</option>', 'determines non-existence of default option 3')); t.false(includes(rendered.html, '<option value="don" >Donatello</option>', 'determines non-existence of default option 4')); }); }); test('Form Generation, with repeatables', t => { const input = barInput; return form(input).then(rendered => { // fs.writeFileSync('fixtures/output.js', rendered.html); t.true(includes(rendered.html, '<label for="c4087332-edda-432d-8464-cc9679742e4e--0">Citation:</label>'), 'Indexing for label of first instance'); t.true(includes(rendered.html, '<input type="text" id="c4087332-edda-432d-8464-cc9679742e4e--0" name="my-quote--quote--0" value="foo" placeholder="Source Material" />'), 'Indexing for label of second instance'); t.true(includes(rendered.html, '<label for="c4087332-edda-432d-8464-cc9679742e4e--1">Citation:</label>'), 'Indexing for label of second instance'); t.true(includes(rendered.html, '<input type="text" id="c4087332-edda-432d-8464-cc9679742e4e--1" name="my-quote--quote--1" value="foo1" placeholder="Source Material" />'), 'Indexing for input text of second instance'); }); });