UNPKG

@deskpro/react-forms

Version:
469 lines (390 loc) 20.1 kB
'use strict'; var _Value = require('../Value'); var _Schema = require('../Schema'); /** * @copyright 2016, Prometheus Research, LLC */ describe('Value', function () { describe('isValue(maybeValue)', function () { it('returns true if value is passed and false otherwise', function () { assert((0, _Value.isValue)((0, _Value.create)())); assert(!(0, _Value.isValue)({})); }); }); describe('create(spec)', function () { it('works without schema', function () { var value = (0, _Value.create)(); assert.deepEqual(value.select('a').parent, value); assert.deepEqual(value.select('a.b').parent, value.select('a')); }); }); describe('.parent', function () { it('allows to access parent value', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)() }) }); var value = (0, _Value.create)({ schema: schema }); assert(value.parent === null); assert.deepEqual(value.select('a').parent, value); assert.deepEqual(value.select('a.b').parent, value.select('a')); }); }); describe('.select()', function () { it('propagates schema when selecting subvalues', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)() }), c: (0, _Schema.array)({ d: (0, _Schema.string)() }), e: (0, _Schema.string)() }); var value = (0, _Value.create)({ schema: schema }); assert.deepEqual(value.select('a').schema, schema.properties.a); assert.deepEqual(value.select('a.b').schema, schema.properties.a.properties.b); assert.deepEqual(value.select(['a', 'b']).schema, schema.properties.a.properties.b); assert.deepEqual(value.select('c').schema, schema.properties.c); assert.deepEqual(value.select('c.0').schema, schema.properties.c.items); assert.deepEqual(value.select(['c', '0']).schema, schema.properties.c.items); assert.deepEqual(value.select(['c', 0]).schema, schema.properties.c.items); assert.deepEqual(value.select('c.1').schema, schema.properties.c.items); assert.deepEqual(value.select('c.2').schema, schema.properties.c.items); assert.deepEqual(value.select('e').schema, schema.properties.e); }); it('allows to select all errors and sub errors', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }), c: (0, _Schema.string)({ isRequired: true }) }), aa: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }), c: (0, _Schema.string)({ isRequired: true }) }) }); var value = (0, _Value.create)({ schema: schema, value: { a: {}, aa: {} } }); assert.deepEqual(value.select('a').completeErrorList, [{ field: 'data.a.b', message: 'is required', schema: schema.properties.a.properties.b }, { field: 'data.a.c', message: 'is required', schema: schema.properties.a.properties.c }]); assert.deepEqual(value.select('aa').completeErrorList, [{ field: 'data.aa.b', message: 'is required', schema: schema.properties.a.properties.b }, { field: 'data.aa.c', message: 'is required', schema: schema.properties.a.properties.c }]); }); it('propagates errors when selecting subvalues (through objects)', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }) }, { isRequired: true }), c: (0, _Schema.array)((0, _Schema.string)(), { minItems: 1 }), e: (0, _Schema.string)({ isRequired: true }) }); var value = (0, _Value.create)({ schema: schema }); assert.deepEqual(value.errorList, []); assert.deepEqual(value.completeErrorList, [{ field: 'data.a', message: 'is required', schema: schema.properties.a }, { field: 'data.e', message: 'is required', schema: schema.properties.e }, { field: 'data.a.b', message: 'is required', schema: schema.properties.a.properties.b }, { field: 'data.c', message: 'has less items than allowed', schema: schema.properties.c }]); assert.deepEqual(value.select('a').errorList, [{ field: 'data.a', message: 'is required', schema: schema.properties.a }]); assert.deepEqual(value.select('a').completeErrorList, [{ field: 'data.a', message: 'is required', schema: schema.properties.a }, { field: 'data.a.b', message: 'is required', schema: schema.properties.a.properties.b }]); assert.deepEqual(value.select('a.b').errorList, [{ field: 'data.a.b', message: 'is required', schema: schema.properties.a.properties.b }]); assert.deepEqual(value.select('a.b').completeErrorList, [{ field: 'data.a.b', message: 'is required', schema: schema.properties.a.properties.b }]); assert.deepEqual(value.select('c').errorList, [{ field: 'data.c', message: 'has less items than allowed', schema: schema.properties.c }]); assert.deepEqual(value.select('c').completeErrorList, [{ field: 'data.c', message: 'has less items than allowed', schema: schema.properties.c }]); assert.deepEqual(value.select('c.0').errorList, []); assert.deepEqual(value.select('c.0').completeErrorList, []); assert.deepEqual(value.select('c.1').errorList, []); assert.deepEqual(value.select('c.1').completeErrorList, []); assert.deepEqual(value.select('e').errorList, [{ field: 'data.e', message: 'is required', schema: schema.properties.e }]); assert.deepEqual(value.select('e').completeErrorList, [{ field: 'data.e', message: 'is required', schema: schema.properties.e }]); }); it('propagates value', function () { var v = { a: { b: 'b' }, c: ['s'], e: 'e' }; var value = (0, _Value.create)({ value: v }); assert.deepEqual(value.value, v); assert.deepEqual(value.select('a').value, v.a); assert.deepEqual(value.select('a.b').value, v.a.b); assert.deepEqual(value.select('c').value, v.c); assert.deepEqual(value.select('c.0').value, v.c[0]); assert.deepEqual(value.select('c.1').value, v.c[1]); assert.deepEqual(value.select('e').value, v.e); }); it('propagates params', function () { var params = { a: 1 }; var value = (0, _Value.create)({ params: params }); assert.deepEqual(value.params, params); assert.deepEqual(value.select('a').params, params); assert.deepEqual(value.select('a.b').params, params); }); it('propagates no errors if no errors are present', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }) }, { isRequired: true }), c: (0, _Schema.array)((0, _Schema.string)(), { minItems: 1 }), e: (0, _Schema.string)({ isRequired: true }) }); var value = (0, _Value.create)({ schema: schema, value: { a: { b: 'b' }, c: ['s'], e: 'e' } }); assert.deepEqual(value.errorList, []); assert.deepEqual(value.completeErrorList, []); assert.deepEqual(value.select('a').errorList, []); assert.deepEqual(value.select('a').completeErrorList, []); assert.deepEqual(value.select('a.b').errorList, []); assert.deepEqual(value.select('a.b').completeErrorList, []); assert.deepEqual(value.select('c').errorList, []); assert.deepEqual(value.select('c').completeErrorList, []); assert.deepEqual(value.select('c.0').errorList, []); assert.deepEqual(value.select('c.0').completeErrorList, []); assert.deepEqual(value.select('c.1').errorList, []); assert.deepEqual(value.select('c.1').completeErrorList, []); assert.deepEqual(value.select('e').errorList, []); assert.deepEqual(value.select('e').completeErrorList, []); }); it('propagates errors in array items', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }) }, { isRequired: true }), c: (0, _Schema.array)((0, _Schema.string)(), { minItems: 1 }), e: (0, _Schema.string)({ isRequired: true }) }); var value = (0, _Value.create)({ schema: schema, value: { a: { b: 'b' }, c: ['s', 1], e: 'e' } }); assert.deepEqual(value.errorList, []); assert.deepEqual(value.completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('a').errorList, []); assert.deepEqual(value.select('a').completeErrorList, []); assert.deepEqual(value.select('a.b').errorList, []); assert.deepEqual(value.select('a.b').completeErrorList, []); assert.deepEqual(value.select('c').errorList, []); assert.deepEqual(value.select('c').completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('c.0').errorList, []); assert.deepEqual(value.select('c.0').completeErrorList, []); assert.deepEqual(value.select('c.1').errorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('c.1').completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('e').errorList, []); assert.deepEqual(value.select('e').completeErrorList, []); }); it('propagates errors in array items', function () { var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }) }, { isRequired: true }), c: (0, _Schema.array)((0, _Schema.string)(), { minItems: 1 }), e: (0, _Schema.string)({ isRequired: true }) }); var value = (0, _Value.create)({ schema: schema, value: { a: { b: 'b' }, c: ['s', 1], e: 'e' } }); assert.deepEqual(value.errorList, []); assert.deepEqual(value.completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('a').errorList, []); assert.deepEqual(value.select('a').completeErrorList, []); assert.deepEqual(value.select('a.b').errorList, []); assert.deepEqual(value.select('a.b').completeErrorList, []); assert.deepEqual(value.select('c').errorList, []); assert.deepEqual(value.select('c').completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('c.0').errorList, []); assert.deepEqual(value.select('c.0').completeErrorList, []); assert.deepEqual(value.select('c.1').errorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('c.1').completeErrorList, [{ field: 'data.c.1', message: 'is the wrong type', schema: schema.properties.c.items }]); assert.deepEqual(value.select('e').errorList, []); assert.deepEqual(value.select('e').completeErrorList, []); }); }); describe('.update()', function () { it('works without schema', function () { var value = (0, _Value.create)(); var nextValue = value.select('a.0.b').update(42).root; assert.deepEqual(nextValue.value, { a: [{ b: 42 }] }); }); var schema = (0, _Schema.object)({ a: (0, _Schema.object)({ b: (0, _Schema.string)({ isRequired: true }) }, { isRequired: true }), c: (0, _Schema.array)((0, _Schema.string)(), { minItems: 1 }), e: (0, _Schema.string)({ isRequired: true }) }); it('allows to update root value', function () { var value = (0, _Value.create)({ schema: schema, value: {} }); var nextValue = value.update({ a: 1 }).root; assert.deepEqual(nextValue.value, { a: 1 }); }); it('allows to update scalar value', function () { var value = (0, _Value.create)({ schema: schema, value: {} }); var nextValue = value.select('e').update('UPDATED').root; assert.deepEqual(nextValue.value, { e: 'UPDATED' }); }); it('allows to update scalar value deep inside object', function () { var value = (0, _Value.create)({ schema: schema, value: {} }); var nextValue = value.select('a.b').update('UPDATED').root; assert.deepEqual(nextValue.value, { a: { b: 'UPDATED' } }); }); it('allows to update scalar value deep inside array', function () { var value = (0, _Value.create)({ schema: schema, value: {} }); var nextValue = value.select('c.0').update('UPDATED').root; assert(Array.isArray(nextValue.value.c)); assert.deepEqual(nextValue.value, { c: ['UPDATED'] }); }); }); describe('.setSchema()', function () { it('updates schema at the root', function () { var schema1 = { type: 'object', properties: { a: { type: 'number' } } }; var schema2 = { type: 'object', properties: { a: { type: 'string' } } }; var value = (0, _Value.create)({ schema: schema1, value: { a: 'string!' } }); assert.deepEqual(value.schema, schema1); assert.deepEqual(value.value, { a: 'string!' }); assert(value.completeErrorList.length === 1); value = value.setSchema(schema2); assert.deepEqual(value.schema, schema2); assert.deepEqual(value.value, { a: 'string!' }); assert(value.completeErrorList.length === 0); }); }); describe('.addError()', function () { it('adds a new error at root', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); assert(value.completeErrorList.length === 0); value = value.addError({ message: 'message' }); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); var error = value.errorList[0]; assert(error.message === 'message'); assert(onChange.calledOnce); }); it('adds a new error at branch', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }).select('a.b'); assert(value.completeErrorList.length === 0); value = value.addError({ message: 'message' }); assert.deepEqual(value.keyPath, ['a', 'b']); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); assert(value.root.completeErrorList.length === 1); assert(value.root.errorList.length === 0); var error = value.errorList[0]; assert(error.message === 'message'); assert(onChange.calledOnce); }); it('adds a new error (quiet)', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); value = value.addError({ message: 'message' }, true); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); assert(onChange.callCount === 0); }); }); describe('.removeError()', function () { it('removes an error from root', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); assert(value.completeErrorList.length === 0); value = value.addError({ message: 'message' }); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); var error = value.errorList[0]; value = value.removeError(error); assert(value.completeErrorList.length === 0); assert(value.errorList.length === 0); assert(onChange.calledTwice); }); it('returns self if no error is found to remove', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); assert(value === value.removeError({})); assert(onChange.callCount === 0); }); it('removes an error from branch', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }).select('a.b'); assert(value.completeErrorList.length === 0); value = value.addError({ message: 'message' }); assert.deepEqual(value.keyPath, ['a', 'b']); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); assert(value.root.completeErrorList.length === 1); assert(value.root.errorList.length === 0); var error = value.errorList[0]; value = value.removeError(error); assert.deepEqual(value.keyPath, ['a', 'b']); assert(onChange.calledTwice); assert(value.completeErrorList.length === 0); assert(value.errorList.length === 0); assert(value.root.completeErrorList.length === 0); assert(value.root.errorList.length === 0); }); it('removes an error (quiet)', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); value = value.addError({ message: 'message' }, true); var error = value.errorList[0]; value = value.removeError(error, true); assert(onChange.callCount === 0); }); }); describe('.updateError()', function () { it('updates a list of errors', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); assert(value.completeErrorList.length === 0); value = value.updateError({ message: 'message' }); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); var error = value.errorList[0]; assert(error.message === 'message'); assert(onChange.calledOnce); value = value.updateError({ message: 'message' }); assert(value.completeErrorList.length === 1); }); it('updates a lisr of errors at branch', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }).select('a.b'); assert(value.completeErrorList.length === 0); value = value.updateError({ message: 'message' }); assert.deepEqual(value.keyPath, ['a', 'b']); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); assert(value.root.completeErrorList.length === 1); assert(value.root.errorList.length === 0); var error = value.errorList[0]; assert(error.message === 'message'); assert(onChange.calledOnce); }); it('updates a list of errors (quiet)', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); value = value.updateError({ message: 'message' }, true); assert(value.completeErrorList.length === 1); assert(value.errorList.length === 1); assert(onChange.callCount === 0); }); }); describe('.updateParams()', function () { it('updates params', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }).select('a.b'); assert.deepEqual(value.params, {}); value = value.updateParams({ a: 1 }); assert.deepEqual(value.keyPath, ['a', 'b']); assert.deepEqual(value.params, { a: 1 }); assert(onChange.calledOnce); value = value.updateParams({ b: 2 }); assert.deepEqual(value.params, { a: 1, b: 2 }); }); it('updates params (quiet)', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }).select('a.b'); value = value.updateParams({ a: 1 }, true); assert(onChange.callCount === 0); }); }); describe('suppressing updates', function () { it('suppresses updates during updating value', function () { var onChange = sinon.spy(); var value = (0, _Value.create)({ onChange: onChange }); var nextValue = (0, _Value.suppressUpdate)(function () { return value.select('a.0.b').update(42).root; }); assert.deepEqual(nextValue.value, { a: [{ b: 42 }] }); assert(onChange.callCount === 0); }); }); });