UNPKG

5.85 kBtext/coffeescriptView Raw
1expect = require 'expect.js'
2util = require 'util'
3changesets = require '../src/changesets'
4{op} = changesets
5
6describe '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