fewer
Version:
A minimal ORM for Node.js.
88 lines • 4.67 kB
JavaScript
;
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