PageRenderTime 27ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/laravel/tests/cases/validator.test.php

https://bitbucket.org/Maron1/taqman
PHP | 711 lines | 419 code | 117 blank | 175 comment | 0 complexity | 7314efb9dd2f7674dbc1824378497c16 MD5 | raw file
  1. <?php
  2. class ValidatorTest extends PHPUnit_Framework_TestCase {
  3. /**
  4. * Setup the test environment.
  5. */
  6. public function setUp()
  7. {
  8. Config::set('database.default', 'sqlite');
  9. }
  10. /**
  11. * Tear down the test environment.
  12. */
  13. public function tearDown()
  14. {
  15. Config::set('database.default', 'mysql');
  16. $_FILES = array();
  17. }
  18. /**
  19. * Test the required validation rule.
  20. *
  21. * @group laravel
  22. */
  23. public function testRequiredRule()
  24. {
  25. $input = array('name' => 'Taylor Otwell');
  26. $rules = array('name' => 'required');
  27. $this->assertTrue(Validator::make($input, $rules)->valid());
  28. $input['name'] = '';
  29. $this->assertFalse(Validator::make($input, $rules)->valid());
  30. unset($input['name']);
  31. $this->assertFalse(Validator::make($input, $rules)->valid());
  32. $_FILES['name']['tmp_name'] = 'foo';
  33. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  34. $_FILES['name']['tmp_name'] = '';
  35. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  36. }
  37. /**
  38. * Test the confirmed validation rule.
  39. *
  40. * @group laravel
  41. */
  42. public function testTheConfirmedRule()
  43. {
  44. $input = array('password' => 'foo', 'password_confirmation' => 'foo');
  45. $rules = array('password' => 'confirmed');
  46. $this->assertTrue(Validator::make($input, $rules)->valid());
  47. $input['password_confirmation'] = 'foo_bar';
  48. $this->assertFalse(Validator::make($input, $rules)->valid());
  49. unset($input['password_confirmation']);
  50. $this->assertFalse(Validator::make($input, $rules)->valid());
  51. }
  52. /**
  53. * Test the different validation rule.
  54. *
  55. * @group laravel
  56. */
  57. public function testTheDifferentRule()
  58. {
  59. $input = array('password' => 'foo', 'password_confirmation' => 'bar');
  60. $rules = array('password' => 'different:password_confirmation');
  61. $this->assertTrue(Validator::make($input, $rules)->valid());
  62. $input['password_confirmation'] = 'foo';
  63. $this->assertFalse(Validator::make($input, $rules)->valid());
  64. unset($input['password_confirmation']);
  65. $this->assertFalse(Validator::make($input, $rules)->valid());
  66. }
  67. /**
  68. * Test the accepted validation rule.
  69. *
  70. * @group laravel
  71. */
  72. public function testTheAcceptedRule()
  73. {
  74. $input = array('terms' => '1');
  75. $rules = array('terms' => 'accepted');
  76. $this->assertTrue(Validator::make($input, $rules)->valid());
  77. $input['terms'] = 'yes';
  78. $this->assertTrue(Validator::make($input, $rules)->valid());
  79. $input['terms'] = '2';
  80. $this->assertFalse(Validator::make($input, $rules)->valid());
  81. // The accepted rule implies required, so should fail if field not present.
  82. unset($input['terms']);
  83. $this->assertFalse(Validator::make($input, $rules)->valid());
  84. }
  85. /**
  86. * Test the numeric validation rule.
  87. *
  88. * @group laravel
  89. */
  90. public function testTheNumericRule()
  91. {
  92. $input = array('amount' => '1.21');
  93. $rules = array('amount' => 'numeric');
  94. $this->assertTrue(Validator::make($input, $rules)->valid());
  95. $input['amount'] = '1';
  96. $this->assertTrue(Validator::make($input, $rules)->valid());
  97. $input['amount'] = 1.2;
  98. $this->assertTrue(Validator::make($input, $rules)->valid());
  99. $input['amount'] = '1.2a';
  100. $this->assertFalse(Validator::make($input, $rules)->valid());
  101. }
  102. /**
  103. * Test the integer validation rule.
  104. *
  105. * @group laravel
  106. */
  107. public function testTheIntegerRule()
  108. {
  109. $input = array('amount' => '1');
  110. $rules = array('amount' => 'integer');
  111. $this->assertTrue(Validator::make($input, $rules)->valid());
  112. $input['amount'] = '0';
  113. $this->assertTrue(Validator::make($input, $rules)->valid());
  114. $input['amount'] = 1.2;
  115. $this->assertFalse(Validator::make($input, $rules)->valid());
  116. $input['amount'] = '1.2a';
  117. $this->assertFalse(Validator::make($input, $rules)->valid());
  118. }
  119. /**
  120. * Test the size validation rule.
  121. *
  122. * @group laravel
  123. */
  124. public function testTheSizeRule()
  125. {
  126. $input = array('amount' => '1.21');
  127. $rules = array('amount' => 'numeric|size:1.21');
  128. $this->assertTrue(Validator::make($input, $rules)->valid());
  129. $rules = array('amount' => 'numeric|size:1');
  130. $this->assertFalse(Validator::make($input, $rules)->valid());
  131. // If no numeric rule is on the field, it is treated as a string
  132. $input = array('amount' => '111');
  133. $rules = array('amount' => 'size:3');
  134. $this->assertTrue(Validator::make($input, $rules)->valid());
  135. $rules = array('amount' => 'size:4');
  136. $this->assertFalse(Validator::make($input, $rules)->valid());
  137. // The size rules checks kilobytes on files
  138. $_FILES['photo']['tmp_name'] = 'foo';
  139. $_FILES['photo']['size'] = 10240;
  140. $rules = array('photo' => 'size:10');
  141. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  142. $_FILES['photo']['size'] = 14000;
  143. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  144. }
  145. /**
  146. * Test the between validation rule.
  147. *
  148. * @group laravel
  149. */
  150. public function testTheBetweenRule()
  151. {
  152. $input = array('amount' => '1.21');
  153. $rules = array('amount' => 'numeric|between:1,2');
  154. $this->assertTrue(Validator::make($input, $rules)->valid());
  155. $rules = array('amount' => 'numeric|between:2,3');
  156. $this->assertFalse(Validator::make($input, $rules)->valid());
  157. // If no numeric rule is on the field, it is treated as a string
  158. $input = array('amount' => '111');
  159. $rules = array('amount' => 'between:1,3');
  160. $this->assertTrue(Validator::make($input, $rules)->valid());
  161. $rules = array('amount' => 'between:100,111');
  162. $this->assertFalse(Validator::make($input, $rules)->valid());
  163. // The size rules checks kilobytes on files
  164. $_FILES['photo']['tmp_name'] = 'foo';
  165. $_FILES['photo']['size'] = 10240;
  166. $rules = array('photo' => 'between:9,11');
  167. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  168. $_FILES['photo']['size'] = 14000;
  169. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  170. }
  171. /**
  172. * Test the between validation rule.
  173. *
  174. * @group laravel
  175. */
  176. public function testTheMinRule()
  177. {
  178. $input = array('amount' => '1.21');
  179. $rules = array('amount' => 'numeric|min:1');
  180. $this->assertTrue(Validator::make($input, $rules)->valid());
  181. $rules = array('amount' => 'numeric|min:2');
  182. $this->assertFalse(Validator::make($input, $rules)->valid());
  183. // If no numeric rule is on the field, it is treated as a string
  184. $input = array('amount' => '01');
  185. $rules = array('amount' => 'min:2');
  186. $this->assertTrue(Validator::make($input, $rules)->valid());
  187. $rules = array('amount' => 'min:3');
  188. $this->assertFalse(Validator::make($input, $rules)->valid());
  189. // The size rules checks kilobytes on files
  190. $_FILES['photo']['tmp_name'] = 'foo';
  191. $_FILES['photo']['size'] = 10240;
  192. $rules = array('photo' => 'min:9');
  193. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  194. $_FILES['photo']['size'] = 8000;
  195. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  196. }
  197. /**
  198. * Test the between validation rule.
  199. *
  200. * @group laravel
  201. */
  202. public function testTheMaxRule()
  203. {
  204. $input = array('amount' => '1.21');
  205. $rules = array('amount' => 'numeric|max:2');
  206. $this->assertTrue(Validator::make($input, $rules)->valid());
  207. $rules = array('amount' => 'numeric|max:1');
  208. $this->assertFalse(Validator::make($input, $rules)->valid());
  209. // If no numeric rule is on the field, it is treated as a string
  210. $input = array('amount' => '01');
  211. $rules = array('amount' => 'max:3');
  212. $this->assertTrue(Validator::make($input, $rules)->valid());
  213. $rules = array('amount' => 'max:1');
  214. $this->assertFalse(Validator::make($input, $rules)->valid());
  215. // The size rules checks kilobytes on files
  216. $_FILES['photo']['tmp_name'] = 'foo';
  217. $_FILES['photo']['size'] = 10240;
  218. $rules = array('photo' => 'max:11');
  219. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  220. $_FILES['photo']['size'] = 140000;
  221. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  222. }
  223. /**
  224. * Test the in validation rule.
  225. *
  226. * @group laravel
  227. */
  228. public function testTheInRule()
  229. {
  230. $input = array('size' => 'L');
  231. $rules = array('size' => 'in:S,M,L');
  232. $this->assertTrue(Validator::make($input, $rules)->valid());
  233. $input['size'] = 'XL';
  234. $this->assertFalse(Validator::make($input, $rules)->valid());
  235. }
  236. /**
  237. * Test the not-in validation rule.
  238. *
  239. * @group laravel
  240. */
  241. public function testTheNotInRule()
  242. {
  243. $input = array('size' => 'L');
  244. $rules = array('size' => 'not_in:S,M,L');
  245. $this->assertFalse(Validator::make($input, $rules)->valid());
  246. $input['size'] = 'XL';
  247. $this->assertTrue(Validator::make($input, $rules)->valid());
  248. }
  249. /**
  250. * Test the IP validation rule.
  251. *
  252. * @group laravel
  253. */
  254. public function testTheIPRule()
  255. {
  256. $input = array('ip' => '192.168.1.1');
  257. $rules = array('ip' => 'ip');
  258. $this->assertTrue(Validator::make($input, $rules)->valid());
  259. $input['ip'] = '192.111';
  260. $this->assertFalse(Validator::make($input, $rules)->valid());
  261. }
  262. /**
  263. * Test the e-mail validation rule.
  264. *
  265. * @group laravel
  266. */
  267. public function testTheEmailRule()
  268. {
  269. $input = array('email' => 'example@gmail.com');
  270. $rules = array('email' => 'email');
  271. $this->assertTrue(Validator::make($input, $rules)->valid());
  272. $input['email'] = 'blas-asok';
  273. $this->assertFalse(Validator::make($input, $rules)->valid());
  274. }
  275. /**
  276. * Test the URL validation rule.
  277. *
  278. * @group laravel
  279. */
  280. public function testTheUrlRule()
  281. {
  282. $input = array('url' => 'http://www.google.com');
  283. $rules = array('url' => 'url');
  284. $this->assertTrue(Validator::make($input, $rules)->valid());
  285. $input['url'] = 'blas-asok';
  286. $this->assertFalse(Validator::make($input, $rules)->valid());
  287. }
  288. /**
  289. * Test the active URL validation rule.
  290. *
  291. * @group laravel
  292. */
  293. public function testTheActiveUrlRule()
  294. {
  295. $input = array('url' => 'http://google.com');
  296. $rules = array('url' => 'active_url');
  297. $this->assertTrue(Validator::make($input, $rules)->valid());
  298. $input['url'] = 'http://asdlk-aselkaiwels.com';
  299. $this->assertFalse(Validator::make($input, $rules)->valid());
  300. }
  301. /**
  302. * Test the image validation rule.
  303. *
  304. * @group laravel
  305. */
  306. public function testTheImageRule()
  307. {
  308. $_FILES['photo']['tmp_name'] = path('storage').'files/desert.jpg';
  309. $rules = array('photo' => 'image');
  310. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  311. $_FILES['photo']['tmp_name'] = path('app').'routes.php';
  312. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  313. }
  314. /**
  315. * Test the alpha validation rule.
  316. *
  317. * @group laravel
  318. */
  319. public function testTheAlphaRule()
  320. {
  321. $input = array('name' => 'TaylorOtwell');
  322. $rules = array('name' => 'alpha');
  323. $this->assertTrue(Validator::make($input, $rules)->valid());
  324. $input['name'] = 'Taylor Otwell';
  325. $this->assertFalse(Validator::make($input, $rules)->valid());
  326. }
  327. /**
  328. * Test the alpha_num validation rule.
  329. *
  330. * @group laravel
  331. */
  332. public function testTheAlphaNumRule()
  333. {
  334. $input = array('name' => 'TaylorOtwell1');
  335. $rules = array('name' => 'alpha_num');
  336. $this->assertTrue(Validator::make($input, $rules)->valid());
  337. $input['name'] = 'Taylor Otwell';
  338. $this->assertFalse(Validator::make($input, $rules)->valid());
  339. }
  340. /**
  341. * Test the alpha_num validation rule.
  342. *
  343. * @group laravel
  344. */
  345. public function testTheAlphaDashRule()
  346. {
  347. $input = array('name' => 'Taylor-Otwell_1');
  348. $rules = array('name' => 'alpha_dash');
  349. $this->assertTrue(Validator::make($input, $rules)->valid());
  350. $input['name'] = 'Taylor Otwell';
  351. $this->assertFalse(Validator::make($input, $rules)->valid());
  352. }
  353. /**
  354. * Test the mimes validation rule.
  355. *
  356. * @group laravel
  357. */
  358. public function testTheMimesRule()
  359. {
  360. $_FILES['file']['tmp_name'] = path('app').'routes.php';
  361. $rules = array('file' => 'mimes:php,txt');
  362. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  363. $rules = array('file' => 'mimes:jpg,bmp');
  364. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  365. $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg';
  366. $rules['file'] = 'mimes:jpg,bmp';
  367. $this->assertTrue(Validator::make($_FILES, $rules)->valid());
  368. $rules['file'] = 'mimes:txt,bmp';
  369. $this->assertFalse(Validator::make($_FILES, $rules)->valid());
  370. }
  371. /**
  372. * Test the unique validation rule.
  373. *
  374. * @group laravel
  375. */
  376. public function testUniqueRule()
  377. {
  378. $input = array('code' => 'ZZ');
  379. $rules = array('code' => 'unique:validation_unique');
  380. $this->assertTrue(Validator::make($input, $rules)->valid());
  381. $input = array('code' => 'AR');
  382. $this->assertFalse(Validator::make($input, $rules)->valid());
  383. $rules = array('code' => 'unique:validation_unique,code,AR,code');
  384. $this->assertTrue(Validator::make($input, $rules)->valid());
  385. }
  386. /**
  387. * Tests the exists validation rule.
  388. *
  389. * @group laravel
  390. */
  391. public function testExistsRule()
  392. {
  393. $input = array('code' => 'TX');
  394. $rules = array('code' => 'exists:validation_unique');
  395. $this->assertTrue(Validator::make($input, $rules)->valid());
  396. $input['code'] = array('TX', 'NY');
  397. $rules = array('code' => 'exists:validation_unique,code');
  398. $this->assertTrue(Validator::make($input, $rules)->valid());
  399. $input['code'] = array('TX', 'XX');
  400. $this->assertFalse(Validator::make($input, $rules)->valid());
  401. $input['code'] = 'XX';
  402. $this->assertFalse(Validator::make($input, $rules)->valid());
  403. }
  404. /**
  405. * Tests the date_format validation rule.
  406. *
  407. * @group laravel
  408. */
  409. public function testTheDateFormatRule()
  410. {
  411. $input = array('date' => '15-Feb-2009');
  412. $rules = array('date' => 'date_format:j-M-Y');
  413. $this->assertTrue(Validator::make($input, $rules)->valid());
  414. $input['date'] = '2009-02-15,15:16:17';
  415. $rules['date'] = 'date_format:"Y-m-d,H:i:s"';
  416. $this->assertTrue(Validator::make($input, $rules)->valid());
  417. $input['date'] = '2009-02-15';
  418. $this->assertFalse(Validator::make($input, $rules)->valid());
  419. $input['date'] = '15:16:17';
  420. $this->assertFalse(Validator::make($input, $rules)->valid());
  421. }
  422. /**
  423. * Test that the validator sets the correct messages.
  424. *
  425. * @group laravel
  426. */
  427. public function testCorrectMessagesAreSet()
  428. {
  429. $lang = require path('app').'language/en/validation.php';
  430. $input = array('email' => 'example-foo');
  431. $rules = array('name' => 'required', 'email' => 'required|email');
  432. $v = Validator::make($input, $rules);
  433. $v->valid();
  434. $messages = $v->errors;
  435. $this->assertInstanceOf('Laravel\\Messages', $messages);
  436. $this->assertEquals(str_replace(':attribute', 'name', $lang['required']), $messages->first('name'));
  437. $this->assertEquals(str_replace(':attribute', 'email', $lang['email']), $messages->first('email'));
  438. }
  439. /**
  440. * Test that custom messages are recognized.
  441. *
  442. * @group laravel
  443. */
  444. public function testCustomMessagesAreRecognize()
  445. {
  446. $messages = array('required' => 'Required!');
  447. $rules = array('name' => 'required');
  448. $v = Validator::make(array(), $rules, $messages);
  449. $v->valid();
  450. $this->assertEquals('Required!', $v->errors->first('name'));
  451. $messages['email_required'] = 'Email Required!';
  452. $rules = array('name' => 'required', 'email' => 'required');
  453. $v = Validator::make(array(), $rules, $messages);
  454. $v->valid();
  455. $this->assertEquals('Required!', $v->errors->first('name'));
  456. $this->assertEquals('Email Required!', $v->errors->first('email'));
  457. $rules = array('custom' => 'required');
  458. $v = Validator::make(array(), $rules);
  459. $v->valid();
  460. $this->assertEquals('This field is required!', $v->errors->first('custom'));
  461. }
  462. /**
  463. * Test that size replacements are made on messages.
  464. *
  465. * @group laravel
  466. */
  467. public function testNumericSizeReplacementsAreMade()
  468. {
  469. $lang = require path('app').'language/en/validation.php';
  470. $input = array('amount' => 100);
  471. $rules = array('amount' => 'numeric|size:80');
  472. $v = Validator::make($input, $rules);
  473. $v->valid();
  474. $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['numeric']), $v->errors->first('amount'));
  475. $rules = array('amount' => 'numeric|between:70,80');
  476. $v = Validator::make($input, $rules);
  477. $v->valid();
  478. $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['numeric']);
  479. $this->assertEquals($expect, $v->errors->first('amount'));
  480. $rules = array('amount' => 'numeric|min:120');
  481. $v = Validator::make($input, $rules);
  482. $v->valid();
  483. $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['numeric']);
  484. $this->assertEquals($expect, $v->errors->first('amount'));
  485. $rules = array('amount' => 'numeric|max:20');
  486. $v = Validator::make($input, $rules);
  487. $v->valid();
  488. $expect = str_replace(array(':attribute', ':max'), array('amount', '20'), $lang['max']['numeric']);
  489. $this->assertEquals($expect, $v->errors->first('amount'));
  490. }
  491. /**
  492. * Test that string size replacements are made on messages.
  493. *
  494. * @group laravel
  495. */
  496. public function testStringSizeReplacementsAreMade()
  497. {
  498. $lang = require path('app').'language/en/validation.php';
  499. $input = array('amount' => '100');
  500. $rules = array('amount' => 'size:80');
  501. $v = Validator::make($input, $rules);
  502. $v->valid();
  503. $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['string']), $v->errors->first('amount'));
  504. $rules = array('amount' => 'between:70,80');
  505. $v = Validator::make($input, $rules);
  506. $v->valid();
  507. $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['string']);
  508. $this->assertEquals($expect, $v->errors->first('amount'));
  509. $rules = array('amount' => 'min:120');
  510. $v = Validator::make($input, $rules);
  511. $v->valid();
  512. $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['string']);
  513. $this->assertEquals($expect, $v->errors->first('amount'));
  514. $rules = array('amount' => 'max:2');
  515. $v = Validator::make($input, $rules);
  516. $v->valid();
  517. $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['string']);
  518. $this->assertEquals($expect, $v->errors->first('amount'));
  519. }
  520. /**
  521. * Test that string size replacements are made on messages.
  522. *
  523. * @group laravel
  524. */
  525. public function testFileSizeReplacementsAreMade()
  526. {
  527. $lang = require path('app').'language/en/validation.php';
  528. $_FILES['amount']['tmp_name'] = 'foo';
  529. $_FILES['amount']['size'] = 10000;
  530. $rules = array('amount' => 'size:80');
  531. $v = Validator::make($_FILES, $rules);
  532. $v->valid();
  533. $this->assertEquals(str_replace(array(':attribute', ':size'), array('amount', '80'), $lang['size']['file']), $v->errors->first('amount'));
  534. $rules = array('amount' => 'between:70,80');
  535. $v = Validator::make($_FILES, $rules);
  536. $v->valid();
  537. $expect = str_replace(array(':attribute', ':min', ':max'), array('amount', '70', '80'), $lang['between']['file']);
  538. $this->assertEquals($expect, $v->errors->first('amount'));
  539. $rules = array('amount' => 'min:120');
  540. $v = Validator::make($_FILES, $rules);
  541. $v->valid();
  542. $expect = str_replace(array(':attribute', ':min'), array('amount', '120'), $lang['min']['file']);
  543. $this->assertEquals($expect, $v->errors->first('amount'));
  544. $rules = array('amount' => 'max:2');
  545. $v = Validator::make($_FILES, $rules);
  546. $v->valid();
  547. $expect = str_replace(array(':attribute', ':max'), array('amount', '2'), $lang['max']['file']);
  548. $this->assertEquals($expect, $v->errors->first('amount'));
  549. }
  550. /**
  551. * Test that values get replaced in messages.
  552. *
  553. * @group laravel
  554. */
  555. public function testValuesGetReplaced()
  556. {
  557. $lang = require path('app').'language/en/validation.php';
  558. $_FILES['file']['tmp_name'] = path('storage').'files/desert.jpg';
  559. $rules = array('file' => 'mimes:php,txt');
  560. $v = Validator::make($_FILES, $rules);
  561. $v->valid();
  562. $expect = str_replace(array(':attribute', ':values'), array('file', 'php, txt'), $lang['mimes']);
  563. $this->assertEquals($expect, $v->errors->first('file'));
  564. }
  565. /**
  566. * Test custom attribute names are replaced.
  567. *
  568. * @group laravel
  569. */
  570. public function testCustomAttributesAreReplaced()
  571. {
  572. $lang = require path('app').'language/en/validation.php';
  573. $rules = array('test_attribute' => 'required');
  574. $v = Validator::make(array(), $rules);
  575. $v->valid();
  576. $expect = str_replace(':attribute', 'attribute', $lang['required']);
  577. $this->assertEquals($expect, $v->errors->first('test_attribute'));
  578. }
  579. /**
  580. * Test required_with attribute names are replaced.
  581. *
  582. * @group laravel
  583. */
  584. public function testRequiredWithAttributesAreReplaced()
  585. {
  586. $lang = require path('app').'language/en/validation.php';
  587. $data = array('first_name' => 'Taylor', 'last_name' => '');
  588. $rules = array('first_name' => 'required', 'last_name' => 'required_with:first_name');
  589. $v = Validator::make($data, $rules);
  590. $v->valid();
  591. $expect = str_replace(array(':attribute', ':field'), array('last name', 'first name'), $lang['required_with']);
  592. $this->assertEquals($expect, $v->errors->first('last_name'));
  593. }
  594. }