PageRenderTime 45ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Zend/Filter/InputTest.php

https://bitbucket.org/ksekar/campus
PHP | 2328 lines | 1885 code | 290 blank | 153 comment | 11 complexity | 34d0a326e97c55d04024538b7901ce9c MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.0, MIT
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Filter
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id: InputTest.php 24594 2012-01-05 21:27:01Z matthew $
  21. */
  22. /**
  23. * @see Zend_Filter_Input
  24. */
  25. require_once 'Zend/Filter/Input.php';
  26. /**
  27. * @see Zend_Loader
  28. */
  29. require_once 'Zend/Loader.php';
  30. /**
  31. * @category Zend
  32. * @package Zend_Filter
  33. * @subpackage UnitTests
  34. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  35. * @license http://framework.zend.com/license/new-bsd New BSD License
  36. * @group Zend_Filter
  37. */
  38. class Zend_Filter_InputTest extends PHPUnit_Framework_TestCase
  39. {
  40. /**
  41. * @group ZF-11267
  42. * If we pass in a validator instance that has a preset custom message, this
  43. * message should be used.
  44. */
  45. function testIfCustomMessagesOnValidatorInstancesCanBeUsed()
  46. {
  47. // test with a Digits validator
  48. require_once 'Zend/Validate/Digits.php';
  49. require_once 'Zend/Validate/NotEmpty.php';
  50. $data = array('field1' => 'invalid data');
  51. $customMessage = 'Hey, that\'s not a Digit!!!';
  52. $validator = new Zend_Validate_Digits();
  53. $validator->setMessage($customMessage, 'notDigits');
  54. $this->assertFalse($validator->isValid('foo'), 'standalone validator thinks \'foo\' is a valid digit');
  55. $messages = $validator->getMessages();
  56. $this->assertSame($messages['notDigits'], $customMessage, 'stanalone validator does not have custom message');
  57. $validators = array('field1' => $validator);
  58. $input = new Zend_Filter_Input(null, $validators, $data);
  59. $this->assertFalse($input->isValid(), 'invalid input is valid');
  60. $messages = $input->getMessages();
  61. $this->assertSame($messages['field1']['notDigits'], $customMessage, 'The custom message is not used');
  62. // test with a NotEmpty validator
  63. $data = array('field1' => '');
  64. $customMessage = 'You should really supply a value...';
  65. $validator = new Zend_Validate_NotEmpty();
  66. $validator->setMessage($customMessage, 'isEmpty');
  67. $this->assertFalse($validator->isValid(''), 'standalone validator thinks \'\' is not empty');
  68. $messages = $validator->getMessages();
  69. $this->assertSame($messages['isEmpty'], $customMessage, 'stanalone NotEmpty validator does not have custom message');
  70. $validators = array('field1' => $validator);
  71. $input = new Zend_Filter_Input(null, $validators, $data);
  72. $this->assertFalse($input->isValid(), 'invalid input is valid');
  73. $messages = $input->getMessages();
  74. $this->assertSame($messages['field1']['isEmpty'], $customMessage, 'For the NotEmpty validator the custom message is not used');
  75. }
  76. /**
  77. *
  78. * If setAllowEmpty(true) is called, all fields are optional, but fields with
  79. * a NotEmpty validator attached to them, should contain a non empty value.
  80. *
  81. * @group ZF-9289
  82. */
  83. function testAllowEmptyTrueRespectsNotEmtpyValidators()
  84. {
  85. require_once 'Zend/Validate/NotEmpty.php';
  86. require_once 'Zend/Validate/Digits.php';
  87. $data = array(
  88. 'field1' => 'foo',
  89. 'field2' => ''
  90. );
  91. $validators = array(
  92. 'field1' => array(
  93. new Zend_Validate_NotEmpty(),
  94. Zend_Filter_Input::MESSAGES => array(
  95. array(
  96. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  97. )
  98. )
  99. ),
  100. 'field2' => array(
  101. new Zend_Validate_NotEmpty()
  102. )
  103. );
  104. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  105. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  106. $this->assertFalse($input->isValid(), 'Ouch, the NotEmpty validators are ignored!');
  107. $validators = array(
  108. 'field1' => array(
  109. 'Digits',
  110. array('NotEmpty', 'integer'),
  111. Zend_Filter_Input::MESSAGES => array(
  112. 1 =>
  113. array(
  114. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  115. )
  116. ),
  117. ),
  118. );
  119. $data = array(
  120. 'field1' => 0,
  121. 'field2' => ''
  122. );
  123. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  124. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  125. $this->assertFalse($input->isValid(), 'Ouch, if the NotEmpty validator is not the first rule, the NotEmpty validators are ignored !');
  126. // and now with a string 'NotEmpty' instead of an instance:
  127. $validators = array(
  128. 'field1' => array(
  129. 'NotEmpty',
  130. Zend_Filter_Input::MESSAGES => array(
  131. 0 =>
  132. array(
  133. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  134. )
  135. ),
  136. ),
  137. );
  138. $data = array(
  139. 'field1' => '',
  140. 'field2' => ''
  141. );
  142. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  143. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  144. $this->assertFalse($input->isValid(), 'If the NotEmpty validator is a string, the NotEmpty validator is ignored !');
  145. // and now with an array
  146. $validators = array(
  147. 'field1' => array(
  148. array('NotEmpty', 'integer'),
  149. Zend_Filter_Input::MESSAGES => array(
  150. 0 =>
  151. array(
  152. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  153. )
  154. ),
  155. ),
  156. );
  157. $data = array(
  158. 'field1' => 0,
  159. 'field2' => ''
  160. );
  161. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  162. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  163. $this->assertFalse($input->isValid(), 'If the NotEmpty validator is an array, the NotEmpty validator is ignored !');
  164. }
  165. /**
  166. * @group ZF-8446
  167. * The issue reports about nested error messages. This is to assure these do not occur.
  168. *
  169. * Example:
  170. * Expected Result
  171. * array(2) {
  172. * ["field1"] => array(1) {
  173. * ["isEmpty"] => string(20) "'field1' is required"
  174. * }
  175. * ["field2"] => array(1) {
  176. * ["isEmpty"] => string(36) "Value is required and can't be empty"
  177. * }
  178. * }
  179. * Actual Result
  180. * array(2) {
  181. * ["field1"] => array(1) {
  182. * ["isEmpty"] => array(1) {
  183. * ["isEmpty"] => string(20) "'field1' is required"
  184. * }
  185. * }
  186. * ["field2"] => array(1) {
  187. * ["isEmpty"] => array(1) {
  188. * ["isEmpty"] => string(20) "'field1' is required"
  189. * }
  190. * }
  191. * }
  192. */
  193. public function testNoNestedMessageArrays()
  194. {
  195. require_once 'Zend/Validate/NotEmpty.php';
  196. $data = array(
  197. 'field1' => '',
  198. 'field2' => ''
  199. );
  200. $validators = array(
  201. 'field1' => array(
  202. new Zend_Validate_NotEmpty(),
  203. Zend_Filter_Input::MESSAGES => array(
  204. array(
  205. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  206. )
  207. )
  208. ),
  209. 'field2' => array(
  210. new Zend_Validate_NotEmpty()
  211. )
  212. );
  213. $input = new Zend_Filter_Input( null, $validators, $data );
  214. $this->assertFalse($input->isValid());
  215. $messages = $input->getMessages();
  216. $this->assertFalse(is_array($messages['field1']['isEmpty']), 'oh oh, we may have got nested messages');
  217. $this->assertTrue(isset($messages['field1']['isEmpty']), 'oh no, we not even got the normally expected messages');
  218. }
  219. /**
  220. * @group ZF-11142, ZF-8446, ZF-9289
  221. */
  222. public function testTwoValidatorsInChainShowCorrectError()
  223. {
  224. require_once 'Zend/Validate/NotEmpty.php';
  225. require_once 'Zend/Validate/Float.php';
  226. $validators = array(
  227. 'field1' => array(
  228. 'NotEmpty', 'Float',
  229. 'presence' => 'required',
  230. 'messages' => array(
  231. 'Field1 is empty',
  232. array(Zend_Validate_Float::NOT_FLOAT => "Field1 must be a number.")
  233. )
  234. ),
  235. 'field2' => array(
  236. 'presence' => 'required'
  237. )
  238. );
  239. $data = array('field1' => 0.0, 'field2' => '');
  240. $input = new Zend_Filter_Input(null, $validators, $data);
  241. $this->assertFalse($input->isValid());
  242. $messages = $input->getMessages();
  243. $this->assertSame($messages['field2']["isEmpty"], "You must give a non-empty value for field 'field2'");
  244. $this->assertSame('Field1 is empty', $messages['field1'][Zend_Validate_NotEmpty::IS_EMPTY], 'custom message not shown');
  245. }
  246. public function testFilterDeclareSingle()
  247. {
  248. $data = array(
  249. 'month' => '6abc '
  250. );
  251. $filters = array(
  252. 'month' => 'digits'
  253. );
  254. $input = new Zend_Filter_Input($filters, null, $data);
  255. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  256. $month = $input->month;
  257. $this->assertEquals('6', $month);
  258. }
  259. public function testFilterDeclareByObject()
  260. {
  261. $data = array(
  262. 'month' => '6abc '
  263. );
  264. Zend_Loader::loadClass('Zend_Filter_Digits');
  265. $filters = array(
  266. 'month' => array(new Zend_Filter_Digits())
  267. );
  268. $input = new Zend_Filter_Input($filters, null, $data);
  269. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  270. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  271. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  272. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  273. $month = $input->month;
  274. $this->assertEquals('6', $month);
  275. }
  276. public function testFilterDeclareByArray()
  277. {
  278. $data = array(
  279. 'month' => '_6_'
  280. );
  281. $filters = array(
  282. 'month' => array(
  283. array('StringTrim', '_')
  284. )
  285. );
  286. $input = new Zend_Filter_Input($filters, null, $data);
  287. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  288. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  289. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  290. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  291. $month = $input->month;
  292. $this->assertEquals('6', $month);
  293. }
  294. public function testFilterDeclareByChain()
  295. {
  296. $data = array(
  297. 'field1' => ' ABC '
  298. );
  299. $filters = array(
  300. 'field1' => array('StringTrim', 'StringToLower')
  301. );
  302. $input = new Zend_Filter_Input($filters, null, $data);
  303. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  304. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  305. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  306. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  307. $this->assertEquals('abc', $input->field1);
  308. }
  309. public function testFilterWildcardRule()
  310. {
  311. $data = array(
  312. 'field1' => ' 12abc ',
  313. 'field2' => ' 24abc '
  314. );
  315. $filters = array(
  316. '*' => 'stringTrim',
  317. 'field1' => 'digits'
  318. );
  319. $input = new Zend_Filter_Input($filters, null, $data);
  320. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  321. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  322. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  323. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  324. $this->assertEquals('12', $input->field1);
  325. $this->assertEquals('24abc', $input->field2);
  326. }
  327. public function testFilterMultiValue()
  328. {
  329. $data = array(
  330. 'field1' => array('FOO', 'BAR', 'BaZ')
  331. );
  332. $filters = array(
  333. 'field1' => 'StringToLower'
  334. );
  335. $input = new Zend_Filter_Input($filters, null, $data);
  336. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  337. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  338. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  339. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  340. $f1 = $input->field1;
  341. $this->assertType('array', $f1);
  342. $this->assertEquals(array('foo', 'bar', 'baz'), $f1);
  343. }
  344. public function testValidatorSingle()
  345. {
  346. $data = array(
  347. 'month' => '6'
  348. );
  349. $validators = array(
  350. 'month' => 'digits'
  351. );
  352. $input = new Zend_Filter_Input(null, $validators, $data);
  353. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  354. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  355. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  356. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  357. $month = $input->month;
  358. $this->assertEquals('6', $month);
  359. }
  360. public function testValidatorSingleInvalid()
  361. {
  362. $data = array(
  363. 'month' => '6abc '
  364. );
  365. $validators = array(
  366. 'month' => 'digits'
  367. );
  368. $input = new Zend_Filter_Input(null, $validators, $data);
  369. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  370. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  371. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  372. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  373. $messages = $input->getMessages();
  374. $this->assertType('array', $messages);
  375. $this->assertEquals(array('month'), array_keys($messages));
  376. $this->assertType('array', $messages['month']);
  377. $this->assertEquals("'6abc ' must contain only digits", current($messages['month']));
  378. $errors = $input->getErrors();
  379. $this->assertType('array', $errors);
  380. $this->assertEquals(array('month'), array_keys($errors));
  381. $this->assertType('array', $errors['month']);
  382. $this->assertEquals("notDigits", $errors['month'][0]);
  383. }
  384. public function testValidatorDeclareByObject()
  385. {
  386. $data = array(
  387. 'month' => '6'
  388. );
  389. Zend_Loader::loadClass('Zend_Validate_Digits');
  390. $validators = array(
  391. 'month' => array(
  392. new Zend_Validate_Digits()
  393. )
  394. );
  395. $input = new Zend_Filter_Input(null, $validators, $data);
  396. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  397. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  398. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  399. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  400. $month = $input->month;
  401. $this->assertEquals('6', $month);
  402. }
  403. public function testValidatorDeclareByArray()
  404. {
  405. $data = array(
  406. 'month' => '6',
  407. 'month2' => 13
  408. );
  409. $validators = array(
  410. 'month' => array(
  411. 'digits',
  412. array('Between', 1, 12)
  413. ),
  414. 'month2' => array(
  415. 'digits',
  416. array('Between', 1, 12)
  417. )
  418. );
  419. $input = new Zend_Filter_Input(null, $validators, $data);
  420. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  421. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  422. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  423. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  424. $month = $input->month;
  425. $this->assertEquals('6', $month);
  426. $messages = $input->getMessages();
  427. $this->assertType('array', $messages);
  428. $this->assertEquals(array('month2'), array_keys($messages));
  429. $this->assertEquals("'13' is not between '1' and '12', inclusively", current($messages['month2']));
  430. }
  431. public function testValidatorChain()
  432. {
  433. $data = array(
  434. 'field1' => '50',
  435. 'field2' => 'abc123',
  436. 'field3' => 150,
  437. );
  438. Zend_Loader::loadClass('Zend_Validate_Between');
  439. $btw = new Zend_Validate_Between(1, 100);
  440. $validators = array(
  441. 'field1' => array('digits', $btw),
  442. 'field2' => array('digits', $btw),
  443. 'field3' => array('digits', $btw)
  444. );
  445. $input = new Zend_Filter_Input(null, $validators, $data);
  446. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  447. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  448. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  449. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  450. $messages = $input->getMessages();
  451. $this->assertType('array', $messages);
  452. $this->assertEquals(array('field2', 'field3'), array_keys($messages));
  453. $this->assertType('array', $messages['field2']);
  454. $this->assertType('array', $messages['field3']);
  455. $this->assertEquals("'abc123' must contain only digits", current($messages['field2']));
  456. $this->assertEquals("'150' is not between '1' and '100', inclusively",
  457. current($messages['field3']));
  458. }
  459. public function testValidatorInvalidFieldInMultipleRules()
  460. {
  461. $data = array(
  462. 'field2' => 'abc123',
  463. );
  464. Zend_Loader::loadClass('Zend_Validate_Between');
  465. $validators = array(
  466. 'field2a' => array(
  467. 'digits',
  468. 'fields' => 'field2'
  469. ),
  470. 'field2b' => array(
  471. new Zend_Validate_Between(1, 100),
  472. 'fields' => 'field2'
  473. )
  474. );
  475. $input = new Zend_Filter_Input(null, $validators, $data);
  476. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  477. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  478. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  479. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  480. $messages = $input->getMessages();
  481. $this->assertType('array', $messages);
  482. $this->assertEquals(array('field2a', 'field2b'), array_keys($messages));
  483. $this->assertType('array', $messages['field2a']);
  484. $this->assertType('array', $messages['field2b']);
  485. $this->assertEquals("'abc123' must contain only digits",
  486. current($messages['field2a']));
  487. $this->assertEquals("'abc123' is not between '1' and '100', inclusively",
  488. current($messages['field2b']));
  489. }
  490. public function testValidatorWildcardRule()
  491. {
  492. $data = array(
  493. 'field1' => '123abc',
  494. 'field2' => '246abc'
  495. );
  496. $validators = array(
  497. '*' => 'alnum',
  498. 'field1' => 'digits'
  499. );
  500. $input = new Zend_Filter_Input(null, $validators, $data);
  501. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  502. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  503. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  504. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  505. $this->assertNull($input->field1);
  506. $this->assertEquals('246abc', $input->field2);
  507. }
  508. public function testValidatorMultiValue()
  509. {
  510. $data = array(
  511. 'field1' => array('abc', 'def', 'ghi'),
  512. 'field2' => array('abc', '123')
  513. );
  514. $validators = array(
  515. 'field1' => 'alpha',
  516. 'field2' => 'alpha'
  517. );
  518. $input = new Zend_Filter_Input(null, $validators, $data);
  519. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  520. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  521. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  522. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  523. $messages = $input->getMessages();
  524. $this->assertType('array', $messages);
  525. $this->assertEquals(array('field2'), array_keys($messages));
  526. $this->assertEquals("'123' contains non alphabetic characters",
  527. current($messages['field2']));
  528. }
  529. public function testValidatorMultiField()
  530. {
  531. $data = array(
  532. 'password1' => 'EREIAMJH',
  533. 'password2' => 'EREIAMJH',
  534. 'password3' => 'VESPER'
  535. );
  536. $validators = array(
  537. 'rule1' => array(
  538. 'StringEquals',
  539. 'fields' => array('password1', 'password2')
  540. ),
  541. 'rule2' => array(
  542. 'StringEquals',
  543. 'fields' => array('password1', 'password3')
  544. )
  545. );
  546. $options = array(
  547. Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
  548. );
  549. $ip = get_include_path();
  550. $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
  551. $newIp = $dir . PATH_SEPARATOR . $ip;
  552. set_include_path($newIp);
  553. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  554. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  555. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  556. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  557. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  558. set_include_path($ip);
  559. $messages = $input->getMessages();
  560. $this->assertType('array', $messages);
  561. $this->assertEquals(array('rule2'), array_keys($messages));
  562. $this->assertEquals("Not all strings in the argument are equal",
  563. current($messages['rule2']));
  564. }
  565. /**
  566. * @group ZF-6711
  567. *
  568. */
  569. public function testValidatorMultiFieldAllowEmptyProcessing()
  570. {
  571. $data = array(
  572. 'password1' => 'EREIAMJH',
  573. 'password2' => 'EREIAMJH',
  574. 'password3' => '',
  575. 'password4' => ''
  576. );
  577. $validators = array(
  578. 'rule1' => array(
  579. 'StringEquals',
  580. 'fields' => array('password1', 'password2')
  581. ),
  582. 'rule2' => array(
  583. Zend_Filter_Input::ALLOW_EMPTY => false,
  584. 'StringEquals',
  585. 'fields' => array('password1', 'password3')
  586. ),
  587. 'rule3' => array(
  588. Zend_Filter_Input::ALLOW_EMPTY => false,
  589. 'StringEquals',
  590. 'fields' => array('password3', 'password4')
  591. )
  592. );
  593. $options = array(
  594. Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
  595. );
  596. $ip = get_include_path();
  597. $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
  598. $newIp = $dir . PATH_SEPARATOR . $ip;
  599. set_include_path($newIp);
  600. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  601. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  602. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  603. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  604. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  605. set_include_path($ip);
  606. $messages = $input->getMessages();
  607. $this->assertType('array', $messages);
  608. $this->assertEquals(array('rule2', 'rule3'), array_keys($messages));
  609. $this->assertEquals(array('isEmpty' => "You must give a non-empty value for field 'password3'"),
  610. $messages['rule2']);
  611. $this->assertEquals(array('isEmpty' => "You must give a non-empty value for field 'password3'",
  612. 0 => "You must give a non-empty value for field 'password4'"
  613. ),
  614. $messages['rule3']);
  615. }
  616. public function testValidatorBreakChain()
  617. {
  618. $data = array(
  619. 'field1' => '150',
  620. 'field2' => '150'
  621. );
  622. Zend_Loader::loadClass('Zend_Validate_Between');
  623. $btw1 = new Zend_Validate_Between(1, 100);
  624. $btw2 = new Zend_Validate_Between(1, 125);
  625. $messageUserDefined = 'Something other than the default message';
  626. $btw2->setMessage($messageUserDefined, Zend_Validate_Between::NOT_BETWEEN);
  627. $validators = array(
  628. 'field1' => array($btw1, $btw2),
  629. 'field2' => array($btw1, $btw2, Zend_Filter_Input::BREAK_CHAIN => true)
  630. );
  631. $input = new Zend_Filter_Input(null, $validators, $data);
  632. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  633. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  634. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  635. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  636. $messages = $input->getMessages();
  637. $this->assertType('array', $messages);
  638. $this->assertEquals(array('field1', 'field2'), array_keys($messages));
  639. $this->assertEquals(
  640. $messageUserDefined,
  641. current($messages['field1']),
  642. 'Expected message to break 2 validators, the message of the latter overwriting that of the former'
  643. );
  644. $this->assertEquals(
  645. "'150' is not between '1' and '100', inclusively",
  646. current($messages['field2']),
  647. 'Expected rule for field2 to break the validation chain at the first validator'
  648. );
  649. }
  650. public function testValidatorAllowEmpty()
  651. {
  652. $data = array(
  653. 'field1' => '',
  654. 'field2' => ''
  655. );
  656. $validators = array(
  657. 'field1' => array(
  658. 'alpha',
  659. Zend_Filter_Input::ALLOW_EMPTY => false
  660. ),
  661. 'field2' => array(
  662. 'alpha',
  663. Zend_Filter_Input::ALLOW_EMPTY => true
  664. )
  665. );
  666. $input = new Zend_Filter_Input(null, $validators, $data);
  667. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  668. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  669. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  670. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  671. $this->assertNull($input->field1);
  672. $this->assertNotNull($input->field2);
  673. $messages = $input->getMessages();
  674. $this->assertType('array', $messages);
  675. $this->assertEquals(array('field1'), array_keys($messages));
  676. $this->assertEquals("You must give a non-empty value for field 'field1'", current($messages['field1']));
  677. }
  678. /**
  679. * @group ZF-6708
  680. * @group ZF-1912
  681. */
  682. public function testValidatorAllowEmptyWithOtherValidatersProcessing()
  683. {
  684. $data = array(
  685. 'field1' => ''
  686. );
  687. $validators = array(
  688. 'field1' => array(
  689. 'alpha',
  690. Zend_Filter_Input::ALLOW_EMPTY => false
  691. ),
  692. );
  693. $input = new Zend_Filter_Input(null, $validators, $data);
  694. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  695. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  696. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  697. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return true');
  698. $messages = $input->getMessages();
  699. $this->assertType('array', $messages);
  700. $this->assertEquals(array('field1'), array_keys($messages));
  701. $this->assertEquals("You must give a non-empty value for field 'field1'", current($messages['field1']));
  702. }
  703. /**
  704. * @group ZF-6708
  705. */
  706. public function testValidatorShouldNotProcessZeroAsEmpty()
  707. {
  708. $validation = array(
  709. 'offset' => array (
  710. 'digits',
  711. 'presence' => 'required'
  712. )
  713. );
  714. $data = array(
  715. 'offset' => 0,
  716. );
  717. $input = new Zend_Filter_Input(null, $validation, $data);
  718. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  719. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  720. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  721. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  722. $messages = $input->getMessages();
  723. $this->assertEquals(array(), array_keys($messages));
  724. }
  725. public function testValidatorAllowEmptyNoValidatorChain()
  726. {
  727. Zend_Loader::loadClass('Zend_Filter_StringTrim');
  728. Zend_Loader::loadClass('Zend_Filter_StripTags');
  729. Zend_Loader::loadClass('Zend_Validate_EmailAddress');
  730. $data = array(
  731. 'nick' => '',
  732. 'email' => 'someemail@server.com'
  733. );
  734. $filters = array(
  735. '*' => new Zend_Filter_StringTrim(),
  736. 'nick' => new Zend_Filter_StripTags()
  737. );
  738. $validators = array(
  739. 'email' => array(
  740. new Zend_Validate_EmailAddress(),
  741. Zend_Filter_Input::ALLOW_EMPTY => true
  742. ),
  743. /*
  744. * This is the case we're testing - when presense is required,
  745. * but there are no validators besides disallowing empty values.
  746. */
  747. 'nick' => array(
  748. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED,
  749. Zend_Filter_Input::ALLOW_EMPTY => false
  750. )
  751. );
  752. $input = new Zend_Filter_Input($filters, $validators, $data);
  753. if ($input->hasInvalid()) {
  754. $input->getMessages();
  755. }
  756. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  757. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  758. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  759. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  760. $messages = $input->getMessages();
  761. $this->assertType('array', $messages);
  762. $this->assertEquals(array('nick'), array_keys($messages));
  763. $this->assertEquals(1, count($messages['nick']));
  764. }
  765. public function testValidatorAllowEmptySetNotEmptyMessage()
  766. {
  767. $data = array(
  768. 'field1' => '',
  769. );
  770. $validators = array(
  771. 'field1Rule' => array(
  772. Zend_Filter_Input::ALLOW_EMPTY => false,
  773. 'fields' => 'field1'
  774. )
  775. );
  776. $options = array(
  777. Zend_Filter_Input::NOT_EMPTY_MESSAGE => "You cannot give an empty value for field '%field%', according to rule '%rule%'"
  778. );
  779. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  780. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  781. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  782. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  783. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  784. $this->assertNull($input->field1);
  785. $messages = $input->getMessages();
  786. $this->assertType('array', $messages);
  787. $this->assertEquals(array('field1Rule'), array_keys($messages));
  788. $this->assertType('array', $messages['field1Rule']);
  789. $this->assertEquals("You cannot give an empty value for field 'field1', according to rule 'field1Rule'", current($messages['field1Rule']));
  790. }
  791. public function testValidatorDefault()
  792. {
  793. $validators = array(
  794. 'field1' => array('presence' => 'required', 'allowEmpty' => false),
  795. 'field2' => array('presence' => 'optional', 'allowEmpty' => false),
  796. 'field3' => array('presence' => 'required', 'allowEmpty' => true),
  797. 'field4' => array('presence' => 'optional', 'allowEmpty' => true),
  798. 'field5' => array('presence' => 'required', 'allowEmpty' => false, 'default' => 'field5default'),
  799. 'field6' => array('presence' => 'optional', 'allowEmpty' => false, 'default' => 'field6default'),
  800. 'field7' => array('presence' => 'required', 'allowEmpty' => true, 'default' => 'field7default'),
  801. 'field8' => array('presence' => 'optional', 'allowEmpty' => true, 'default' => array('field8default', 'field8default2')),
  802. );
  803. $data = array();
  804. $input = new Zend_Filter_Input(null, $validators, $data);
  805. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  806. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  807. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  808. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  809. $missing = $input->getMissing();
  810. $this->assertType('array', $missing);
  811. // make sure field5 and field7 are not counted as missing
  812. $this->assertEquals(array('field1', 'field3'), array_keys($missing));
  813. $this->assertNull($input->field1);
  814. $this->assertNull($input->field2);
  815. $this->assertNull($input->field3);
  816. $this->assertNull($input->field4);
  817. $this->assertEquals('field5default', $input->field5, 'Expected field5 to be non-null');
  818. $this->assertEquals('field6default', $input->field6, 'Expected field6 to be non-null');
  819. $this->assertEquals('field7default', $input->field7, 'Expected field7 to be non-null');
  820. $this->assertEquals('field8default', $input->field8, 'Expected field8 to be non-null');
  821. }
  822. /**
  823. * @group ZF-6761
  824. */
  825. public function testValidatorMissingDefaults()
  826. {
  827. $validators = array(
  828. 'rule1' => array('presence' => 'required',
  829. 'fields' => array('field1', 'field2'),
  830. 'default' => array('field1default'))
  831. );
  832. $data = array();
  833. $input = new Zend_Filter_Input(null, $validators, $data);
  834. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  835. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  836. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  837. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  838. $missing = $input->getMissing();
  839. $this->assertType('array', $missing);
  840. $this->assertEquals(array('rule1'), array_keys($missing));
  841. $this->assertEquals(array("Field 'field2' is required by rule 'rule1', but the field is missing"), $missing['rule1']);
  842. }
  843. public function testValidatorDefaultDoesNotOverwriteData()
  844. {
  845. $validators = array(
  846. 'field1' => array('presence' => 'required', 'allowEmpty' => false, 'default' => 'abcd'),
  847. 'field2' => array('presence' => 'optional', 'allowEmpty' => false, 'default' => 'abcd'),
  848. 'field3' => array('presence' => 'required', 'allowEmpty' => true, 'default' => 'abcd'),
  849. 'field4' => array('presence' => 'optional', 'allowEmpty' => true, 'default' => 'abcd'),
  850. );
  851. $data = array(
  852. 'field1' => 'ABCD',
  853. 'field2' => 'ABCD',
  854. 'field3' => 'ABCD',
  855. 'field4' => 'ABCD'
  856. );
  857. $input = new Zend_Filter_Input(null, $validators, $data);
  858. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  859. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  860. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  861. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  862. $this->assertEquals('ABCD', $input->field1);
  863. $this->assertEquals('ABCD', $input->field2);
  864. $this->assertEquals('ABCD', $input->field3);
  865. $this->assertEquals('ABCD', $input->field4);
  866. }
  867. public function testValidatorNotAllowEmpty()
  868. {
  869. $filters = array(
  870. 'field1' => 'Digits',
  871. 'field2' => 'Alnum'
  872. );
  873. $validators = array(
  874. 'field1' => array('Digits'),
  875. 'field2' => array('Alnum'),
  876. 'field3' => array('Alnum', 'presence' => 'required')
  877. );
  878. $data = array(
  879. 'field1' => 'asd1', // Valid data
  880. 'field2' => '$' // Invalid data
  881. );
  882. $input = new Zend_Filter_Input($filters, $validators, $data);
  883. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  884. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  885. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  886. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  887. $messages = $input->getMessages();
  888. $this->assertType('array', $messages);
  889. $this->assertEquals(array('field2', 'field3'), array_keys($messages));
  890. $this->assertType('array', $messages['field2']);
  891. $this->assertEquals("You must give a non-empty value for field 'field2'", current($messages['field2']));
  892. }
  893. public function testValidatorMessagesSingle()
  894. {
  895. $data = array('month' => '13abc');
  896. $digitsMesg = 'Month should consist of digits';
  897. $validators = array(
  898. 'month' => array(
  899. 'digits',
  900. 'messages' => $digitsMesg
  901. )
  902. );
  903. $input = new Zend_Filter_Input(null, $validators, $data);
  904. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  905. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  906. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  907. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  908. $messages = $input->getMessages();
  909. $this->assertType('array', $messages);
  910. $this->assertEquals(array('month'), array_keys($messages));
  911. $this->assertEquals(1, count($messages['month']));
  912. $this->assertEquals($digitsMesg, current($messages['month']));
  913. }
  914. public function testValidatorMessagesMultiple()
  915. {
  916. $data = array('month' => '13abc');
  917. $digitsMesg = 'Month should consist of digits';
  918. $betweenMesg = 'Month should be between 1 and 12';
  919. Zend_Loader::loadClass('Zend_Validate_Between');
  920. $validators = array(
  921. 'month' => array(
  922. 'digits',
  923. new Zend_Validate_Between(1, 12),
  924. 'messages' => array(
  925. $digitsMesg,
  926. $betweenMesg
  927. )
  928. )
  929. );
  930. $input = new Zend_Filter_Input(null, $validators, $data);
  931. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  932. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  933. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  934. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  935. $messages = $input->getMessages();
  936. $this->assertType('array', $messages);
  937. $this->assertEquals(array('month'), array_keys($messages));
  938. $this->assertEquals(2, count($messages['month']));
  939. $this->assertEquals($digitsMesg, $messages['month']['notDigits']);
  940. $this->assertEquals($betweenMesg, $messages['month']['notBetween']);
  941. }
  942. public function testValidatorMessagesFieldsMultiple()
  943. {
  944. $data = array('field1' => array('13abc', '234'));
  945. $digitsMesg = 'Field1 should consist of digits';
  946. $betweenMesg = 'Field1 should be between 1 and 12';
  947. Zend_Loader::loadClass('Zend_Validate_Between');
  948. $validators = array(
  949. 'field1' => array(
  950. 'digits',
  951. new Zend_Validate_Between(1, 12),
  952. 'messages' => array(
  953. $digitsMesg,
  954. $betweenMesg
  955. )
  956. )
  957. );
  958. $input = new Zend_Filter_Input(null, $validators, $data);
  959. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  960. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  961. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  962. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  963. $messages = $input->getMessages();
  964. $this->assertType('array', $messages);
  965. $this->assertEquals(array('field1'), array_keys($messages));
  966. $this->assertEquals(3, count($messages['field1']));
  967. $this->assertEquals($digitsMesg, $messages['field1']['notDigits']);
  968. $this->assertEquals($betweenMesg, $messages['field1']['notBetween']);
  969. }
  970. public function testValidatorMessagesIntIndex()
  971. {
  972. $data = array('month' => '13abc');
  973. $betweenMesg = 'Month should be between 1 and 12';
  974. Zend_Loader::loadClass('Zend_Validate_Between');
  975. $validators = array(
  976. 'month' => array(
  977. 'digits',
  978. new Zend_Validate_Between(1, 12),
  979. 'messages' => array(
  980. 1 => $betweenMesg
  981. )
  982. )
  983. );
  984. $input = new Zend_Filter_Input(null, $validators, $data);
  985. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  986. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  987. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  988. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  989. $messages = $input->getMessages();
  990. $this->assertType('array', $messages);
  991. $this->assertEquals(array('month'), array_keys($messages));
  992. $this->assertEquals(2, count($messages['month']));
  993. $this->assertEquals("'13abc' must contain only digits", current($messages['month']));
  994. /**
  995. * @todo $this->assertEquals($betweenMesg, next($messages['month']));
  996. */
  997. }
  998. public function testValidatorMessagesSingleWithKeys()
  999. {
  1000. $data = array('month' => '13abc');
  1001. $digitsMesg = 'Month should consist of digits';
  1002. $validators = array(
  1003. 'month' => array(
  1004. 'digits',
  1005. 'messages' => array('notDigits' => $digitsMesg)
  1006. )
  1007. );
  1008. $input = new Zend_Filter_Input(null, $validators, $data);
  1009. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1010. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1011. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1012. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1013. $messages = $input->getMessages();
  1014. $this->assertType('array', $messages);
  1015. $this->assertEquals(array('month'), array_keys($messages));
  1016. $this->assertEquals(1, count($messages['month']));
  1017. // $this->assertEquals($digitsMesg, $messages['month'][0]);
  1018. }
  1019. public function testValidatorMessagesMultipleWithKeys()
  1020. {
  1021. $data = array('month' => '13abc');
  1022. $digitsMesg = 'Month should consist of digits';
  1023. $betweenMesg = 'Month should be between 1 and 12';
  1024. Zend_Loader::loadClass('Zend_Validate_Between');
  1025. $validators = array(
  1026. 'month' => array(
  1027. 'digits',
  1028. new Zend_Validate_Between(1, 12),
  1029. 'messages' => array(
  1030. array('notDigits' => $digitsMesg),
  1031. array('notBetween' => $betweenMesg)
  1032. )
  1033. )
  1034. );
  1035. $input = new Zend_Filter_Input(null, $validators, $data);
  1036. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1037. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1038. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1039. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1040. $messages = $input->getMessages();
  1041. $this->assertType('array', $messages);
  1042. $this->assertEquals(array('month'), array_keys($messages));
  1043. $this->assertEquals(2, count($messages['month']));
  1044. // $this->assertEquals($digitsMesg, $messages['month'][0]);
  1045. // $this->assertEquals($betweenMesg, $messages['month'][1]);
  1046. }
  1047. public function testValidatorMessagesMixedWithKeys()
  1048. {
  1049. $data = array('month' => '13abc');
  1050. $digitsMesg = 'Month should consist of digits';
  1051. $betweenMesg = 'Month should be between 1 and 12';
  1052. Zend_Loader::loadClass('Zend_Validate_Between');
  1053. $validators = array(
  1054. 'month' => array(
  1055. 'digits',
  1056. new Zend_Validate_Between(1, 12),
  1057. 'messages' => array(
  1058. $digitsMesg,
  1059. array('notBetween' => $betweenMesg)
  1060. )
  1061. )
  1062. );
  1063. $input = new Zend_Filter_Input(null, $validators, $data);
  1064. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1065. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1066. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1067. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1068. $messages = $input->getMessages();
  1069. $this->assertType('array', $messages);
  1070. $this->assertEquals(array('month'), array_keys($messages));
  1071. $this->assertEquals(2, count($messages['month']));
  1072. // $this->assertEquals($digitsMesg, $messages['month'][0]);
  1073. // $this->assertEquals($betweenMesg, $messages['month'][1]);
  1074. }
  1075. public function testValidatorHasMissing()
  1076. {
  1077. $data = array();
  1078. $validators = array(
  1079. 'month' => array(
  1080. 'digits',
  1081. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1082. )
  1083. );
  1084. $input = new Zend_Filter_Input(null, $validators, $data);
  1085. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1086. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1087. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1088. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1089. }
  1090. public function testValidatorFieldOptional()
  1091. {
  1092. $data = array();
  1093. $validators = array(
  1094. 'month' => array(
  1095. 'digits',
  1096. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_OPTIONAL
  1097. )
  1098. );
  1099. $input = new Zend_Filter_Input(null, $validators, $data);
  1100. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1101. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1102. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1103. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1104. }
  1105. public function testValidatorGetMissing()
  1106. {
  1107. $data = array();
  1108. $validators = array(
  1109. 'month' => array(
  1110. 'digits',
  1111. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1112. )
  1113. );
  1114. $input = new Zend_Filter_Input(null, $validators, $data);
  1115. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1116. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1117. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1118. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1119. $missing = $input->getMissing();
  1120. $this->assertType('array', $missing);
  1121. $this->assertEquals(array('month'), array_keys($missing));
  1122. $this->assertEquals("Field 'month' is required by rule 'month', but the field is missing", $missing['month'][0]);
  1123. }
  1124. public function testValidatorSetMissingMessage()
  1125. {
  1126. $data = array();
  1127. $validators = array(
  1128. 'monthRule' => array(
  1129. 'digits',
  1130. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED,
  1131. 'fields' => 'month'
  1132. )
  1133. );
  1134. $options = array(
  1135. Zend_Filter_Input::MISSING_MESSAGE => 'I looked for %field% but I did not find it; it is required by rule %rule%'
  1136. );
  1137. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  1138. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1139. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1140. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1141. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1142. $missing = $input->getMissing();
  1143. $this->assertType('array', $missing);
  1144. $this->assertEquals(array('monthRule'), array_keys($missing));
  1145. $this->assertEquals("I looked for month but I did not find it; it is required by rule monthRule", $missing['monthRule'][0]);
  1146. }
  1147. public function testValidatorHasUnknown()
  1148. {
  1149. $data = array(
  1150. 'unknown' => 'xxx'
  1151. );
  1152. $validators = array(
  1153. 'month' => 'digits'
  1154. );
  1155. $input = new Zend_Filter_Input(null, $validators, $data);
  1156. $this->assertFalse($input->hasMissing(), 'Expecting hasMissing() to return false');
  1157. $this->assertFalse($input->hasInvalid(), 'Expecting hasInvalid() to return false');
  1158. $this->assertTrue($input->hasUnknown(), 'Expecting hasUnknown() to return true');
  1159. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1160. }
  1161. public function testValidatorGetUnknown()
  1162. {
  1163. $data = array(
  1164. 'unknown' => 'xxx'
  1165. );
  1166. $validators = array(
  1167. 'month' => 'digits'
  1168. );
  1169. $input = new Zend_Filter_Input(null, $validators, $data);
  1170. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1171. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1172. $this->assertTrue($input->hasUnknown(), 'Expected hasUnknown() to retrun true');
  1173. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1174. $unknown = $input->getUnknown();
  1175. $this->assertType('array', $unknown);
  1176. $this->assertThat($unknown, $this->arrayHasKey('unknown'));
  1177. }
  1178. public function testValidatorGetInvalid()
  1179. {
  1180. $data = array(
  1181. 'month' => '6abc '
  1182. );
  1183. $validators = array(
  1184. 'month' => 'digits',
  1185. 'field2' => array('digits', 'presence' => 'required')
  1186. );
  1187. $input = new Zend_Filter_Input(null, $validators, $data);
  1188. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1189. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1190. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1191. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1192. $messages = $input->getMessages();
  1193. $invalid = $input->getInvalid();
  1194. $missing = $input->getMissing();
  1195. $this->assertType('array', $messages);
  1196. $this->assertEquals(array('month', 'field2'), array_keys($messages));
  1197. $this->assertType('array', $invalid);
  1198. $this->assertEquals(array('month'), array_keys($invalid));
  1199. $this->assertType('array', $missing);
  1200. $this->assertEquals(array('field2'), array_keys($missing));
  1201. $this->assertEquals(array_merge($invalid, $missing), $messages);
  1202. }
  1203. public function testValidatorIsValid()
  1204. {
  1205. $data = array(
  1206. 'field1' => 'abc123',
  1207. 'field2' => 'abcdef'
  1208. );
  1209. $validators = array(
  1210. 'field1' => 'alpha',
  1211. 'field2' => 'alpha'
  1212. );
  1213. $input = new Zend_Filter_Input(null, $validators, $data);
  1214. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1215. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1216. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1217. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1218. $this->assertFalse($input->isValid());
  1219. $this->assertFalse($input->isValid('field1'));
  1220. $this->assertTrue($input->isValid('field2'));
  1221. $input->setData(array('field2' => 'abcdef'));
  1222. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1223. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1224. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1225. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1226. $this->assertTrue($input->isValid());
  1227. $this->assertFalse($input->isValid('field1'));
  1228. $this->assertTrue($input->isValid('field2'));
  1229. }
  1230. public function testAddNamespace()
  1231. {
  1232. $data = array(
  1233. 'field1' => 'abc',
  1234. 'field2' => '123',
  1235. 'field3' => '123'
  1236. );
  1237. $validators = array(
  1238. 'field1' => 'MyDigits',
  1239. 'field2' => 'MyDigits',
  1240. 'field3' => 'digits'
  1241. );
  1242. $ip = get_include_path();
  1243. $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
  1244. $newIp = $dir . PATH_SEPARATOR . $ip;
  1245. set_include_path($newIp);
  1246. $input = new Zend_Filter_Input(null, $validators, $data);
  1247. $input->addNamespace('TestNamespace');
  1248. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1249. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1250. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1251. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1252. set_include_path($ip);
  1253. $this->assertEquals('123', (string) $input->field2);
  1254. $this->assertEquals('123', (string) $input->field3);
  1255. $messages = $input->getMessages();
  1256. $this->assertType('array', $messages);
  1257. $this->assertThat($messages, $this->arrayHasKey('field1'));
  1258. $this->assertEquals("'abc' must contain only digits", current($messages['field1']));
  1259. }
  1260. public function testGetPluginLoader()
  1261. {
  1262. $input = new Zend_Filter_Input(null, null);
  1263. $loader = $input->getPluginLoader(Zend_Filter_Input::VALIDATE);
  1264. $this->assertType('Zend_Loader_PluginLoader', $loader,
  1265. 'Expected object of type Zend_Loader_PluginLoader, got ' , get_class($loader));
  1266. try {
  1267. $loader = $input->getPluginLoader('foo');
  1268. $this->fail('Expected to catch Zend_Filter_Exception');
  1269. } catch (Zend_Exception $e) {
  1270. $this->assertType('Zend_Filter_Exception', $e,
  1271. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1272. $this->assertEquals('Invalid type "foo" provided to getPluginLoader()',
  1273. $e->getMessage());
  1274. }
  1275. }
  1276. public function testSetPluginLoader()
  1277. {
  1278. $input = new Zend_Filter_Input(null, null);
  1279. $loader = new Zend_Loader_PluginLoader();
  1280. $input->setPluginLoader($loader, Zend_Filter_Input::VALIDATE);
  1281. }
  1282. public function testSetPluginLoaderInvalidType()
  1283. {
  1284. $input = new Zend_Filter_Input(null, null);
  1285. $loader = new Zend_Loader_PluginLoader();
  1286. try {
  1287. $input->setPluginLoader($loader, 'foo');
  1288. $this->fail('Expected to catch Zend_Filter_Exception');
  1289. } catch (Zend_Exception $e) {
  1290. $this->assertType('Zend_Filter_Exception', $e,
  1291. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1292. $this->assertEquals('Invalid type "foo" provided to setPluginLoader()',
  1293. $e->getMessage());
  1294. }
  1295. }
  1296. public function testNamespaceExceptionClassNotFound()
  1297. {
  1298. $data = array(
  1299. 'field1' => 'abc'
  1300. );
  1301. $validators = array(
  1302. 'field1' => 'MyDigits'
  1303. );
  1304. // Do not add namespace on purpose, so MyDigits will not be found
  1305. $input = new Zend_Filter_Input(null, $validators, $data);
  1306. try {
  1307. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1308. $this->fail('Expected to catch Zend_Filter_Exception');
  1309. } catch (Zend_Exception $e) {
  1310. $this->assertType('Zend_Loader_PluginLoader_Exception', $e,
  1311. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1312. $this->assertContains("not found in the registry", $e->getMessage());
  1313. }
  1314. }
  1315. public function testNamespaceExceptionInvalidClass()
  1316. {
  1317. $data = array(
  1318. 'field1' => 'abc'
  1319. );
  1320. // Zend_Validate_Exception exists, but does not implement the needed interface
  1321. $validators = array(
  1322. 'field1' => 'Exception'
  1323. );
  1324. $input = new Zend_Filter_Input(null, $validators, $data);
  1325. try {
  1326. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1327. $this->fail('Expected to catch Zend_Filter_Exception');
  1328. } catch (Zend_Exception $e) {
  1329. $this->assertType('Zend_Filter_Exception', $e,
  1330. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1331. $this->assertEquals("Class 'Zend_Validate_Exception' based on basename 'Exception' must implement the 'Zend_Validate_Interface' interface",
  1332. $e->getMessage());
  1333. }
  1334. }
  1335. public function testSetDefaultEscapeFilter()
  1336. {
  1337. $data = array(
  1338. 'field1' => ' ab&c '
  1339. );
  1340. $input = new Zend_Filter_Input(null, null, $data);
  1341. $input->setDefaultEscapeFilter('StringTrim');
  1342. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1343. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1344. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1345. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1346. $this->assertEquals('ab&c', $input->field1);
  1347. }
  1348. public function testSetDefaultEscapeFilterExceptionWrongClassType()
  1349. {
  1350. $input = new Zend_Filter_Input(null, null);
  1351. try {
  1352. $input->setDefaultEscapeFilter(new StdClass());
  1353. $this->fail('Expected to catch Zend_Filter_Exception');
  1354. } catch (Zend_Exception $e) {
  1355. $this->assertType('Zend_Filter_Exception', $e,
  1356. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1357. $this->assertEquals("Escape filter specified does not implement Zend_Filter_Interface", $e->getMessage());
  1358. }
  1359. }
  1360. public function testOptionAllowEmpty()
  1361. {
  1362. $data = array(
  1363. 'field1' => ''
  1364. );
  1365. $validators = array(
  1366. 'field1' => 'alpha'
  1367. );
  1368. $options = array(
  1369. Zend_Filter_Input::ALLOW_EMPTY => true
  1370. );
  1371. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  1372. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1373. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1374. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1375. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1376. $this->assertNotNull($input->field1);
  1377. $this->assertEquals('', $input->field1);
  1378. }
  1379. public function testOptionBreakChain()
  1380. {
  1381. $data = array(
  1382. 'field1' => '150'
  1383. );
  1384. Zend_Loader::loadClass('Zend_Validate_Between');
  1385. $btw1 = new Zend_Validate_Between(1, 100);
  1386. $btw2 = new Zend_Validate_Between(1, 125);
  1387. $validators = array(
  1388. 'field1' => array($btw1, $btw2),
  1389. );
  1390. $options = array(
  1391. Zend_Filter_Input::BREAK_CHAIN => true
  1392. );
  1393. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  1394. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1395. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1396. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1397. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1398. $messages = $input->getMessages();
  1399. $this->assertType('array', $messages);
  1400. $this->assertEquals(array('field1'), array_keys($messages));
  1401. $this->assertEquals(1, count($messages['field1']), 'Expected rule for field1 to break 1 validator');
  1402. $this->assertEquals("'150' is not between '1' and '100', inclusively",
  1403. current($messages['field1']));
  1404. }
  1405. public function testOptionEscapeFilter()
  1406. {
  1407. $data = array(
  1408. 'field1' => ' ab&c '
  1409. );
  1410. $options = array(
  1411. Zend_Filter_Input::ESCAPE_FILTER => 'StringTrim'
  1412. );
  1413. $input = new Zend_Filter_Input(null, null, $data, $options);
  1414. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1415. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1416. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1417. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1418. $this->assertEquals('ab&c', $input->field1);
  1419. }
  1420. public function testOptionNamespace()
  1421. {
  1422. $data = array(
  1423. 'field1' => 'abc',
  1424. 'field2' => '123',
  1425. 'field3' => '123'
  1426. );
  1427. $validators = array(
  1428. 'field1' => 'MyDigits',
  1429. 'field2' => 'MyDigits',
  1430. 'field3' => 'digits'
  1431. );
  1432. $options = array(
  1433. Zend_Filter_Input::INPUT_NAMESPACE => 'TestNamespace'
  1434. );
  1435. $ip = get_include_path();
  1436. $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files';
  1437. $newIp = $dir . PATH_SEPARATOR . $ip;
  1438. set_include_path($newIp);
  1439. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  1440. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1441. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1442. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1443. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1444. set_include_path($ip);
  1445. $this->assertEquals('123', (string) $input->field2);
  1446. $this->assertEquals('123', (string) $input->field3);
  1447. $messages = $input->getMessages();
  1448. $this->assertType('array', $messages);
  1449. $this->assertThat($messages, $this->arrayHasKey('field1'));
  1450. $this->assertEquals("'abc' must contain only digits", current($messages['field1']));
  1451. }
  1452. public function testOptionPresence()
  1453. {
  1454. $data = array(
  1455. 'field1' => '123'
  1456. // field2 is missing deliberately
  1457. );
  1458. $validators = array(
  1459. 'field1' => 'Digits',
  1460. 'field2' => 'Digits'
  1461. );
  1462. $options = array(
  1463. Zend_Filter_Input::PRESENCE => true
  1464. );
  1465. $input = new Zend_Filter_Input(null, $validators, $data, $options);
  1466. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return false');
  1467. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1468. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1469. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1470. $missing = $input->getMissing();
  1471. $this->assertType('array', $missing);
  1472. $this->assertEquals(array('field2'), array_keys($missing));
  1473. $this->assertEquals("Field 'field2' is required by rule 'field2', but the field is missing", $missing['field2'][0]);
  1474. }
  1475. public function testOptionExceptionUnknown()
  1476. {
  1477. $options = array(
  1478. 'unknown' => 'xxx'
  1479. );
  1480. try {
  1481. $input = new Zend_Filter_Input(null, null, null, $options);
  1482. $this->fail('Expected to catch Zend_Filter_Exception');
  1483. } catch (Zend_Exception $e) {
  1484. $this->assertType('Zend_Filter_Exception', $e,
  1485. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1486. $this->assertEquals("Unknown option 'unknown'", $e->getMessage());
  1487. }
  1488. }
  1489. public function testGetEscaped()
  1490. {
  1491. $data = array(
  1492. 'field1' => 'ab&c'
  1493. );
  1494. $input = new Zend_Filter_Input(null, null, $data);
  1495. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1496. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1497. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1498. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1499. $this->assertEquals('ab&amp;c', $input->getEscaped('field1'));
  1500. $this->assertNull($input->getEscaped('field2'));
  1501. }
  1502. public function testGetEscapedAllFields()
  1503. {
  1504. $data = array(
  1505. 'field1' => 'ab&c'
  1506. );
  1507. $input = new Zend_Filter_Input(null, null, $data);
  1508. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1509. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1510. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1511. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1512. $this->assertEquals(array('field1' => 'ab&amp;c'), $input->getEscaped());
  1513. }
  1514. public function testMagicGetEscaped()
  1515. {
  1516. $data = array(
  1517. 'field1' => 'ab&c'
  1518. );
  1519. $input = new Zend_Filter_Input(null, null, $data);
  1520. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1521. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1522. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1523. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1524. $this->assertEquals('ab&amp;c', $input->field1);
  1525. $this->assertNull($input->field2);
  1526. }
  1527. public function testGetEscapedMultiValue()
  1528. {
  1529. $data = array(
  1530. 'multiSelect' => array('C&H', 'B&O', 'AT&T')
  1531. );
  1532. $input = new Zend_Filter_Input(null, null, $data);
  1533. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1534. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1535. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1536. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1537. $multi = $input->getEscaped('multiSelect');
  1538. $this->assertType('array', $multi);
  1539. $this->assertEquals(3, count($multi));
  1540. $this->assertEquals(array('C&amp;H', 'B&amp;O', 'AT&amp;T'), $multi);
  1541. }
  1542. public function testGetUnescaped()
  1543. {
  1544. $data = array(
  1545. 'field1' => 'ab&c'
  1546. );
  1547. $input = new Zend_Filter_Input(null, null, $data);
  1548. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1549. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1550. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1551. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1552. $this->assertEquals('ab&c', $input->getUnescaped('field1'));
  1553. $this->assertNull($input->getUnescaped('field2'));
  1554. }
  1555. public function testGetUnescapedAllFields()
  1556. {
  1557. $data = array(
  1558. 'field1' => 'ab&c'
  1559. );
  1560. $input = new Zend_Filter_Input(null, null, $data);
  1561. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1562. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1563. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1564. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1565. $this->assertEquals(array('field1' => 'ab&c'), $input->getUnescaped());
  1566. }
  1567. public function testMagicIsset()
  1568. {
  1569. $data = array(
  1570. 'field1' => 'ab&c'
  1571. );
  1572. $input = new Zend_Filter_Input(null, null, $data);
  1573. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1574. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1575. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1576. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1577. $this->assertTrue(isset($input->field1));
  1578. $this->assertFalse(isset($input->field2));
  1579. }
  1580. public function testProcess()
  1581. {
  1582. $data = array(
  1583. 'field1' => 'ab&c',
  1584. 'field2' => '123abc'
  1585. );
  1586. $filters = array(
  1587. '*' => 'StringTrim',
  1588. 'field2' => 'digits'
  1589. );
  1590. $validators = array(
  1591. 'field1' => array(Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_OPTIONAL),
  1592. 'field2' => array(
  1593. 'digits',
  1594. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1595. )
  1596. );
  1597. $input = new Zend_Filter_Input($filters, $validators, $data);
  1598. try {
  1599. $input->process();
  1600. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1601. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1602. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1603. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1604. } catch (Zend_Exception $e) {
  1605. $this->fail('Received Zend_Exception where none was expected');
  1606. }
  1607. }
  1608. public function testProcessUnknownThrowsNoException()
  1609. {
  1610. $data = array(
  1611. 'field1' => 'ab&c',
  1612. 'field2' => '123abc',
  1613. 'field3' => 'unknown'
  1614. );
  1615. $filters = array(
  1616. '*' => 'StringTrim',
  1617. 'field2' => 'digits'
  1618. );
  1619. $validators = array(
  1620. 'field1' => array(Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_OPTIONAL),
  1621. 'field2' => array(
  1622. 'digits',
  1623. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1624. )
  1625. );
  1626. $input = new Zend_Filter_Input($filters, $validators, $data);
  1627. try {
  1628. $input->process();
  1629. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1630. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1631. $this->assertTrue($input->hasUnknown(), 'Expected hasUnknown() to retrun true');
  1632. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1633. } catch (Zend_Exception $e) {
  1634. $this->fail('Received Zend_Exception where none was expected');
  1635. }
  1636. }
  1637. public function testProcessInvalidThrowsException()
  1638. {
  1639. $data = array(
  1640. 'field1' => 'ab&c',
  1641. 'field2' => 'abc' // invalid because no digits
  1642. );
  1643. $filters = array(
  1644. '*' => 'StringTrim',
  1645. 'field2' => 'digits'
  1646. );
  1647. $validators = array(
  1648. 'field1' => array(Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_OPTIONAL),
  1649. 'field2' => array(
  1650. 'digits',
  1651. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1652. )
  1653. );
  1654. $input = new Zend_Filter_Input($filters, $validators, $data);
  1655. try {
  1656. $input->process();
  1657. $this->fail('Expected to catch Zend_Filter_Exception');
  1658. } catch (Zend_Exception $e) {
  1659. $this->assertType('Zend_Filter_Exception', $e,
  1660. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1661. $this->assertEquals("Input has invalid fields", $e->getMessage());
  1662. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1663. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1664. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1665. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1666. }
  1667. }
  1668. public function testProcessMissingThrowsException()
  1669. {
  1670. $data = array(
  1671. 'field1' => 'ab&c'
  1672. // field2 is missing on purpose for this test
  1673. );
  1674. $filters = array(
  1675. '*' => 'StringTrim',
  1676. 'field2' => 'digits'
  1677. );
  1678. $validators = array(
  1679. 'field1' => array(
  1680. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_OPTIONAL
  1681. ),
  1682. 'field2' => array(
  1683. 'digits',
  1684. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED
  1685. )
  1686. );
  1687. $input = new Zend_Filter_Input($filters, $validators, $data);
  1688. try {
  1689. $input->process();
  1690. $this->fail('Expected to catch Zend_Filter_Exception');
  1691. } catch (Zend_Exception $e) {
  1692. $this->assertType('Zend_Filter_Exception', $e,
  1693. 'Expected object of type Zend_Filter_Exception, got '.get_class($e));
  1694. $this->assertEquals("Input has missing fields", $e->getMessage());
  1695. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1696. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1697. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1698. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1699. }
  1700. }
  1701. /**
  1702. * @group ZF-3004
  1703. */
  1704. public function testInsertingNullDoesNotGetEscapedWithDefaultEscapeMethod()
  1705. {
  1706. $input = new Zend_Filter_Input(null, null, array('test' => null));
  1707. $input->process();
  1708. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1709. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1710. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1711. $this->assertTrue($input->hasValid(), 'Expected hasValid() to return true');
  1712. $this->assertNull($input->getUnescaped('test'), 'getUnescaped of test fails to return null');
  1713. $this->assertNull($input->getEscaped('test'), 'getEscaped of test fails to return null');
  1714. $this->assertNull($input->test, 'magic get of test fails to return null');
  1715. }
  1716. /**
  1717. * @group ZF-3100
  1718. */
  1719. public function testPluginLoaderInputNamespaceWithSameNameFilterAndValidatorLeadsToException()
  1720. {
  1721. $filters = array(
  1722. 'date1' => array('Date')
  1723. );
  1724. $validators = array(
  1725. 'date1' => array('Date')
  1726. );
  1727. $data = array(
  1728. 'date1' => '1990-01-01'
  1729. );
  1730. $options = array(
  1731. 'inputNamespace' => array('MyZend_Filter', 'MyZend_Validate'),
  1732. );
  1733. $filter = new Zend_Filter_Input($filters, $validators, $data, $options);
  1734. try {
  1735. $filter->process();
  1736. $this->fail();
  1737. } catch(Zend_Filter_Exception $e) {
  1738. $this->assertEquals(
  1739. "Class 'MyZend_Validate_Date' based on basename 'Date' must implement the 'Zend_Filter_Interface' interface",
  1740. $e->getMessage()
  1741. );
  1742. }
  1743. }
  1744. /**
  1745. * @group ZF-3100
  1746. */
  1747. public function testPluginLoaderWithFilterValidateNamespaceWithSameNameFilterAndValidatorWorksPerfectly()
  1748. {
  1749. // Array
  1750. $filters = array(
  1751. 'date1' => array('Date')
  1752. );
  1753. $validators = array(
  1754. 'date1' => array('Date')
  1755. );
  1756. $data = array(
  1757. 'date1' => '1990-01-01'
  1758. );
  1759. $options = array(
  1760. 'filterNamespace' => array('MyZend_Filter'),
  1761. 'validatorNamespace' => array('MyZend_Validate'),
  1762. );
  1763. $filter = new Zend_Filter_Input($filters, $validators, $data, $options);
  1764. try {
  1765. $filter->process();
  1766. $this->assertEquals("2000-01-01", $filter->date1);
  1767. } catch(Zend_Filter_Exception $e) {
  1768. $this->fail();
  1769. }
  1770. // String notation
  1771. $options = array(
  1772. 'filterNamespace' => 'MyZend_Filter',
  1773. 'validatorNamespace' => 'MyZend_Validate',
  1774. );
  1775. $filter = new Zend_Filter_Input($filters, $validators, $data, $options);
  1776. try {
  1777. $filter->process();
  1778. $this->assertEquals("2000-01-01", $filter->date1);
  1779. } catch(Zend_Filter_Exception $e) {
  1780. $this->fail();
  1781. }
  1782. }
  1783. /**
  1784. * @group ZF-7135
  1785. */
  1786. public function testValidatorAllowNull()
  1787. {
  1788. $data = array(
  1789. 'field1' => null
  1790. );
  1791. $validators = array(
  1792. 'field1' => array(
  1793. 'notEmpty'
  1794. )
  1795. );
  1796. $input = new Zend_Filter_Input(null, $validators, $data);
  1797. $this->assertFalse($input->hasMissing(), 'Expected hasMissing() to return false');
  1798. $this->assertTrue($input->hasInvalid(), 'Expected hasInvalid() to return true');
  1799. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1800. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return true');
  1801. $this->assertNull($input->field1);
  1802. }
  1803. /**
  1804. * @group ZF-7034
  1805. */
  1806. public function testSettingNotEmptyMessageAndMessagePerKeyAndMessagePerArray()
  1807. {
  1808. require_once 'Zend/Validate/NotEmpty.php';
  1809. require_once 'Zend/Validate/Regex.php';
  1810. require_once 'Zend/Validate/StringLength.php';
  1811. $filters = array( );
  1812. $validators = array(
  1813. 'street' => array (
  1814. new Zend_Validate_NotEmpty (),
  1815. new Zend_Validate_Regex ( '/^[a-zA-Z0-9]{1,30}$/u' ),
  1816. new Zend_Validate_StringLength ( 0, 10 ),
  1817. Zend_Filter_Input::PRESENCE => Zend_Filter_Input::PRESENCE_REQUIRED,
  1818. Zend_Filter_Input::DEFAULT_VALUE => '',
  1819. Zend_Filter_Input::BREAK_CHAIN => true,
  1820. 'messages' => array (
  1821. 0 => 'Bitte geben Sie Ihre Straße ein.',
  1822. 'Verwenden Sie bitte keine Sonderzeichen bei der Eingabe.',
  1823. array (
  1824. Zend_Validate_StringLength::TOO_LONG => 'Bitte beschränken Sie sich auf %max% Zeichen'
  1825. )
  1826. )
  1827. )
  1828. );
  1829. $filter = new Zend_Filter_Input($filters, $validators, array('street' => ''));
  1830. $this->assertFalse($filter->isValid());
  1831. $message = $filter->getMessages();
  1832. $this->assertContains('Bitte geben Sie Ihre Straße ein.', $message['street']['isEmpty']);
  1833. $filter2 = new Zend_Filter_Input($filters, $validators, array('street' => 'Str!!'));
  1834. $this->assertFalse($filter2->isValid());
  1835. $message = $filter2->getMessages();
  1836. $this->assertContains('Verwenden Sie bitte keine Sonderzeichen', $message['street']['regexNotMatch']);
  1837. $filter3 = new Zend_Filter_Input($filters, $validators, array('street' => 'Str1234567890'));
  1838. $this->assertFalse($filter3->isValid());
  1839. $message = $filter3->getMessages();
  1840. $this->assertContains('Bitte beschränken Sie sich auf', $message['street']['stringLengthTooLong']);
  1841. }
  1842. /**
  1843. * @group ZF-7394
  1844. */
  1845. public function testSettingMultipleNotEmptyMessages()
  1846. {
  1847. require_once 'Zend/Validate/NotEmpty.php';
  1848. require_once 'Zend/Validate/Regex.php';
  1849. require_once 'Zend/Validate/StringLength.php';
  1850. $filters = array( );
  1851. $validators = array(
  1852. 'name' => array('NotEmpty','messages' => 'Please enter your name'),
  1853. 'subject' => array('NotEmpty','messages' => 'Please enter a subject'),
  1854. 'email' => array('EmailAddress','messages' => 'Please enter a valid Email address'),
  1855. 'content' => array('NotEmpty','messages' => 'Please enter message contents')
  1856. );
  1857. $data = array(
  1858. 'name' => '',
  1859. 'subject' => '',
  1860. 'content' => ''
  1861. );
  1862. $filter = new Zend_Filter_Input($filters, $validators, $data);
  1863. $this->assertFalse($filter->isValid());
  1864. $message = $filter->getMessages();
  1865. $this->assertContains('Please enter your name', $message['name']['isEmpty']);
  1866. $this->assertContains('Please enter a subject', $message['subject']['isEmpty']);
  1867. $this->assertContains('Please enter message contents', $message['content']['isEmpty']);
  1868. }
  1869. /**
  1870. * @group ZF-3736
  1871. */
  1872. public function testTranslateNotEmptyMessages()
  1873. {
  1874. require_once 'Zend/Translate/Adapter/Array.php';
  1875. $translator = new Zend_Translate_Adapter_Array(array('missingMessage' => 'Still missing'), 'en');
  1876. $validators = array(
  1877. 'rule1' => array('presence' => 'required',
  1878. 'fields' => array('field1', 'field2'),
  1879. 'default' => array('field1default'))
  1880. );
  1881. $data = array();
  1882. $input = new Zend_Filter_Input(null, $validators, $data);
  1883. $input->setTranslator($translator);
  1884. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1885. $missing = $input->getMissing();
  1886. $this->assertType('array', $missing);
  1887. $this->assertEquals(array('rule1'), array_keys($missing));
  1888. $this->assertEquals(array("Still missing"), $missing['rule1']);
  1889. }
  1890. /**
  1891. * @group ZF-3736
  1892. */
  1893. public function testTranslateNotEmptyMessagesByUsingRegistry()
  1894. {
  1895. require_once 'Zend/Translate/Adapter/Array.php';
  1896. $translator = new Zend_Translate_Adapter_Array(array('missingMessage' => 'Still missing'), 'en');
  1897. require_once 'Zend/Registry.php';
  1898. Zend_Registry::set('Zend_Translate', $translator);
  1899. $validators = array(
  1900. 'rule1' => array('presence' => 'required',
  1901. 'fields' => array('field1', 'field2'),
  1902. 'default' => array('field1default'))
  1903. );
  1904. $data = array();
  1905. $input = new Zend_Filter_Input(null, $validators, $data);
  1906. $this->assertTrue($input->hasMissing(), 'Expected hasMissing() to return true');
  1907. $this->assertFalse($input->hasInvalid(), 'Expected hasInvalid() to return false');
  1908. $this->assertFalse($input->hasUnknown(), 'Expected hasUnknown() to return false');
  1909. $this->assertFalse($input->hasValid(), 'Expected hasValid() to return false');
  1910. $missing = $input->getMissing();
  1911. $this->assertType('array', $missing);
  1912. $this->assertEquals(array('rule1'), array_keys($missing));
  1913. $this->assertEquals(array("Still missing"), $missing['rule1']);
  1914. }
  1915. /**
  1916. * If setAllowEmpty(true) is called, all fields are optional, but fields with
  1917. * a NotEmpty validator attached to them, should contain a non empty value.
  1918. *
  1919. * @group ZF-9289
  1920. */
  1921. function testAllowEmptyTrueRespectsNotEmptyValidators()
  1922. {
  1923. $data = array(
  1924. 'field1' => 'foo',
  1925. 'field2' => ''
  1926. );
  1927. $validators = array(
  1928. 'field1' => array(
  1929. new Zend_Validate_NotEmpty(),
  1930. Zend_Filter_Input::MESSAGES => array(
  1931. array(
  1932. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  1933. )
  1934. )
  1935. ),
  1936. 'field2' => array(
  1937. new Zend_Validate_NotEmpty()
  1938. )
  1939. );
  1940. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  1941. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  1942. $this->assertFalse($input->isValid(), 'Ouch, the NotEmpty validators are ignored!');
  1943. $validators = array(
  1944. 'field1' => array(
  1945. 'Digits',
  1946. array('NotEmpty', 'integer'),
  1947. Zend_Filter_Input::MESSAGES => array(
  1948. 1 =>
  1949. array(
  1950. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  1951. )
  1952. )
  1953. )
  1954. );
  1955. $data = array(
  1956. 'field1' => 0,
  1957. 'field2' => ''
  1958. );
  1959. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  1960. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  1961. $this->assertFalse($input->isValid(), 'Ouch, if the NotEmpty validator is not the first rule, the NotEmpty validators are ignored !');
  1962. // and now with a string 'NotEmpty' instead of an instance:
  1963. $validators = array(
  1964. 'field1' => array(
  1965. 'NotEmpty',
  1966. Zend_Filter_Input::MESSAGES => array(
  1967. 0 =>
  1968. array(
  1969. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  1970. )
  1971. )
  1972. )
  1973. );
  1974. $data = array(
  1975. 'field1' => '',
  1976. 'field2' => ''
  1977. );
  1978. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  1979. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  1980. $this->assertFalse($input->isValid(), 'If the NotEmpty validator is a string, the NotEmpty validator is ignored !');
  1981. // and now with an array
  1982. $validators = array(
  1983. 'field1' => array(
  1984. array('NotEmpty', 'integer'),
  1985. Zend_Filter_Input::MESSAGES => array(
  1986. 0 =>
  1987. array(
  1988. Zend_Validate_NotEmpty::IS_EMPTY => '\'field1\' is required'
  1989. )
  1990. )
  1991. )
  1992. );
  1993. $data = array(
  1994. 'field1' => 0,
  1995. 'field2' => ''
  1996. );
  1997. $options = array(Zend_Filter_Input::ALLOW_EMPTY => true);
  1998. $input = new Zend_Filter_Input( null, $validators, $data, $options );
  1999. $this->assertFalse($input->isValid(), 'If the NotEmpty validator is an array, the NotEmpty validator is ignored !');
  2000. }
  2001. /**
  2002. * This test doesn't include any assertions as it's purpose is to
  2003. * ensure that passing an empty array value into a $validators rule
  2004. * doesn't cause a notice to be emitted
  2005. *
  2006. * @group ZF-11819
  2007. */
  2008. public function testValidatorRuleCanHaveEmptyArrayAsMetacommandValue()
  2009. {
  2010. $validators = array(
  2011. 'perms' => array('Int', 'default' => array()),
  2012. );
  2013. $validate = new Zend_Filter_Input(NULL, $validators);
  2014. $validate->isValid();
  2015. }
  2016. }
  2017. class MyZend_Filter_Date implements Zend_Filter_Interface
  2018. {
  2019. public function filter($value)
  2020. {
  2021. return "2000-01-01";
  2022. }
  2023. }
  2024. class MyZend_Validate_Date implements Zend_Validate_Interface
  2025. {
  2026. public function isValid($value)
  2027. {
  2028. return true;
  2029. }
  2030. public function getMessages()
  2031. {
  2032. return array();
  2033. }
  2034. public function getErrors()
  2035. {
  2036. return array();
  2037. }
  2038. }