UNPKG

5.55 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 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