82 lines
3.2 KiB
JavaScript
82 lines
3.2 KiB
JavaScript
define(["require", "exports", "./merge"], function (require, exports, merge_1) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
describe('merge', function () {
|
|
it('can merge', function () {
|
|
expect((0, merge_1.merge)({}, { a: 1, b: 0 }, { b: 2 })).toEqual({
|
|
a: 1,
|
|
b: 2,
|
|
});
|
|
});
|
|
it('can handle falsey', function () {
|
|
expect((0, merge_1.merge)({}, null, undefined, false, { a: '1' }, { b: '2' }, { b: undefined })).toEqual({
|
|
a: '1',
|
|
b: undefined,
|
|
});
|
|
});
|
|
it('can handle null values', function () {
|
|
expect((0, merge_1.merge)({}, { a: null })).toEqual({
|
|
a: null,
|
|
});
|
|
});
|
|
it('can handle array values', function () {
|
|
expect((0, merge_1.merge)({}, { a: [1, 2] })).toEqual({ a: [1, 2] });
|
|
});
|
|
it('can merge deeply', function () {
|
|
expect((0, merge_1.merge)({}, { b: 0 }, { a: { c: 1 } }, { a: { c: 2 } })).toEqual({
|
|
a: { c: 2 },
|
|
b: 0,
|
|
});
|
|
});
|
|
it('can handle cycles', function () {
|
|
var obj = {
|
|
foo: undefined,
|
|
};
|
|
obj.foo = obj;
|
|
expect((0, merge_1.merge)({}, obj)).toEqual({ foo: obj });
|
|
});
|
|
it('can handle deep cycles', function () {
|
|
var obj = {
|
|
foo: {
|
|
bar: {
|
|
baz: undefined,
|
|
},
|
|
},
|
|
};
|
|
obj.foo.bar.baz = obj;
|
|
var result = (0, merge_1.merge)({}, obj);
|
|
expect(result).toEqual({ foo: { bar: { baz: obj } } });
|
|
expect(result.foo).not.toBe(obj.foo);
|
|
expect(result.foo.bar.baz).toBe(obj);
|
|
});
|
|
it('can handle prototype pollution', function () {
|
|
var obj1 = {
|
|
__proto__: { payload: 'malicious value' },
|
|
constructor: { foo: 'malicious value' },
|
|
};
|
|
// used to check it keeps other properties
|
|
var obj2 = {
|
|
__proto__: { payload: 'malicious value' },
|
|
prototype: { payload: 'malicious value' },
|
|
constructor: { foo: 'malicious value' },
|
|
foo: { bar: 'baz' },
|
|
};
|
|
// used to check deep cycles
|
|
var obj3 = {
|
|
__proto__: { payload: 'malicious value' },
|
|
constructor: { foo: 'malicious value' },
|
|
a: { b: 'baz', __proto__: { payload: 'malicious value' } },
|
|
};
|
|
expect((0, merge_1.merge)({}, obj1)).toEqual({});
|
|
expect((0, merge_1.merge)({}, obj2)).toEqual({ foo: { bar: 'baz' } });
|
|
expect((0, merge_1.merge)({}, obj1, obj2)).toEqual({ foo: { bar: 'baz' } });
|
|
// Checking that merge keeps target properties but doesn't merge malicious properties
|
|
expect((0, merge_1.merge)(obj1, obj2, obj3)).toEqual({
|
|
a: { b: 'baz' },
|
|
constructor: { foo: 'malicious value' },
|
|
foo: { bar: 'baz' },
|
|
});
|
|
});
|
|
});
|
|
});
|
|
//# sourceMappingURL=merge.test.js.map
|