151 lines
4.8 KiB
PHP
Executable File
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);
|
|
}
|
|
}
|
|
}
|