PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/ZendTest/Validator/AbstractTest.php

https://github.com/EvanDotPro/zf2
PHP | 313 lines | 234 code | 50 blank | 29 comment | 3 complexity | 1176f4719d59edd7d18c50ad344be528 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. */
  9. namespace ZendTest\Validator;
  10. use ReflectionMethod;
  11. use Zend\Validator\AbstractValidator;
  12. use Zend\Validator\EmailAddress;
  13. use Zend\Validator\Hostname;
  14. /**
  15. * @group Zend_Validator
  16. */
  17. class AbstractTest extends \PHPUnit_Framework_TestCase
  18. {
  19. /** @var AbstractValidator */
  20. public $validator;
  21. /**
  22. * Whether an error occurred
  23. *
  24. * @var bool
  25. */
  26. protected $errorOccurred = false;
  27. public function setUp()
  28. {
  29. $this->validator = new TestAsset\ConcreteValidator();
  30. }
  31. public function tearDown()
  32. {
  33. AbstractValidator::setDefaultTranslator(null, 'default');
  34. }
  35. public function testTranslatorNullByDefault()
  36. {
  37. $this->assertNull($this->validator->getTranslator());
  38. }
  39. public function testCanSetTranslator()
  40. {
  41. $this->testTranslatorNullByDefault();
  42. set_error_handler(array($this, 'errorHandlerIgnore'));
  43. $translator = new TestAsset\Translator();
  44. restore_error_handler();
  45. $this->validator->setTranslator($translator);
  46. $this->assertSame($translator, $this->validator->getTranslator());
  47. }
  48. public function testCanSetTranslatorToNull()
  49. {
  50. $this->testCanSetTranslator();
  51. set_error_handler(array($this, 'errorHandlerIgnore'));
  52. $this->validator->setTranslator(null);
  53. restore_error_handler();
  54. $this->assertNull($this->validator->getTranslator());
  55. }
  56. public function testGlobalDefaultTranslatorNullByDefault()
  57. {
  58. $this->assertNull(AbstractValidator::getDefaultTranslator());
  59. }
  60. public function testErrorMessagesAreTranslatedWhenTranslatorPresent()
  61. {
  62. if (!extension_loaded('intl')) {
  63. $this->markTestSkipped('ext/intl not enabled');
  64. }
  65. $loader = new TestAsset\ArrayTranslator();
  66. $loader->translations = array(
  67. 'fooMessage' => 'This is the translated message for %value%',
  68. );
  69. $translator = new TestAsset\Translator();
  70. $translator->getPluginManager()->setService('default', $loader);
  71. $translator->addTranslationFile('default', null);
  72. $this->validator->setTranslator($translator);
  73. $this->assertFalse($this->validator->isValid('bar'));
  74. $messages = $this->validator->getMessages();
  75. $this->assertTrue(array_key_exists('fooMessage', $messages));
  76. $this->assertContains('bar', $messages['fooMessage'], var_export($messages, 1));
  77. $this->assertContains('This is the translated message for ', $messages['fooMessage']);
  78. }
  79. public function testCanTranslateMessagesInsteadOfKeys()
  80. {
  81. if (!extension_loaded('intl')) {
  82. $this->markTestSkipped('ext/intl not enabled');
  83. }
  84. $loader = new TestAsset\ArrayTranslator();
  85. $loader->translations = array(
  86. '%value% was passed' => 'This is the translated message for %value%',
  87. );
  88. $translator = new TestAsset\Translator();
  89. $translator->getPluginManager()->setService('default', $loader);
  90. $translator->addTranslationFile('default', null);
  91. $this->validator->setTranslator($translator);
  92. $this->assertFalse($this->validator->isValid('bar'));
  93. $messages = $this->validator->getMessages();
  94. $this->assertTrue(array_key_exists('fooMessage', $messages));
  95. $this->assertContains('bar', $messages['fooMessage'], var_export($messages, 1));
  96. $this->assertContains('This is the translated message for ', $messages['fooMessage']);
  97. }
  98. public function testObscureValueFlagFalseByDefault()
  99. {
  100. $this->assertFalse($this->validator->isValueObscured());
  101. }
  102. public function testCanSetValueObscuredFlag()
  103. {
  104. $this->testObscureValueFlagFalseByDefault();
  105. $this->validator->setValueObscured(true);
  106. $this->assertTrue($this->validator->isValueObscured());
  107. $this->validator->setValueObscured(false);
  108. $this->assertFalse($this->validator->isValueObscured());
  109. }
  110. public function testValueIsObfuscatedWheObscureValueFlagIsTrue()
  111. {
  112. $this->validator->setValueObscured(true);
  113. $this->assertFalse($this->validator->isValid('foobar'));
  114. $messages = $this->validator->getMessages();
  115. $this->assertTrue(isset($messages['fooMessage']));
  116. $message = $messages['fooMessage'];
  117. $this->assertNotContains('foobar', $message);
  118. $this->assertContains('******', $message);
  119. }
  120. /**
  121. * @group ZF-4463
  122. */
  123. public function testDoesNotFailOnObjectInput()
  124. {
  125. $this->assertFalse($this->validator->isValid(new \stdClass()));
  126. $messages = $this->validator->getMessages();
  127. $this->assertTrue(array_key_exists('fooMessage', $messages));
  128. }
  129. public function testTranslatorEnabledPerDefault()
  130. {
  131. set_error_handler(array($this, 'errorHandlerIgnore'));
  132. $translator = new TestAsset\Translator();
  133. $this->validator->setTranslator($translator);
  134. $this->assertTrue($this->validator->isTranslatorEnabled());
  135. }
  136. public function testCanDisableTranslator()
  137. {
  138. if (!extension_loaded('intl')) {
  139. $this->markTestSkipped('ext/intl not enabled');
  140. }
  141. $loader = new TestAsset\ArrayTranslator();
  142. $loader->translations = array(
  143. '%value% was passed' => 'This is the translated message for %value%',
  144. );
  145. $translator = new TestAsset\Translator();
  146. $translator->getPluginManager()->setService('default', $loader);
  147. $translator->addTranslationFile('default', null);
  148. $this->validator->setTranslator($translator);
  149. $this->assertFalse($this->validator->isValid('bar'));
  150. $messages = $this->validator->getMessages();
  151. $this->assertTrue(array_key_exists('fooMessage', $messages));
  152. $this->assertContains('bar', $messages['fooMessage']);
  153. $this->assertContains('This is the translated message for ', $messages['fooMessage']);
  154. $this->validator->setTranslatorEnabled(false);
  155. $this->assertFalse($this->validator->isTranslatorEnabled());
  156. $this->assertFalse($this->validator->isValid('bar'));
  157. $messages = $this->validator->getMessages();
  158. $this->assertTrue(array_key_exists('fooMessage', $messages));
  159. $this->assertContains('bar', $messages['fooMessage']);
  160. $this->assertContains('bar was passed', $messages['fooMessage']);
  161. }
  162. public function testGetMessageTemplates()
  163. {
  164. $messages = $this->validator->getMessageTemplates();
  165. $this->assertEquals(
  166. array('fooMessage' => '%value% was passed',
  167. 'barMessage' => '%value% was wrong'), $messages);
  168. $this->assertEquals(
  169. array(TestAsset\ConcreteValidator::FOO_MESSAGE => '%value% was passed',
  170. TestAsset\ConcreteValidator::BAR_MESSAGE => '%value% was wrong'),
  171. $messages
  172. );
  173. }
  174. public function testInvokeProxiesToIsValid()
  175. {
  176. $validator = new TestAsset\ConcreteValidator;
  177. $this->assertFalse($validator('foo'));
  178. $this->assertContains("foo was passed", $validator->getMessages());
  179. }
  180. public function testTranslatorMethods()
  181. {
  182. $translatorMock = $this->getMock('ZendTest\Validator\TestAsset\Translator');
  183. $this->validator->setTranslator($translatorMock, 'foo');
  184. $this->assertEquals($translatorMock, $this->validator->getTranslator());
  185. $this->assertEquals('foo', $this->validator->getTranslatorTextDomain());
  186. $this->assertTrue($this->validator->hasTranslator());
  187. $this->assertTrue($this->validator->isTranslatorEnabled());
  188. $this->validator->setTranslatorEnabled(false);
  189. $this->assertFalse($this->validator->isTranslatorEnabled());
  190. }
  191. public function testDefaultTranslatorMethods()
  192. {
  193. $this->assertFalse(AbstractValidator::hasDefaultTranslator());
  194. $this->assertNull(AbstractValidator::getDefaultTranslator());
  195. $this->assertEquals('default', AbstractValidator::getDefaultTranslatorTextDomain());
  196. $this->assertFalse($this->validator->hasTranslator());
  197. $translatorMock = $this->getMock('ZendTest\Validator\TestAsset\Translator');
  198. AbstractValidator::setDefaultTranslator($translatorMock, 'foo');
  199. $this->assertEquals($translatorMock, AbstractValidator::getDefaultTranslator());
  200. $this->assertEquals($translatorMock, $this->validator->getTranslator());
  201. $this->assertEquals('foo', AbstractValidator::getDefaultTranslatorTextDomain());
  202. $this->assertEquals('foo', $this->validator->getTranslatorTextDomain());
  203. $this->assertTrue(AbstractValidator::hasDefaultTranslator());
  204. }
  205. public function testMessageCreationWithNestedArrayValueDoesNotRaiseNotice()
  206. {
  207. $r = new ReflectionMethod($this->validator, 'createMessage');
  208. $r->setAccessible(true);
  209. $message = $r->invoke($this->validator, 'fooMessage', array('foo' => array('bar' => 'baz')));
  210. $this->assertContains('foo', $message);
  211. $this->assertContains('bar', $message);
  212. $this->assertContains('baz', $message);
  213. }
  214. public function testNonIdenticalMessagesAllReturned()
  215. {
  216. $this->assertFalse($this->validator->isValid('invalid'));
  217. $messages = $this->validator->getMessages();
  218. $this->assertCount(2, $messages);
  219. $this->assertEquals(array(
  220. TestAsset\ConcreteValidator::FOO_MESSAGE => 'invalid was passed',
  221. TestAsset\ConcreteValidator::BAR_MESSAGE => 'invalid was wrong'
  222. ), $messages);
  223. }
  224. public function testIdenticalMessagesNotReturned()
  225. {
  226. $this->validator->setMessage('Default error message');
  227. $this->assertFalse($this->validator->isValid('invalid'));
  228. $messages = $this->validator->getMessages();
  229. $this->assertCount(1, $messages);
  230. $this->assertEquals('Default error message', reset($messages));
  231. }
  232. public function testIdenticalAndNonIdenticalMessagesReturned()
  233. {
  234. $validator = new EmailAddress();
  235. $this->assertFalse($validator->isValid('invalid@email.coma'));
  236. $this->assertCount(3, $validator->getMessages());
  237. $this->assertArrayHasKey(EmailAddress::INVALID_HOSTNAME, $validator->getMessages());
  238. $this->assertArrayHasKey(Hostname::UNKNOWN_TLD, $validator->getMessages());
  239. $this->assertArrayHasKey(Hostname::LOCAL_NAME_NOT_ALLOWED, $validator->getMessages());
  240. $validator->setMessages(array(
  241. EmailAddress::INVALID_HOSTNAME => 'This is the same error message',
  242. Hostname::UNKNOWN_TLD => 'This is the same error message'
  243. ));
  244. $this->assertFalse($validator->isValid('invalid@email.coma'));
  245. $this->assertCount(2, $validator->getMessages());
  246. $this->assertArrayHasKey(EmailAddress::INVALID_HOSTNAME, $validator->getMessages());
  247. $this->assertArrayHasKey(Hostname::LOCAL_NAME_NOT_ALLOWED, $validator->getMessages());
  248. }
  249. /**
  250. * Ignores a raised PHP error when in effect, but throws a flag to indicate an error occurred
  251. *
  252. * @param integer $errno
  253. * @param string $errstr
  254. * @param string $errfile
  255. * @param integer $errline
  256. * @param array $errcontext
  257. * @return void
  258. */
  259. public function errorHandlerIgnore($errno, $errstr, $errfile, $errline, array $errcontext)
  260. {
  261. $this->errorOccurred = true;
  262. }
  263. }