1
1
import pop from './pop'
2
+ import { getIn , setIn } from 'final-form'
2
3
3
4
describe ( 'pop' , ( ) => {
4
5
it ( 'should call changeValue once' , ( ) => {
5
6
const changeValue = jest . fn ( )
6
- const state = { }
7
+ const state = {
8
+ formState : {
9
+ values : {
10
+ foo : [ 'one' , 'two' ]
11
+ }
12
+ } ,
13
+ fields : {
14
+ 'foo[0]' : {
15
+ name : 'foo[0]' ,
16
+ touched : true ,
17
+ error : 'First Error'
18
+ } ,
19
+ 'foo[1]' : {
20
+ name : 'foo[1]' ,
21
+ touched : false ,
22
+ error : 'Second Error'
23
+ }
24
+ }
25
+ }
7
26
const result = pop ( [ 'foo' ] , state , { changeValue } )
8
27
expect ( result ) . toBeUndefined ( )
9
28
expect ( changeValue ) . toHaveBeenCalled ( )
@@ -15,7 +34,26 @@ describe('pop', () => {
15
34
16
35
it ( 'should return undefined if array is undefined' , ( ) => {
17
36
const changeValue = jest . fn ( )
18
- const returnValue = pop ( [ 'foo' ] , { } , { changeValue } )
37
+ const state = {
38
+ formState : {
39
+ values : {
40
+ foo : [ 'one' , 'two' ]
41
+ }
42
+ } ,
43
+ fields : {
44
+ 'foo[0]' : {
45
+ name : 'foo[0]' ,
46
+ touched : true ,
47
+ error : 'First Error'
48
+ } ,
49
+ 'foo[1]' : {
50
+ name : 'foo[1]' ,
51
+ touched : false ,
52
+ error : 'Second Error'
53
+ }
54
+ }
55
+ }
56
+ const returnValue = pop ( [ 'foo' ] , state , { changeValue } )
19
57
const op = changeValue . mock . calls [ 0 ] [ 2 ]
20
58
expect ( returnValue ) . toBeUndefined ( )
21
59
const result = op ( undefined )
@@ -24,7 +62,26 @@ describe('pop', () => {
24
62
25
63
it ( 'should return empty array if array is empty' , ( ) => {
26
64
const changeValue = jest . fn ( )
27
- const returnValue = pop ( [ 'foo' ] , { } , { changeValue } )
65
+ const state = {
66
+ formState : {
67
+ values : {
68
+ foo : [ 'one' , 'two' ]
69
+ }
70
+ } ,
71
+ fields : {
72
+ 'foo[0]' : {
73
+ name : 'foo[0]' ,
74
+ touched : true ,
75
+ error : 'First Error'
76
+ } ,
77
+ 'foo[1]' : {
78
+ name : 'foo[1]' ,
79
+ touched : false ,
80
+ error : 'Second Error'
81
+ }
82
+ }
83
+ }
84
+ const returnValue = pop ( [ 'foo' ] , state , { changeValue } )
28
85
const op = changeValue . mock . calls [ 0 ] [ 2 ]
29
86
expect ( returnValue ) . toBeUndefined ( )
30
87
const result = op ( [ ] )
@@ -37,9 +94,105 @@ describe('pop', () => {
37
94
const changeValue = jest . fn ( ( args , state , op ) => {
38
95
result = op ( [ 'a' , 'b' , 'c' ] )
39
96
} )
40
- const returnValue = pop ( [ 'foo' ] , { } , { changeValue } )
97
+ const state = {
98
+ formState : {
99
+ values : {
100
+ foo : [ 'one' , 'two' ]
101
+ }
102
+ } ,
103
+ fields : {
104
+ 'foo[0]' : {
105
+ name : 'foo[0]' ,
106
+ touched : true ,
107
+ error : 'First Error'
108
+ } ,
109
+ 'foo[1]' : {
110
+ name : 'foo[1]' ,
111
+ touched : false ,
112
+ error : 'Second Error'
113
+ }
114
+ }
115
+ }
116
+ const returnValue = pop ( [ 'foo' ] , state , { changeValue } )
41
117
expect ( returnValue ) . toBe ( 'c' )
42
118
expect ( Array . isArray ( result ) ) . toBe ( true )
43
119
expect ( result ) . toEqual ( [ 'a' , 'b' ] )
44
120
} )
121
+
122
+ it ( 'should pop value off the end of array and return it' , ( ) => {
123
+ const array = [ 'a' , 'b' , 'c' , 'd' ]
124
+ // implementation of changeValue taken directly from Final Form
125
+ const changeValue = ( state , name , mutate ) => {
126
+ const before = getIn ( state . formState . values , name )
127
+ const after = mutate ( before )
128
+ state . formState . values = setIn ( state . formState . values , name , after ) || { }
129
+ }
130
+ const state = {
131
+ formState : {
132
+ values : {
133
+ foo : array ,
134
+ anotherField : 42
135
+ }
136
+ } ,
137
+ fields : {
138
+ 'foo[0]' : {
139
+ name : 'foo[0]' ,
140
+ touched : true ,
141
+ error : 'A Error'
142
+ } ,
143
+ 'foo[1]' : {
144
+ name : 'foo[1]' ,
145
+ touched : false ,
146
+ error : 'B Error'
147
+ } ,
148
+ 'foo[2]' : {
149
+ name : 'foo[2]' ,
150
+ touched : true ,
151
+ error : 'C Error'
152
+ } ,
153
+ 'foo[3]' : {
154
+ name : 'foo[3]' ,
155
+ touched : false ,
156
+ error : 'D Error'
157
+ } ,
158
+ anotherField : {
159
+ name : 'anotherField' ,
160
+ touched : false
161
+ }
162
+ }
163
+ }
164
+ const returnValue = pop ( [ 'foo' ] , state , { changeValue } )
165
+ expect ( returnValue ) . toBe ( 'd' )
166
+ expect ( Array . isArray ( state . formState . values . foo ) ) . toBe ( true )
167
+ expect ( state . formState . values . foo ) . not . toBe ( array ) // copied
168
+ expect ( state ) . toEqual ( {
169
+ formState : {
170
+ values : {
171
+ foo : [ 'a' , 'b' , 'c' ] ,
172
+ anotherField : 42
173
+ }
174
+ } ,
175
+ fields : {
176
+ 'foo[0]' : {
177
+ name : 'foo[0]' ,
178
+ touched : true ,
179
+ error : 'A Error'
180
+ } ,
181
+ 'foo[1]' : {
182
+ name : 'foo[1]' ,
183
+ touched : false ,
184
+ error : 'B Error'
185
+ } ,
186
+ 'foo[2]' : {
187
+ name : 'foo[2]' ,
188
+ touched : true ,
189
+ error : 'C Error'
190
+ } ,
191
+ anotherField : {
192
+ name : 'anotherField' ,
193
+ touched : false
194
+ }
195
+ }
196
+ } )
197
+ } )
45
198
} )
0 commit comments