Skip to content

Commit 1e265e9

Browse files
authored
ENGCOM-7825: Prefix dropdown in checkout doesn't select empty value by default if required #28238
2 parents 3e0aa39 + 61a12b0 commit 1e265e9

File tree

2 files changed

+169
-4
lines changed

2 files changed

+169
-4
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,15 @@ 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-
$result[$value] = $value;
104+
$result[] = $this->escaper->escapeHtml(trim($value)) ?: ' ';
105105
}
106+
106107
if ($isOptional && trim(current($options))) {
107-
$result = array_merge([' ' => ' '], $result);
108+
$result = array_merge([' '], $result);
108109
}
109110

110111
return $result;
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
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+
/**
31+
* @var Options
32+
*/
33+
private $model;
34+
35+
/**
36+
* @var ObjectManagerInterface
37+
*/
38+
private $objectManager;
39+
40+
/**
41+
* @inheritdoc
42+
*/
43+
protected function setUp(): void
44+
{
45+
$this->objectManager = Bootstrap::getObjectManager();
46+
$this->model = $this->objectManager->create(Options::class);
47+
}
48+
49+
/**
50+
* Test suffix and prefix options
51+
*
52+
* @dataProvider optionsDataProvider
53+
*
54+
* @param string $optionType
55+
* @param array $showOptionConfig
56+
* @param array $optionValuesConfig
57+
* @param array $expectedOptions
58+
* @return void
59+
*/
60+
public function testOptions(
61+
string $optionType,
62+
array $showOptionConfig,
63+
array $optionValuesConfig,
64+
array $expectedOptions
65+
): void {
66+
$this->setConfig($showOptionConfig);
67+
$this->setConfig($optionValuesConfig);
68+
69+
/** @var array $options */
70+
$options = $optionType === 'prefix'
71+
? $this->model->getNamePrefixOptions()
72+
: $this->model->getNameSuffixOptions();
73+
74+
$this->assertEquals($expectedOptions, $options);
75+
}
76+
77+
/**
78+
* Set config param
79+
*
80+
* @param array $data
81+
* @param string|null $scopeType
82+
* @param string|null $scopeCode
83+
* @return void
84+
*/
85+
private function setConfig(
86+
array $data,
87+
?string $scopeType = ScopeInterface::SCOPE_STORE,
88+
?string $scopeCode = 'default'
89+
): void {
90+
$path = array_key_first($data);
91+
$this->objectManager->get(MutableScopeConfigInterface::class)
92+
->setValue($path, $data[$path], $scopeType, $scopeCode);
93+
}
94+
95+
/**
96+
* DataProvider for testOptions()
97+
*
98+
* @return array
99+
*/
100+
public function optionsDataProvider(): array
101+
{
102+
$optionPrefixName = 'prefix';
103+
$optionSuffixName = 'suffix';
104+
$optionValues = 'v1;v2';
105+
$expectedValues = ['v1', 'v2'];
106+
$optionValuesWithBlank = ';v1;v2';
107+
$expectedValuesWithBlank = [' ', 'v1', 'v2'];
108+
$optionValuesWithTwoBlank = ';v1;v2;';
109+
$expectedValuesTwoBlank = [' ', 'v1', 'v2', ' '];
110+
111+
return [
112+
'prefix_required_with_blank_option' => [
113+
$optionPrefixName,
114+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_REQUIRED],
115+
[self::XML_PATH_PREFIX_OPTIONS => $optionValuesWithBlank],
116+
$expectedValuesWithBlank,
117+
],
118+
'prefix_required' => [
119+
$optionPrefixName,
120+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_REQUIRED],
121+
[self::XML_PATH_PREFIX_OPTIONS => $optionValues],
122+
$expectedValues,
123+
],
124+
'prefix_required_with_two_blank_option' => [
125+
$optionPrefixName,
126+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_REQUIRED],
127+
[self::XML_PATH_PREFIX_OPTIONS => $optionValuesWithTwoBlank],
128+
$expectedValuesTwoBlank,
129+
],
130+
'prefix_optional' => [
131+
$optionPrefixName,
132+
[self::XML_PATH_PREFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
133+
[self::XML_PATH_PREFIX_OPTIONS => $optionValues],
134+
$expectedValuesWithBlank,
135+
],
136+
'suffix_optional' => [
137+
$optionSuffixName,
138+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
139+
[self::XML_PATH_SUFFIX_OPTIONS => $optionValues],
140+
$expectedValuesWithBlank,
141+
],
142+
'suffix_optional_with_blank_option' => [
143+
$optionSuffixName,
144+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
145+
[self::XML_PATH_SUFFIX_OPTIONS => $optionValuesWithBlank],
146+
$expectedValuesWithBlank,
147+
],
148+
'suffix_required_with_blank_option' => [
149+
$optionSuffixName,
150+
[self::XML_PATH_SUFFIX_SHOW => Nooptreq::VALUE_OPTIONAL],
151+
[self::XML_PATH_SUFFIX_OPTIONS => $optionValuesWithBlank],
152+
$expectedValuesWithBlank,
153+
],
154+
];
155+
}
156+
157+
/**
158+
* @inheritdoc
159+
*/
160+
protected function tearDown(): void
161+
{
162+
$this->objectManager->removeSharedInstance(Address::class);
163+
}
164+
}

0 commit comments

Comments
 (0)