XsdTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Test\Unit\Publisher;
  7. class XsdTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var string
  11. */
  12. protected $_schemaFile;
  13. protected function setUp()
  14. {
  15. if (!function_exists('libxml_set_external_entity_loader')) {
  16. $this->markTestSkipped('Skipped on HHVM. Will be fixed in MAGETWO-45033');
  17. }
  18. $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver();
  19. $this->_schemaFile = $urnResolver->getRealPath('urn:magento:framework-message-queue:etc/publisher.xsd');
  20. }
  21. /**
  22. * @param string $fixtureXml
  23. * @param array $expectedErrors
  24. * @dataProvider exemplarXmlDataProvider
  25. */
  26. public function testExemplarXml($fixtureXml, array $expectedErrors)
  27. {
  28. $validationState = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
  29. $validationState->expects($this->any())
  30. ->method('isValidationRequired')
  31. ->willReturn(true);
  32. $messageFormat = '%message%';
  33. $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationState, [], null, null, $messageFormat);
  34. $actualErrors = [];
  35. $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
  36. $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
  37. $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
  38. }
  39. /**
  40. * @return array
  41. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  42. */
  43. public function exemplarXmlDataProvider()
  44. {
  45. // @codingStandardsIgnoreStart
  46. return [
  47. /** Valid configurations */
  48. 'valid' => [
  49. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  50. <publisher topic="topic.message.queue.config.01">
  51. <connection name="amqp" exchange="magento2" />
  52. <connection name="db" exchange="magento2" disabled="true" />
  53. </publisher>
  54. <publisher topic="topic.message.queue.config.02">
  55. <connection name="amqp" exchange="magento2" disabled="true"/>
  56. <connection name="db" exchange="magento2" disabled="true" />
  57. </publisher>
  58. <publisher topic="topic.message.queue.config.03" disabled="true" />
  59. </config>',
  60. [],
  61. ],
  62. 'non unique publisher topic' => [
  63. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  64. <publisher topic="topic.message.queue.config.01">
  65. <connection name="amqp" exchange="magento2" />
  66. </publisher>
  67. <publisher topic="topic.message.queue.config.01">
  68. <connection name="amqp" exchange="magento2" disabled="true"/>
  69. </publisher>
  70. </config>',
  71. [
  72. "Element 'publisher': Duplicate key-sequence ['topic.message.queue.config.01'] in unique identity-constraint 'unique-publisher-topic'."
  73. ],
  74. ],
  75. 'non unique publisher connection name' => [
  76. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  77. <publisher topic="topic.message.queue.config.01">
  78. <connection name="amqp" exchange="magento2" />
  79. <connection name="amqp" exchange="magento2" />
  80. </publisher>
  81. </config>',
  82. [
  83. "Element 'connection': Duplicate key-sequence ['amqp'] in unique identity-constraint 'unique-connection-name'."
  84. ],
  85. ],
  86. 'missed required publisher attribute' => [
  87. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  88. <publisher disabled="false">
  89. <connection name="amqp" exchange="magento2" />
  90. </publisher>
  91. </config>',
  92. [
  93. "Element 'publisher': The attribute 'topic' is required but missing."
  94. ],
  95. ],
  96. 'missed required connection attribute' => [
  97. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  98. <publisher topic="top01">
  99. <connection exchange="magento2" />
  100. </publisher>
  101. </config>',
  102. [
  103. "Element 'connection': The attribute 'name' is required but missing."
  104. ],
  105. ],
  106. 'unexpected publisher element' => [
  107. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  108. <unexpected name="10">20</unexpected>
  109. <publisher topic="topic.message.queue.config.03" disabled="true" />
  110. </config>',
  111. [
  112. "Element 'unexpected': This element is not expected. Expected is ( publisher )."
  113. ],
  114. ],
  115. 'unexpected connection element' => [
  116. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  117. <publisher topic="topic.message.queue.config.03" disabled="true">
  118. <connection name="amqp" exchange="magento2" />
  119. <unexpected name="10">20</unexpected>
  120. </publisher>
  121. </config>',
  122. [
  123. "Element 'unexpected': This element is not expected. Expected is ( connection )."
  124. ],
  125. ],
  126. 'unexpected publisher attribute' => [
  127. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  128. <publisher topic="topic.message.queue.config.03" disabled="true" unexpected="10"/>
  129. </config>',
  130. [
  131. "Element 'publisher', attribute 'unexpected': The attribute 'unexpected' is not allowed.",
  132. ],
  133. ],
  134. 'unexpected connection attribute' => [
  135. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  136. <publisher topic="topic.message.queue.config.03" disabled="true">
  137. <connection name="amqp" exchange="magento2" unexpected="10"/>
  138. </publisher>
  139. </config>',
  140. [
  141. "Element 'connection', attribute 'unexpected': The attribute 'unexpected' is not allowed.",
  142. ],
  143. ],
  144. 'invalid connection attribute value' => [
  145. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  146. <publisher topic="topic.message.queue.config.03" disabled="true">
  147. <connection name="amqp" exchange="magento2" disabled="disabled"/>
  148. </publisher>
  149. </config>',
  150. [
  151. "Element 'connection', attribute 'disabled': 'disabled' is not a valid value of the atomic type 'xs:boolean'.",
  152. ],
  153. ],
  154. 'invalid publisher attribute value' => [
  155. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
  156. <publisher topic="topic.message.queue.config.03" disabled="disabled">
  157. <connection name="amqp" exchange="magento2" />
  158. </publisher>
  159. </config>',
  160. [
  161. "Element 'publisher', attribute 'disabled': 'disabled' is not a valid value of the atomic type 'xs:boolean'.",
  162. ],
  163. ],
  164. ];
  165. // @codingStandardsIgnoreEnd
  166. }
  167. }