UNPKG

fewer

Version:

A minimal ORM for Node.js.

88 lines 4.67 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const createModel_1 = __importStar(require("../createModel")); describe('createModel', () => { it('returns a new object', () => { const obj = {}; expect(createModel_1.default(obj)).not.toBe(obj); }); it('has all of the same properties', () => { const obj = { foo: 'bar', bar: 'baz', [0]: 'number', [Symbol('sym')]: 'symbol', }; expect(createModel_1.default(obj)).toEqual(obj); }); it('contains all of the symbol properties', () => { const model = createModel_1.default({}); expect(model[createModel_1.Symbols.isModel]).toEqual(true); expect(model[createModel_1.Symbols.dirty]).toEqual(false); expect(model[createModel_1.Symbols.changed]).toEqual([]); expect(model[createModel_1.Symbols.changes]).toEqual({}); expect(model[createModel_1.Symbols.errors]).toEqual([]); expect(model[createModel_1.Symbols.valid]).toEqual(false); }); it('does not allow changing symbol properties', () => { // Type as any to suppress intentional type errors: const model = createModel_1.default({}); expect(() => (model[createModel_1.Symbols.isModel] = null)).toThrowError(); expect(() => (model[createModel_1.Symbols.dirty] = null)).toThrowError(); expect(() => (model[createModel_1.Symbols.changed] = null)).toThrowError(); expect(() => (model[createModel_1.Symbols.changes] = null)).toThrowError(); expect(() => (model[createModel_1.Symbols.errors] = null)).toThrowError(); expect(() => (model[createModel_1.Symbols.valid] = null)).toThrowError(); // Modifying the underlying properties should also fail: expect(() => model[createModel_1.Symbols.errors].push('foo')).toThrowError(); expect(() => model[createModel_1.Symbols.changes].push('foo')).toThrowError(); expect(() => (model[createModel_1.Symbols.changed]['foo'] = 'bar')).toThrowError(); }); it('is dirty after modifying a property', () => { const model = createModel_1.default({ foo: 'bar' }); model.foo = 'baz'; expect(model.foo).toEqual('baz'); expect(model[createModel_1.Symbols.dirty]).toEqual(true); expect(model[createModel_1.Symbols.changed]).toEqual(['foo']); expect(model[createModel_1.Symbols.changes]).toEqual({ foo: 'bar' }); }); it('is not dirty after resetting a property', () => { const model = createModel_1.default({ foo: 'bar' }); model.foo = 'baz'; model.foo = 'bar'; expect(model.foo).toEqual('bar'); expect(model[createModel_1.Symbols.dirty]).toEqual(false); expect(model[createModel_1.Symbols.changed]).toEqual([]); expect(model[createModel_1.Symbols.changes]).toEqual({}); }); it('handles settings validation flags accordingly', () => { // NOTE: Type as any to allow calling internal methods: const model = createModel_1.default({ foo: 'bar' }); expect(model[createModel_1.InternalSymbols.hasValidationRun]).toEqual(false); expect(model[createModel_1.Symbols.valid]).toEqual(false); model[createModel_1.InternalSymbols.setErrors]([]); expect(model[createModel_1.InternalSymbols.hasValidationRun]).toEqual(true); expect(model[createModel_1.Symbols.valid]).toEqual(true); model.foo = 'baz'; expect(model[createModel_1.InternalSymbols.hasValidationRun]).toEqual(false); expect(model[createModel_1.Symbols.valid]).toEqual(false); model[createModel_1.InternalSymbols.setErrors]([{ message: 'Some error.' }]); expect(model[createModel_1.InternalSymbols.hasValidationRun]).toEqual(true); expect(model[createModel_1.Symbols.valid]).toEqual(false); }); it('allows dynamic assignment of properties without making the object dirty', () => { // NOTE: Type as any to allow calling internal methods: const model = createModel_1.default({ one: '1', two: '2' }); model[createModel_1.InternalSymbols.dynAssign]({ two: 'two', three: '3' }); expect(model[createModel_1.Symbols.dirty]).toEqual(false); expect(model).toEqual({ one: '1', two: 'two', three: '3' }); }); }); //# sourceMappingURL=createModel.test.js.map