Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
FlatTableBuilderTest.php
Go to the documentation of this file.
1 <?php
7 
9 
14 class FlatTableBuilderTest extends \PHPUnit\Framework\TestCase
15 {
19  private $flatIndexerMock;
20 
24  private $resourceMock;
25 
29  private $scopeConfigMock;
30 
34  private $storeManagerMock;
35 
39  private $tableDataMock;
40 
44  private $connectionMock;
45 
49  private $metadataPoolMock;
50 
54  private $metadataMock;
55 
59  private $flatTableBuilder;
60 
61  protected function setUp()
62  {
63  $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
64  $this->flatIndexerMock = $this->getMockBuilder(\Magento\Catalog\Helper\Product\Flat\Indexer::class)
65  ->disableOriginalConstructor()
66  ->getMock();
67  $this->resourceMock = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
68  ->disableOriginalConstructor()
69  ->getMock();
70  $this->scopeConfigMock = $this->getMockBuilder(\Magento\Framework\App\Config\ScopeConfigInterface::class)
71  ->disableOriginalConstructor()
72  ->getMockForAbstractClass();
73  $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
74  ->disableOriginalConstructor()
75  ->getMockForAbstractClass();
76  $this->tableDataMock = $this->getMockBuilder(
77  \Magento\Catalog\Model\Indexer\Product\Flat\TableDataInterface::class
78  )->disableOriginalConstructor()->getMockForAbstractClass();
79  $this->connectionMock = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
80  ->disableOriginalConstructor()
81  ->getMockForAbstractClass();
82  $this->metadataPoolMock = $this->getMockBuilder(\Magento\Framework\EntityManager\MetadataPool::class)
83  ->disableOriginalConstructor()
84  ->getMock();
85  $this->metadataMock = $this->getMockBuilder(
86  \Magento\Framework\EntityManager\EntityMetadataInterface::class
87  )->disableOriginalConstructor()->getMockForAbstractClass();
88  $this->metadataMock->expects($this->any())->method('getLinkField')->willReturn('entity_id');
89 
90  $this->flatTableBuilder = $objectManagerHelper->getObject(
91  \Magento\Catalog\Model\Indexer\Product\Flat\FlatTableBuilder::class,
92  [
93  'productIndexerHelper' => $this->flatIndexerMock,
94  'resource' => $this->resourceMock,
95  'config' => $this->scopeConfigMock,
96  'storeManager' => $this->storeManagerMock,
97  'tableData' => $this->tableDataMock,
98  '_connection' => $this->connectionMock
99  ]
100  );
101  $objectManagerHelper->setBackwardCompatibleProperty(
102  $this->flatTableBuilder,
103  'metadataPool',
104  $this->metadataPoolMock
105  );
106  }
107 
108  public function testBuild()
109  {
110  $storeId = 1;
111  $changedIds = [];
112  $valueFieldSuffix = '_value';
113  $tableDropSuffix = '';
114  $fillTmpTables = true;
115  $tableName = 'catalog_product_entity';
116  $attributeTable = 'catalog_product_entity_int';
117  $temporaryTableName = 'catalog_product_entity_int_tmp_indexer';
118  $temporaryValueTableName = 'catalog_product_entity_int_tmp_indexer_value';
119  $linkField = 'entity_id';
120  $statusId = 22;
121  $eavCustomField = 'space_weight';
122  $eavCustomValueField = $eavCustomField . $valueFieldSuffix;
123  $this->flatIndexerMock->expects($this->once())->method('getAttributes')->willReturn([]);
124  $this->flatIndexerMock->expects($this->exactly(3))->method('getFlatColumns')
125  ->willReturnOnConsecutiveCalls([], [$eavCustomValueField => []], [$eavCustomValueField => []]);
126  $this->flatIndexerMock->expects($this->once())->method('getFlatIndexes')->willReturn([]);
127  $statusAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class)
128  ->disableOriginalConstructor()
129  ->getMock();
130  $eavCustomAttributeMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute::class)
131  ->disableOriginalConstructor()
132  ->getMock();
133  $this->flatIndexerMock->expects($this->once())->method('getTablesStructure')
134  ->willReturn(
135  [
136  'catalog_product_entity' => [$linkField => $statusAttributeMock],
137  'catalog_product_entity_int' => [
138  $linkField => $statusAttributeMock,
139  $eavCustomField => $eavCustomAttributeMock
140  ]
141  ]
142  );
143  $this->flatIndexerMock->expects($this->atLeastOnce())->method('getTable')
144  ->withConsecutive([$tableName], ['catalog_product_website'])
145  ->willReturnOnConsecutiveCalls($tableName, 'catalog_product_website');
146  $this->flatIndexerMock->expects($this->once())->method('getAttribute')
147  ->with('status')
148  ->willReturn($statusAttributeMock);
149  $backendMock = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Backend\AbstractBackend::class)
150  ->disableOriginalConstructor()
151  ->getMock();
152  $backendMock->expects($this->atLeastOnce())->method('getTable')->willReturn($attributeTable);
153  $statusAttributeMock->expects($this->atLeastOnce())->method('getBackend')->willReturn(
154  $backendMock
155  );
156  $eavCustomAttributeMock->expects($this->atLeastOnce())->method('getBackend')->willReturn(
157  $backendMock
158  );
159  $statusAttributeMock->expects($this->atLeastOnce())->method('getId')->willReturn($statusId);
160  $tableMock = $this->getMockBuilder(\Magento\Framework\DB\Ddl\Table::class)
161  ->disableOriginalConstructor()
162  ->getMock();
163  $this->connectionMock->expects($this->any())->method('newTable')->willReturn($tableMock);
164  $selectMock = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
165  ->disableOriginalConstructor()
166  ->getMock();
167  $this->connectionMock->expects($this->atLeastOnce())->method('select')->willReturn($selectMock);
168  $selectMock->expects($this->once())->method('from')->with(
169  ['et' => 'catalog_product_entity_tmp_indexer'],
170  [$linkField, 'type_id', 'attribute_set_id']
171  )->willReturnSelf();
172  $selectMock->expects($this->atLeastOnce())->method('joinInner')->willReturnSelf();
173  $selectMock->expects($this->exactly(3))->method('joinLeft')
174  ->withConsecutive(
175  [
176  ['dstatus' => $attributeTable],
177  sprintf(
178  'e.%s = dstatus.%s AND dstatus.store_id = %s AND dstatus.attribute_id = %s',
179  $linkField,
180  $linkField,
181  $storeId,
182  $statusId
183  ),
184  []
185  ],
186  [
187  $temporaryTableName,
188  "e.{$linkField} = {$temporaryTableName}.{$linkField}",
189  [$linkField, $eavCustomField]
190  ],
191  [
192  $temporaryValueTableName,
193  "e.{$linkField} = {$temporaryValueTableName}.{$linkField}",
194  [$eavCustomValueField]
195  ]
196  )->willReturnSelf();
197  $this->metadataPoolMock->expects($this->atLeastOnce())->method('getMetadata')->with(ProductInterface::class)
198  ->willReturn($this->metadataMock);
199  $storeMock = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
200  ->disableOriginalConstructor()
201  ->getMockForAbstractClass();
202  $this->storeManagerMock->expects($this->once())->method('getStore')->with($storeId)->willReturn($storeMock);
203  $this->flatTableBuilder->build($storeId, $changedIds, $valueFieldSuffix, $tableDropSuffix, $fillTmpTables);
204  }
205 }
$tableName
Definition: trigger.php:13