merge.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. var merge = require('../')
  2. var test = require('tap').test
  3. test('add keys in target that do not exist at the root', function (t) {
  4. var src = { key1: 'value1', key2: 'value2' }
  5. target = {}
  6. var res = merge(target, src)
  7. t.deepEqual(target, {}, 'merge should be immutable')
  8. t.deepEqual(res, src)
  9. t.end()
  10. })
  11. test('merge existing simple keys in target at the roots', function (t) {
  12. var src = { key1: 'changed', key2: 'value2' }
  13. var target = { key1: 'value1', key3: 'value3' }
  14. var expected = {
  15. key1: 'changed',
  16. key2: 'value2',
  17. key3: 'value3'
  18. }
  19. t.deepEqual(target, { key1: 'value1', key3: 'value3' })
  20. t.deepEqual(merge(target, src), expected)
  21. t.end()
  22. })
  23. test('merge nested objects into target', function (t) {
  24. var src = {
  25. key1: {
  26. subkey1: 'changed',
  27. subkey3: 'added'
  28. }
  29. }
  30. var target = {
  31. key1: {
  32. subkey1: 'value1',
  33. subkey2: 'value2'
  34. }
  35. }
  36. var expected = {
  37. key1: {
  38. subkey1: 'changed',
  39. subkey2: 'value2',
  40. subkey3: 'added'
  41. }
  42. }
  43. t.deepEqual(target, {
  44. key1: {
  45. subkey1: 'value1',
  46. subkey2: 'value2'
  47. }
  48. })
  49. t.deepEqual(merge(target, src), expected)
  50. t.end()
  51. })
  52. test('replace simple key with nested object in target', function (t) {
  53. var src = {
  54. key1: {
  55. subkey1: 'subvalue1',
  56. subkey2: 'subvalue2'
  57. }
  58. }
  59. var target = {
  60. key1: 'value1',
  61. key2: 'value2'
  62. }
  63. var expected = {
  64. key1: {
  65. subkey1: 'subvalue1',
  66. subkey2: 'subvalue2'
  67. },
  68. key2: 'value2'
  69. }
  70. t.deepEqual(target, { key1: 'value1', key2: 'value2' })
  71. t.deepEqual(merge(target, src), expected)
  72. t.end()
  73. })
  74. test('should add nested object in target', function(t) {
  75. var src = {
  76. "b": {
  77. "c": {}
  78. }
  79. }
  80. var target = {
  81. "a": {}
  82. }
  83. var expected = {
  84. "a": {},
  85. "b": {
  86. "c": {}
  87. }
  88. }
  89. t.deepEqual(merge(target, src), expected)
  90. t.end()
  91. })
  92. test('should replace object with simple key in target', function (t) {
  93. var src = { key1: 'value1' }
  94. var target = {
  95. key1: {
  96. subkey1: 'subvalue1',
  97. subkey2: 'subvalue2'
  98. },
  99. key2: 'value2'
  100. }
  101. var expected = { key1: 'value1', key2: 'value2' }
  102. t.deepEqual(target, {
  103. key1: {
  104. subkey1: 'subvalue1',
  105. subkey2: 'subvalue2'
  106. },
  107. key2: 'value2'
  108. })
  109. t.deepEqual(merge(target, src), expected)
  110. t.end()
  111. })
  112. test('should work on simple array', function (t) {
  113. var src = ['one', 'three']
  114. var target = ['one', 'two']
  115. var expected = ['one', 'two', 'three']
  116. t.deepEqual(target, ['one', 'two'])
  117. t.deepEqual(merge(target, src), expected)
  118. t.ok(Array.isArray(merge(target, src)))
  119. t.end()
  120. })
  121. test('should work on another simple array', function(t) {
  122. var target = ["a1","a2","c1","f1","p1"];
  123. var src = ["t1","s1","c2","r1","p2","p3"];
  124. var expected = ["a1", "a2", "c1", "f1", "p1", "t1", "s1", "c2", "r1", "p2", "p3"]
  125. t.deepEqual(target, ["a1", "a2", "c1", "f1", "p1"])
  126. t.deepEqual(merge(target, src), expected)
  127. t.ok(Array.isArray(merge(target, src)))
  128. t.end()
  129. })
  130. test('should work on array properties', function (t) {
  131. var src = {
  132. key1: ['one', 'three'],
  133. key2: ['four']
  134. }
  135. var target = {
  136. key1: ['one', 'two']
  137. }
  138. var expected = {
  139. key1: ['one', 'two', 'three'],
  140. key2: ['four']
  141. }
  142. t.deepEqual(target, {
  143. key1: ['one', 'two']
  144. })
  145. t.deepEqual(merge(target, src), expected)
  146. t.ok(Array.isArray(merge(target, src).key1))
  147. t.ok(Array.isArray(merge(target, src).key2))
  148. t.end()
  149. })
  150. test('should work on array of objects', function (t) {
  151. var src = [
  152. { key1: ['one', 'three'], key2: ['one'] },
  153. { key3: ['five'] }
  154. ]
  155. var target = [
  156. { key1: ['one', 'two'] },
  157. { key3: ['four'] }
  158. ]
  159. var expected = [
  160. { key1: ['one', 'two', 'three'], key2: ['one'] },
  161. { key3: ['four', 'five'] }
  162. ]
  163. t.deepEqual(target, [
  164. { key1: ['one', 'two'] },
  165. { key3: ['four'] }
  166. ])
  167. t.deepEqual(merge(target, src), expected)
  168. t.ok(Array.isArray(merge(target, src)), 'result should be an array')
  169. t.ok(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too')
  170. t.end()
  171. })
  172. test('should work on arrays of nested objects', function(t) {
  173. var target = [
  174. { key1: { subkey: 'one' }}
  175. ]
  176. var src = [
  177. { key1: { subkey: 'two' }},
  178. { key2: { subkey: 'three' }}
  179. ]
  180. var expected = [
  181. { key1: { subkey: 'two' }},
  182. { key2: { subkey: 'three' }}
  183. ]
  184. t.deepEqual(merge(target, src), expected)
  185. t.end()
  186. })