Speedometer: Add a React + Redux TodoMVC implementation
[WebKit-https.git] / PerformanceTests / Speedometer / resources / todomvc / architecture-examples / react-redux / src / reducers / todos.spec.js
1 import todos from './todos'
2 import * as types from '../constants/ActionTypes'
3
4 describe('todos reducer', () => {
5   it('should handle initial state', () => {
6     expect(
7       todos(undefined, {})
8     ).toEqual([
9       {
10         text: 'Use Redux',
11         completed: false,
12         id: 0
13       }
14     ])
15   })
16
17   it('should handle ADD_TODO', () => {
18     expect(
19       todos([], {
20         type: types.ADD_TODO,
21         text: 'Run the tests'
22       })
23     ).toEqual([
24       {
25         text: 'Run the tests',
26         completed: false,
27         id: 0
28       }
29     ])
30
31     expect(
32       todos([
33         {
34           text: 'Use Redux',
35           completed: false,
36           id: 0
37         }
38       ], {
39         type: types.ADD_TODO,
40         text: 'Run the tests'
41       })
42     ).toEqual([
43       {
44         text: 'Run the tests',
45         completed: false,
46         id: 1
47       }, {
48         text: 'Use Redux',
49         completed: false,
50         id: 0
51       }
52     ])
53
54     expect(
55       todos([
56         {
57           text: 'Run the tests',
58           completed: false,
59           id: 1
60         }, {
61           text: 'Use Redux',
62           completed: false,
63           id: 0
64         }
65       ], {
66         type: types.ADD_TODO,
67         text: 'Fix the tests'
68       })
69     ).toEqual([
70       {
71         text: 'Fix the tests',
72         completed: false,
73         id: 2
74       }, {
75         text: 'Run the tests',
76         completed: false,
77         id: 1
78       }, {
79         text: 'Use Redux',
80         completed: false,
81         id: 0
82       }
83     ])
84   })
85
86   it('should handle DELETE_TODO', () => {
87     expect(
88       todos([
89         {
90           text: 'Run the tests',
91           completed: false,
92           id: 1
93         }, {
94           text: 'Use Redux',
95           completed: false,
96           id: 0
97         }
98       ], {
99         type: types.DELETE_TODO,
100         id: 1
101       })
102     ).toEqual([
103       {
104         text: 'Use Redux',
105         completed: false,
106         id: 0
107       }
108     ])
109   })
110
111   it('should handle EDIT_TODO', () => {
112     expect(
113       todos([
114         {
115           text: 'Run the tests',
116           completed: false,
117           id: 1
118         }, {
119           text: 'Use Redux',
120           completed: false,
121           id: 0
122         }
123       ], {
124         type: types.EDIT_TODO,
125         text: 'Fix the tests',
126         id: 1
127       })
128     ).toEqual([
129       {
130         text: 'Fix the tests',
131         completed: false,
132         id: 1
133       }, {
134         text: 'Use Redux',
135         completed: false,
136         id: 0
137       }
138     ])
139   })
140
141   it('should handle COMPLETE_TODO', () => {
142     expect(
143       todos([
144         {
145           text: 'Run the tests',
146           completed: false,
147           id: 1
148         }, {
149           text: 'Use Redux',
150           completed: false,
151           id: 0
152         }
153       ], {
154         type: types.COMPLETE_TODO,
155         id: 1
156       })
157     ).toEqual([
158       {
159         text: 'Run the tests',
160         completed: true,
161         id: 1
162       }, {
163         text: 'Use Redux',
164         completed: false,
165         id: 0
166       }
167     ])
168   })
169
170   it('should handle COMPLETE_ALL', () => {
171     expect(
172       todos([
173         {
174           text: 'Run the tests',
175           completed: true,
176           id: 1
177         }, {
178           text: 'Use Redux',
179           completed: false,
180           id: 0
181         }
182       ], {
183         type: types.COMPLETE_ALL
184       })
185     ).toEqual([
186       {
187         text: 'Run the tests',
188         completed: true,
189         id: 1
190       }, {
191         text: 'Use Redux',
192         completed: true,
193         id: 0
194       }
195     ])
196
197     // Unmark if all todos are currently completed
198     expect(
199       todos([
200         {
201           text: 'Run the tests',
202           completed: true,
203           id: 1
204         }, {
205           text: 'Use Redux',
206           completed: true,
207           id: 0
208         }
209       ], {
210         type: types.COMPLETE_ALL
211       })
212     ).toEqual([
213       {
214         text: 'Run the tests',
215         completed: false,
216         id: 1
217       }, {
218         text: 'Use Redux',
219         completed: false,
220         id: 0
221       }
222     ])
223   })
224
225   it('should handle CLEAR_COMPLETED', () => {
226     expect(
227       todos([
228         {
229           text: 'Run the tests',
230           completed: true,
231           id: 1
232         }, {
233           text: 'Use Redux',
234           completed: false,
235           id: 0
236         }
237       ], {
238         type: types.CLEAR_COMPLETED
239       })
240     ).toEqual([
241       {
242         text: 'Use Redux',
243         completed: false,
244         id: 0
245       }
246     ])
247   })
248
249   it('should not generate duplicate ids after CLEAR_COMPLETED', () => {
250     expect(
251       [
252         {
253           type: types.COMPLETE_TODO,
254           id: 0
255         }, {
256           type: types.CLEAR_COMPLETED
257         }, {
258           type: types.ADD_TODO,
259           text: 'Write more tests'
260         }
261       ].reduce(todos, [
262         {
263           id: 0,
264           completed: false,
265           text: 'Use Redux'
266         }, {
267           id: 1,
268           completed: false,
269           text: 'Write tests'
270         }
271       ])
272     ).toEqual([
273       {
274         text: 'Write more tests',
275         completed: false,
276         id: 2
277       }, {
278         text: 'Write tests',
279         completed: false,
280         id: 1
281       }
282     ])
283   })
284 })