Skip to content

Commit 71e6a30

Browse files
committed
ACP2E-2595: Custom Customer Attribute Not Saving File type Attribute(Image)
1 parent 92ee679 commit 71e6a30

File tree

2 files changed

+249
-1
lines changed

2 files changed

+249
-1
lines changed

app/code/Magento/Customer/Controller/Account/EditPost.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class EditPost extends AbstractAccount implements CsrfAwareActionInterface, Http
137137
* @param SessionCleanerInterface|null $sessionCleaner
138138
* @param AccountConfirmation|null $accountConfirmation
139139
* @param Url|null $customerUrl
140+
* @param Mapper|null $customerMapper
140141
*/
141142
public function __construct(
142143
Context $context,
@@ -150,7 +151,8 @@ public function __construct(
150151
?Filesystem $filesystem = null,
151152
?SessionCleanerInterface $sessionCleaner = null,
152153
?AccountConfirmation $accountConfirmation = null,
153-
?Url $customerUrl = null
154+
?Url $customerUrl = null,
155+
?Mapper $customerMapper = null
154156
) {
155157
parent::__construct($context);
156158
$this->session = $customerSession;
@@ -165,6 +167,7 @@ public function __construct(
165167
$this->accountConfirmation = $accountConfirmation ?: ObjectManager::getInstance()
166168
->get(AccountConfirmation::class);
167169
$this->customerUrl = $customerUrl ?: ObjectManager::getInstance()->get(Url::class);
170+
$this->customerMapper = $customerMapper ?: ObjectManager::getInstance()->get(Mapper::class);
168171
}
169172

170173
/**
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
<?php
2+
/**
3+
*
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Magento\Customer\Test\Unit\Controller\Account;
10+
11+
use Magento\Customer\Api\SessionCleanerInterface;
12+
use Magento\Customer\Api\AccountManagementInterface;
13+
use Magento\Customer\Api\CustomerRepositoryInterface;
14+
use Magento\Customer\Api\Data\CustomerInterface;
15+
use Magento\Customer\Controller\Account\EditPost;
16+
use Magento\Customer\Model\Metadata\Form\File;
17+
use Magento\Customer\Model\Session;
18+
use Magento\Customer\Model\AddressRegistry;
19+
use Magento\Customer\Model\CustomerExtractor;
20+
use Magento\Customer\Model\AccountConfirmation;
21+
use Magento\Customer\Model\Url;
22+
use Magento\Customer\Model\Customer\Mapper;
23+
use Magento\Framework\Escaper;
24+
use Magento\Framework\Exception\SessionException;
25+
use Magento\Framework\Filesystem;
26+
use Magento\Framework\App\RequestInterface;
27+
use Magento\Framework\App\Action\Context;
28+
use Magento\Framework\Controller\Result\RedirectFactory;
29+
use Magento\Framework\Controller\Result\Redirect;
30+
use Magento\Framework\Data\Form\FormKey\Validator;
31+
use Magento\Framework\Event\ManagerInterface as EventManagerInterface;
32+
use Magento\Framework\Message\ManagerInterface as MessageManagerInterface;
33+
use PHPUnit\Framework\MockObject\MockObject;
34+
use PHPUnit\Framework\TestCase;
35+
36+
class EditPostTest extends TestCase
37+
{
38+
/**
39+
* @var EditPost
40+
*/
41+
private $editPost;
42+
43+
/**
44+
* @var Context|MockObject
45+
*/
46+
private $context;
47+
48+
/**
49+
* @var Session|MockObject
50+
*/
51+
private $customerSession;
52+
53+
/**
54+
* @var AccountManagementInterface|MockObject
55+
*/
56+
private $accountManagement;
57+
58+
/**
59+
* @var CustomerRepositoryInterface|MockObject
60+
*/
61+
private $customerRepository;
62+
63+
/**
64+
* @var Validator|MockObject
65+
*/
66+
private $formKeyValidator;
67+
68+
/**
69+
* @var CustomerExtractor|MockObject
70+
*/
71+
private $customerExtractor;
72+
73+
/**
74+
* @var Escaper|MockObject
75+
*/
76+
private $escaper;
77+
78+
/**
79+
* @var AddressRegistry|MockObject
80+
*/
81+
private $addressRegistry;
82+
83+
/**
84+
* @var Filesystem|MockObject
85+
*/
86+
private $filesystem;
87+
88+
/**
89+
* @var SessionCleanerInterface|MockObject
90+
*/
91+
private $sessionCleaner;
92+
93+
/**
94+
* @var AccountConfirmation|MockObject
95+
*/
96+
private $accountConfirmation;
97+
98+
/**
99+
* @var Url|MockObject
100+
*/
101+
private $customerUrl;
102+
103+
/**
104+
* @var RequestInterface|MockObject
105+
*/
106+
private $request;
107+
108+
/**
109+
* @var Mapper|MockObject
110+
*/
111+
private $customerMapper;
112+
113+
protected function setUp(): void
114+
{
115+
$this->context = $this->getMockBuilder(Context::class)
116+
->disableOriginalConstructor()
117+
->getMock();
118+
$this->customerSession = $this->getMockBuilder(Session::class)
119+
->disableOriginalConstructor()
120+
->getMock();
121+
$this->accountManagement = $this->getMockBuilder(AccountManagementInterface::class)
122+
->getMockForAbstractClass();
123+
$this->customerRepository = $this->getMockBuilder(CustomerRepositoryInterface::class)
124+
->getMockForAbstractClass();
125+
$this->formKeyValidator = $this->getMockBuilder(Validator::class)
126+
->disableOriginalConstructor()
127+
->getMock();
128+
$this->customerExtractor = $this->getMockBuilder(CustomerExtractor::class)
129+
->disableOriginalConstructor()
130+
->getMock();
131+
$this->escaper = $this->getMockBuilder(Escaper::class)
132+
->disableOriginalConstructor()
133+
->getMock();
134+
$this->addressRegistry = $this->getMockBuilder(AddressRegistry::class)
135+
->disableOriginalConstructor()
136+
->getMock();
137+
$this->filesystem = $this->getMockBuilder(Filesystem::class)
138+
->disableOriginalConstructor()
139+
->getMock();
140+
$this->sessionCleaner = $this->getMockBuilder(SessionCleanerInterface::class)
141+
->getMockForAbstractClass();
142+
$this->accountConfirmation = $this->getMockBuilder(AccountConfirmation::class)
143+
->disableOriginalConstructor()
144+
->getMock();
145+
$this->customerUrl = $this->getMockBuilder(Url::class)
146+
->disableOriginalConstructor()
147+
->getMock();
148+
$this->customerMapper = $this->getMockBuilder(Mapper::class)
149+
->disableOriginalConstructor()
150+
->getMock();
151+
152+
$this->request = $this->getMockBuilder(RequestInterface::class)
153+
->addMethods(['isPost', 'getPostValue'])
154+
->getMockForAbstractClass();
155+
$this->context->expects($this->any())
156+
->method('getRequest')
157+
->willReturn($this->request);
158+
$resultRedirectFactory = $this->getMockBuilder(RedirectFactory::class)
159+
->disableOriginalConstructor()
160+
->getMock();
161+
$this->context->expects($this->any())
162+
->method('getResultRedirectFactory')
163+
->willReturn($resultRedirectFactory);
164+
$redirect = $this->getMockBuilder(Redirect::class)
165+
->disableOriginalConstructor()
166+
->getMock();
167+
$resultRedirectFactory->expects($this->any())
168+
->method('create')
169+
->willReturn($redirect);
170+
171+
$eventManager = $this->getMockBuilder(EventManagerInterface::class)
172+
->getMockForAbstractClass();
173+
$this->context->expects($this->any())
174+
->method('getEventManager')
175+
->willReturn($eventManager);
176+
177+
$messageManager = $this->getMockBuilder(MessageManagerInterface::class)
178+
->getMockForAbstractClass();
179+
$this->context->expects($this->any())
180+
->method('getMessageManager')
181+
->willReturn($messageManager);
182+
183+
$this->editPost = new EditPost(
184+
$this->context,
185+
$this->customerSession,
186+
$this->accountManagement,
187+
$this->customerRepository,
188+
$this->formKeyValidator,
189+
$this->customerExtractor,
190+
$this->escaper,
191+
$this->addressRegistry,
192+
$this->filesystem,
193+
$this->sessionCleaner,
194+
$this->accountConfirmation,
195+
$this->customerUrl,
196+
$this->customerMapper
197+
);
198+
}
199+
200+
/**
201+
* @return void
202+
* @throws SessionException
203+
*/
204+
public function testExecute()
205+
{
206+
$this->formKeyValidator->expects($this->once())
207+
->method('validate')
208+
->with($this->request)
209+
->willReturn(true);
210+
$this->request->expects($this->once())
211+
->method('isPost')
212+
->willReturn(true);
213+
214+
$customer = $this->getMockBuilder(CustomerInterface::class)
215+
->getMockForAbstractClass();
216+
$customer->expects($this->any())
217+
->method('getAddresses')
218+
->willReturn([]);
219+
$this->customerRepository->expects($this->any())
220+
->method('getById')
221+
->willReturn($customer);
222+
223+
$this->customerMapper->expects($this->once())
224+
->method('toFlatArray')
225+
->willReturn([]);
226+
$this->customerExtractor->expects($this->once())
227+
->method('extract')
228+
->willReturn($customer);
229+
230+
$attr = 'attr1';
231+
$this->request->expects($this->exactly(5))
232+
->method('getParam')
233+
->withConsecutive(
234+
['change_email'],
235+
[ 'delete_attribute_value'],
236+
[$attr . File::UPLOADED_FILE_SUFFIX]
237+
)->willReturnOnConsecutiveCalls(
238+
false,
239+
$attr,
240+
'uploadedFileName'
241+
);
242+
243+
$this->editPost->execute();
244+
}
245+
}

0 commit comments

Comments
 (0)