@novo-learning/novo-sdk
Version:
SDK for the Novolanguage Speech Analysis API
139 lines • 4.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const merge_deep_1 = require("./merge-deep");
const mergeSource = Object.freeze({
level1: true,
sibling: 10,
inner: {
level2: true,
sibling: 100,
},
});
describe('Merge deep merges properties', () => {
const cases = [
[{ source: mergeSource, changes: [] }, mergeSource],
[{ source: mergeSource, changes: [{}] }, mergeSource],
[
{ source: mergeSource, changes: [{ sibling: 20 }] },
{
level1: true,
sibling: 20,
inner: {
level2: true,
sibling: 100,
},
},
],
[
{ source: mergeSource, changes: [{ inner: { sibling: 200 } }] },
{
level1: true,
sibling: 10,
inner: {
level2: true,
sibling: 200,
},
},
],
[
{ source: mergeSource, changes: [{ inner: { sibling: 200 }, sibling: 20 }] },
{
level1: true,
sibling: 20,
inner: {
level2: true,
sibling: 200,
},
},
],
[
{ source: mergeSource, changes: [{ inner: { sibling: 300 } }, { sibling: 30 }] },
{
level1: true,
sibling: 30,
inner: {
level2: true,
sibling: 300,
},
},
],
[
{ source: mergeSource, changes: [{ extra: true }] },
{
...mergeSource,
extra: true,
},
],
[
{ source: mergeSource, changes: [{ inner: { extra: true } }] },
{
...mergeSource,
inner: { ...mergeSource.inner, extra: true },
},
],
];
test.each(cases)('merge deep', ({ source, changes }, expectedResult) => {
const target = structuredClone(source);
const result = (0, merge_deep_1.mergeDeep)(target, ...changes);
expect(result).toEqual(expectedResult);
expect(target).toEqual(expectedResult);
});
const casesPrototype = [
[
{
source: mergeSource,
changes: [
{
constructor: () => {
console.error('');
},
},
],
},
mergeSource,
],
[{ source: mergeSource, changes: [{ __proto__: { test: true } }] }, mergeSource],
[{ source: mergeSource, changes: [{ prototype: { test: true } }] }, mergeSource],
[
{ source: mergeSource, changes: [{ sibling: 20, __proto__: { test: true } }] },
{
level1: true,
sibling: 20,
inner: {
level2: true,
sibling: 100,
},
},
],
[
{
source: mergeSource,
changes: [
{
sibling: 20,
inner: {
constructor: () => {
console.error('');
},
},
},
],
},
{
level1: true,
sibling: 20,
inner: {
level2: true,
sibling: 100,
},
},
],
];
test.each(casesPrototype)('merge deep does not pollute prototype', ({ source, changes }, expectedResult) => {
const target = structuredClone(source);
const result = (0, merge_deep_1.mergeDeep)(target, ...changes);
expect(result).toEqual(expectedResult);
expect(target).toEqual(expectedResult);
});
});
//# sourceMappingURL=merge-deep.spec.js.map