Skip to content

Commit 9d9b105

Browse files
committed
ACP2E-3415: remember me added missing functionality for authentication popup and sign ins from checkout
1 parent 88660e7 commit 9d9b105

File tree

15 files changed

+770
-6
lines changed

15 files changed

+770
-6
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe.
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Persistent\Block\Header;
9+
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Framework\Serialize\Serializer\JsonHexTag;
12+
use Magento\Framework\Serialize\SerializerInterface;
13+
use Magento\Framework\View\Element\Template;
14+
use Magento\Framework\View\Element\Template\Context;
15+
use Magento\Persistent\Model\CheckoutConfigProvider;
16+
17+
class RememberMeInit extends Template
18+
{
19+
/**
20+
* @param Context $context
21+
* @param array $data
22+
* @param SerializerInterface|null $serializer
23+
* @param CheckoutConfigProvider|null $checkoutConfigProvider
24+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
25+
*/
26+
public function __construct(
27+
Context $context,
28+
array $data = [],
29+
private ?SerializerInterface $serializer = null,
30+
private ?CheckoutConfigProvider $checkoutConfigProvider = null
31+
) {
32+
parent::__construct($context, $data);
33+
$this->serializer = $serializer ?: ObjectManager::getInstance()
34+
->get(JsonHexTag::class);
35+
$this->checkoutConfigProvider = $checkoutConfigProvider ?: ObjectManager::getInstance()
36+
->get(CheckoutConfigProvider::class);
37+
}
38+
39+
/**
40+
* Retrieve serialized config.
41+
*
42+
* @return string|bool
43+
*/
44+
private function getSerializedCheckoutConfig(): string|bool
45+
{
46+
return $this->serializer->serialize($this->checkoutConfigProvider->getConfig());
47+
}
48+
49+
/**
50+
* @inheritDoc
51+
*/
52+
public function toHtml()
53+
{
54+
$html = parent::toHtml();
55+
$serializedConfig = $this->getSerializedCheckoutConfig();
56+
$jsString = '<script type="text/x-magento-init">{"*":
57+
{"Magento_Persistent/js/remember-me-config": {
58+
"config": ' . $serializedConfig . '
59+
}}}</script>';
60+
61+
$html .= $jsString;
62+
return $html;
63+
}
64+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Persistent\Observer;
9+
10+
use Magento\Customer\Model\Session;
11+
use Magento\Framework\Event\Observer;
12+
use Magento\Framework\Event\ObserverInterface;
13+
use Magento\Persistent\Helper\Data;
14+
15+
/**
16+
* Observer to add layout handle for persistent remember me init
17+
*
18+
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
19+
*/
20+
class AddPersistentRememberMeInitObserver implements ObserverInterface
21+
{
22+
23+
/**
24+
* @param Data $persistentData
25+
* @param Session $customerSession
26+
*/
27+
public function __construct(
28+
private Data $persistentData,
29+
private Session $customerSession,
30+
) {
31+
}
32+
33+
/**
34+
* Apply persistent remember me init config to layout on certain conditions
35+
*
36+
* @param Observer $observer
37+
* @return $this
38+
*/
39+
public function execute(Observer $observer): static
40+
{
41+
if ($this->customerSession->isLoggedIn()
42+
|| !$this->persistentData->isEnabled()
43+
|| !$this->persistentData->isRememberMeEnabled()
44+
) {
45+
return $this;
46+
}
47+
48+
/** @var \Magento\Framework\View\Layout $layout */
49+
$layout = $observer->getEvent()->getData('layout');
50+
$layout->getUpdate()->addHandle('remember_me');
51+
return $this;
52+
}
53+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Persistent\Plugin;
9+
10+
use Magento\Framework\View\Layout;
11+
use Magento\Persistent\Block\Header\RememberMeInit;
12+
use Magento\Persistent\Helper\Data;
13+
use Magento\Customer\Model\Session;
14+
15+
/**
16+
* Plugin to add layout handle and block for persistent remember me init
17+
*
18+
* @SuppressWarnings(PHPMD.CookieAndSessionMisuse)
19+
*/
20+
class AddPersistentRememberMeInitPlugin
21+
{
22+
/**
23+
* @param Data $persistentData
24+
* @param Session $customerSession
25+
*/
26+
public function __construct(
27+
private readonly Data $persistentData,
28+
private readonly Session $customerSession
29+
) {
30+
}
31+
32+
/**
33+
* Add the RememberMeInit block to the layout.
34+
*
35+
* @param Layout $subject
36+
* @param callable $proceed
37+
* @return void
38+
*/
39+
public function aroundGenerateElements(Layout $subject, callable $proceed)
40+
{
41+
$proceed();
42+
43+
if (!$this->customerSession->isLoggedIn()
44+
&& $this->persistentData->isEnabled()
45+
&& $this->persistentData->isRememberMeEnabled()
46+
) {
47+
if ($subject->getBlock('head.additional') &&
48+
!$subject->getBlock('persistent_initial_configs')) {
49+
$subject->addBlock(
50+
RememberMeInit::class,
51+
'persistent_initial_configs'
52+
);
53+
$subject->addOutputElement('persistent_initial_configs');
54+
}
55+
}
56+
}
57+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe.
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Persistent\Test\Unit\Block\Header;
9+
10+
use Magento\Framework\App\Config\ScopeConfigInterface;
11+
use Magento\Framework\Event\ManagerInterface;
12+
use Magento\Framework\Serialize\SerializerInterface;
13+
use Magento\Framework\View\Element\Template\Context;
14+
use Magento\Persistent\Block\Header\RememberMeInit;
15+
use Magento\Persistent\Model\CheckoutConfigProvider;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
use PHPUnit\Framework\TestCase;
18+
19+
class RememberMeInitTest extends TestCase
20+
{
21+
/**
22+
* @var Context|MockObject
23+
*/
24+
private $context;
25+
26+
/**
27+
* @var SerializerInterface|MockObject
28+
*/
29+
private $serializer;
30+
31+
/**
32+
* @var CheckoutConfigProvider|MockObject
33+
*/
34+
private $checkoutConfigProvider;
35+
36+
/**
37+
* @var RememberMeInit
38+
*/
39+
private $rememberMeInit;
40+
41+
protected function setUp(): void
42+
{
43+
$this->context = $this->createMock(Context::class);
44+
$eventManager = $this->createMock(ManagerInterface::class);
45+
$scopeConfig = $this->createMock(ScopeConfigInterface::class);
46+
$this->serializer = $this->createMock(SerializerInterface::class);
47+
$this->checkoutConfigProvider = $this->createMock(CheckoutConfigProvider::class);
48+
49+
$this->context->method('getEventManager')->willReturn($eventManager);
50+
$this->context->method('getScopeConfig')->willReturn($scopeConfig);
51+
52+
$this->rememberMeInit = new RememberMeInit(
53+
$this->context,
54+
[],
55+
$this->serializer,
56+
$this->checkoutConfigProvider
57+
);
58+
}
59+
public function testToHtml()
60+
{
61+
$config = ['key' => 'value'];
62+
$serializedConfig = json_encode($config);
63+
64+
$this->checkoutConfigProvider->method('getConfig')->willReturn($config);
65+
$this->serializer->method('serialize')->with($config)->willReturn($serializedConfig);
66+
67+
$expectedHtml = '<script type="text/x-magento-init">{"*":
68+
{"Magento_Persistent/js/remember-me-config": {
69+
"config": ' . $serializedConfig . '
70+
}}}</script>';
71+
$this->assertEquals($expectedHtml, $this->rememberMeInit->toHtml());
72+
}
73+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
/**
3+
* Copyright 2024 Adobe.
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Persistent\Test\Unit\Observer;
9+
10+
use Magento\Customer\Model\Session;
11+
use Magento\Framework\DataObject;
12+
use Magento\Framework\Event\Observer;
13+
use Magento\Framework\View\Layout;
14+
use Magento\Framework\View\Layout\ProcessorInterface;
15+
use Magento\Persistent\Helper\Data;
16+
use Magento\Persistent\Observer\AddPersistentRememberMeInitObserver;
17+
use PHPUnit\Framework\MockObject\MockObject;
18+
use PHPUnit\Framework\TestCase;
19+
20+
class AddPersistentRememberMeInitObserverTest extends TestCase
21+
{
22+
23+
/**
24+
* @var Data|MockObject
25+
*/
26+
private $persistentData;
27+
28+
/**
29+
* @var Session|MockObject
30+
*/
31+
private $customerSession;
32+
33+
/**
34+
* @var Layout|MockObject
35+
*/
36+
private $layout;
37+
38+
/**
39+
* @var Observer|MockObject
40+
*/
41+
private $eventObserver;
42+
43+
/**
44+
* @var AddPersistentRememberMeInitObserver
45+
*/
46+
private $observer;
47+
48+
protected function setUp(): void
49+
{
50+
$this->persistentData = $this->createMock(Data::class);
51+
$this->customerSession = $this->createMock(Session::class);
52+
$this->layout = $this->createMock(Layout::class);
53+
$this->eventObserver = $this->createMock(Observer::class);
54+
55+
$this->observer = new AddPersistentRememberMeInitObserver(
56+
$this->persistentData,
57+
$this->customerSession
58+
);
59+
}
60+
61+
public function testExecuteAddsHandle()
62+
{
63+
$this->customerSession->method('isLoggedIn')->willReturn(false);
64+
$this->persistentData->method('isEnabled')->willReturn(true);
65+
$this->persistentData->method('isRememberMeEnabled')->willReturn(true);
66+
$processor = $this->createMock(ProcessorInterface::class);
67+
$processor->expects($this->once())
68+
->method('addHandle')
69+
->with('remember_me');
70+
$data = $this->createMock(DataObject::class);
71+
72+
$data->method('getData')
73+
->with('layout')
74+
->willReturn($this->layout);
75+
76+
$this->eventObserver
77+
->method('getEvent')
78+
->willReturn($data);
79+
$this->layout->expects($this->once())
80+
->method('getUpdate')
81+
->willReturn($processor);
82+
83+
$this->observer->execute($this->eventObserver);
84+
}
85+
86+
public function testExecuteDoesNotAddHandleWhenLoggedIn()
87+
{
88+
$this->customerSession->method('isLoggedIn')->willReturn(true);
89+
90+
$this->layout->expects($this->never())
91+
->method('getUpdate');
92+
93+
$this->observer->execute($this->eventObserver);
94+
}
95+
96+
public function testExecuteDoesNotAddHandleWhenPersistentDisabled()
97+
{
98+
$this->customerSession->method('isLoggedIn')->willReturn(false);
99+
$this->persistentData->method('isEnabled')->willReturn(false);
100+
101+
$this->layout->expects($this->never())
102+
->method('getUpdate');
103+
104+
$this->observer->execute($this->eventObserver);
105+
}
106+
107+
public function testExecuteDoesNotAddHandleWhenRememberMeDisabled()
108+
{
109+
$this->customerSession->method('isLoggedIn')->willReturn(false);
110+
$this->persistentData->method('isEnabled')->willReturn(true);
111+
$this->persistentData->method('isRememberMeEnabled')->willReturn(false);
112+
113+
$this->layout->expects($this->never())
114+
->method('getUpdate');
115+
116+
$this->observer->execute($this->eventObserver);
117+
}
118+
}

0 commit comments

Comments
 (0)