diff --git a/test/specs/utils/deepMerge.spec.js b/test/specs/utils/deepMerge.spec.js new file mode 100644 index 0000000..d879593 --- /dev/null +++ b/test/specs/utils/deepMerge.spec.js @@ -0,0 +1,66 @@ +var deepMerge = require('../../../lib/utils').deepMerge; + +describe('utils::deepMerge', function () { + it('should be immutable', function () { + var a = {}; + var b = {foo: 123}; + var c = {bar: 456}; + + deepMerge(a, b, c); + + expect(typeof a.foo).toEqual('undefined'); + expect(typeof a.bar).toEqual('undefined'); + expect(typeof b.bar).toEqual('undefined'); + expect(typeof c.foo).toEqual('undefined'); + }); + + it('should deepMerge properties', function () { + var a = {foo: 123}; + var b = {bar: 456}; + var c = {foo: 789}; + var d = deepMerge(a, b, c); + + expect(d.foo).toEqual(789); + expect(d.bar).toEqual(456); + }); + + it('should deepMerge recursively', function () { + var a = {foo: {bar: 123}}; + var b = {foo: {baz: 456}, bar: {qux: 789}}; + + expect(deepMerge(a, b)).toEqual({ + foo: { + bar: 123, + baz: 456 + }, + bar: { + qux: 789 + } + }); + }); + + it('should remove all references from nested objects', function () { + var a = {foo: {bar: 123}}; + var b = {}; + var d = deepMerge(a, b); + + expect(d).toEqual({ + foo: { + bar: 123 + } + }); + + expect(d.foo).not.toBe(a.foo); + }); + + it('handles null and undefined arguments', function () { + expect(deepMerge(undefined, undefined)).toEqual({}); + expect(deepMerge(undefined, {foo: 123})).toEqual({foo: 123}); + expect(deepMerge({foo: 123}, undefined)).toEqual({foo: 123}); + + expect(deepMerge(null, null)).toEqual({}); + expect(deepMerge(null, {foo: 123})).toEqual({foo: 123}); + expect(deepMerge({foo: 123}, null)).toEqual({foo: 123}); + }); +}); +