Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Migration/Service/MigrationDataWriter.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public function writeData(MigrationContextInterface $migrationContext, Context $
}

$convertedValues = array_values($converted);
$this->fixApplier->apply($convertedValues, $migrationContext->getConnection()->getId());
$this->fixApplier->apply($convertedValues, $migrationContext->getConnection()->getId(), $migrationContext->getRunUuid());

try {
$currentWriter = $this->writerRegistry->getWriter($dataSet::getEntity());
Expand Down
14 changes: 10 additions & 4 deletions src/Migration/Writer/MigrationFix/MigrationFixApplier.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ public function __construct(
/**
* @param array<int|string, array<int|string, mixed>> $data
*/
public function apply(array &$data, string $connectionId): void
public function apply(array &$data, string $connectionId, string $runId): void
{
$itemIds = \array_column($data, 'id');
$fixes = $this->getMappings($itemIds, $connectionId);
$fixes = $this->getFixes($itemIds, $connectionId, $runId);

foreach ($data as &$item) {
$id = $item['id'];
Expand All @@ -48,19 +48,25 @@ public function apply(array &$data, string $connectionId): void
*
* @return array<string, list<MigrationFix>>
*/
private function getMappings(array $ids, string $connectionId): array
private function getFixes(array $ids, string $connectionId, string $runId): array
{
// To ensure, only select fixes for the current run, join swag_migration_logging table and filter by run_id
$sql = <<<'SQL'
SELECT fix.entity_id as entityId, fix.id, fix.value, fix.path FROM swag_migration_fix as fix
SELECT fix.entity_id AS entityId, fix.id, fix.value, fix.path
FROM swag_migration_fix AS fix
INNER JOIN swag_migration_logging AS log ON log.entity_id = fix.entity_id
WHERE fix.entity_id IN (:ids)
AND fix.connection_id = :connectionId
AND log.run_id = :runId
AND log.user_fixable = 1;
SQL;

$result = $this->connection->fetchAllAssociative(
$sql,
[
'ids' => Uuid::fromHexToBytesList($ids),
'connectionId' => Uuid::fromHexToBytes($connectionId),
'runId' => Uuid::fromHexToBytes($runId),
],
[
'ids' => ArrayParameterType::STRING,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,39 @@

use Doctrine\DBAL\Connection;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Write\EntityWriter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\Test\TestCaseBase\IntegrationTestBehaviour;
use Shopware\Core\Framework\Uuid\Uuid;
use SwagMigrationAssistant\Migration\Mapping\MappingService;
use SwagMigrationAssistant\Migration\Mapping\SwagMigrationMappingDefinition;
use SwagMigrationAssistant\Migration\Connection\SwagMigrationConnectionEntity;
use SwagMigrationAssistant\Migration\Logging\SwagMigrationLoggingEntity;
use SwagMigrationAssistant\Migration\MigrationContext;
use SwagMigrationAssistant\Migration\MigrationFix\SwagMigrationFixEntity;
use SwagMigrationAssistant\Migration\Run\SwagMigrationRunEntity;
use SwagMigrationAssistant\Migration\Writer\MigrationFix\MigrationFixApplier;
use SwagMigrationAssistant\Profile\Shopware\Gateway\Local\ShopwareLocalGateway;

class MigrationFixApplierTest extends TestCase
{
use IntegrationTestBehaviour;

private MappingService $mappingService;

protected function setUp(): void
{
$this->mappingService = new MappingService(
$this->getContainer()->get('swag_migration_mapping.repository'),
$this->getContainer()->get(EntityWriter::class),
$this->getContainer()->get(SwagMigrationMappingDefinition::class),
$this->getContainer()->get(Connection::class),
new NullLogger()
);
}

public function testApply(): void
{
$connectionId = Uuid::randomHex();
$this->createConnection($connectionId);
$connection = $this->createConnection($connectionId);
$run = $this->createRun($connection);

$idOne = Uuid::randomHex();
$idTwo = Uuid::randomHex();
$idThree = Uuid::randomHex();

$fixApplier = new MigrationFixApplier($this->getContainer()->get(Connection::class));

// create also mapping without fix
$this->mappingService->createMapping(
$connectionId,
'any_other',
'old_id_3',
null,
null,
$idThree,
'value three'
);

$this->mappingService->writeMapping();
$this->createFixAndLogging($connection->getId(), $idOne, 'val1', 'first.path', $run);
$this->createFixAndLogging($connection->getId(), $idOne, ['nested' => ['array' => ['value' => 'nested array value']]], 'second.other.path', $run);

$this->createFix($connectionId, $idOne, 'val1', 'first.path');
$this->createFix($connectionId, $idOne, ['nested' => ['array' => ['value' => 'nested array value']]], 'second.other.path');

$this->createFix($connectionId, $idTwo, 'val3', 'third.path');
$this->createFix($connectionId, $idTwo, 'val4', 'fourth.other.path');
$this->createFixAndLogging($connection->getId(), $idTwo, 'val3', 'third.path', $run);
$this->createFixAndLogging($connection->getId(), $idTwo, 'val4', 'fourth.other.path', $run);

$data = [
[
Expand All @@ -81,7 +56,7 @@ public function testApply(): void
['id' => $idThree],
];

$fixApplier->apply($data, $connectionId);
$fixApplier->apply($data, $connection->getId(), $run->getId());

$expected = [[
'id' => $idOne,
Expand Down Expand Up @@ -110,22 +85,64 @@ public function testApply(): void
static::assertSame($expected, $data);
}

private function createFix(string $connectionId, string $entityId, mixed $value, string $path): void
private function createFixAndLogging(string $connectionId, string $entityId, mixed $value, string $path, SwagMigrationRunEntity $swagMigrationRunEntity): void
{
$context = Context::createDefaultContext();
$migrationFix = new SwagMigrationFixEntity();
$migrationFix->setId(Uuid::randomHex());
$migrationFix->setConnectionId($connectionId);
$migrationFix->setEntityId($entityId);
$migrationFix->setPath($path);
$migrationFix->setValue($value);
$this->getContainer()->get('swag_migration_fix.repository')->create([\json_decode(\json_encode($migrationFix, \JSON_THROW_ON_ERROR), true)], $context);

$loggingEntity = new SwagMigrationLoggingEntity();
$loggingEntity->setId(Uuid::randomHex());
$loggingEntity->setEntityId($entityId);
$loggingEntity->setLevel('level');
$loggingEntity->setCode('code');
$loggingEntity->setRunId($swagMigrationRunEntity->getId());
$loggingEntity->setRun($swagMigrationRunEntity);
$loggingEntity->setProfileName('profileName');
$loggingEntity->setGatewayName('gatewayName');
$loggingEntity->setUserFixable(true);
$context->scope(MigrationContext::SOURCE_CONTEXT, function (Context $context) use ($loggingEntity): void {
$this->getContainer()->get('swag_migration_logging.repository')->create([\json_decode(\json_encode($loggingEntity, \JSON_THROW_ON_ERROR), true)], $context);
});
}

$this->getContainer()->get('swag_migration_fix.repository')->create([$migrationFix->jsonSerialize()], Context::createDefaultContext());
private function createRun(SwagMigrationConnectionEntity $connection): SwagMigrationRunEntity
{
$swagMigrationRun = null;
Context::createDefaultContext()->scope(MigrationContext::SOURCE_CONTEXT, function (Context $context) use (&$swagMigrationRun, $connection): void {
$runRepository = $this->getContainer()->get('swag_migration_run.repository');
$runId = Uuid::randomHex();
$runData = [
[
'id' => $runId,
'connection_id' => $connection->getId(),
'connection' => $connection->jsonSerialize(),
'step' => 'apply-fixes',
],
];

$runRepository->create($runData, $context);
$criteria = new Criteria([$runId]);
$swagMigrationRun = $runRepository->search($criteria, $context)->first();
});

static::assertInstanceOf(SwagMigrationRunEntity::class, $swagMigrationRun);

return $swagMigrationRun;
}

private function createConnection(string $connectionId): void
private function createConnection(string $connectionId): SwagMigrationConnectionEntity
{
Context::createDefaultContext()->scope(MigrationContext::SOURCE_CONTEXT, function (Context $context) use ($connectionId): void {
$this->getContainer()->get('swag_migration_connection.repository')->create(
$connection = null;
Context::createDefaultContext()->scope(MigrationContext::SOURCE_CONTEXT, function (Context $context) use (&$connection, $connectionId): void {
$connectionRepository = $this->getContainer()->get('swag_migration_connection.repository');

$connectionRepository->create(
[
[
'id' => $connectionId,
Expand All @@ -141,6 +158,13 @@ private function createConnection(string $connectionId): void
],
$context
);

$criteria = new Criteria([$connectionId]);
$connection = $connectionRepository->search($criteria, $context)->first();
});

static::assertInstanceOf(SwagMigrationConnectionEntity::class, $connection);

return $connection;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public function testApply(): void

$migrationFixApplier = new MigrationFixApplier($this->createConnection($fixes));

$migrationFixApplier->apply($data, Uuid::randomHex());
$migrationFixApplier->apply($data, Uuid::randomHex(), Uuid::randomHex());

static::assertSame($expected, $data[0]['the']['path']['to']['value']);
static::assertSame($expected, $data[0]['other']['path']['to']['value']);
Expand Down
Loading