ValidationTest.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryApi\Test\Api\SourceRepository;
  8. use Magento\Framework\Webapi\Exception;
  9. use Magento\Framework\Webapi\Rest\Request;
  10. use Magento\InventoryApi\Api\Data\SourceInterface;
  11. use Magento\TestFramework\TestCase\WebapiAbstract;
  12. class ValidationTest extends WebapiAbstract
  13. {
  14. /**#@+
  15. * Service constants
  16. */
  17. const RESOURCE_PATH = '/V1/inventory/sources';
  18. const SERVICE_NAME = 'inventoryApiSourceRepositoryV1';
  19. /**#@-*/
  20. /**
  21. * @var array
  22. */
  23. private $validData = [
  24. SourceInterface::SOURCE_CODE => 'source-code-1',
  25. SourceInterface::NAME => 'source-name-1',
  26. SourceInterface::POSTCODE => 'source-postcode',
  27. SourceInterface::COUNTRY_ID => 'US',
  28. ];
  29. /**
  30. * @param string $field
  31. * @param array $expectedErrorData
  32. * @throws \Exception
  33. * @dataProvider dataProviderRequiredFields
  34. */
  35. public function testCreateWithMissedRequiredFields(string $field, array $expectedErrorData)
  36. {
  37. $data = $this->validData;
  38. unset($data[$field]);
  39. $serviceInfo = [
  40. 'rest' => [
  41. 'resourcePath' => self::RESOURCE_PATH,
  42. 'httpMethod' => Request::HTTP_METHOD_POST,
  43. ],
  44. 'soap' => [
  45. 'service' => self::SERVICE_NAME,
  46. 'operation' => self::SERVICE_NAME . 'Save',
  47. ],
  48. ];
  49. $this->webApiCall($serviceInfo, $data, $expectedErrorData);
  50. }
  51. /**
  52. * @return array
  53. */
  54. public function dataProviderRequiredFields(): array
  55. {
  56. return [
  57. 'without_' . SourceInterface::NAME => [
  58. SourceInterface::NAME,
  59. [
  60. 'message' => 'Validation Failed',
  61. 'errors' => [
  62. [
  63. 'message' => '"%field" can not be empty.',
  64. 'parameters' => [
  65. 'field' => SourceInterface::NAME,
  66. ],
  67. ],
  68. ],
  69. ],
  70. ],
  71. 'without_' . SourceInterface::POSTCODE => [
  72. SourceInterface::POSTCODE,
  73. [
  74. 'message' => 'Validation Failed',
  75. 'errors' => [
  76. [
  77. 'message' => '"%field" can not be empty.',
  78. 'parameters' => [
  79. 'field' => SourceInterface::POSTCODE,
  80. ],
  81. ],
  82. ],
  83. ],
  84. ],
  85. 'without_' . SourceInterface::SOURCE_CODE => [
  86. SourceInterface::SOURCE_CODE,
  87. [
  88. 'message' => 'Validation Failed',
  89. 'errors' => [
  90. [
  91. 'message' => '"%field" can not be empty.',
  92. 'parameters' => [
  93. 'field' => SourceInterface::SOURCE_CODE,
  94. ],
  95. ],
  96. ],
  97. ],
  98. ],
  99. ];
  100. }
  101. /**
  102. * @param string $field
  103. * @param string|null $value
  104. * @param array $expectedErrorData
  105. * @dataProvider failedValidationDataProvider
  106. */
  107. public function testFailedValidationOnCreate(string $field, $value, array $expectedErrorData)
  108. {
  109. $data = $this->validData;
  110. $data[$field] = $value;
  111. $serviceInfo = [
  112. 'rest' => [
  113. 'resourcePath' => self::RESOURCE_PATH,
  114. 'httpMethod' => Request::HTTP_METHOD_POST,
  115. ],
  116. 'soap' => [
  117. 'service' => self::SERVICE_NAME,
  118. 'operation' => self::SERVICE_NAME . 'Save',
  119. ],
  120. ];
  121. $this->webApiCall($serviceInfo, $data, $expectedErrorData);
  122. }
  123. /**
  124. * @param string $field
  125. * @param string|null $value
  126. * @param array $expectedErrorData
  127. * @dataProvider failedValidationUpdateDataProvider
  128. * @magentoApiDataFixture ../../../../app/code/Magento/InventoryApi/Test/_files/source.php
  129. */
  130. public function testFailedValidationOnUpdate(string $field, $value, array $expectedErrorData)
  131. {
  132. $data = $this->validData;
  133. $data[$field] = $value;
  134. $sourceCode = 'source-code-1';
  135. $serviceInfo = [
  136. 'rest' => [
  137. 'resourcePath' => self::RESOURCE_PATH . '/' . $sourceCode,
  138. 'httpMethod' => Request::HTTP_METHOD_PUT,
  139. ],
  140. 'soap' => [
  141. 'service' => self::SERVICE_NAME,
  142. 'operation' => self::SERVICE_NAME . 'Save',
  143. ],
  144. ];
  145. $this->webApiCall($serviceInfo, $data, $expectedErrorData);
  146. }
  147. /**
  148. * SuppressWarnings was added due to a tests on different fail types and big size of data provider
  149. *
  150. * @return array
  151. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  152. */
  153. public function failedValidationDataProvider(): array
  154. {
  155. return [
  156. 'null_' . SourceInterface::SOURCE_CODE => [
  157. SourceInterface::SOURCE_CODE,
  158. null,
  159. [
  160. 'message' => 'Validation Failed',
  161. 'errors' => [
  162. [
  163. 'message' => '"%field" can not be empty.',
  164. 'parameters' => [
  165. 'field' => SourceInterface::SOURCE_CODE,
  166. ],
  167. ],
  168. ],
  169. ],
  170. ],
  171. 'empty_' . SourceInterface::SOURCE_CODE => [
  172. SourceInterface::SOURCE_CODE,
  173. '',
  174. [
  175. 'message' => 'Validation Failed',
  176. 'errors' => [
  177. [
  178. 'message' => '"%field" can not be empty.',
  179. 'parameters' => [
  180. 'field' => SourceInterface::SOURCE_CODE,
  181. ],
  182. ],
  183. ],
  184. ],
  185. ],
  186. 'whitespaces_' . SourceInterface::SOURCE_CODE => [
  187. SourceInterface::SOURCE_CODE,
  188. ' ',
  189. [
  190. 'message' => 'Validation Failed',
  191. 'errors' => [
  192. [
  193. 'message' => '"%field" can not be empty.',
  194. 'parameters' => [
  195. 'field' => SourceInterface::SOURCE_CODE,
  196. ],
  197. ],
  198. ],
  199. ],
  200. ],
  201. 'with_whitespaces_' . SourceInterface::SOURCE_CODE => [
  202. SourceInterface::SOURCE_CODE,
  203. 'source code',
  204. [
  205. 'message' => 'Validation Failed',
  206. 'errors' => [
  207. [
  208. 'message' => '"%field" can not contain whitespaces.',
  209. 'parameters' => [
  210. 'field' => SourceInterface::SOURCE_CODE,
  211. ],
  212. ],
  213. ],
  214. ],
  215. ],
  216. 'null_' . SourceInterface::NAME => [
  217. SourceInterface::NAME,
  218. null,
  219. [
  220. 'message' => 'Validation Failed',
  221. 'errors' => [
  222. [
  223. 'message' => '"%field" can not be empty.',
  224. 'parameters' => [
  225. 'field' => SourceInterface::NAME,
  226. ],
  227. ],
  228. ],
  229. ],
  230. ],
  231. 'empty_' . SourceInterface::NAME => [
  232. SourceInterface::NAME,
  233. '',
  234. [
  235. 'message' => 'Validation Failed',
  236. 'errors' => [
  237. [
  238. 'message' => '"%field" can not be empty.',
  239. 'parameters' => [
  240. 'field' => SourceInterface::NAME,
  241. ],
  242. ],
  243. ],
  244. ],
  245. ],
  246. 'whitespaces_' . SourceInterface::NAME => [
  247. SourceInterface::NAME,
  248. ' ',
  249. [
  250. 'message' => 'Validation Failed',
  251. 'errors' => [
  252. [
  253. 'message' => '"%field" can not be empty.',
  254. 'parameters' => [
  255. 'field' => SourceInterface::NAME,
  256. ],
  257. ],
  258. ],
  259. ],
  260. ],
  261. 'empty_' . SourceInterface::POSTCODE => [
  262. SourceInterface::POSTCODE,
  263. '',
  264. [
  265. 'message' => 'Validation Failed',
  266. 'errors' => [
  267. [
  268. 'message' => '"%field" can not be empty.',
  269. 'parameters' => [
  270. 'field' => SourceInterface::POSTCODE,
  271. ],
  272. ],
  273. ],
  274. ],
  275. ],
  276. 'whitespaces_' . SourceInterface::POSTCODE => [
  277. SourceInterface::POSTCODE,
  278. ' ',
  279. [
  280. 'message' => 'Validation Failed',
  281. 'errors' => [
  282. [
  283. 'message' => '"%field" can not be empty.',
  284. 'parameters' => [
  285. 'field' => SourceInterface::POSTCODE,
  286. ],
  287. ],
  288. ],
  289. ],
  290. ],
  291. 'null_' . SourceInterface::POSTCODE => [
  292. SourceInterface::POSTCODE,
  293. null,
  294. [
  295. 'message' => 'Validation Failed',
  296. 'errors' => [
  297. [
  298. 'message' => '"%field" can not be empty.',
  299. 'parameters' => [
  300. 'field' => SourceInterface::POSTCODE,
  301. ],
  302. ],
  303. ],
  304. ],
  305. ],
  306. 'empty_' . SourceInterface::COUNTRY_ID => [
  307. SourceInterface::COUNTRY_ID,
  308. '',
  309. [
  310. 'message' => 'Validation Failed',
  311. 'errors' => [
  312. [
  313. 'message' => '"%field" can not be empty.',
  314. 'parameters' => [
  315. 'field' => SourceInterface::COUNTRY_ID,
  316. ],
  317. ],
  318. ],
  319. ],
  320. ],
  321. 'whitespaces_' . SourceInterface::COUNTRY_ID => [
  322. SourceInterface::COUNTRY_ID,
  323. ' ',
  324. [
  325. 'message' => 'Validation Failed',
  326. 'errors' => [
  327. [
  328. 'message' => '"%field" can not be empty.',
  329. 'parameters' => [
  330. 'field' => SourceInterface::COUNTRY_ID,
  331. ],
  332. ],
  333. ],
  334. ],
  335. ],
  336. 'null_' . SourceInterface::COUNTRY_ID => [
  337. SourceInterface::COUNTRY_ID,
  338. null,
  339. [
  340. 'message' => 'Validation Failed',
  341. 'errors' => [
  342. [
  343. 'message' => '"%field" can not be empty.',
  344. 'parameters' => [
  345. 'field' => SourceInterface::COUNTRY_ID,
  346. ],
  347. ],
  348. ],
  349. ],
  350. ],
  351. ];
  352. }
  353. /**
  354. * SuppressWarnings was added due to a tests on different fail types and big size of data provider.
  355. *
  356. * @return array
  357. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  358. */
  359. public function failedValidationUpdateDataProvider(): array
  360. {
  361. return [
  362. 'null_' . SourceInterface::NAME => [
  363. SourceInterface::NAME,
  364. null,
  365. [
  366. 'message' => 'Validation Failed',
  367. 'errors' => [
  368. [
  369. 'message' => '"%field" can not be empty.',
  370. 'parameters' => [
  371. 'field' => SourceInterface::NAME,
  372. ],
  373. ],
  374. ],
  375. ],
  376. ],
  377. 'empty_' . SourceInterface::NAME => [
  378. SourceInterface::NAME,
  379. '',
  380. [
  381. 'message' => 'Validation Failed',
  382. 'errors' => [
  383. [
  384. 'message' => '"%field" can not be empty.',
  385. 'parameters' => [
  386. 'field' => SourceInterface::NAME,
  387. ],
  388. ],
  389. ],
  390. ],
  391. ],
  392. 'whitespaces_' . SourceInterface::NAME => [
  393. SourceInterface::NAME,
  394. ' ',
  395. [
  396. 'message' => 'Validation Failed',
  397. 'errors' => [
  398. [
  399. 'message' => '"%field" can not be empty.',
  400. 'parameters' => [
  401. 'field' => SourceInterface::NAME,
  402. ],
  403. ],
  404. ],
  405. ],
  406. ],
  407. 'empty_' . SourceInterface::POSTCODE => [
  408. SourceInterface::POSTCODE,
  409. '',
  410. [
  411. 'message' => 'Validation Failed',
  412. 'errors' => [
  413. [
  414. 'message' => '"%field" can not be empty.',
  415. 'parameters' => [
  416. 'field' => SourceInterface::POSTCODE,
  417. ],
  418. ],
  419. ],
  420. ],
  421. ],
  422. 'whitespaces_' . SourceInterface::POSTCODE => [
  423. SourceInterface::POSTCODE,
  424. ' ',
  425. [
  426. 'message' => 'Validation Failed',
  427. 'errors' => [
  428. [
  429. 'message' => '"%field" can not be empty.',
  430. 'parameters' => [
  431. 'field' => SourceInterface::POSTCODE,
  432. ],
  433. ],
  434. ],
  435. ],
  436. ],
  437. 'null_' . SourceInterface::POSTCODE => [
  438. SourceInterface::POSTCODE,
  439. null,
  440. [
  441. 'message' => 'Validation Failed',
  442. 'errors' => [
  443. [
  444. 'message' => '"%field" can not be empty.',
  445. 'parameters' => [
  446. 'field' => SourceInterface::POSTCODE,
  447. ],
  448. ],
  449. ],
  450. ],
  451. ],
  452. 'empty_' . SourceInterface::COUNTRY_ID => [
  453. SourceInterface::COUNTRY_ID,
  454. '',
  455. [
  456. 'message' => 'Validation Failed',
  457. 'errors' => [
  458. [
  459. 'message' => '"%field" can not be empty.',
  460. 'parameters' => [
  461. 'field' => SourceInterface::COUNTRY_ID,
  462. ],
  463. ],
  464. ],
  465. ],
  466. ],
  467. 'whitespaces_' . SourceInterface::COUNTRY_ID => [
  468. SourceInterface::COUNTRY_ID,
  469. ' ',
  470. [
  471. 'message' => 'Validation Failed',
  472. 'errors' => [
  473. [
  474. 'message' => '"%field" can not be empty.',
  475. 'parameters' => [
  476. 'field' => SourceInterface::COUNTRY_ID,
  477. ],
  478. ],
  479. ],
  480. ],
  481. ],
  482. 'null_' . SourceInterface::COUNTRY_ID => [
  483. SourceInterface::COUNTRY_ID,
  484. null,
  485. [
  486. 'message' => 'Validation Failed',
  487. 'errors' => [
  488. [
  489. 'message' => '"%field" can not be empty.',
  490. 'parameters' => [
  491. 'field' => SourceInterface::COUNTRY_ID,
  492. ],
  493. ],
  494. ],
  495. ],
  496. ],
  497. ];
  498. }
  499. /**
  500. * @param array $serviceInfo
  501. * @param array $data
  502. * @param array $expectedErrorData
  503. * @return void
  504. * @throws \Exception
  505. */
  506. private function webApiCall(array $serviceInfo, array $data, array $expectedErrorData)
  507. {
  508. try {
  509. $this->_webApiCall($serviceInfo, ['source' => $data]);
  510. $this->fail('Expected throwing exception');
  511. } catch (\Exception $e) {
  512. if (TESTS_WEB_API_ADAPTER === self::ADAPTER_REST) {
  513. self::assertEquals($expectedErrorData, $this->processRestExceptionResult($e));
  514. self::assertEquals(Exception::HTTP_BAD_REQUEST, $e->getCode());
  515. } elseif (TESTS_WEB_API_ADAPTER === self::ADAPTER_SOAP) {
  516. $this->assertInstanceOf('SoapFault', $e);
  517. $expectedWrappedErrors = [];
  518. foreach ($expectedErrorData['errors'] as $error) {
  519. // @see \Magento\TestFramework\TestCase\WebapiAbstract::getActualWrappedErrors()
  520. $expectedWrappedErrors[] = [
  521. 'message' => $error['message'],
  522. 'params' => $error['parameters'],
  523. ];
  524. }
  525. $this->checkSoapFault($e, $expectedErrorData['message'], 'env:Sender', [], $expectedWrappedErrors);
  526. } else {
  527. throw $e;
  528. }
  529. }
  530. }
  531. }