XsdTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Integration\Test\Unit\Model\Config;
  7. /**
  8. * Test for validation rules implemented by XSD schema for integration configuration.
  9. */
  10. class XsdTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var string
  14. */
  15. protected $schemaFile;
  16. protected function setUp()
  17. {
  18. if (!function_exists('libxml_set_external_entity_loader')) {
  19. $this->markTestSkipped('Skipped on HHVM. Will be fixed in MAGETWO-45033');
  20. }
  21. $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver();
  22. $this->schemaFile = $urnResolver->getRealPath(
  23. 'urn:magento:module:Magento_Integration:etc/integration/config.xsd'
  24. );
  25. }
  26. /**
  27. * @param string $fixtureXml
  28. * @param array $expectedErrors
  29. * @dataProvider exemplarXmlDataProvider
  30. */
  31. public function testExemplarXml($fixtureXml, array $expectedErrors)
  32. {
  33. $validationStateMock = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
  34. $validationStateMock->method('isValidationRequired')
  35. ->willReturn(true);
  36. $messageFormat = '%message%';
  37. $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationStateMock, [], null, null, $messageFormat);
  38. $actualResult = $dom->validate($this->schemaFile, $actualErrors);
  39. $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
  40. $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
  41. }
  42. /**
  43. * @return array
  44. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  45. */
  46. public function exemplarXmlDataProvider()
  47. {
  48. return [
  49. /** Valid configurations */
  50. 'valid' => [
  51. '<integrations>
  52. <integration name="TestIntegration">
  53. <email>test-integration@magento.com</email>
  54. <endpoint_url>https://endpoint.url</endpoint_url>
  55. <identity_link_url>http://www.example.com/identity</identity_link_url>
  56. </integration>
  57. </integrations>',
  58. [],
  59. ],
  60. 'valid with several entities' => [
  61. '<integrations>
  62. <integration name="TestIntegration1">
  63. <email>test-integration1@magento.com</email>
  64. <endpoint_url>http://endpoint.url</endpoint_url>
  65. <identity_link_url>http://www.example.com/identity</identity_link_url>
  66. </integration>
  67. <integration name="TestIntegration2">
  68. <email>test-integration2@magento.com</email>
  69. </integration>
  70. </integrations>',
  71. [],
  72. ],
  73. /** Missing required elements */
  74. 'empty root node' => [
  75. '<integrations/>',
  76. ["Element 'integrations': Missing child element(s). Expected is ( integration )."],
  77. ],
  78. 'empty integration' => [
  79. '<integrations>
  80. <integration name="TestIntegration" />
  81. </integrations>',
  82. ["Element 'integration': Missing child element(s). Expected is ( email )."],
  83. ],
  84. 'integration without email' => [
  85. '<integrations>
  86. <integration name="TestIntegration1">
  87. <endpoint_url>http://endpoint.url</endpoint_url>
  88. <identity_link_url>http://www.example.com/identity</identity_link_url>
  89. </integration>
  90. </integrations>',
  91. ["Element 'endpoint_url': This element is not expected. Expected is ( email )."],
  92. ],
  93. /** Empty nodes */
  94. 'empty email' => [
  95. '<integrations>
  96. <integration name="TestIntegration1">
  97. <email></email>
  98. <endpoint_url>http://endpoint.url</endpoint_url>
  99. <identity_link_url>http://www.example.com/identity</identity_link_url>
  100. </integration>
  101. </integrations>',
  102. [
  103. "Element 'email': [facet 'pattern'] The value '' is not " .
  104. "accepted by the pattern '[^@]+@[^\.]+\..+'.",
  105. "Element 'email': '' is not a valid value of the atomic type 'emailType'."
  106. ],
  107. ],
  108. 'endpoint_url is empty' => [
  109. '<integrations>
  110. <integration name="TestIntegration1">
  111. <email>test-integration1@magento.com</email>
  112. <endpoint_url></endpoint_url>
  113. </integration>
  114. </integrations>',
  115. [
  116. "Element 'endpoint_url': [facet 'minLength'] The value has a length of '0'; this underruns" .
  117. " the allowed minimum length of '4'.",
  118. "Element 'endpoint_url': '' is not a valid value of the atomic type 'urlType'."
  119. ],
  120. ],
  121. 'identity_link_url is empty' => [
  122. '<integrations>
  123. <integration name="TestIntegration1">
  124. <email>test-integration1@magento.com</email>
  125. <endpoint_url>http://endpoint.url</endpoint_url>
  126. <identity_link_url></identity_link_url>
  127. </integration>
  128. </integrations>',
  129. [
  130. "Element 'identity_link_url': [facet 'minLength'] The value has a length of '0'; this underruns" .
  131. " the allowed minimum length of '4'.",
  132. "Element 'identity_link_url': '' is not a valid value of the atomic type 'urlType'."
  133. ],
  134. ],
  135. /** Invalid structure */
  136. 'irrelevant root node' => [
  137. '<integration name="TestIntegration"/>',
  138. ["Element 'integration': No matching global declaration available for the validation root."],
  139. ],
  140. 'irrelevant node in root' => [
  141. '<integrations>
  142. <integration name="TestIntegration1">
  143. <email>test-integration1@magento.com</email>
  144. <endpoint_url>http://endpoint.url</endpoint_url>
  145. <identity_link_url>http://www.example.com/identity</identity_link_url>
  146. </integration>
  147. <invalid/>
  148. </integrations>',
  149. ["Element 'invalid': This element is not expected. Expected is ( integration )."],
  150. ],
  151. 'irrelevant node in integration' => [
  152. '<integrations>
  153. <integration name="TestIntegration1">
  154. <email>test-integration1@magento.com</email>
  155. <endpoint_url>http://endpoint.url</endpoint_url>
  156. <identity_link_url>http://www.example.com/identity</identity_link_url>
  157. <invalid/>
  158. </integration>
  159. </integrations>',
  160. ["Element 'invalid': This element is not expected."],
  161. ],
  162. 'irrelevant node in authentication' => [
  163. '<integrations>
  164. <integration name="TestIntegration1">
  165. <email>test-integration1@magento.com</email>
  166. <endpoint_url>http://endpoint.url</endpoint_url>
  167. <identity_link_url>http://www.example.com/identity</identity_link_url>
  168. <invalid/>
  169. </integration>
  170. </integrations>',
  171. ["Element 'invalid': This element is not expected."],
  172. ],
  173. /** Excessive attributes */
  174. 'invalid attribute in root' => [
  175. '<integrations invalid="invalid">
  176. <integration name="TestIntegration1">
  177. <email>test-integration1@magento.com</email>
  178. <endpoint_url>http://endpoint.url</endpoint_url>
  179. <identity_link_url>http://www.example.com/identity</identity_link_url>
  180. </integration>
  181. </integrations>',
  182. ["Element 'integrations', attribute 'invalid': The attribute 'invalid' is not allowed."],
  183. ],
  184. 'invalid attribute in integration' => [
  185. '<integrations>
  186. <integration name="TestIntegration1" invalid="invalid">
  187. <email>test-integration1@magento.com</email>
  188. <endpoint_url>http://endpoint.url</endpoint_url>
  189. <identity_link_url>http://www.example.com/identity</identity_link_url>
  190. </integration>
  191. </integrations>',
  192. ["Element 'integration', attribute 'invalid': The attribute 'invalid' is not allowed."],
  193. ],
  194. 'invalid attribute in email' => [
  195. '<integrations>
  196. <integration name="TestIntegration1">
  197. <email invalid="invalid">test-integration1@magento.com</email>
  198. <endpoint_url>http://endpoint.url</endpoint_url>
  199. <identity_link_url>http://www.example.com/identity</identity_link_url>
  200. </integration>
  201. </integrations>',
  202. ["Element 'email', attribute 'invalid': The attribute 'invalid' is not allowed."],
  203. ],
  204. 'invalid attribute in endpoint_url' => [
  205. '<integrations>
  206. <integration name="TestIntegration1">
  207. <email>test-integration1@magento.com</email>
  208. <endpoint_url invalid="invalid">http://endpoint.url</endpoint_url>
  209. <identity_link_url>http://www.example.com/identity</identity_link_url>
  210. </integration>
  211. </integrations>',
  212. ["Element 'endpoint_url', attribute 'invalid': The attribute 'invalid' is not allowed."],
  213. ],
  214. 'invalid attribute in identity_link_url' => [
  215. '<integrations>
  216. <integration name="TestIntegration1">
  217. <email>test-integration1@magento.com</email>
  218. <endpoint_url>http://endpoint.url</endpoint_url>
  219. <identity_link_url invalid="invalid">http://endpoint.url</identity_link_url>
  220. </integration>
  221. </integrations>',
  222. ["Element 'identity_link_url', attribute 'invalid': The attribute 'invalid' is not allowed."],
  223. ],
  224. /** Missing or empty required attributes */
  225. 'integration without name' => [
  226. '<integrations>
  227. <integration>
  228. <email>test-integration1@magento.com</email>
  229. <endpoint_url>http://endpoint.url</endpoint_url>
  230. <identity_link_url>http://www.example.com/identity</identity_link_url>
  231. </integration>
  232. </integrations>',
  233. ["Element 'integration': The attribute 'name' is required but missing."],
  234. ],
  235. 'integration with empty name' => [
  236. '<integrations>
  237. <integration name="">
  238. <email>test-integration1@magento.com</email>
  239. <endpoint_url>http://endpoint.url</endpoint_url>
  240. <identity_link_url>http://www.example.com/identity</identity_link_url>
  241. </integration>
  242. </integrations>',
  243. [
  244. "Element 'integration', attribute 'name': [facet 'minLength'] The value '' has a length of '0'; " .
  245. "this underruns the allowed minimum length of '2'.",
  246. "Element 'integration', attribute 'name': " .
  247. "'' is not a valid value of the atomic type 'integrationNameType'."
  248. ],
  249. ],
  250. /** Invalid values */
  251. 'invalid email' => [
  252. '<integrations>
  253. <integration name="TestIntegration1">
  254. <email>invalid</email>
  255. <endpoint_url>http://endpoint.url</endpoint_url>
  256. <identity_link_url>http://www.example.com/identity</identity_link_url>
  257. </integration>
  258. </integrations>',
  259. [
  260. "Element 'email': [facet 'pattern'] The value 'invalid' " .
  261. "is not accepted by the pattern '[^@]+@[^\.]+\..+'.",
  262. "Element 'email': 'invalid' is not a valid value of the atomic type 'emailType'."
  263. ],
  264. ]
  265. ];
  266. }
  267. }