SchemaPersistorTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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\Framework\Setup\Test\Unit;
  8. use Magento\Framework\Component\ComponentRegistrar;
  9. use Magento\Framework\Setup\SchemaListener;
  10. use Magento\Framework\Setup\XmlPersistor;
  11. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  12. /**
  13. * Unit test for schema persistor.
  14. *
  15. * @package Magento\Framework\Setup\Test\Unit
  16. */
  17. class SchemaPersistorTest extends \PHPUnit\Framework\TestCase
  18. {
  19. /**
  20. * @var \Magento\Framework\Setup\SchemaPersistor
  21. */
  22. private $model;
  23. /**
  24. * @var ObjectManagerHelper
  25. */
  26. private $objectManagerHelper;
  27. /**
  28. * @var ComponentRegistrar|\PHPUnit_Framework_MockObject_MockObject
  29. */
  30. private $componentRegistrarMock;
  31. /**
  32. * @var XmlPersistor|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. private $xmlPersistor;
  35. protected function setUp() : void
  36. {
  37. $this->componentRegistrarMock = $this->getMockBuilder(ComponentRegistrar::class)
  38. ->disableOriginalConstructor()
  39. ->getMock();
  40. $this->xmlPersistor = $this->getMockBuilder(XmlPersistor::class)
  41. ->getMock();
  42. $this->objectManagerHelper = new ObjectManagerHelper($this);
  43. $this->model = $this->objectManagerHelper->getObject(
  44. \Magento\Framework\Setup\SchemaPersistor::class,
  45. [
  46. 'componentRegistrar' => $this->componentRegistrarMock,
  47. 'xmlPersistor' => $this->xmlPersistor
  48. ]
  49. );
  50. }
  51. /**
  52. * @dataProvider schemaListenerTablesDataProvider
  53. * @param array $tables
  54. * @param string $expectedXML
  55. */
  56. public function testPersist(array $tables, $expectedXML) : void
  57. {
  58. $moduleName = 'First_Module';
  59. /** @var SchemaListener|\PHPUnit_Framework_MockObject_MockObject $schemaListenerMock */
  60. $schemaListenerMock = $this->getMockBuilder(SchemaListener::class)
  61. ->disableOriginalConstructor()
  62. ->getMock();
  63. $schemaListenerMock->expects(self::once())
  64. ->method('getTables')
  65. ->willReturn($tables);
  66. $this->componentRegistrarMock->expects(self::once())
  67. ->method('getPath')
  68. ->with('module', $moduleName)
  69. ->willReturn('some-non-existing-path');
  70. $simpleXmlElement = new \SimpleXMLElement($expectedXML);
  71. $this->xmlPersistor
  72. ->expects(self::once())
  73. ->method('persist')
  74. ->with($simpleXmlElement, 'some-non-existing-path/etc/db_schema.xml');
  75. $this->model->persist($schemaListenerMock);
  76. }
  77. /**
  78. * Provide listened schema.
  79. *
  80. * @return array
  81. */
  82. public function schemaListenerTablesDataProvider() : array
  83. {
  84. return [
  85. [
  86. 'schemaListenerTables' => [
  87. 'First_Module' => [
  88. 'first_table' => [
  89. 'disabled' => false,
  90. 'name' => 'first_table',
  91. 'resource' => 'default',
  92. 'engine' => 'innodb',
  93. 'columns' => [
  94. 'first_column' => [
  95. 'name' => 'first_column',
  96. 'xsi:type' => 'integer',
  97. 'nullable' => 1,
  98. 'unsigned' => '0',
  99. ],
  100. 'second_column' => [
  101. 'name' => 'second_column',
  102. 'xsi:type' => 'date',
  103. 'nullable' => 0,
  104. ]
  105. ],
  106. 'indexes' => [
  107. 'TEST_INDEX' => [
  108. 'name' => 'TEST_INDEX',
  109. 'indexType' => 'btree',
  110. 'columns' => [
  111. 'first_column'
  112. ]
  113. ]
  114. ],
  115. 'constraints' => [
  116. 'foreign' => [
  117. 'some_foreign_constraint' => [
  118. 'referenceTable' => 'table',
  119. 'referenceColumn' => 'column',
  120. 'table' => 'first_table',
  121. 'column' => 'first_column'
  122. ]
  123. ],
  124. 'primary' => [
  125. 'PRIMARY' => [
  126. 'xsi:type' => 'primary',
  127. 'name' => 'PRIMARY',
  128. 'columns' => [
  129. 'second_column'
  130. ]
  131. ]
  132. ]
  133. ]
  134. ]
  135. ]
  136. ],
  137. // @codingStandardsIgnoreStart
  138. 'XMLResult' => '<?xml version="1.0"?>
  139. <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  140. xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  141. <table name="first_table" resource="default" engine="innodb">
  142. <column xmlns:xsi="xsi" xsi:type="integer" name="first_column" nullable="1"
  143. unsigned="0"/>
  144. <column xmlns:xsi="xsi" xsi:type="date" name="second_column" nullable="0"/>
  145. <constraint xmlns:xsi="xsi" xsi:type="foreign" referenceId="some_foreign_constraint"
  146. referenceTable="table" referenceColumn="column"
  147. table="first_table" column="first_column"/>
  148. <constraint xmlns:xsi="xsi" xsi:type="primary" referenceId="PRIMARY">
  149. <column name="second_column"/>
  150. </constraint>
  151. <index referenceId="TEST_INDEX" indexType="btree">
  152. <column name="first_column"/>
  153. </index>
  154. </table>
  155. </schema>'
  156. // @codingStandardsIgnoreEnd
  157. ]
  158. ];
  159. }
  160. }