14
14
use Doctrine \Common \Collections \ArrayCollection ;
15
15
use PHPUnit \Framework \TestCase ;
16
16
use Symfony \Component \EventDispatcher \EventDispatcher ;
17
+ use Symfony \Component \Form \AbstractType ;
17
18
use Symfony \Component \Form \Exception \UnexpectedTypeException ;
18
19
use Symfony \Component \Form \Extension \Core \DataMapper \DataMapper ;
19
20
use Symfony \Component \Form \Extension \Core \EventListener \ResizeFormListener ;
20
21
use Symfony \Component \Form \Extension \Core \Type \TextType ;
21
22
use Symfony \Component \Form \FormBuilder ;
23
+ use Symfony \Component \Form \FormBuilderInterface ;
22
24
use Symfony \Component \Form \FormEvent ;
23
25
use Symfony \Component \Form \FormFactoryBuilder ;
24
26
use Symfony \Component \Form \FormFactoryInterface ;
25
- use Symfony \Component \Form \FormInterface ;
26
27
27
28
class ResizeFormListenerTest extends TestCase
28
29
{
29
30
private FormFactoryInterface $ factory ;
30
- private FormInterface $ form ;
31
+ private FormBuilderInterface $ builder ;
31
32
32
33
protected function setUp (): void
33
34
{
34
35
$ this ->factory = (new FormFactoryBuilder ())->getFormFactory ();
35
- $ this ->form = $ this ->getBuilder ()
36
+ $ this ->builder = $ this ->getBuilder ()
36
37
->setCompound (true )
37
- ->setDataMapper (new DataMapper ())
38
- ->getForm ();
38
+ ->setDataMapper (new DataMapper ());
39
39
}
40
40
41
41
protected function getBuilder ($ name = 'name ' )
42
42
{
43
43
return new FormBuilder ($ name , null , new EventDispatcher (), $ this ->factory );
44
44
}
45
45
46
- protected function getForm ($ name = 'name ' )
46
+ /**
47
+ * @group legacy
48
+ */
49
+ public function testPreSetDataResizesForm ()
47
50
{
48
- return $ this ->getBuilder ($ name )->getForm ();
51
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
52
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
53
+ $ this ->builder ->addEventSubscriber (new class (TextType::class, ['attr ' => ['maxlength ' => 10 ]], false , false ) extends ResizeFormListener {
54
+ public function preSetData (FormEvent $ event ): void
55
+ {
56
+ parent ::preSetData ($ event );
57
+ }
58
+ });
59
+
60
+ $ form = $ this ->builder ->getForm ();
61
+
62
+ $ this ->assertTrue ($ form ->has ('0 ' ));
63
+
64
+ // initialize the form
65
+ $ form ->setData ([1 => 'string ' , 2 => 'string ' ]);
66
+
67
+ $ this ->assertFalse ($ form ->has ('0 ' ));
68
+ $ this ->assertTrue ($ form ->has ('1 ' ));
69
+ $ this ->assertTrue ($ form ->has ('2 ' ));
70
+
71
+ $ this ->assertSame ('string ' , $ form ->get ('1 ' )->getData ());
72
+ $ this ->assertSame ('string ' , $ form ->get ('2 ' )->getData ());
49
73
}
50
74
51
- public function testPreSetDataResizesForm ()
75
+ public function testPostSetDataResizesForm ()
52
76
{
53
- $ this ->form ->add ($ this ->getForm ('0 ' ));
54
- $ this ->form ->add ($ this ->getForm ('1 ' ));
77
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
78
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
79
+ $ this ->builder ->addEventSubscriber (new ResizeFormListener (TextType::class, ['attr ' => ['maxlength ' => 10 ]], false , false ));
55
80
56
- $ data = [1 => 'string ' , 2 => 'string ' ];
57
- $ event = new FormEvent ($ this ->form , $ data );
58
- $ listener = new ResizeFormListener (TextType::class, ['attr ' => ['maxlength ' => 10 ]], false , false );
59
- $ listener ->preSetData ($ event );
81
+ $ form = $ this ->builder ->getForm ();
82
+
83
+ $ this ->assertTrue ($ form ->has ('0 ' ));
60
84
61
- $ this ->assertFalse ($ this ->form ->has ('0 ' ));
62
- $ this ->assertTrue ($ this ->form ->has ('1 ' ));
63
- $ this ->assertTrue ($ this ->form ->has ('2 ' ));
85
+ // initialize the form
86
+ $ form ->setData ([1 => 'string ' , 2 => 'string ' ]);
87
+
88
+ $ this ->assertFalse ($ form ->has ('0 ' ));
89
+ $ this ->assertTrue ($ form ->has ('1 ' ));
90
+ $ this ->assertTrue ($ form ->has ('2 ' ));
91
+
92
+ $ this ->assertSame ('string ' , $ form ->get ('1 ' )->getData ());
93
+ $ this ->assertSame ('string ' , $ form ->get ('2 ' )->getData ());
64
94
}
65
95
96
+ /**
97
+ * @group legacy
98
+ */
66
99
public function testPreSetDataRequiresArrayOrTraversable ()
67
100
{
68
101
$ this ->expectException (UnexpectedTypeException::class);
69
102
$ data = 'no array or traversable ' ;
70
- $ event = new FormEvent ($ this ->form , $ data );
71
- $ listener = new ResizeFormListener ('text ' , [], false , false );
103
+ $ event = new FormEvent ($ this ->builder ->getForm (), $ data );
104
+ $ listener = new class (TextType::class, [], false , false ) extends ResizeFormListener {
105
+ public function preSetData (FormEvent $ event ): void
106
+ {
107
+ parent ::preSetData ($ event );
108
+ }
109
+ };
72
110
$ listener ->preSetData ($ event );
73
111
}
74
112
113
+ public function testPostSetDataRequiresArrayOrTraversable ()
114
+ {
115
+ $ this ->expectException (UnexpectedTypeException::class);
116
+ $ data = 'no array or traversable ' ;
117
+ $ event = new FormEvent ($ this ->builder ->getForm (), $ data );
118
+ $ listener = new ResizeFormListener (TextType::class, [], false , false );
119
+ $ listener ->postSetData ($ event );
120
+ }
121
+
122
+ /**
123
+ * @group legacy
124
+ */
75
125
public function testPreSetDataDealsWithNullData ()
76
126
{
77
127
$ data = null ;
78
- $ event = new FormEvent ($ this ->form , $ data );
79
- $ listener = new ResizeFormListener (TextType::class, [], false , false );
128
+ $ event = new FormEvent ($ this ->builder ->getForm (), $ data );
129
+ $ listener = new class (TextType::class, [], false , false ) extends ResizeFormListener {
130
+ public function preSetData (FormEvent $ event ): void
131
+ {
132
+ parent ::preSetData ($ event );
133
+ }
134
+ };
80
135
$ listener ->preSetData ($ event );
81
136
82
- $ this ->assertSame (0 , $ this ->form ->count ());
137
+ $ this ->assertSame (0 , $ this ->builder ->count ());
138
+ }
139
+
140
+ public function testPostSetDataDealsWithNullData ()
141
+ {
142
+ $ data = null ;
143
+ $ event = new FormEvent ($ this ->builder ->getForm (), $ data );
144
+ $ listener = new ResizeFormListener (TextType::class, [], false , false );
145
+ $ listener ->postSetData ($ event );
146
+
147
+ $ this ->assertSame (0 , $ this ->builder ->count ());
83
148
}
84
149
85
150
public function testPreSubmitResizesUpIfAllowAdd ()
86
151
{
87
- $ this ->form ->add ($ this ->getForm ('0 ' ));
152
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
153
+ $ this ->builder ->addEventSubscriber (new ResizeFormListener (TextType::class, ['attr ' => ['maxlength ' => 10 ]], true , false ));
88
154
89
- $ data = [ 0 => ' string ' , 1 => ' string ' ] ;
90
- $ event = new FormEvent ( $ this -> form , $ data );
91
- $ listener = new ResizeFormListener (TextType::class, [ ' attr ' => [ ' maxlength ' => 10 ]], true , false );
92
- $ listener -> preSubmit ( $ event );
155
+ $ form = $ this -> builder -> getForm () ;
156
+
157
+ $ this -> assertTrue ( $ form -> has ( ' 0 ' ) );
158
+ $ this -> assertFalse ( $ form -> has ( ' 1 ' ) );
93
159
94
- $ this ->assertTrue ($ this ->form ->has ('0 ' ));
95
- $ this ->assertTrue ($ this ->form ->has ('1 ' ));
160
+ $ form ->submit ([0 => 'string ' , 1 => 'string ' ]);
161
+
162
+ $ this ->assertTrue ($ form ->has ('0 ' ));
163
+ $ this ->assertTrue ($ form ->has ('1 ' ));
96
164
}
97
165
98
166
public function testPreSubmitResizesDownIfAllowDelete ()
99
167
{
100
- $ this ->form ->add ($ this ->getForm ('0 ' ));
101
- $ this ->form ->add ($ this ->getForm ('1 ' ));
168
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
169
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
170
+ $ this ->builder ->addEventSubscriber (new ResizeFormListener (TextType::class, [], false , true ));
102
171
103
- $ data = [0 => 'string ' ];
104
- $ event = new FormEvent ($ this ->form , $ data );
105
- $ listener = new ResizeFormListener ('text ' , [], false , true );
106
- $ listener ->preSubmit ($ event );
172
+ $ form = $ this ->builder ->getForm ();
173
+ // initialize the form
174
+ $ form ->setData ([0 => 'string ' , 1 => 'string ' ]);
175
+
176
+ $ this ->assertTrue ($ form ->has ('0 ' ));
177
+ $ this ->assertTrue ($ form ->has ('1 ' ));
107
178
108
- $ this ->assertTrue ($ this ->form ->has ('0 ' ));
109
- $ this ->assertFalse ($ this ->form ->has ('1 ' ));
179
+ $ form ->submit ([0 => 'string ' ]);
180
+
181
+ $ this ->assertTrue ($ form ->has ('0 ' ));
182
+ $ this ->assertFalse ($ form ->has ('1 ' ));
110
183
}
111
184
112
185
// fix for https://github.com/symfony/symfony/pull/493
113
186
public function testPreSubmitRemovesZeroKeys ()
114
187
{
115
- $ this ->form ->add ($ this ->getForm ('0 ' ));
188
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
116
189
117
190
$ data = [];
118
- $ event = new FormEvent ($ this ->form , $ data );
119
- $ listener = new ResizeFormListener ('text ' , [], false , true );
191
+ $ form = $ this ->builder ->getForm ();
192
+ $ event = new FormEvent ($ form , $ data );
193
+ $ listener = new ResizeFormListener (TextType::class, [], false , true );
120
194
$ listener ->preSubmit ($ event );
121
195
122
- $ this ->assertFalse ($ this -> form ->has ('0 ' ));
196
+ $ this ->assertFalse ($ form ->has ('0 ' ));
123
197
}
124
198
125
199
public function testPreSubmitDoesNothingIfNotAllowAddNorAllowDelete ()
126
200
{
127
- $ this ->form ->add ($ this ->getForm ('0 ' ));
128
- $ this ->form ->add ($ this ->getForm ('1 ' ));
201
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
202
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
129
203
130
204
$ data = [0 => 'string ' , 2 => 'string ' ];
131
- $ event = new FormEvent ($ this ->form , $ data );
132
- $ listener = new ResizeFormListener ('text ' , [], false , false );
205
+ $ form = $ this ->builder ->getForm ();
206
+ $ event = new FormEvent ($ form , $ data );
207
+ $ listener = new ResizeFormListener (TextType::class, [], false , false );
133
208
$ listener ->preSubmit ($ event );
134
209
135
- $ this ->assertTrue ($ this -> form ->has ('0 ' ));
136
- $ this ->assertTrue ($ this -> form ->has ('1 ' ));
137
- $ this ->assertFalse ($ this -> form ->has ('2 ' ));
210
+ $ this ->assertTrue ($ form ->has ('0 ' ));
211
+ $ this ->assertTrue ($ form ->has ('1 ' ));
212
+ $ this ->assertFalse ($ form ->has ('2 ' ));
138
213
}
139
214
140
215
public function testPreSubmitDealsWithNoArrayOrTraversable ()
141
216
{
142
217
$ data = 'no array or traversable ' ;
143
- $ event = new FormEvent ($ this ->form , $ data );
144
- $ listener = new ResizeFormListener ('text ' , [], false , false );
218
+ $ form = $ this ->builder ->getForm ();
219
+ $ event = new FormEvent ($ form , $ data );
220
+ $ listener = new ResizeFormListener (TextType::class, [], false , false );
145
221
$ listener ->preSubmit ($ event );
146
222
147
- $ this ->assertFalse ($ this -> form ->has ('1 ' ));
223
+ $ this ->assertFalse ($ form ->has ('1 ' ));
148
224
}
149
225
150
226
public function testPreSubmitDealsWithNullData ()
151
227
{
152
- $ this ->form ->add ($ this ->getForm ('1 ' ));
228
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
153
229
154
230
$ data = null ;
155
- $ event = new FormEvent ($ this ->form , $ data );
156
- $ listener = new ResizeFormListener ('text ' , [], false , true );
231
+ $ form = $ this ->builder ->getForm ();
232
+ $ event = new FormEvent ($ form , $ data );
233
+ $ listener = new ResizeFormListener (TextType::class, [], false , true );
157
234
$ listener ->preSubmit ($ event );
158
235
159
- $ this ->assertFalse ($ this -> form ->has ('1 ' ));
236
+ $ this ->assertFalse ($ form ->has ('1 ' ));
160
237
}
161
238
162
239
// fixes https://github.com/symfony/symfony/pull/40
163
240
public function testPreSubmitDealsWithEmptyData ()
164
241
{
165
- $ this ->form ->add ($ this ->getForm ('1 ' ));
242
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
166
243
167
244
$ data = '' ;
168
- $ event = new FormEvent ($ this ->form , $ data );
169
- $ listener = new ResizeFormListener ('text ' , [], false , true );
245
+ $ form = $ this ->builder ->getForm ();
246
+ $ event = new FormEvent ($ form , $ data );
247
+ $ listener = new ResizeFormListener (TextType::class, [], false , true );
170
248
$ listener ->preSubmit ($ event );
171
249
172
- $ this ->assertFalse ($ this -> form ->has ('1 ' ));
250
+ $ this ->assertFalse ($ form ->has ('1 ' ));
173
251
}
174
252
175
253
public function testOnSubmitNormDataRemovesEntriesMissingInTheFormIfAllowDelete ()
176
254
{
177
- $ this ->form ->add ($ this ->getForm ('1 ' ));
255
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
178
256
179
257
$ data = [0 => 'first ' , 1 => 'second ' , 2 => 'third ' ];
180
- $ event = new FormEvent ($ this ->form , $ data );
181
- $ listener = new ResizeFormListener ('text ' , [], false , true );
258
+ $ form = $ this ->builder ->getForm ();
259
+ $ event = new FormEvent ($ form , $ data );
260
+ $ listener = new ResizeFormListener (TextType::class, [], false , true );
182
261
$ listener ->onSubmit ($ event );
183
262
184
263
$ this ->assertEquals ([1 => 'second ' ], $ event ->getData ());
185
264
}
186
265
187
266
public function testOnSubmitNormDataDoesNothingIfNotAllowDelete ()
188
267
{
189
- $ this ->form ->add ($ this ->getForm ('1 ' ));
268
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
190
269
191
270
$ data = [0 => 'first ' , 1 => 'second ' , 2 => 'third ' ];
192
- $ event = new FormEvent ($ this ->form , $ data );
193
- $ listener = new ResizeFormListener ('text ' , [], false , false );
271
+ $ form = $ this ->builder ->getForm ();
272
+ $ event = new FormEvent ($ form , $ data );
273
+ $ listener = new ResizeFormListener (TextType::class, [], false , false );
194
274
$ listener ->onSubmit ($ event );
195
275
196
276
$ this ->assertEquals ($ data , $ event ->getData ());
@@ -200,30 +280,30 @@ public function testOnSubmitNormDataRequiresArrayOrTraversable()
200
280
{
201
281
$ this ->expectException (UnexpectedTypeException::class);
202
282
$ data = 'no array or traversable ' ;
203
- $ event = new FormEvent ($ this ->form , $ data );
204
- $ listener = new ResizeFormListener (' text ' , [], false , false );
283
+ $ event = new FormEvent ($ this ->builder -> getForm () , $ data );
284
+ $ listener = new ResizeFormListener (TextType::class , [], false , false );
205
285
$ listener ->onSubmit ($ event );
206
286
}
207
287
208
288
public function testOnSubmitNormDataDealsWithNullData ()
209
289
{
210
- $ this ->form ->add ($ this ->getForm ('1 ' ));
290
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
211
291
212
292
$ data = null ;
213
- $ event = new FormEvent ($ this ->form , $ data );
214
- $ listener = new ResizeFormListener (' text ' , [], false , true );
293
+ $ event = new FormEvent ($ this ->builder -> getForm () , $ data );
294
+ $ listener = new ResizeFormListener (TextType::class , [], false , true );
215
295
$ listener ->onSubmit ($ event );
216
296
217
297
$ this ->assertEquals ([], $ event ->getData ());
218
298
}
219
299
220
300
public function testOnSubmitDealsWithObjectBackedIteratorAggregate ()
221
301
{
222
- $ this ->form ->add ($ this ->getForm ('1 ' ));
302
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
223
303
224
304
$ data = new \ArrayObject ([0 => 'first ' , 1 => 'second ' , 2 => 'third ' ]);
225
- $ event = new FormEvent ($ this ->form , $ data );
226
- $ listener = new ResizeFormListener (' text ' , [], false , true );
305
+ $ event = new FormEvent ($ this ->builder -> getForm () , $ data );
306
+ $ listener = new ResizeFormListener (TextType::class , [], false , true );
227
307
$ listener ->onSubmit ($ event );
228
308
229
309
$ this ->assertArrayNotHasKey (0 , $ event ->getData ());
@@ -232,11 +312,11 @@ public function testOnSubmitDealsWithObjectBackedIteratorAggregate()
232
312
233
313
public function testOnSubmitDealsWithArrayBackedIteratorAggregate ()
234
314
{
235
- $ this ->form ->add ($ this ->getForm ('1 ' ));
315
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
236
316
237
317
$ data = new ArrayCollection ([0 => 'first ' , 1 => 'second ' , 2 => 'third ' ]);
238
- $ event = new FormEvent ($ this ->form , $ data );
239
- $ listener = new ResizeFormListener (' text ' , [], false , true );
318
+ $ event = new FormEvent ($ this ->builder -> getForm () , $ data );
319
+ $ listener = new ResizeFormListener (TextType::class , [], false , true );
240
320
$ listener ->onSubmit ($ event );
241
321
242
322
$ this ->assertArrayNotHasKey (0 , $ event ->getData ());
@@ -245,46 +325,37 @@ public function testOnSubmitDealsWithArrayBackedIteratorAggregate()
245
325
246
326
public function testOnSubmitDeleteEmptyNotCompoundEntriesIfAllowDelete ()
247
327
{
248
- $ this ->form ->setData (['0 ' => 'first ' , '1 ' => 'second ' ]);
249
- $ this ->form ->add ($ this ->getForm ('0 ' ));
250
- $ this ->form ->add ($ this ->getForm ('1 ' ));
251
-
252
- $ data = [0 => 'first ' , 1 => '' ];
253
- foreach ($ data as $ child => $ dat ) {
254
- $ this ->form ->get ($ child )->submit ($ dat );
255
- }
256
- $ event = new FormEvent ($ this ->form , $ data );
257
- $ listener = new ResizeFormListener ('text ' , [], false , true , true );
258
- $ listener ->onSubmit ($ event );
328
+ $ this ->builder ->setData (['0 ' => 'first ' , '1 ' => 'second ' ]);
329
+ $ this ->builder ->add ($ this ->getBuilder ('0 ' ));
330
+ $ this ->builder ->add ($ this ->getBuilder ('1 ' ));
331
+ $ this ->builder ->addEventSubscriber (new ResizeFormListener (TextType::class, [], false , true , true ));
259
332
260
- $ this ->assertEquals ([0 => 'first ' ], $ event ->getData ());
333
+ $ form = $ this ->builder ->getForm ();
334
+
335
+ $ form ->submit ([0 => 'first ' , 1 => '' ]);
336
+
337
+ $ this ->assertEquals ([0 => 'first ' ], $ form ->getData ());
261
338
}
262
339
263
340
public function testOnSubmitDeleteEmptyCompoundEntriesIfAllowDelete ()
264
341
{
265
- $ this ->form ->setData (['0 ' => ['name ' => 'John ' ], '1 ' => ['name ' => 'Jane ' ]]);
266
- $ form1 = $ this ->getBuilder ('0 ' )
267
- ->setCompound (true )
268
- ->setDataMapper (new DataMapper ())
269
- ->getForm ();
270
- $ form1 ->add ($ this ->getForm ('name ' ));
271
- $ form2 = $ this ->getBuilder ('1 ' )
272
- ->setCompound (true )
273
- ->setDataMapper (new DataMapper ())
274
- ->getForm ();
275
- $ form2 ->add ($ this ->getForm ('name ' ));
276
- $ this ->form ->add ($ form1 );
277
- $ this ->form ->add ($ form2 );
278
-
279
- $ data = ['0 ' => ['name ' => 'John ' ], '1 ' => ['name ' => '' ]];
280
- foreach ($ data as $ child => $ dat ) {
281
- $ this ->form ->get ($ child )->submit ($ dat );
282
- }
283
- $ event = new FormEvent ($ this ->form , $ data );
284
- $ callback = fn ($ data ) => null === $ data ['name ' ];
285
- $ listener = new ResizeFormListener ('text ' , [], false , true , $ callback );
286
- $ listener ->onSubmit ($ event );
342
+ $ this ->builder ->setData (['0 ' => ['name ' => 'John ' ], '1 ' => ['name ' => 'Jane ' ]]);
343
+ $ this ->builder ->add ('0 ' , NestedType::class);
344
+ $ this ->builder ->add ('1 ' , NestedType::class);
345
+ $ callback = fn ($ data ) => empty ($ data ['name ' ]);
346
+ $ this ->builder ->addEventSubscriber (new ResizeFormListener (NestedType::class, [], false , true , $ callback ));
347
+
348
+ $ form = $ this ->builder ->getForm ();
349
+ $ form ->submit (['0 ' => ['name ' => 'John ' ], '1 ' => ['name ' => '' ]]);
287
350
288
- $ this ->assertEquals (['0 ' => ['name ' => 'John ' ]], $ event ->getData ());
351
+ $ this ->assertEquals (['0 ' => ['name ' => 'John ' ]], $ form ->getData ());
352
+ }
353
+ }
354
+
355
+ class NestedType extends AbstractType
356
+ {
357
+ public function buildForm (FormBuilderInterface $ builder , array $ options ): void
358
+ {
359
+ $ builder ->add ('name ' );
289
360
}
290
361
}
0 commit comments