From 429f08c686ddc65149391a885b9c0c8fc7c115bf Mon Sep 17 00:00:00 2001 From: Johannes Wachter Date: Thu, 28 Jan 2021 11:05:16 +0100 Subject: [PATCH] add product-payload class (#111) --- Payload/ProductPayload.php | 56 +++++++++++++ Payload/ProductTranslationPayload.php | 75 ++++++++++++++++++ Payload/TaxonPayload.php | 9 +++ Resources/config/taxon_category_adapter.xml | 2 + Resources/doc/installation.md | 2 +- Tests/MockSyliusData.php | 64 +++++++++++++++ Tests/Unit/Payload/ProductPayloadTest.php | 69 ++++++++++++++++ .../Payload/ProductTranslationPayloadTest.php | 79 +++++++++++++++++++ 8 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 Payload/ProductTranslationPayload.php create mode 100644 Tests/Unit/Payload/ProductPayloadTest.php create mode 100644 Tests/Unit/Payload/ProductTranslationPayloadTest.php diff --git a/Payload/ProductPayload.php b/Payload/ProductPayload.php index c034b1e..acef621 100644 --- a/Payload/ProductPayload.php +++ b/Payload/ProductPayload.php @@ -14,6 +14,7 @@ namespace Sulu\Bundle\SyliusConsumerBundle\Payload; use Sulu\Bundle\SyliusConsumerBundle\Common\Payload; +use Sulu\Exception\FeatureNotImplementedException; class ProductPayload { @@ -38,6 +39,61 @@ public function getCode(): string return $this->code; } + public function isEnabled(): bool + { + return $this->payload->getBoolValue('enabled'); + } + + public function getMainTaxonId(): int + { + return $this->payload->getIntValue('mainTaxonId'); + } + + /** + * @return int[] + */ + public function getTaxonIds(): array + { + return array_map(function (array $taxon) { + return $taxon['taxonId']; + }, $this->payload->getArrayValue('productTaxons')); + } + + /** + * @return ProductTranslationPayload[] + */ + public function getTranslations(): array + { + $translations = []; + foreach ($this->payload->getArrayValue('translations') as $translationPayload) { + $translation = new ProductTranslationPayload($translationPayload); + $translations[$translation->getLocale()] = $translation; + } + + return $translations; + } + + /** + * @return ProductVariantPayload[] + */ + public function getVariants(): array + { + $variants = []; + foreach ($this->payload->getArrayValue('variants') as $variantPayload) { + $variants[] = new ProductVariantPayload($variantPayload['code'], $variantPayload); + } + + return $variants; + } + + /** + * @return mixed[] + */ + public function getImages(): array + { + throw new FeatureNotImplementedException('Images are not implemented'); + } + public function getPayload(): Payload { return $this->payload; diff --git a/Payload/ProductTranslationPayload.php b/Payload/ProductTranslationPayload.php new file mode 100644 index 0000000..26f714e --- /dev/null +++ b/Payload/ProductTranslationPayload.php @@ -0,0 +1,75 @@ +payload = new Payload($payload); + } + + public function getLocale(): string + { + return $this->getLocalization()->getLocale(); + } + + public function getLocalization(): Localization + { + return Localization::createFromString($this->payload->getStringValue('locale'), Localization::LCID); + } + + public function getName(): string + { + return $this->payload->getStringValue('name'); + } + + public function getSlug(): string + { + return $this->payload->getStringValue('slug'); + } + + public function getDescription(): string + { + return $this->payload->getStringValue('description'); + } + + public function getShortDescription(): string + { + return $this->payload->getStringValue('shortDescription'); + } + + public function getMetaKeywords(): ?string + { + return $this->payload->getNullableStringValue('metaKeywords'); + } + + public function getMetaDescription(): ?string + { + return $this->payload->getNullableStringValue('metaDescription'); + } + + public function getPayload(): Payload + { + return $this->payload; + } +} diff --git a/Payload/TaxonPayload.php b/Payload/TaxonPayload.php index e10db4b..61237fd 100644 --- a/Payload/TaxonPayload.php +++ b/Payload/TaxonPayload.php @@ -14,6 +14,7 @@ namespace Sulu\Bundle\SyliusConsumerBundle\Payload; use Sulu\Bundle\SyliusConsumerBundle\Common\Payload; +use Sulu\Exception\FeatureNotImplementedException; class TaxonPayload { @@ -78,6 +79,14 @@ public function getTranslations(): array return $translations; } + /** + * @return mixed[] + */ + public function getImages(): array + { + throw new FeatureNotImplementedException('Images are not implemented'); + } + public function getPayload(): Payload { return $this->payload; diff --git a/Resources/config/taxon_category_adapter.xml b/Resources/config/taxon_category_adapter.xml index 9319e56..dfdc81e 100644 --- a/Resources/config/taxon_category_adapter.xml +++ b/Resources/config/taxon_category_adapter.xml @@ -3,6 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> + + diff --git a/Resources/doc/installation.md b/Resources/doc/installation.md index e176f0e..c33b43a 100644 --- a/Resources/doc/installation.md +++ b/Resources/doc/installation.md @@ -17,7 +17,7 @@ sulu_sylius_consumer: framework: messenger: transports: - sulu_sylius_transport: '%env(SYLIUS_MESSENGER_TRANSPORT_DSN)%' + sulu_sylius_transport: '%env(SULU_SYLIUS_MESSENGER_TRANSPORT_DSN)%' buses: sulu_sylius_producer.messenger_bus: middleware: diff --git a/Tests/MockSyliusData.php b/Tests/MockSyliusData.php index 5fe4b27..40d6f05 100644 --- a/Tests/MockSyliusData.php +++ b/Tests/MockSyliusData.php @@ -77,4 +77,68 @@ final class MockSyliusData ], 'images' => [], ]; + + const PRODUCT = [ + 'id' => 1, + 'code' => 'Everyday_white_basic_T_Shirt', + 'enabled' => true, + 'mainTaxonId' => 4, + 'productTaxons' => [ + [ + 'id' => 1, + 'taxonId' => 2, + 'position' => 0, + 'customData' => [], + ], + [ + 'id' => 2, + 'taxonId' => 4, + 'position' => 1, + 'customData' => [], + ], + ], + 'translations' => [ + [ + 'locale' => 'en_US', + 'name' => 'Everyday white basic T-Shirt', + 'slug' => 'everyday-white-basic-t-shirt', + 'description' => 'Quia nihil dignissimos expedita quia neque odio qui sunt. Nemo animi maxime rem qui quaerat eos. Eum ipsam aut aliquid cum et in sint. + +Est cumque illum saepe aliquam est. Ullam impedit ipsa aut nostrum est sunt nesciunt. Ut sint saepe ullam sed dolorum atque eos accusamus. + +Expedita voluptatum magnam est vitae voluptas eos. Maiores voluptatibus quos enim expedita voluptatibus aut. Non ducimus nesciunt voluptas deleniti.', + 'shortDescription' => 'Sequi doloribus minus quis quibusdam. Architecto optio sit inventore quibusdam magni voluptatem. Non sed ex mollitia nisi nemo velit quidem.', + 'metaKeywords' => null, + 'metaDescription' => null, + 'customData' => [], + ], + ], + 'images' => [ + [ + 'id' => 1, + 'type' => 'main', + 'path' => '23/d6/bab23ff05421d888c688112110c5.jpg', + 'filename' => null, + 'customData' => [], + ], + ], + 'customData' => [], + 'variants' => [ + [ + 'id' => 1, + 'code' => 'Everyday_white_basic_T_Shirt-variant-0', + 'position' => 0, + 'translations' => [ + 'en_US' => [ + 'locale' => 'en_US', + 'id' => 1, + 'name' => 'S', + ], + ], + 'version' => 1, + 'onHold' => 0, + 'onHand' => 7, + ], + ], + ]; } diff --git a/Tests/Unit/Payload/ProductPayloadTest.php b/Tests/Unit/Payload/ProductPayloadTest.php new file mode 100644 index 0000000..082dbac --- /dev/null +++ b/Tests/Unit/Payload/ProductPayloadTest.php @@ -0,0 +1,69 @@ +assertEquals(MockSyliusData::PRODUCT['code'], $entity->getCode()); + } + + public function testIsEnabled(): void + { + $entity = new ProductPayload(MockSyliusData::PRODUCT['code'], MockSyliusData::PRODUCT); + + $this->assertTrue($entity->isEnabled()); + } + + public function testGetMainTaxonId(): void + { + $entity = new ProductPayload(MockSyliusData::PRODUCT['code'], MockSyliusData::PRODUCT); + + $this->assertEquals(MockSyliusData::PRODUCT['mainTaxonId'], $entity->getMainTaxonId()); + } + + public function testGetTaxonIds(): void + { + $entity = new ProductPayload(MockSyliusData::PRODUCT['code'], MockSyliusData::PRODUCT); + + $this->assertEquals([2, 4], $entity->getTaxonIds()); + } + + public function testGetTranslations(): void + { + $entity = new ProductPayload(MockSyliusData::PRODUCT['code'], MockSyliusData::PRODUCT); + + $translations = $entity->getTranslations(); + $this->assertCount(1, $translations); + + $this->assertEquals(MockSyliusData::PRODUCT['translations'][0], $translations['en_us']->getPayload()->getData()); + } + + public function testGetVariants(): void + { + $entity = new ProductPayload(MockSyliusData::PRODUCT['code'], MockSyliusData::PRODUCT); + + $variants = $entity->getVariants(); + $this->assertCount(1, $variants); + + $this->assertEquals(MockSyliusData::PRODUCT['variants'][0], $variants[0]->getPayload()->getData()); + } +} diff --git a/Tests/Unit/Payload/ProductTranslationPayloadTest.php b/Tests/Unit/Payload/ProductTranslationPayloadTest.php new file mode 100644 index 0000000..8d698e1 --- /dev/null +++ b/Tests/Unit/Payload/ProductTranslationPayloadTest.php @@ -0,0 +1,79 @@ +assertEquals('en_us', $entity->getLocale()); + } + + public function testGetLocalization(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertInstanceOf(Localization::class, $entity->getLocalization()); + $this->assertEquals('en_us', $entity->getLocalization()->getLocale()); + } + + public function testGetName(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertEquals('Everyday white basic T-Shirt', $entity->getName()); + } + + public function testGetSlug(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertEquals('everyday-white-basic-t-shirt', $entity->getSlug()); + } + + public function testGetDescription(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertEquals('Quia nihil dignissimos expedita quia neque odio qui sunt. Nemo animi maxime rem qui quaerat eos. Eum ipsam aut aliquid cum et in sint.' . PHP_EOL . PHP_EOL . 'Est cumque illum saepe aliquam est. Ullam impedit ipsa aut nostrum est sunt nesciunt. Ut sint saepe ullam sed dolorum atque eos accusamus.' . PHP_EOL . PHP_EOL . 'Expedita voluptatum magnam est vitae voluptas eos. Maiores voluptatibus quos enim expedita voluptatibus aut. Non ducimus nesciunt voluptas deleniti.', $entity->getDescription()); + } + + public function testGetShortDescription(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertEquals('Sequi doloribus minus quis quibusdam. Architecto optio sit inventore quibusdam magni voluptatem. Non sed ex mollitia nisi nemo velit quidem.', $entity->getShortDescription()); + } + + public function testGetMetaKeyword(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertNull($entity->getMetaKeywords()); + } + + public function testGetMetaDescription(): void + { + $entity = new ProductTranslationPayload(MockSyliusData::PRODUCT['translations'][0]); + + $this->assertNull($entity->getMetaDescription()); + } +}