magento2-docker/dev/tests/setup-integration/testsuite/Magento/Setup/SafeInstallerTest.php

151 lines
4.8 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Setup;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Setup\Declaration\Schema\Db\DbSchemaReaderInterface;
use Magento\TestFramework\Deploy\CliCommand;
use Magento\TestFramework\Deploy\TestModuleManager;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\SetupTestCase;
/**
* The purpose of this test is verifying safe declarative installation works.
*/
class SafeInstallerTest extends SetupTestCase
{
/**
* @var TestModuleManager
*/
private $moduleManager;
/**
* @var CliCommand
*/
private $cliCommand;
/**
* @var ResourceConnection
*/
private $resourceConnection;
/**
* @var DbSchemaReaderInterface
*/
private $dbSchemaReader;
/**
* @inheritdoc
*/
protected function setUp(): void
{
$objectManager = Bootstrap::getObjectManager();
$this->moduleManager = $objectManager->get(TestModuleManager::class);
$this->cliCommand = $objectManager->get(CliCommand::class);
$this->resourceConnection = $objectManager->get(ResourceConnection::class);
$this->dbSchemaReader = $objectManager->get(DbSchemaReaderInterface::class);
}
/**
* @moduleName Magento_TestSetupDeclarationModule4
* @dataProviderFromFile Magento/TestSetupDeclarationModule4/fixture/safe_data_provider.php
*/
public function testInstallation()
{
$testTableData = $this->getData();
$row = reset($testTableData);
$this->cliCommand->install(['Magento_TestSetupDeclarationModule4']);
$adapter = $this->resourceConnection->getConnection();
$testTableName = $this->resourceConnection->getTableName('test_table');
$adapter->insertArray(
$this->resourceConnection->getTableName('test_table'),
array_keys($row),
$this->getData()
);
//Move new db_schema.xml
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule4',
'remove_title_column',
'db_schema.xml',
'etc'
);
$this->cliCommand->upgrade(
[
'safe-mode' => true,
]
);
//Move new db_schema.xml with restored title field
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule4',
'restore_title_column',
'db_schema.xml',
'etc'
);
$this->cliCommand->upgrade(
[
'data-restore' => true,
]
);
$testTableSelect = $adapter->select()->from($testTableName);
self::assertEquals($testTableData, $adapter->fetchAll($testTableSelect));
}
/**
* Tests that not whitelisted elements should not be removed from DB to avoid backwards-incompatible change.
*
* @moduleName Magento_TestSetupDeclarationModule6
*/
public function testDestructiveOperationBehaviour()
{
$this->cliCommand->install(['Magento_TestSetupDeclarationModule6']);
$this->assertForeignKeyPresence('test_table', 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF');
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule6',
'remove_fk_declaration',
'db_schema.xml',
'etc'
);
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule6',
'remove_fk_declaration',
'db_schema_whitelist.json',
'etc'
);
$this->cliCommand->upgrade();
$this->assertForeignKeyPresence('test_table', 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF');
$this->moduleManager->updateRevision(
'Magento_TestSetupDeclarationModule6',
'restore_fk_declaration_to_wl',
'db_schema_whitelist.json',
'etc'
);
$this->cliCommand->upgrade();
$this->assertForeignKeyPresence('test_table', 'TEST_TABLE_TINYINT_REFERENCE_TABLE_TINYINT_REF', false);
}
/**
* Asserts foreign key presence.
*
* @param string $tableName
* @param string $foreignKeyName
* @param bool $isPresent
* @return void
*/
private function assertForeignKeyPresence(string $tableName, string $foreignKeyName, bool $isPresent = true): void
{
$foreignKeys = $this->dbSchemaReader
->readReferences($this->resourceConnection->getTableName($tableName), 'default');
if ($isPresent) {
$this->assertArrayHasKey($foreignKeyName, $foreignKeys);
} else {
$this->assertArrayNotHasKey($foreignKeyName, $foreignKeys);
}
}
}