@@ -234,41 +234,170 @@ public function testDeserializeValue($value, $expected) {
234234 $ this ->string ($ output )->isEqualTo (implode (', ' , $ expected ));
235235 }
236236
237- public function testPrepareQuestionInputForSave () {
237+ public function providerPrepareQuestionInputForSave () {
238+ global $ DB ;
239+
238240 $ question = $ this ->getQuestion ([
239241 'fieldtype ' => 'checkboxes ' ,
240242 'name ' => 'question ' ,
241243 'required ' => '0 ' ,
242- 'default_values ' => json_encode ([ ' 1 ' , ' 2 ' , ' 3 ' , ' 5 ' , ' 6 ' ]) ,
243- 'values ' => json_encode ([ ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' ]) ,
244+ 'values ' => ' 1\r\n2\r\n3\r\n4\r\n5\r\n6 ' ,
245+ 'default_values ' => ' 1\r\n2\r\n3\r\n5\r\n6 ' ,
244246 'order ' => '1 ' ,
245247 'show_rule ' => \PluginFormcreatorCondition::SHOW_RULE_ALWAYS ,
246248 'range_min ' => 3 ,
247249 'range_max ' => 4 ,
248250 ]);
251+
252+ yield [
253+ 'field ' => $ this ->newTestedInstance ($ question ),
254+ 'input ' => [
255+ 'values ' => "" ,
256+ 'name ' => 'foo ' ,
257+ ],
258+ 'expected ' => [],
259+ 'message ' => 'The field value is required. ' ,
260+ ];
261+
262+ yield [
263+ 'field ' => $ this ->newTestedInstance ($ question ),
264+ 'input ' => [
265+ 'values ' => 'éè\r\nsomething else ' ,
266+ 'default_values ' => 'éè ' ,
267+ ],
268+ 'expected ' => [
269+ 'values ' => '[\"éè\",\"something else\"] ' ,
270+ 'default_values ' => '[\"éè\"] ' ,
271+ ],
272+ 'message ' => '' ,
273+ ];
274+
275+ yield [
276+ 'field ' => $ this ->newTestedInstance ($ question ),
277+ 'input ' => [
278+ 'values ' => ' something \r\n something else ' ,
279+ 'default_values ' => ' something ' ,
280+ ],
281+ 'expected ' => [
282+ 'values ' => '[\"something\",\"something else\"] ' ,
283+ 'default_values ' => '[\"something\"] ' ,
284+ ],
285+ 'message ' => '' ,
286+ ];
287+
288+ yield 'no default value ' => [
289+ 'field ' => $ this ->newTestedInstance ($ question ),
290+ 'input ' => [
291+ 'values ' => 'a\r\nb\r\nc ' ,
292+ 'name ' => 'foo ' ,
293+ 'default_values ' => ''
294+ ],
295+ 'expected ' => [
296+ 'values ' => $ DB ->escape ('["a","b","c"] ' ),
297+ 'name ' => 'foo ' ,
298+ 'default_values ' => '' ,
299+ ],
300+ 'message ' => '' ,
301+ ];
302+
303+ yield 'several default values ' => [
304+ 'field ' => $ this ->newTestedInstance ($ question ),
305+ 'input ' => [
306+ 'values ' => 'a\r\nb\r\nc ' ,
307+ 'name ' => 'foo ' ,
308+ 'default_values ' => 'a\r\n\b '
309+ ],
310+ 'expected ' => [
311+ 'values ' => $ DB ->escape ('["a","b","c"] ' ),
312+ 'name ' => 'foo ' ,
313+ 'default_values ' => $ DB ->escape ('["a","b"] ' ),
314+ ],
315+ 'message ' => '' ,
316+ ];
317+
318+ yield 'one default value ' => [
319+ 'field ' => $ this ->newTestedInstance ($ question ),
320+ 'input ' => [
321+ 'values ' => 'a\r\nb\r\nc ' ,
322+ 'name ' => 'foo ' ,
323+ 'default_values ' => 'b '
324+ ],
325+ 'expected ' => [
326+ 'values ' => $ DB ->escape ('["a","b","c"] ' ),
327+ 'name ' => 'foo ' ,
328+ 'default_values ' => $ DB ->escape ('["b"] ' ),
329+ ],
330+ 'message ' => '' ,
331+ ];
332+
333+ yield 'invalid default value ' => [
334+ 'field ' => $ this ->newTestedInstance ($ question ),
335+ 'input ' => [
336+ 'values ' => 'a\r\nb\r\nc ' ,
337+ 'name ' => 'foo ' ,
338+ 'default_values ' => 'z '
339+ ],
340+ 'expected ' => [],
341+ 'message ' => 'The default values are not in the list of available values. ' ,
342+ ];
343+ }
344+
345+ /**
346+ * @dataProvider providerPrepareQuestionInputForSave
347+ *
348+ * @return void
349+ */
350+ public function testPrepareQuestionInputForSave ($ field , $ input , $ expected , $ message ) {
351+
352+ // Clean error messages
353+ $ _SESSION ['MESSAGE_AFTER_REDIRECT ' ] = [];
354+
355+ $ output = $ field ->prepareQuestionInputForSave ($ input );
356+ if ($ expected === false || is_array ($ expected ) && count ($ expected ) == 0 ) {
357+ $ this ->array ($ output )->hasSize (0 );
358+ $ this ->sessionHasMessage ($ message , ERROR );
359+ //End of test on expected failure
360+ return ;
361+ }
362+
363+ $ this ->array ($ output )->isEqualTo ($ expected );
364+
365+ return ;
366+
367+ $ question = $ this ->getQuestion ([
368+ 'fieldtype ' => 'checkboxes ' ,
369+ 'name ' => 'question ' ,
370+ 'required ' => '0 ' ,
371+ 'default_values ' => json_encode (['1 ' , '2 ' , '3 ' , '5 ' , '6 ' ]),
372+ 'values ' => json_encode (['1 ' , '2 ' , '3 ' , '4 ' , '5 ' , '6 ' ]),
373+ 'order ' => '1 ' ,
374+ 'show_rule ' => \PluginFormcreatorCondition::SHOW_RULE_ALWAYS ,
375+ 'range_min ' => 3 ,
376+ 'range_max ' => 4 ,
377+ ]);
249378 $ fieldInstance = $ this ->newTestedInstance ($ question );
250379
251380 // Test a value is mandatory
252381 $ input = [
253- 'values ' => "" ,
254- 'name ' => 'foo ' ,
382+ 'values ' => "" ,
383+ 'name ' => 'foo ' ,
255384 ];
256385 $ out = $ fieldInstance ->prepareQuestionInputForSave ($ input );
257386 $ this ->integer (count ($ out ))->isEqualTo (0 );
258387
259388 // Test accented chars are kept
260389 $ input = [
261- 'values ' => 'éè\r\nsomething else ' ,
262- 'default_values ' => 'éè ' ,
390+ 'values ' => 'éè\r\nsomething else ' ,
391+ 'default_values ' => 'éè ' ,
263392 ];
264393 $ out = $ fieldInstance ->prepareQuestionInputForSave ($ input );
265394 $ this ->string ($ out ['values ' ])->isEqualTo ('[\"éè\",\"something else\"] ' );
266395 $ this ->string ($ out ['default_values ' ])->isEqualTo ('[\"éè\"] ' );
267396
268397 // Test values are trimmed
269398 $ input = [
270- 'values ' => ' something \r\n something else ' ,
271- 'default_values ' => ' something ' ,
399+ 'values ' => ' something \r\n something else ' ,
400+ 'default_values ' => ' something ' ,
272401 ];
273402 $ out = $ fieldInstance ->prepareQuestionInputForSave ($ input );
274403 $ this ->string ($ out ['values ' ])->isEqualTo ('[\"something\",\"something else\"] ' );
0 commit comments