Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ForeignKeyTest.php
Go to the documentation of this file.
1 <?php
7 
15 
21 class ForeignKeyTest extends \PHPUnit\Framework\TestCase
22 {
26  private $objectManager;
27 
31  private $foreignKey;
32 
36  private $resourceConnectionMock;
37 
38  protected function setUp()
39  {
40  $this->objectManager = new ObjectManager($this);
41  $this->resourceConnectionMock = $this->getMockBuilder(ResourceConnection::class)
42  ->disableOriginalConstructor()
43  ->getMock();
44  $this->foreignKey = $this->objectManager->getObject(
45  ForeignKey::class,
46  [
47  'resourceConnection' => $this->resourceConnectionMock
48  ]
49  );
50  }
51 
55  public function testToDefinition()
56  {
58  $constraint = $this->getMockBuilder(Reference::class)
59  ->disableOriginalConstructor()
60  ->getMock();
61  $columnMock = $this->getMockBuilder(Column::class)
62  ->disableOriginalConstructor()
63  ->getMock();
64  $refColumnMock = $this->getMockBuilder(Column::class)
65  ->disableOriginalConstructor()
66  ->getMock();
67  $adapterMock = $this->getMockBuilder(AdapterInterface::class)
68  ->disableOriginalConstructor()
69  ->getMock();
70  $tableMock = $this->getMockBuilder(Table::class)
71  ->disableOriginalConstructor()
72  ->getMock();
73  $refTableMock = $this->getMockBuilder(Table::class)
74  ->disableOriginalConstructor()
75  ->getMock();
76 
77  $columnMock->expects($this->any())->method('getName')->willReturn('col_name');
78  $refColumnMock->expects($this->any())->method('getName')->willReturn('ref_col_name');
79  $constraint->expects($this->any())->method('getName')->willReturn('fk_name');
80  $constraint->expects($this->any())->method('getOnDelete')->willReturn('CASCADE');
81  $tableMock->expects($this->any())->method('getResource')->willReturn('default');
82  $constraint->expects($this->any())->method('getTable')->willReturn($tableMock);
83  $refTableMock->expects($this->any())->method('getName')->willReturn('ref_table');
84  $constraint->expects($this->any())->method('getReferenceTable')->willReturn($refTableMock);
85  $constraint->expects($this->any())->method('getColumn')->willReturn($columnMock);
86  $constraint->expects($this->any())->method('getReferenceColumn')->willReturn($refColumnMock);
87  $this->resourceConnectionMock->expects($this->once())
88  ->method('getConnection')
89  ->with('default')
90  ->willReturn($adapterMock);
91  $this->resourceConnectionMock->expects($this->any())->method('getTableName')->willReturnArgument(0);
92 
93  $adapterMock->expects($this->any())
94  ->method('quoteIdentifier')
95  ->willReturnMap(
96  [
97  ['fk_name', false, '`fk_name`'],
98  ['col_name', false, '`col_name`'],
99  ['ref_table', false, '`ref_table`'],
100  ['`ref_table`', false, '`ref_table`'],
101  ['ref_col_name', false, '`ref_col_name`'],
102  ]
103  );
104 
105  $this->assertEquals(
106  'CONSTRAINT `fk_name` FOREIGN KEY (`col_name`) REFERENCES `ref_table` (`ref_col_name`) ON DELETE CASCADE',
107  $this->foreignKey->toDefinition($constraint)
108  );
109  }
110 
118  public function testFromDefinition($definition, $expectedDefinition)
119  {
120  $result = $this->foreignKey->fromDefinition(['Create Table' => $definition]);
121  $this->assertEquals($expectedDefinition, $result);
122  }
123 
127  public function definitionDataProvider()
128  {
129  return [
130  [
131  'definition' => 'CREATE TABLE `table_name` ('
132  . '`col_name` INT(10) UNSIGNED NOT NULL COMMENT \'column name\','
133  . 'INDEX `TEST_INDEX` (`col_name`),'
134  . 'CONSTRAINT `fk_name` FOREIGN KEY (`col_name`) '
135  . 'REFERENCES `ref_table` (`ref_col_name`) ON DELETE CASCADE',
136  'excpectedDefiniton' => [
137  'fk_name' => [
138  'type' => Reference::TYPE,
139  'name' => 'fk_name',
140  'column' => 'col_name',
141  'referenceTable' => 'ref_table',
142  'referenceColumn' => 'ref_col_name',
143  'onDelete' => 'CASCADE'
144  ]
145  ],
146  ],
147  [
148  'definition' => 'CREATE TABLE `table_name` ('
149  . '`col_name` INT(10) UNSIGNED NOT NULL COMMENT \'column name\','
150  . 'INDEX `TEST_INDEX` (`col_name`),'
151  . 'CONSTRAINT `fk_name` FOREIGN KEY(`col_name`)'
152  . 'REFERENCES `ref_table`(`ref_col_name`)ON DELETE NO ACTION',
153  'excpectedDefiniton' => [
154  'fk_name' => [
155  'type' => Reference::TYPE,
156  'name' => 'fk_name',
157  'column' => 'col_name',
158  'referenceTable' => 'ref_table',
159  'referenceColumn' => 'ref_col_name',
160  'onDelete' => 'NO ACTION'
161  ]
162  ]
163  ],
164  [
165  'definition' => 'CREATE TABLE `table_name` ('
166  . '`column_name` INT(10) UNSIGNED NOT NULL COMMENT \'column name\','
167  . 'INDEX `TEST_INDEX` (`col_name`),'
168  . 'CONSTRAINT `fk_name` FOREIGN KEY(`column_name`)'
169  . 'REFERENCES `ref_table`(`ref_col_name`)ON DELETE SET DEFAULT',
170  'excpectedDefiniton' => [
171  'fk_name' => [
172  'type' => Reference::TYPE,
173  'name' => 'fk_name',
174  'column' => 'column_name',
175  'referenceTable' => 'ref_table',
176  'referenceColumn' => 'ref_col_name',
177  'onDelete' => 'SET DEFAULT'
178  ]
179  ]
180  ],
181  [
182  'definition' => 'CREATE TABLE `table_name` ('
183  . '`column_name` INT(10) UNSIGNED NOT NULL COMMENT \'column name\','
184  . 'INDEX `TEST_INDEX` (`col_name`),'
185  . 'CONSTRAINT `fk_name` FOREIGN KEY(`column_name`)'
186  . 'REFERENCES `ref_table`(`ref_col_name`)ON DELETE SET NULL',
187  'excpectedDefiniton' => [
188  'fk_name' => [
189  'type' => Reference::TYPE,
190  'name' => 'fk_name',
191  'column' => 'column_name',
192  'referenceTable' => 'ref_table',
193  'referenceColumn' => 'ref_col_name',
194  'onDelete' => 'SET NULL'
195  ]
196  ]
197  ],
198  [
199  'definition' => 'CREATE TABLE `table_name` ('
200  . '`column_name` INT(10) UNSIGNED NOT NULL COMMENT \'column name\','
201  . 'INDEX `TEST_INDEX` (`col_name`),'
202  . 'CONSTRAINT `fk_name` FOREIGN KEY(`column_name`)'
203  . 'REFERENCES `ref_table`(`ref_col_name`)ON DELETE RESTRICT ON UPDATE RESTRICT',
204  'excpectedDefiniton' => [
205  'fk_name' => [
206  'type' => Reference::TYPE,
207  'name' => 'fk_name',
208  'column' => 'column_name',
209  'referenceTable' => 'ref_table',
210  'referenceColumn' => 'ref_col_name',
211  'onDelete' => 'RESTRICT'
212  ]
213  ]
214  ],
215  ];
216  }
217 }