1 | expect = require 'expect.js'
|
2 | util = require 'util'
|
3 | changesets = require '../src/changesets'
|
4 | {op} = changesets
|
5 |
|
6 | describe 'changesets', ->
|
7 | oldObj = newObj = changeset = changesetWithouEmbeddedKey = null
|
8 |
|
9 | beforeEach ->
|
10 | oldObj =
|
11 | name: 'joe'
|
12 | age: 55
|
13 | mixed: 10
|
14 | nested: inner: 1
|
15 | empty: undefined
|
16 | date: new Date 'October 13, 2014 11:13:00'
|
17 | coins: [2, 5]
|
18 | toys: ['car', 'doll', 'car']
|
19 | pets: [undefined, null]
|
20 | children: [
|
21 | {name: 'kid1', age: 1, subset: [
|
22 | {id: 1, value: 'haha'}
|
23 | {id: 2, value: 'hehe'}
|
24 | ]}
|
25 | {name: 'kid2', age: 2}
|
26 | ]
|
27 |
|
28 |
|
29 | newObj =
|
30 | name: 'smith'
|
31 | mixed: '10'
|
32 | nested: inner: 2
|
33 | date: new Date 'October 13, 2014 11:13:00'
|
34 | coins: [2, 5, 1]
|
35 | toys: []
|
36 | pets: []
|
37 | children: [
|
38 | {name: 'kid3', age: 3}
|
39 | {name: 'kid1', age: 0, subset: [
|
40 | {id: 1, value: 'heihei'}
|
41 | ]}
|
42 | {name: 'kid2', age: 2}
|
43 | ]
|
44 |
|
45 |
|
46 | changeset = [
|
47 | { type: 'update', key: 'name', value: 'smith', oldValue: 'joe' }
|
48 | { type: 'remove', key: 'mixed', value: 10 }
|
49 | { type: 'add', key: 'mixed', value: '10' }
|
50 | { type: 'update', key: 'nested', changes: [
|
51 | { type: 'update', key: 'inner', value: 2, oldValue: 1}
|
52 | ]
|
53 | }
|
54 | { type: 'update', key: 'coins', embededKey: '$index', changes: [{ type: 'add', key: '2', value: 1 } ] }
|
55 | { type: 'update', key: 'toys', embededKey: '$index', changes: [
|
56 | { type: 'remove', key: '0', value: 'car' }
|
57 | { type: 'remove', key: '1', value: 'doll' }
|
58 | { type: 'remove', key: '2', value: 'car' }
|
59 | ]
|
60 | }
|
61 | { type: 'update', key: 'pets', embededKey: '$index', changes: [
|
62 | { type: 'remove', key: '0', value: undefined }
|
63 | { type: 'remove', key: '1', value: null }
|
64 | ]
|
65 | }
|
66 | { type: 'update', key: 'children', embededKey: 'name', changes: [
|
67 | { type: 'update', key: 'kid1', changes: [
|
68 | { type: 'update', key: 'age', value: 0, oldValue: 1 }
|
69 | { type: 'update', key: 'subset', embededKey: 'id', changes: [
|
70 | { type: 'update', key: 1, changes: [{ type: 'update', key: 'value', value: 'heihei', oldValue: 'haha' } ] }
|
71 | { type: 'remove', key: 2, value: {id: 2, value: 'hehe'} }
|
72 | ]
|
73 | }
|
74 | ]}
|
75 | { type: 'add', key: 'kid3', value: { name: 'kid3', age: 3 } }
|
76 | ]
|
77 | }
|
78 |
|
79 | { type: 'remove', key: 'age', value: 55 }
|
80 | { type: 'remove', key: 'empty', value: undefined }
|
81 | ]
|
82 |
|
83 | changesetWithoutEmbeddedKey = [
|
84 | { type: 'update', key: 'name', value: 'smith', oldValue: 'joe' }
|
85 | { type: 'remove', key: 'mixed', value: 10 }
|
86 | { type: 'add', key: 'mixed', value: '10' }
|
87 | { type: 'update', key: 'nested', changes: [
|
88 | { type: 'update', key: 'inner', value: 2, oldValue: 1}
|
89 | ]
|
90 | }
|
91 | { type: 'update', key: 'coins', embededKey: '$index', changes: [ { type: 'add', key: '2', value: 1 } ] }
|
92 | { type: 'update', key: 'toys', embededKey: '$index', changes: [
|
93 | { type: 'remove', key: '0', value: 'car' }
|
94 | { type: 'remove', key: '1', value: 'doll' }
|
95 | { type: 'remove', key: '2', value: 'car' }
|
96 | ]
|
97 | }
|
98 | { type: 'update', key: 'pets', embededKey: '$index', changes: [
|
99 | { type: 'remove', key: '0', value: undefined }
|
100 | { type: 'remove', key: '1', value: null }
|
101 | ]
|
102 | }
|
103 | { type: 'update', key: 'children', embededKey: '$index', changes: [
|
104 | {
|
105 | type: 'update', key: '0', changes: [
|
106 | { type: 'update', key: 'name', value: 'kid3', oldValue: 'kid1' }
|
107 | { type: 'update', key: 'age', value: 3, oldValue: 1 }
|
108 | { type: 'remove', key: 'subset', value: [ { id: 1, value: 'haha' }, { id: 2, value: 'hehe' } ]}
|
109 | ]
|
110 | }
|
111 | {
|
112 | type: 'update', key: '1', changes: [
|
113 | { type: 'update', key: 'name', value: 'kid1', oldValue: 'kid2' }
|
114 | { type: 'update', key: 'age', value: 0, oldValue: 2 }
|
115 | { type: 'add', key: 'subset', value: [ { id: 1, value: 'heihei' } ] }
|
116 | ]
|
117 | },
|
118 | { type: 'add', key: '2', value: { name: 'kid2', age: 2 } }
|
119 | ]
|
120 | }
|
121 |
|
122 | { type: 'remove', key: 'age', value: 55 }
|
123 | { type: 'remove', key: 'empty', value: undefined }
|
124 | ]
|
125 |
|
126 |
|
127 | describe 'diff()', ->
|
128 |
|
129 | it 'should return correct diff for object with embedded array object that does not have key specified', ->
|
130 | diffs = changesets.diff oldObj, newObj
|
131 | expect(diffs).to.eql changesetWithoutEmbeddedKey
|
132 |
|
133 | it 'should return correct diff for object with embedded array that has key specified', ->
|
134 | diffs = changesets.diff oldObj, newObj, {'children': 'name', 'children.subset': 'id'}
|
135 | expect(diffs).to.eql changeset
|
136 |
|
137 |
|
138 | describe 'applyChanges()', ->
|
139 |
|
140 | it 'should transfer oldObj to newObj with changeset', ->
|
141 | changesets.applyChanges oldObj, changeset
|
142 | newObj.children.sort (a, b) -> a.name > b.name
|
143 | expect(oldObj).to.eql newObj
|
144 |
|
145 | it 'should transfer oldObj to newObj with changesetWithoutEmbeddedKey', ->
|
146 | changesets.applyChanges oldObj, changesetWithoutEmbeddedKey
|
147 | newObj.children.sort (a, b) -> a.name > b.name
|
148 | oldObj.children.sort (a, b) -> a.name > b.name
|
149 | expect(oldObj).to.eql newObj
|
150 |
|
151 |
|
152 | describe 'revertChanges()', ->
|
153 |
|
154 | it 'should transfer newObj to oldObj with changeset', ->
|
155 | changesets.revertChanges newObj, changeset
|
156 | oldObj.children.sort (a, b) -> a.name > b.name
|
157 | newObj.children.sort (a, b) -> a.name > b.name
|
158 | expect(newObj).to.eql oldObj
|
159 |
|
160 |
|
161 | it 'should transfer newObj to oldObj with changesetWithoutEmbeddedKey', ->
|
162 | changesets.revertChanges newObj, changesetWithoutEmbeddedKey
|
163 | oldObj.children.sort (a, b) -> a.name > b.name
|
164 | newObj.children.sort (a, b) -> a.name > b.name
|
165 | expect(newObj).to.eql oldObj
|