diff --git a/CHANGELOG.md b/CHANGELOG.md index 9792823..72bd589 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# [NEXT] +- Fixes errors when downloading media. +- Fixes errors when migrating category images. + # 13.0.0 - Compatibility with Migration Assistant version 18. diff --git a/CHANGELOG_de-DE.md b/CHANGELOG_de-DE.md index 764fbc3..31cad1e 100644 --- a/CHANGELOG_de-DE.md +++ b/CHANGELOG_de-DE.md @@ -1,3 +1,7 @@ +# [NEXT] +- Behebt Fehler beim Herunterladen von Medien. +- Behebt Fehler bei der Migration von Kategoriebildern. + # 13.0.0 - Kompatibilität mit Migration Assistant Version 18. diff --git a/src/Profile/Magento/Converter/CategoryConverter.php b/src/Profile/Magento/Converter/CategoryConverter.php index 1a95522..780b263 100644 --- a/src/Profile/Magento/Converter/CategoryConverter.php +++ b/src/Profile/Magento/Converter/CategoryConverter.php @@ -28,6 +28,10 @@ #[Package('fundamentals@after-sales')] abstract class CategoryConverter extends MagentoConverter { + private const DIRECTORY_SEPARATOR = '/'; + + private const CATEGORY_MEDIA_PATH = 'media/catalog/category/'; + protected string $connectionId; protected Context $context; @@ -384,7 +388,7 @@ protected function getCategoryMedia(string $path): array [ 'runId' => $this->runId, 'entity' => MediaDataSet::getEntity(), - 'uri' => '/media/catalog/category/' . $path, + 'uri' => $this->createMediaUri($path), 'fileName' => $categoryMedia['id'], 'fileSize' => 0, 'mediaId' => $categoryMedia['id'], @@ -406,4 +410,15 @@ private function parentIsRoot(array $data, ?array $rootCategoryMapping): bool return true; } + + private function createMediaUri(string $path): string + { + $normalizedPath = \ltrim($path, self::DIRECTORY_SEPARATOR); + + if (\str_starts_with($normalizedPath, self::CATEGORY_MEDIA_PATH)) { + return self::DIRECTORY_SEPARATOR . $normalizedPath; + } + + return self::DIRECTORY_SEPARATOR . self::CATEGORY_MEDIA_PATH . $normalizedPath; + } } diff --git a/tests/Profile/Magento2/Converter/Magento2CategoryConverterTest.php b/tests/Profile/Magento2/Converter/Magento2CategoryConverterTest.php index 26554f1..f07627b 100644 --- a/tests/Profile/Magento2/Converter/Magento2CategoryConverterTest.php +++ b/tests/Profile/Magento2/Converter/Magento2CategoryConverterTest.php @@ -7,6 +7,7 @@ namespace Swag\MigrationMagento\Test\Profile\Magento2\Converter; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Log\Package; @@ -76,9 +77,11 @@ class Magento2CategoryConverterTest extends TestCase private string $defaultLanguageUuid; + private DummyMediaFileService $mediaFileService; + protected function setUp(): void { - $mediaFileService = new DummyMediaFileService(); + $this->mediaFileService = new DummyMediaFileService(); $mappingService = new DummyMagentoMappingService(); $this->loggingService = new DummyLoggingService(); @@ -163,10 +166,10 @@ protected function setUp(): void $defaultCmsPageLookup = $this->getContainer()->get(DefaultCmsPageLookup::class); $languageLookup = $this->getContainer()->get(LanguageLookup::class); - $this->categoryConverter20 = new Magento20CategoryConverter($mappingService, $this->loggingService, $mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); - $this->categoryConverter21 = new Magento21CategoryConverter($mappingService, $this->loggingService, $mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); - $this->categoryConverter22 = new Magento22CategoryConverter($mappingService, $this->loggingService, $mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); - $this->categoryConverter23 = new Magento23CategoryConverter($mappingService, $this->loggingService, $mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); + $this->categoryConverter20 = new Magento20CategoryConverter($mappingService, $this->loggingService, $this->mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); + $this->categoryConverter21 = new Magento21CategoryConverter($mappingService, $this->loggingService, $this->mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); + $this->categoryConverter22 = new Magento22CategoryConverter($mappingService, $this->loggingService, $this->mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); + $this->categoryConverter23 = new Magento23CategoryConverter($mappingService, $this->loggingService, $this->mediaFileService, $mediaFolderLookup, $lowestRootCategoryLookup, $defaultCmsPageLookup, $languageLookup); } public function testSupports(): void @@ -224,6 +227,46 @@ public function testConvert20(): void ); } + #[DataProvider('categoryImagePathProvider')] + public function testConvertCategoryImagePath(string $sourcePath, string $expectedUri): void + { + $categoryData = require __DIR__ . '/../../../_fixtures/category_data.php'; + $categoryData[1]['image'] = $sourcePath; + + $this->mediaFileService->resetMediaFileArray(); + $this->categoryConverter20->convert( + $categoryData[1], + Context::createDefaultContext(), + $this->migrationContext20 + ); + + $mediaFiles = $this->mediaFileService->getMediaFileArray(); + + static::assertCount(1, $mediaFiles); + static::assertSame($expectedUri, $mediaFiles[0]['uri']); + } + + /** + * @return iterable + */ + public static function categoryImagePathProvider(): iterable + { + yield 'bare category image filename' => [ + 'sourcePath' => 'example.jpg', + 'expectedUri' => '/media/catalog/category/example.jpg', + ]; + + yield 'category image with existing media prefix' => [ + 'sourcePath' => '/media/catalog/category/example.jpg', + 'expectedUri' => '/media/catalog/category/example.jpg', + ]; + + yield 'category image with existing media prefix without leading slash' => [ + 'sourcePath' => 'media/catalog/category/example.jpg', + 'expectedUri' => '/media/catalog/category/example.jpg', + ]; + } + public function testConvert21(): void { $categoryData = require __DIR__ . '/../../../_fixtures/category_data.php';