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