diff --git a/modules/price/tests/modules/commerce_price_test/commerce_price_test.services.yml b/modules/price/tests/modules/commerce_price_test/commerce_price_test.services.yml index 76ac9a9ed9..e2a63d53e6 100644 --- a/modules/price/tests/modules/commerce_price_test/commerce_price_test.services.yml +++ b/modules/price/tests/modules/commerce_price_test/commerce_price_test.services.yml @@ -3,3 +3,8 @@ services: class: Drupal\commerce_price_test\TestPriceResolver tags: - { name: commerce_price.price_resolver, priority: 100 } + commerce_test.test_multicurrency_price_resolver: + class: Drupal\commerce_price_test\TestMulticurrencyPriceResolver + arguments: ['@language_manager'] + tags: + - { name: commerce_price.price_resolver, priority: 200 } diff --git a/modules/price/tests/modules/commerce_price_test/src/TestMulticurrencyPriceResolver.php b/modules/price/tests/modules/commerce_price_test/src/TestMulticurrencyPriceResolver.php new file mode 100644 index 0000000000..b9d67561c4 --- /dev/null +++ b/modules/price/tests/modules/commerce_price_test/src/TestMulticurrencyPriceResolver.php @@ -0,0 +1,52 @@ +languageManager = $language_manager; + } + + /** + * {@inheritdoc} + */ + public function resolve(PurchasableEntityInterface $entity, $quantity, Context $context) { + // Define mapping between language and currency. + $currency_by_language = ['fr' => 'EUR']; + + // Get current language. + $language = $this->languageManager->getCurrentLanguage()->getId(); + + // Get value from currency price field, if exists. + if (isset($currency_by_language[$language]) && $entity->hasField('price_' . strtolower($currency_by_language[$language]))) { + $price = $entity->get('price_' . strtolower($currency_by_language[$language]))->getValue(); + $price = reset($price); + + return new Price($price['number'], $price['currency_code']); + } + } + +} diff --git a/modules/price/tests/src/Kernel/PriceMulticurrencyTest.php b/modules/price/tests/src/Kernel/PriceMulticurrencyTest.php new file mode 100644 index 0000000000..4b4cfae66c --- /dev/null +++ b/modules/price/tests/src/Kernel/PriceMulticurrencyTest.php @@ -0,0 +1,124 @@ +save(); + // Import EUR currency. + $this->container->get('commerce_price.currency_importer')->import('EUR'); + + $this->installEntitySchema('commerce_product_attribute'); + $this->installEntitySchema('commerce_product_attribute_value'); + $this->installEntitySchema('commerce_product_variation'); + $this->installEntitySchema('commerce_product_variation_type'); + $this->installEntitySchema('commerce_product'); + $this->installEntitySchema('commerce_product_type'); + $this->installConfig(['commerce_product']); + + $this->productVariationDefaultDisplay = commerce_get_entity_display('commerce_product_variation', 'default', 'view'); + $this->productVariationViewBuilder = $this->container->get('entity_type.manager')->getViewBuilder('commerce_product_variation'); + + // Create extra Price EUR field. + $field_storage = FieldStorageConfig::create([ + 'field_name' => 'price_eur', + 'entity_type' => 'commerce_product_variation', + 'type' => 'commerce_price', + 'cardinality' => 1, + ]); + $field_storage->save(); + + $field = FieldConfig::create([ + 'field_storage' => $field_storage, + 'bundle' => 'default', + 'label' => 'Price EUR', + 'required' => TRUE, + 'translatable' => FALSE, + ]); + $field->save(); + + // Create product variation. + $variation = ProductVariation::create([ + 'type' => 'default', + 'sku' => strtolower($this->randomMachineName()), + 'price' => new Price('12.00', 'USD'), + 'price_eur' => new Price('10.00', 'EUR'), + ]); + $variation->save(); + $this->variation = $variation; + } + + /** + * Tests the multicurrency price. + */ + public function testPriceMulticurrency() { + // Set the calculated price formatter which use the price resolver. + $this->productVariationDefaultDisplay->setComponent('price', [ + 'type' => 'commerce_price_calculated', + 'settings' => [], + ]); + $this->productVariationDefaultDisplay->save(); + + // Check the default price. + $build = $this->productVariationViewBuilder->viewField($this->variation->price, 'default'); + $this->render($build); + $this->assertText('$12.00'); + + // Change the language to 'fr'. + \Drupal::configFactory()->getEditable('system.site')->set('default_langcode', 'fr')->save(); + // Check the price for 'fr' language. + $build = $this->productVariationViewBuilder->viewField($this->variation->price, 'default'); + $this->render($build); + $this->assertText('€10.00'); + } + +}