UNPKG

formiojs

Version:

Common js library for client side interaction with <form.io>

373 lines (341 loc) • 12.1 kB
'use strict'; require("core-js/modules/es.string.trim.js"); var _powerAssert = _interopRequireDefault(require("power-assert")); var _chai = require("chai"); var _sinon = _interopRequireDefault(require("sinon")); var _Component = _interopRequireDefault(require("./Component")); var _Webform = _interopRequireDefault(require("../../../Webform")); var _harness = _interopRequireDefault(require("../../../../test/harness")); var _fixtures = require("./fixtures"); var _merge2 = _interopRequireDefault(require("lodash/merge")); var _comp = _interopRequireDefault(require("./fixtures/comp3")); var _comp2 = _interopRequireDefault(require("./fixtures/comp4")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } describe('Component', function () { it('Should create a Component', function (done) { var component = new _Component.default(); // Test that we have a proper constructed component. _powerAssert.default.equal(component.options.renderMode, 'form'); _powerAssert.default.equal(component.options.attachMode, 'full'); _powerAssert.default.equal(component.attached, false); _powerAssert.default.equal(component.rendered, false); done(); }); it('Should build a base component', function () { return _harness.default.testCreate(_Component.default, { type: 'base' }).then(function (component) { var element = component.element.querySelector('[ref="component"]'); _powerAssert.default.equal(element.textContent.trim(), 'Unknown component: base'); }); }); it('Should provide required validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { required: true } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: '', field: 'firstName', error: 'First Name is required' }, good: { value: 'te' } }, done); }).catch(done); }); it('Should provide minLength validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { minLength: 2 } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 't', field: 'firstName', error: 'First Name must have at least 2 characters.' }, good: { value: 'te' } }, done); }); }); it('Should provide maxLength validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { maxLength: 5 } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 'testte', field: 'firstName', error: 'First Name must have no more than 5 characters.' }, good: { value: 'te' } }, done); }); }); it('Should provide maxWords validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { maxWords: 2 } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 'test test test', field: 'firstName', error: 'First Name must have no more than 2 words.' }, good: { value: 'te st' } }, done); }); }); it('Should provide minWords validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { minWords: 2 } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 'test', field: 'firstName', error: 'First Name must have at least 2 words.' }, good: { value: 'te st' } }, done); }); }); it('Should provide custom validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { custom: 'valid = (input !== "Joe") ? true : "You cannot be Joe"' } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 'Joe', field: 'firstName', error: 'You cannot be Joe' }, good: { value: 'Tom' } }, done); }); }); it('Should provide json validation', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _fixtures.comp1, { validate: { json: { 'if': [{ '===': [{ var: 'data.firstName' }, 'Joe'] }, true, 'You must be Joe'] } } })).then(function (component) { return _harness.default.testComponent(component, { bad: { value: 'Tom', field: 'firstName', error: 'You must be Joe' }, good: { value: 'Joe' } }, done); }); }); it('Should mark as invalid calculated fields that are invalid', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); var formJson = { components: [{ label: 'A', mask: false, tableView: false, delimiter: false, requireDecimal: false, inputFormat: 'plain', key: 'a', type: 'number', input: true }, { label: 'B', mask: false, disabled: true, tableView: false, delimiter: false, requireDecimal: false, inputFormat: 'plain', calculateValue: 'value = data.a + 1;', validate: { custom: 'valid = input <= 10 ? true : \'B should be less or equal to 10\';' }, key: 'b', type: 'number', input: true }] }; form.setForm(formJson).then(function () { return form.setSubmission({ data: { a: 1 } }); }).then(function () { setTimeout(function () { var a = form.getComponent('a'); a.updateComponentValue(10); setTimeout(function () { var _b$refs$messageContai; var b = form.getComponent('b'); (0, _chai.expect)(((_b$refs$messageContai = b.refs.messageContainer) === null || _b$refs$messageContai === void 0 ? void 0 : _b$refs$messageContai.innerHTML.indexOf('B should be less or equal to 10')) > -1).to.be.true; (0, _chai.expect)(b.refs.input[0].classList.contains('is-invalid')).to.be.true; done(); }, 300); }, 300); }).catch(done); }); describe('shouldSkipValidation', function () { it('should return true if component is hidden', function (done) { _harness.default.testCreate(_Component.default, _fixtures.comp1).then(function (cmp) { cmp.visible = false; cmp.checkCondition = function () { return true; }; (0, _chai.expect)(cmp.visible).to.be.false; (0, _chai.expect)(cmp.checkCondition()).to.be.true; (0, _chai.expect)(cmp.shouldSkipValidation()).to.be.true; done(); }, done).catch(done); }); it('should return true if component is conditionally hidden', function (done) { _harness.default.testCreate(_Component.default, _fixtures.comp1).then(function (cmp) { cmp.visible = true; cmp.checkCondition = function () { return false; }; (0, _chai.expect)(cmp.visible).to.be.true; (0, _chai.expect)(cmp.checkCondition()).to.be.false; (0, _chai.expect)(cmp.shouldSkipValidation()).to.be.true; done(); }, done).catch(done); }); it('should return false if not hidden', function (done) { _harness.default.testCreate(_Component.default, _fixtures.comp1).then(function (cmp) { cmp.visible = true; cmp.checkCondition = function () { return true; }; (0, _chai.expect)(cmp.visible).to.be.true; (0, _chai.expect)(cmp.checkCondition()).to.be.true; (0, _chai.expect)(cmp.shouldSkipValidation()).to.be.false; done(); }, done).catch(done); }); }); describe('Component Modal', function () { it('Modal window should stay opened after redrawing component if it was opened ont hte moment of calling', function (done) { _harness.default.testCreate(_Component.default, _comp.default).then(function (component) { component.componentModal.openModal(); component.redraw().then(function () { var isVisible = !component.componentModal.refs.modalWrapper.classList.contains('component-rendering-hidden'); (0, _powerAssert.default)(isVisible); done(); }).catch(done); }).catch(done); }); }); }); it('Should return value for HTML mode', function () { return _harness.default.testCreate(_Component.default, _fixtures.comp1).then(function (component) { _powerAssert.default.equal(component.itemValueForHTMLMode(['option 1', 'option 2', 'option 3']), 'option 1, option 2, option 3'); _powerAssert.default.equal(component.itemValueForHTMLMode(['option 1', ['option 2', 'option 3']]), 'option 1, option 2, option 3'); _powerAssert.default.equal(component.itemValueForHTMLMode(['2020-03-18T15:00:00.000Z', '2020-03-31T09:05:00.000Z']), '2020-03-18T15:00:00.000Z, 2020-03-31T09:05:00.000Z'); _powerAssert.default.equal(component.itemValueForHTMLMode('test'), 'test'); }); }); it('Should protect against change loops', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); var formJson = { components: [{ key: 'textField', label: 'Text Field', type: 'textfield', calculateValue: "value = value + '_calculated'" }] }; form.setForm(formJson).then(function () { var textField = form.getComponent('textField'); var spy = _sinon.default.spy(textField, 'calculateComponentValue'); form.onChange({ textField: 'test' }); setTimeout(function () { (0, _chai.expect)(spy.calledOnce).to.be.true; done(); }, 500); }).catch(function (err) { return done(err); }); }); it('Should mark as invalid only invalid fields in multiple components', function (done) { var formElement = document.createElement('div'); var form = new _Webform.default(formElement); var formJson = { components: [{ label: 'Email', tableView: true, multiple: true, validate: { required: true }, key: 'email', type: 'email', input: true }] }; form.setForm(formJson).then(function () { return form.setSubmission({ data: { email: ['oleg@form.io', 'oleg@form', ''] } }); }).then(function () { setTimeout(function () { var email = form.getComponent('email'); (0, _chai.expect)(email.refs.input[0].classList.contains('is-invalid')).to.be.false; (0, _chai.expect)(email.refs.input[1].classList.contains('is-invalid')).to.be.true; (0, _chai.expect)(email.refs.input[2].classList.contains('is-invalid')).to.be.true; done(); }, 300); }).catch(done); }); describe('shouldDisplayRedAsterisk', function () { it('modalPreview template should have className "field-required" if component is required', function (done) { _harness.default.testCreate(_Component.default, (0, _merge2.default)({}, _comp2.default, { validate: { required: true } })).then(function (cmp) { _powerAssert.default.equal(!!cmp.element.querySelector('.field-required'), true); done(); }, done).catch(done); }); });