Skip to content

Commit 47ed648

Browse files
committed
Issue #2831954 by bojanz, GoZ, vasike: Add test coverage for multicurrency.
1 parent 4b526b5 commit 47ed648

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed

modules/price/tests/modules/commerce_price_test/commerce_price_test.services.yml

+4
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ services:
33
class: Drupal\commerce_price_test\TestPriceResolver
44
tags:
55
- { name: commerce_price.price_resolver, priority: 100 }
6+
commerce_test.test_multicurrency_price_resolver:
7+
class: Drupal\commerce_price_test\TestMulticurrencyPriceResolver
8+
tags:
9+
- { name: commerce_price.price_resolver, priority: 200 }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Drupal\commerce_price_test;
4+
5+
use Drupal\commerce\Context;
6+
use Drupal\commerce\PurchasableEntityInterface;
7+
use Drupal\commerce_price\Price;
8+
use Drupal\commerce_price\Resolver\PriceResolverInterface;
9+
10+
/**
11+
* Test multicurrency price resolver.
12+
*/
13+
class TestMulticurrencyPriceResolver implements PriceResolverInterface {
14+
15+
/**
16+
* {@inheritdoc}
17+
*/
18+
public function resolve(PurchasableEntityInterface $entity, $quantity, Context $context) {
19+
// Define mapping between language and currency.
20+
$currency_by_language = ['fr' => 'EUR'];
21+
22+
// Get current language.
23+
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
24+
25+
// Get value from currency price field, if exists.
26+
if (isset($currency_by_language[$language]) && $entity->hasField('price_' . strtolower($currency_by_language[$language]))) {
27+
$price = $entity->get('price_' . strtolower($currency_by_language[$language]))->getValue();
28+
$price = reset($price);
29+
30+
return new Price($price['number'], $price['currency_code']);
31+
}
32+
}
33+
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
namespace Drupal\Tests\commerce_price\Kernel;
4+
5+
use Drupal\commerce_price\Price;
6+
use Drupal\commerce_product\Entity\ProductVariation;
7+
use Drupal\commerce_store\StoreCreationTrait;
8+
use Drupal\field\Entity\FieldConfig;
9+
use Drupal\field\Entity\FieldStorageConfig;
10+
use Drupal\language\Entity\ConfigurableLanguage;
11+
use Drupal\Tests\commerce\Kernel\CommerceKernelTestBase;
12+
13+
/**
14+
* Tests price for multicurrency.
15+
*
16+
* @group commerce
17+
*/
18+
class PriceMulticurrencyTest extends CommerceKernelTestBase {
19+
20+
use StoreCreationTrait;
21+
22+
/**
23+
* Modules to enable.
24+
*
25+
* @var array
26+
*/
27+
public static $modules = [
28+
'language',
29+
'path',
30+
'commerce_price_test',
31+
'commerce_product',
32+
];
33+
34+
/**
35+
* @var \Drupal\commerce_product\Entity\ProductVariationInterface
36+
*/
37+
protected $variation;
38+
39+
/**
40+
* @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface
41+
*/
42+
protected $productVariationDefaultDisplay;
43+
44+
/**
45+
* @var \Drupal\Core\Entity\EntityViewBuilderInterface
46+
*/
47+
protected $productVariationViewBuilder;
48+
49+
/**
50+
* {@inheritdoc}
51+
*/
52+
protected function setUp() {
53+
parent::setUp();
54+
55+
// Add FR language.
56+
ConfigurableLanguage::createFromLangcode('fr')->save();
57+
// Import EUR currency.
58+
$this->container->get('commerce_price.currency_importer')->import('EUR');
59+
60+
$this->installEntitySchema('commerce_product_attribute');
61+
$this->installEntitySchema('commerce_product_attribute_value');
62+
$this->installEntitySchema('commerce_product_variation');
63+
$this->installEntitySchema('commerce_product_variation_type');
64+
$this->installEntitySchema('commerce_product');
65+
$this->installEntitySchema('commerce_product_type');
66+
$this->installConfig(['commerce_product']);
67+
68+
$this->productVariationDefaultDisplay = commerce_get_entity_display('commerce_product_variation', 'default', 'view');
69+
$this->productVariationViewBuilder = $this->container->get('entity_type.manager')->getViewBuilder('commerce_product_variation');
70+
71+
// Create extra Price EUR field.
72+
$field_storage = FieldStorageConfig::create([
73+
'field_name' => 'price_eur',
74+
'entity_type' => 'commerce_product_variation',
75+
'type' => 'commerce_price',
76+
'cardinality' => 1,
77+
]);
78+
$field_storage->save();
79+
80+
$field = FieldConfig::create([
81+
'field_storage' => $field_storage,
82+
'bundle' => 'default',
83+
'label' => 'Price EUR',
84+
'required' => TRUE,
85+
'translatable' => FALSE,
86+
]);
87+
$field->save();
88+
89+
// Create product variation.
90+
$variation = ProductVariation::create([
91+
'type' => 'default',
92+
'sku' => strtolower($this->randomMachineName()),
93+
'price' => new Price('12.00', 'USD'),
94+
'price_eur' => new Price('10.00', 'EUR'),
95+
]);
96+
$variation->save();
97+
$this->variation = $variation;
98+
}
99+
100+
/**
101+
* Tests the multicurrency price.
102+
*/
103+
public function testPriceMulticurrency() {
104+
// Set the calculated price formatter which use the price resolver.
105+
$this->productVariationDefaultDisplay->setComponent('price', [
106+
'type' => 'commerce_price_calculated',
107+
'settings' => [],
108+
]);
109+
$this->productVariationDefaultDisplay->save();
110+
111+
// Check the default price.
112+
$build = $this->productVariationViewBuilder->viewField($this->variation->price, 'default');
113+
$this->render($build);
114+
$this->assertText('$12.00');
115+
116+
// Change the language to 'fr'.
117+
\Drupal::configFactory()->getEditable('system.site')->set('default_langcode', 'fr')->save();
118+
// Check the price for 'fr' language.
119+
$build = $this->productVariationViewBuilder->viewField($this->variation->price, 'default');
120+
$this->render($build);
121+
$this->assertText('€10.00');
122+
}
123+
124+
}

0 commit comments

Comments
 (0)