Open Journal Systems  3.3.0
FormValidatorArrayCustomTest.php
1 <?php
2 
17 import('lib.pkp.tests.PKPTestCase');
18 import('lib.pkp.classes.form.Form');
19 
21  private
22  $checkedValues = array(),
26 
27  protected function setUp() : void {
28  parent::setUp();
29  $this->form = new Form('some template');
30  $this->subfieldValidation = array($this, 'userFunctionForSubfields');
31  $this->localeFieldValidation = array($this, 'userFunctionForLocaleFields');
32  }
33 
38  public function testIsValidOptionalAndEmpty() {
39  // Tests are completely bypassed when the validation type is
40  // "optional" and the test data are empty. We make sure this is the
41  // case by always returning 'false' for the custom validation function.
42  $this->form->setData('testData', '');
43  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_OPTIONAL_VALUE, 'some.message.key', $this->subfieldValidation, array(false));
44  self::assertTrue($validator->isValid());
45  self::assertEquals(array(), $validator->getErrorFields());
46  self::assertSame(array(), $this->checkedValues);
47 
48  $this->form->setData('testData', array());
49  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_OPTIONAL_VALUE, 'some.message.key', $this->subfieldValidation, array(false));
50  self::assertTrue($validator->isValid());
51  self::assertEquals(array(), $validator->getErrorFields());
52  self::assertSame(array(), $this->checkedValues);
53 
54  // The data are valid when they contain only empty (sub-)sub-fields and the validation type is "optional".
55  $this->form->setData('testData', array('subfield1' => array(), 'subfield2' => ''));
56  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_OPTIONAL_VALUE, 'some.message.key', $this->subfieldValidation, array(false));
57  self::assertTrue($validator->isValid());
58  self::assertEquals(array(), $validator->getErrorFields());
59  self::assertSame(array(), $this->checkedValues);
60 
61  $this->form->setData('testData', array('subfield1' => array('subsubfield1' => array(), 'subsubfield2' => '')));
62  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_OPTIONAL_VALUE, 'some.message.key', $this->subfieldValidation, array(false), false, array('subsubfield1', 'subsubfield2'));
63  self::assertTrue($validator->isValid());
64  self::assertEquals(array(), $validator->getErrorFields());
65  self::assertSame(array(), $this->checkedValues);
66  }
67 
72  public function testIsValidNoArray() {
73  // Field data must be an array, otherwise validation fails
74  $this->form->setData('testData', '');
75  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(true));
76  self::assertFalse($validator->isValid());
77  self::assertEquals(array(), $validator->getErrorFields());
78  self::assertSame(array(), $this->checkedValues);
79  }
80 
86  public function testIsValidCheckAllSubfields() {
87  // Check non-locale data
88  $this->form->setData('testData', array('subfield1' => 'abc', 'subfield2' => '0'));
89  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(true));
90  self::assertTrue($validator->isValid());
91  self::assertEquals(array(), $validator->getErrorFields());
92  self::assertSame(array('abc', '0'), $this->checkedValues);
93  $this->checkedValues = array();
94 
95  // Check complement return
96  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(false), true);
97  self::assertTrue($validator->isValid());
98  self::assertEquals(array(), $validator->getErrorFields());
99  self::assertSame(array('abc', '0'), $this->checkedValues);
100  $this->checkedValues = array();
101 
102  // Simulate invalid data (check function returns false)
103  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(false));
104  self::assertFalse($validator->isValid());
105  self::assertEquals(array('testData[subfield1]', 'testData[subfield2]'), $validator->getErrorFields());
106  self::assertSame(array('abc', '0'), $this->checkedValues);
107  $this->checkedValues = array();
108 
109  // Check locale data
110  $this->form->setData('testData', array('en_US' => 'abc', 'de_DE' => 'def'));
111  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->localeFieldValidation, array(true), false, array(), true);
112  self::assertTrue($validator->isValid());
113  self::assertEquals(array(), $validator->getErrorFields());
114  self::assertSame(array('en_US' => array('abc'), 'de_DE' => array('def')), $this->checkedValues);
115  $this->checkedValues = array();
116 
117  // Simulate invalid locale data
118  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->localeFieldValidation, array(false), false, array(), true);
119  self::assertFalse($validator->isValid());
120  self::assertEquals(array('en_US' => 'testData[en_US]', 'de_DE' => 'testData[de_DE]'), $validator->getErrorFields());
121  self::assertSame(array('en_US' => array('abc'), 'de_DE' => array('def')), $this->checkedValues);
122  $this->checkedValues = array();
123  }
124 
131  // Check non-locale data
132  $testArray = array(
133  'subfield1' => array('subsubfield1' => 'abc', 'subsubfield2' => 'def'),
134  'subfield2' => array('subsubfield1' => '0', 'subsubfield2' => 0) // also test allowed boarder conditions
135  );
136  $this->form->setData('testData', $testArray);
137  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(true), false, array('subsubfield1', 'subsubfield2'));
138  self::assertTrue($validator->isValid());
139  self::assertEquals(array(), $validator->getErrorFields());
140  self::assertSame(array('abc', 'def', '0', 0), $this->checkedValues);
141  $this->checkedValues = array();
142 
143  // Check complement return
144  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(false), true, array('subsubfield1', 'subsubfield2'));
145  self::assertTrue($validator->isValid());
146  self::assertEquals(array(), $validator->getErrorFields());
147  self::assertSame(array('abc', 'def', '0', 0), $this->checkedValues);
148  $this->checkedValues = array();
149 
150  // Simulate invalid data (check function returns false)
151  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(false), false, array('subsubfield1', 'subsubfield2'));
152  self::assertFalse($validator->isValid());
153  $expectedErrors = array(
154  'testData[subfield1][subsubfield1]', 'testData[subfield1][subsubfield2]',
155  'testData[subfield2][subsubfield1]', 'testData[subfield2][subsubfield2]'
156  );
157  self::assertEquals($expectedErrors, $validator->getErrorFields());
158  self::assertSame(array('abc', 'def', '0', 0), $this->checkedValues);
159  $this->checkedValues = array();
160 
161  // Check locale data
162  $testArray = array(
163  'en_US' => array('subsubfield1' => 'abc', 'subsubfield2' => 'def'),
164  'de_DE' => array('subsubfield1' => 'uvw', 'subsubfield2' => 'xyz')
165  );
166  $this->form->setData('testData', $testArray);
167  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->localeFieldValidation, array(true), false, array('subsubfield1', 'subsubfield2'), true);
168  self::assertTrue($validator->isValid());
169  self::assertEquals(array(), $validator->getErrorFields());
170  self::assertSame(array('en_US' => array('abc', 'def'), 'de_DE' => array('uvw', 'xyz')), $this->checkedValues);
171  $this->checkedValues = array();
172 
173  // Simulate invalid locale data
174  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->localeFieldValidation, array(false), false, array('subsubfield1', 'subsubfield2'), true);
175  self::assertFalse($validator->isValid());
176  $expectedErrors = array(
177  'en_US' => array(
178  'testData[en_US][subsubfield1]', 'testData[en_US][subsubfield2]'
179  ),
180  'de_DE' => array(
181  'testData[de_DE][subsubfield1]', 'testData[de_DE][subsubfield2]'
182  )
183  );
184  self::assertEquals($expectedErrors, $validator->getErrorFields());
185  self::assertSame(array('en_US' => array('abc', 'def'), 'de_DE' => array('uvw', 'xyz')), $this->checkedValues);
186  $this->checkedValues = array();
187  }
188 
195  // Make sure that we get 'null' in the user function
196  // whenever an expected field doesn't exist in the value array.
197  $testArray = array(
198  'subfield1' => array('subsubfield1' => null, 'subsubfield2' => ''),
199  'subfield2' => array('subsubfield2' => 0)
200  );
201  $this->form->setData('testData', $testArray);
202  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(true), false, array('subsubfield1', 'subsubfield2'));
203  self::assertTrue($validator->isValid());
204  self::assertEquals(array(), $validator->getErrorFields());
205  self::assertSame(array(null, '', null, 0), $this->checkedValues);
206  $this->checkedValues = array();
207 
208  // Pass in a one-dimensional array where a two-dimensional array is expected
209  $testArray = array('subfield1' => 'abc', 'subfield2' => 'def');
210  $this->form->setData('testData', $testArray);
211  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation, array(true), false, array('subsubfield'));
212  self::assertFalse($validator->isValid());
213  self::assertEquals(array('testData[subfield1]', 'testData[subfield2]'), $validator->getErrorFields());
214  self::assertSame(array(), $this->checkedValues);
215  $this->checkedValues = array();
216 
217  // Pass in a one-dimensional locale array where a two-dimensional array is expected
218  $testArray = array('en_US' => 'abc', 'de_DE' => 'def');
219  $this->form->setData('testData', $testArray);
220  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->localeFieldValidation, array(true), false, array('subsubfield'), true);
221  self::assertFalse($validator->isValid());
222  self::assertEquals(array('en_US' => 'testData[en_US]', 'de_DE' => 'testData[de_DE]'), $validator->getErrorFields());
223  self::assertSame(array(), $this->checkedValues);
224  $this->checkedValues = array();
225  }
226 
231  public function testIsArray() {
232  $this->form->setData('testData', array('subfield' => 'abc'));
233  $validator = new FormValidatorArrayCustom($this->form, 'testData', FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', $this->subfieldValidation);
234  self::assertTrue($validator->isArray());
235 
236  $this->form->setData('testData', 'field');
237  self::assertFalse($validator->isArray());
238  }
239 
250  public function userFunctionForSubfields($value, $additionalArgument) {
251  $this->checkedValues[] = $value;
252  return $additionalArgument;
253  }
254 
267  public function userFunctionForLocaleFields($value, $key, $additionalArgument) {
268  if (!isset($this->checkedValues[$key])) $this->checkedValues[$key] = array();
269  $this->checkedValues[$key][] = $value;
270  return $additionalArgument;
271  }
272 }
273 
FormValidatorArrayCustomTest\userFunctionForLocaleFields
userFunctionForLocaleFields($value, $key, $additionalArgument)
Definition: FormValidatorArrayCustomTest.php:267
FormValidatorArrayCustomTest
Test class for FormValidatorArrayCustom.
Definition: FormValidatorArrayCustomTest.php:20
FormValidatorArrayCustomTest\setUp
setUp()
Definition: FormValidatorArrayCustomTest.php:27
FormValidatorArrayCustomTest\$localeFieldValidation
$localeFieldValidation
Definition: FormValidatorArrayCustomTest.php:25
PKPTestCase
Class that implements functionality common to all PKP unit test cases.
Definition: PKPTestCase.inc.php:27
FormValidatorArrayCustomTest\testIsArray
testIsArray()
Definition: FormValidatorArrayCustomTest.php:231
FormValidatorArrayCustomTest\$form
$form
Definition: FormValidatorArrayCustomTest.php:23
FormValidatorArrayCustomTest\testIsValidNoArray
testIsValidNoArray()
Definition: FormValidatorArrayCustomTest.php:72
FormValidatorArrayCustomTest\userFunctionForSubfields
userFunctionForSubfields($value, $additionalArgument)
Definition: FormValidatorArrayCustomTest.php:250
FormValidatorArrayCustomTest\testIsValidOptionalAndEmpty
testIsValidOptionalAndEmpty()
Definition: FormValidatorArrayCustomTest.php:38
FormValidatorArrayCustomTest\testIsValidCheckExplicitSubsubfields
testIsValidCheckExplicitSubsubfields()
Definition: FormValidatorArrayCustomTest.php:130
FormValidatorArrayCustomTest\$subfieldValidation
$subfieldValidation
Definition: FormValidatorArrayCustomTest.php:24
FormValidatorArrayCustom
Form validation check with a custom user function performing the validation check of an array of fiel...
Definition: FormValidatorArrayCustom.inc.php:18
FormValidatorArrayCustomTest\testIsValidCheckAllSubfields
testIsValidCheckAllSubfields()
Definition: FormValidatorArrayCustomTest.php:86
Form
Class defining basic operations for handling HTML forms.
Definition: Form.inc.php:47
FormValidatorArrayCustomTest\testIsValidWithBorderConditions
testIsValidWithBorderConditions()
Definition: FormValidatorArrayCustomTest.php:194