@qntm-code/utils
Version:
A collection of useful utility functions with associated TypeScript types. All functions have been unit tested.
105 lines (104 loc) • 4.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
const freeze_1 = require("./freeze");
describe('freeze', () => {
it('should deeply freeze an object', () => {
const childArray = ['a', 10, new Date()];
const childObject = {
a: 'a',
b: 10,
c: new Date(),
};
const value = {
childArray,
childObject,
};
const frozenValue = (0, freeze_1.freeze)(value);
expect(Object.isFrozen(frozenValue)).toBe(true);
expect(Object.isFrozen(frozenValue.childArray)).toBe(true);
expect(Object.isFrozen(frozenValue.childObject)).toBe(true);
});
it('should deeply freeze symbol-keyed properties', () => {
const sym = Symbol('child');
const value = {
[sym]: { a: { b: 1 } },
};
const frozenValue = (0, freeze_1.freeze)(value);
expect(Object.isFrozen(frozenValue)).toBe(true);
expect(Object.isFrozen(frozenValue[sym])).toBe(true);
expect(Object.isFrozen(frozenValue[sym].a)).toBe(true);
});
it('should handle circular references', () => {
const value = { a: 1 };
value.self = value;
const frozenValue = (0, freeze_1.freeze)(value);
expect(Object.isFrozen(frozenValue)).toBe(true);
expect(frozenValue.self).toBe(frozenValue);
});
it('should deeply freeze an array', () => {
const childArray = ['a', 10, new Date()];
const childObject = {
a: 'a',
b: 10,
c: new Date(),
};
const value = [childArray, childObject];
const frozenValue = (0, freeze_1.freeze)(value);
expect(Object.isFrozen(frozenValue)).toBe(true);
expect(Object.isFrozen(frozenValue[0])).toBe(true);
expect(Object.isFrozen(frozenValue[1])).toBe(true);
});
it('should deeply freeze a map', () => {
const keyObject = { a: 'a' };
const valueObject = { b: 'b' };
const value = new Map([
['key1', 'value1'],
[keyObject, valueObject],
]);
const frozenValue = (0, freeze_1.freeze)(value);
expect(() => frozenValue.set('x', 'y')).toThrow();
expect(() => frozenValue.delete('key1')).toThrow();
expect(() => frozenValue.clear()).toThrow();
frozenValue.forEach((v, k) => {
expect(Object.isFrozen(k)).toBe(true);
expect(Object.isFrozen(v)).toBe(true);
});
});
it('should prevent mutation of map values like Date', () => {
const value = new Map([['d', new Date(0)]]);
const frozenValue = (0, freeze_1.freeze)(value);
const date = frozenValue.get('d');
expect(() => date.setTime(123)).toThrow();
});
it('should deeply freeze a set', () => {
const valueObject1 = { a: 'a' };
const valueObject2 = { b: 'b' };
const value = new Set(['value1', valueObject1, valueObject2]);
const frozenValue = (0, freeze_1.freeze)(value);
expect(() => frozenValue.add('x')).toThrow();
expect(() => frozenValue.delete('value1')).toThrow();
expect(() => frozenValue.clear()).toThrow();
frozenValue.forEach(v => {
expect(Object.isFrozen(v)).toBe(true);
});
});
it('should prevent mutation of Date', () => {
const value = new Date(0);
const frozenValue = (0, freeze_1.freeze)(value);
expect(() => frozenValue.setTime(123)).toThrow();
});
it('should prevent mutation of typed arrays', () => {
const value = new Uint8Array([1, 2, 3]);
const frozenValue = (0, freeze_1.freeze)(value);
expect(frozenValue[0]).toBe(1);
expect(() => {
frozenValue[0] = 9;
}).toThrow();
expect(() => frozenValue.set([4], 0)).toThrow();
expect(() => frozenValue.fill(0)).toThrow();
});
});