Skip to content

Commit 7aa9a9c

Browse files
fix
1 parent 3f1099e commit 7aa9a9c

File tree

2 files changed

+169
-2
lines changed

2 files changed

+169
-2
lines changed

app/code/Magento/Customer/Model/Options.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,14 @@ private function prepareNamePrefixSuffixOptions($options, $isOptional = false)
9797
if (empty($options)) {
9898
return false;
9999
}
100+
100101
$result = [];
101-
$options = array_filter(explode(';', $options));
102+
$options = explode(';', $options);
102103
foreach ($options as $value) {
103-
$value = $this->escaper->escapeHtml(trim($value));
104+
$value = $this->escaper->escapeHtml(trim($value)) ?: ' ';
104105
$result[$value] = $value;
105106
}
107+
106108
if ($isOptional && trim(current($options))) {
107109
$result = array_merge([' ' => ' '], $result);
108110
}
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\Customer\Model;
10+
11+
use Magento\Config\Model\Config\Source\Nooptreq;
12+
use Magento\Customer\Helper\Address;
13+
use Magento\Framework\App\Config\MutableScopeConfigInterface;
14+
use Magento\Framework\ObjectManagerInterface;
15+
use Magento\Store\Model\ScopeInterface;
16+
use Magento\TestFramework\Helper\Bootstrap;
17+
use PHPUnit\Framework\TestCase;
18+
19+
/**
20+
* Test for \Magento\Customer\Model\Options.
21+
* @magentoDbIsolation enabled
22+
*/
23+
class OptionsTest extends TestCase
24+
{
25+
private const XML_PATH_SUFFIX_SHOW = 'customer/address/suffix_show';
26+
private const XML_PATH_SUFFIX_OPTIONS = 'customer/address/suffix_options';
27+
private const XML_PATH_PREFIX_SHOW = 'customer/address/prefix_show';
28+
private const XML_PATH_PREFIX_OPTIONS = 'customer/address/prefix_options';
29+
30+
private const STUB_OPTION_PREFIX_NAME = 'prefix';
31+
private const STUB_OPTION_SUFFIX_NAME = 'suffix';
32+
private const STUB_CONFIG_VALUES = 'v1;v2';
33+
private const STUB_CONFIG_VALUES_WITH_BLANK_OPTION = ';v1;v2';
34+
private const STUB_EXPECTED_VALUES_WITH_BLANK_OPTION = [' ' => ' ', 'v1' => 'v1', 'v2' => 'v2'];
35+
private const STUB_EXPECTED_VALUES = ['v1' => 'v1', 'v2' => 'v2'];
36+
37+
/**
38+
* @var Options
39+
*/
40+
private $model;
41+
42+
/**
43+
* @var ObjectManagerInterface
44+
*/
45+
private $objectManager;
46+
47+
/**
48+
* @inheritdoc
49+
*/
50+
protected function setUp(): void
51+
{
52+
$this->objectManager = Bootstrap::getObjectManager();
53+
$this->model = $this->objectManager->create(Options::class);
54+
}
55+
56+
/**
57+
* Test suffix and prefix options
58+
*
59+
* @dataProvider optionsDataProvider
60+
*
61+
* @param string $optionType
62+
* @param array $showOptionConfig
63+
* @param array $optionValuesConfig
64+
* @param array $expectedOptions
65+
* @param int $expectedCount
66+
* @return void
67+
*/
68+
public function testOptions(
69+
string $optionType,
70+
array $showOptionConfig,
71+
array $optionValuesConfig,
72+
array $expectedOptions,
73+
int $expectedCount
74+
): void {
75+
$this->setConfig($showOptionConfig);
76+
$this->setConfig($optionValuesConfig);
77+
78+
/** @var array $options */
79+
$options = $optionType === self::STUB_OPTION_PREFIX_NAME
80+
? $this->model->getNamePrefixOptions()
81+
: $this->model->getNameSuffixOptions();
82+
83+
$this->assertCount($expectedCount, $options);
84+
$this->assertEquals($expectedOptions, $options);
85+
}
86+
87+
/**
88+
* Set config param
89+
*
90+
* @param array $data
91+
* @param string|null $scopeType
92+
* @param string|null $scopeCode
93+
* @return void
94+
*/
95+
private function setConfig(
96+
array $data,
97+
?string $scopeType = ScopeInterface::SCOPE_STORE,
98+
?string $scopeCode = 'default'
99+
): void {
100+
$path = array_key_first($data);
101+
$this->objectManager->get(MutableScopeConfigInterface::class)
102+
->setValue($path, $data[$path], $scopeType, $scopeCode);
103+
}
104+
105+
/**
106+
* DataProvider for testOptions()
107+
*
108+
* @return array
109+
*/
110+
public function optionsDataProvider(): array
111+
{
112+
return [
113+
'prefix_required_with_blank_option' => [
114+
self::STUB_OPTION_PREFIX_NAME,
115+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_REQUIRED],
116+
[self::XML_PATH_PREFIX_OPTIONS => self::STUB_CONFIG_VALUES_WITH_BLANK_OPTION],
117+
self::STUB_EXPECTED_VALUES_WITH_BLANK_OPTION,
118+
3,
119+
],
120+
'prefix_required' => [
121+
self::STUB_OPTION_PREFIX_NAME,
122+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_REQUIRED],
123+
[self::XML_PATH_PREFIX_OPTIONS => self::STUB_CONFIG_VALUES],
124+
self::STUB_EXPECTED_VALUES,
125+
2,
126+
],
127+
'prefix_optional' => [
128+
self::STUB_OPTION_PREFIX_NAME,
129+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
130+
[self::XML_PATH_PREFIX_OPTIONS => self::STUB_CONFIG_VALUES],
131+
self::STUB_EXPECTED_VALUES_WITH_BLANK_OPTION,
132+
3,
133+
],
134+
'suffix_optional' => [
135+
self::STUB_OPTION_SUFFIX_NAME,
136+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
137+
[self::XML_PATH_SUFFIX_OPTIONS => self::STUB_CONFIG_VALUES],
138+
self::STUB_EXPECTED_VALUES_WITH_BLANK_OPTION,
139+
3,
140+
],
141+
'suffix_optional_with_blank_option' => [
142+
self::STUB_OPTION_SUFFIX_NAME,
143+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
144+
[self::XML_PATH_SUFFIX_OPTIONS => self::STUB_CONFIG_VALUES_WITH_BLANK_OPTION],
145+
self::STUB_EXPECTED_VALUES_WITH_BLANK_OPTION,
146+
3,
147+
],
148+
'suffix_required_with_blank_option' => [
149+
self::STUB_OPTION_SUFFIX_NAME,
150+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
151+
[self::XML_PATH_SUFFIX_OPTIONS => self::STUB_CONFIG_VALUES_WITH_BLANK_OPTION],
152+
self::STUB_EXPECTED_VALUES_WITH_BLANK_OPTION,
153+
3,
154+
],
155+
];
156+
}
157+
158+
/**
159+
* @inheritdoc
160+
*/
161+
protected function tearDown(): void
162+
{
163+
$this->objectManager->removeSharedInstance(Address::class);
164+
}
165+
}

0 commit comments

Comments
 (0)