Skip to content

Commit 8868871

Browse files
committed
ACP2E-2711: Error message is displayed during setup:upgrade when the database contains a custom MySQL trigger which is not related to the indexation mechanism
1 parent 015b8dd commit 8868871

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

lib/internal/Magento/Framework/Mview/Test/Unit/TriggerCleanerTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,62 @@ public function testRemoveTriggersNoChanges(): void
117117
$this->model->removeTriggers();
118118
}
119119

120+
public function testRemoveTriggersNotLinked(): void
121+
{
122+
$DBTriggers = [
123+
'trg_catalog_category_entity_int_after_insert' => [
124+
'TRIGGER_NAME' => 'trg_catalog_category_entity_int_after_insert',
125+
'ACTION_STATEMENT' => 'BEGIN statement; END',
126+
'EVENT_OBJECT_TABLE' => 'catalog_category_entity_int'
127+
],
128+
'not_linked_trg_catalog_category_entity_int_after_insert' => [
129+
'TRIGGER_NAME' => 'trg_catalog_category_entity_int_after_insert',
130+
'ACTION_STATEMENT' => 'BEGIN statement; END',
131+
'EVENT_OBJECT_TABLE' => 'catalog_category_entity_int'
132+
]
133+
];
134+
135+
$connectionMock = $this->getConnectionMock();
136+
$connectionMock->expects($this->once())
137+
->method('fetchAssoc')
138+
->willReturn($DBTriggers);
139+
140+
$this->resource->expects($this->once())->method('getConnection')->willReturn($connectionMock);
141+
142+
$triggerMock = $this->getMockBuilder(Trigger::class)
143+
->disableOriginalConstructor()
144+
->onlyMethods(['getName', 'getStatements'])
145+
->getMockForAbstractClass();
146+
$triggerMock->expects($this->atLeastOnce())
147+
->method('getName')
148+
->willReturn('trg_catalog_category_entity_int_after_insert');
149+
$triggerMock->expects($this->once())->method('getStatements')->willReturn(['statement;']);
150+
151+
$subscriptionMock = $this->createMock(Subscription::class);
152+
$subscriptionMock->expects($this->once())->method('getTriggers')->willReturn([$triggerMock]);
153+
$subscriptionMock->expects($this->once())->method('create')->willReturn($subscriptionMock);
154+
155+
$viewMock = $this->createMock(View::class);
156+
$viewMock->expects($this->once())
157+
->method('getSubscriptions')
158+
->willReturn(['subscriptionConfig' => []]);
159+
$viewMock->expects($this->once())->method('initSubscriptionInstance')->willReturn($subscriptionMock);
160+
161+
$viewCollectionMock = $this->getMockForAbstractClass(CollectionInterface::class);
162+
$viewCollectionMock->expects($this->once())->method('getViewsByStateMode')->willReturn([$viewMock]);
163+
164+
$this->viewCollectionFactory->expects($this->once())->method('create')->willReturn($viewCollectionMock);
165+
166+
$subscriptionMock->expects($this->never())->method('saveTrigger');
167+
$viewMock->expects($this->once())->method('unsubscribe');
168+
169+
$this->viewFactory->expects($this->once())->method('create')->willReturn($viewMock);
170+
$state = $this->createMock(\Magento\Indexer\Model\Mview\View\State::class);
171+
$viewMock->expects($this->once())->method('getActionClass')->willReturn(true);
172+
$viewMock->expects($this->exactly(2))->method('getState')->willReturn($state);
173+
$this->model->removeTriggers();
174+
}
175+
120176
/**
121177
* Prepare connection mock
122178
*

lib/internal/Magento/Framework/Mview/TriggerCleaner.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,10 @@ public function removeTriggers(): bool
8787
$remainingTriggers = array_diff_key($this->DbTriggers, $this->processedTriggers);
8888
foreach ($remainingTriggers as $trigger) {
8989
$view = $this->createViewByTableName($trigger['EVENT_OBJECT_TABLE']);
90-
$view->unsubscribe();
91-
$view->getState()->delete();
90+
if ($view->getActionClass()) {
91+
$view->unsubscribe();
92+
$view->getState()->delete();
93+
}
9294
}
9395

9496
return true;

0 commit comments

Comments
 (0)