UNPKG

acebase-core

Version:

Shared AceBase core components, no need to install manually

354 lines 18.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const schema_1 = require("./schema"); describe('schema', () => { const ok = { ok: true }; it('can be defined with strings and objects', async () => { // Try using string type definitions const clientSchema1 = new schema_1.SchemaDefinition({ name: 'string', url: 'string', email: 'string', 'contacts?': { '*': { type: 'string', name: 'string', email: 'string', telephone: 'string', }, }, 'addresses?': { '*': { type: '"postal"|"visit"', street: 'string', nr: 'number', city: 'string', 'state?': 'string', country: '"nl"|"be"|"de"|"fr"', }, }, }); // Test if we can add client without contacts and addresses let result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '' }, false); expect(result).toEqual({ ok: true }); // Test without email result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '' }, false); expect(result.ok).toBeFalse(); // Test with wrong email data type result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: 35 }, false); expect(result.ok).toBeFalse(); // Test with invalid property result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', wrong: 'not allowed' }, false); expect(result.ok).toBeFalse(); // Test with wrong contact result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: 'none' }, false); expect(result.ok).toBeFalse(); // Test with empty contacts result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: {} }, false); expect(result).toEqual({ ok: true }); // Test with wrong contact item data type result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: { contact1: 'wrong contact' } }, false); expect(result.ok).toBeFalse(); // Test with ok contact item result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: { contact1: { type: 'sales', name: 'John', email: '', telephone: '' } } }, false); expect(result).toEqual({ ok: true }); // Test wrong contact item on target path result = clientSchema1.check('clients/client1', 'wrong contact', false, ['contacts', 'contact1']); expect(result.ok).toBeFalse(); // Test with ok contact item on target path result = clientSchema1.check('clients/client1', { type: 'sales', name: 'John', email: '', telephone: '' }, false, ['contacts', 'contact1']); expect(result).toEqual({ ok: true }); // Test updating a single property result = clientSchema1.check('clients/client1', { name: 'John' }, true); expect(result).toEqual({ ok: true }); // Test removing a mandatory property result = clientSchema1.check('clients/client1', { name: null }, true); expect(result.ok).toBeFalse(); // Test removing an optional property result = clientSchema1.check('clients/client1', { addresses: null }, true); expect(result).toEqual({ ok: true }); // Test removing an unknown property result = clientSchema1.check('clients/client1', { unknown: null }, true); expect(result).toEqual({ ok: true }); // Try using classnames & regular expressions const emailRegex = /[a-z.\-_]+@(?:[a-z\-_]+\.){1,}[a-z]{2,}$/i; const clientSchema2 = new schema_1.SchemaDefinition({ name: String, url: /^https:\/\//, email: emailRegex, 'contacts?': { '*': { type: String, name: String, email: emailRegex, telephone: /^\+[0-9\-]{10,}$/, }, }, 'addresses?': { '*': { type: '"postal"|"visit"', street: String, nr: Number, city: String, 'state?': String, country: /^[A-Z]{2}$/, }, }, }); // Test valid input result = clientSchema2.check('clients/client1', { name: 'My client', url: 'https://client.com', email: 'info@client.com' }, false); expect(result).toEqual({ ok: true }); // Test with empty email result = clientSchema2.check('clients/client1', '', false, ['email']); expect(result.ok).toBeFalse(); // Test with invalid email result = clientSchema2.check('clients/client1', 'not valid @address.com', false, ['email']); expect(result.ok).toBeFalse(); // Test with valid email result = clientSchema2.check('clients/client1', 'test@address.com', false, ['email']); expect(result).toEqual({ ok: true }); // Test valid address result = clientSchema2.check('clients/client1', { type: 'visit', street: 'Main', nr: 253, city: 'Capital', country: 'NL' }, false, ['addresses', 'address1']); expect(result).toEqual({ ok: true }); // Test invalid address type result = clientSchema2.check('clients/client1', { type: 'invalid', street: 'Main', nr: 253, city: 'Capital', country: 'NL' }, false, ['addresses', 'address1']); expect(result.ok).toBeFalse(); // Test invalid country (lowercase) result = clientSchema2.check('clients/client1', { type: 'postal', street: 'Main', nr: 253, city: 'Capital', country: 'nl' }, false, ['addresses', 'address1']); expect(result.ok).toBeFalse(); // Test updating property to valid value result = clientSchema2.check('clients/client1', { country: 'NL' }, true, ['addresses', 'address1']); expect(result).toEqual({ ok: true }); // Test updating property to invalid value result = clientSchema2.check('clients/client1', { country: 'nl' }, true, ['addresses', 'address1']); expect(result.ok).toBeFalse(); // Test updating target to valid value result = clientSchema2.check('clients/client1', 'NL', true, ['addresses', 'address1', 'country']); expect(result).toEqual({ ok: true }); // Test updating target to invalid value result = clientSchema2.check('clients/client1', 'nl', true, ['addresses', 'address1', 'country']); expect(result.ok).toBeFalse(); // Create new schema to test static values const staticValuesSchema = new schema_1.SchemaDefinition({ 'bool?': true, 'int?': 35, 'float?': 101.101, }); // Test valid boolean value: result = staticValuesSchema.check('static', { bool: true }, false); expect(result).toEqual({ ok: true }); // Test invalid boolean value: result = staticValuesSchema.check('static', { bool: false }, false); expect(result.ok).toBeFalse(); // Test valid int value: result = staticValuesSchema.check('static', { int: 35 }, false); expect(result).toEqual({ ok: true }); // Test invalid int value: result = staticValuesSchema.check('static', { int: 2323 }, false); expect(result.ok).toBeFalse(); // Test valid float value: result = staticValuesSchema.check('static', { float: 101.101 }, false); expect(result).toEqual({ ok: true }); // Test invalid float value: result = staticValuesSchema.check('static', { float: 897.452 }, false); expect(result.ok).toBeFalse(); }); it('with warnOnly enabled', async () => { const warnOptions = { warnOnly: true, warnCallback: (warning) => { console.log(`Expected warning: ${warning}`); }, }; // Try using string type definitions const clientSchema1 = new schema_1.SchemaDefinition({ name: 'string', url: 'string', email: 'string', 'contacts?': { '*': { type: 'string', name: 'string', email: 'string', telephone: 'string', }, }, 'addresses?': { '*': { type: '"postal"|"visit"', street: 'string', nr: 'number', city: 'string', 'state?': 'string', country: '"nl"|"be"|"de"|"fr"', }, }, }, warnOptions); // Test if we can add client without contacts and addresses let result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '' }, false); expect(result).toEqual({ ok: true }); // Test without email result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '' }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with wrong email data type result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: 35 }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with invalid property result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', wrong: 'not allowed' }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with wrong contact result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: 'none' }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with empty contacts result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: {} }, false); expect(result).toEqual({ ok: true }); // Test with wrong contact item data type result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: { contact1: 'wrong contact' } }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with ok contact item result = clientSchema1.check('clients/client1', { name: 'Ewout', url: '', email: '', contacts: { contact1: { type: 'sales', name: 'John', email: '', telephone: '' } } }, false); expect(result).toEqual({ ok: true }); // Test wrong contact item on target path result = clientSchema1.check('clients/client1', 'wrong contact', false, ['contacts', 'contact1']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with ok contact item on target path result = clientSchema1.check('clients/client1', { type: 'sales', name: 'John', email: '', telephone: '' }, false, ['contacts', 'contact1']); expect(result).toEqual({ ok: true }); // Test updating a single property result = clientSchema1.check('clients/client1', { name: 'John' }, true); expect(result).toEqual({ ok: true }); // Test removing a mandatory property result = clientSchema1.check('clients/client1', { name: null }, true); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test removing an optional property result = clientSchema1.check('clients/client1', { addresses: null }, true); expect(result).toEqual({ ok: true }); // Test removing an unknown property result = clientSchema1.check('clients/client1', { unknown: null }, true); expect(result).toEqual({ ok: true }); // Try using classnames & regular expressions const emailRegex = /[a-z.\-_]+@(?:[a-z\-_]+\.){1,}[a-z]{2,}$/i; const clientSchema2 = new schema_1.SchemaDefinition({ name: String, url: /^https:\/\//, email: emailRegex, 'contacts?': { '*': { type: String, name: String, email: emailRegex, telephone: /^\+[0-9\-]{10,}$/, }, }, 'addresses?': { '*': { type: '"postal"|"visit"', street: String, nr: Number, city: String, 'state?': String, country: /^[A-Z]{2}$/, }, }, }, warnOptions); // Test valid input result = clientSchema2.check('clients/client1', { name: 'My client', url: 'https://client.com', email: 'info@client.com' }, false); expect(result).toEqual({ ok: true }); // Test with empty email result = clientSchema2.check('clients/client1', '', false, ['email']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with invalid email result = clientSchema2.check('clients/client1', 'not valid @address.com', false, ['email']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test with valid email result = clientSchema2.check('clients/client1', 'test@address.com', false, ['email']); expect(result).toEqual({ ok: true }); // Test valid address result = clientSchema2.check('clients/client1', { type: 'visit', street: 'Main', nr: 253, city: 'Capital', country: 'NL' }, false, ['addresses', 'address1']); expect(result).toEqual({ ok: true }); // Test invalid address type result = clientSchema2.check('clients/client1', { type: 'invalid', street: 'Main', nr: 253, city: 'Capital', country: 'NL' }, false, ['addresses', 'address1']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test invalid country (lowercase) result = clientSchema2.check('clients/client1', { type: 'postal', street: 'Main', nr: 253, city: 'Capital', country: 'nl' }, false, ['addresses', 'address1']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test updating property to valid value result = clientSchema2.check('clients/client1', { country: 'NL' }, true, ['addresses', 'address1']); expect(result).toEqual({ ok: true }); // Test updating property to invalid value result = clientSchema2.check('clients/client1', { country: 'nl' }, true, ['addresses', 'address1']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test updating target to valid value result = clientSchema2.check('clients/client1', 'NL', true, ['addresses', 'address1', 'country']); expect(result).toEqual({ ok: true }); // Test updating target to invalid value result = clientSchema2.check('clients/client1', 'nl', true, ['addresses', 'address1', 'country']); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Create new schema to test static values const staticValuesSchema = new schema_1.SchemaDefinition({ 'bool?': true, 'int?': 35, 'float?': 101.101, }, warnOptions); // Test valid boolean value: result = staticValuesSchema.check('static', { bool: true }, false); expect(result).toEqual({ ok: true }); // Test invalid boolean value: result = staticValuesSchema.check('static', { bool: false }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test valid int value: result = staticValuesSchema.check('static', { int: 35 }, false); expect(result).toEqual({ ok: true }); // Test invalid int value: result = staticValuesSchema.check('static', { int: 2323 }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); // Test valid float value: result = staticValuesSchema.check('static', { float: 101.101 }, false); expect(result).toEqual({ ok: true }); // Test invalid float value: result = staticValuesSchema.check('static', { float: 897.452 }, false); expect(result.ok).toBeTrue(); expect(result.reason).not.toBeUndefined(); expect(result.warning).not.toBeUndefined(); }); it('type Object must allow any property', async () => { const schema = new schema_1.SchemaDefinition('Object'); let result = schema.check('generic-object', { custom: 'allowed' }, false); expect(result).toEqual(ok); result = schema.check('generic-object', 'allowed', false, ['custom']); expect(result).toEqual(ok); result = schema.check('generic-object', 'NOT allowed', false); expect(result.ok).toBeFalse(); }); }); //# sourceMappingURL=schema.spec.js.map