Skip to content

Commit 889a941

Browse files
Merge remote-tracking branch 'origin/future-develop' into Arrow_AdobeIMS_091122
2 parents a04c34b + c04d936 commit 889a941

File tree

19 files changed

+1081
-24
lines changed

19 files changed

+1081
-24
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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\AdminAdobeIms\Api;
10+
11+
/**
12+
* Declare functionality for user logout from the Adobe IMS account
13+
*
14+
* @api
15+
*/
16+
interface ImsLogOutInterface
17+
{
18+
/**
19+
* LogOut User from Adobe IMS Account
20+
*
21+
* @param string|null $accessToken
22+
* @return bool
23+
*/
24+
public function execute(?string $accessToken = null) : bool;
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\AdobeImsApi\Api;
9+
10+
use Magento\Framework\Exception\AuthenticationException;
11+
use Magento\Framework\Exception\AuthorizationException;
12+
use Magento\Framework\Exception\InvalidArgumentException;
13+
14+
/**
15+
* Reads token data.
16+
*
17+
* @api
18+
*/
19+
interface TokenReaderInterface
20+
{
21+
/**
22+
* Read data from a token.
23+
*
24+
* @param string $token
25+
* @return array
26+
* @throws AuthenticationException
27+
* @throws AuthorizationException
28+
* @throws InvalidArgumentException
29+
*/
30+
public function read(string $token);
31+
}

AdminAdobeIms/Controller/Adminhtml/OAuth/ImsReauthCallback.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,19 @@ public function execute(): ResultInterface
112112

113113
return $resultRaw;
114114
}
115+
116+
/**
117+
* Validate IMS state is valid
118+
*
119+
* @param RequestInterface $request
120+
* @return void
121+
* @throws NotFoundException
122+
*/
123+
private function validateStateKey(RequestInterface $request): void
124+
{
125+
$request->setParam('form_key', $request->getParam('state', null));
126+
if (!$this->_formKeyValidator->validate($request)) {
127+
throw new NotFoundException(__('Invalid state returned from IMS'));
128+
}
129+
}
115130
}
File renamed without changes.
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\AdminAdobeIms\Test\Unit\Controller\Adminhtml\OAuth;
9+
10+
use Magento\AdminAdobeIms\Controller\Adminhtml\OAuth\ImsCallback;
11+
use Magento\AdminAdobeIms\Logger\AdminAdobeImsLogger;
12+
use Magento\AdminAdobeIms\Model\ImsConnection;
13+
use Magento\AdminAdobeIms\Service\AdminLoginProcessService;
14+
use Magento\AdminAdobeIms\Service\ImsConfig;
15+
use Magento\AdminAdobeIms\Service\ImsOrganizationService;
16+
use Magento\Backend\App\Action\Context;
17+
use Magento\Backend\Helper\Data;
18+
use Magento\Backend\Model\Auth\Session;
19+
use Magento\Framework\App\ActionFlag;
20+
use Magento\Framework\App\Request\Http;
21+
use Magento\Framework\App\RequestInterface;
22+
use Magento\Framework\Data\Form\FormKey\Validator;
23+
use Magento\Framework\Message\Manager;
24+
use Magento\Framework\ObjectManager\ObjectManager;
25+
use Magento\Framework\Validator\Locale;
26+
use PHPUnit\Framework\MockObject\MockObject;
27+
use PHPUnit\Framework\TestCase;
28+
29+
/**
30+
* Unit test for \Magento\AdminAdobeIms\Controller\Adminhtml\OAuth\ImsCallback controller.
31+
*
32+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
33+
*/
34+
class ImsCallbackTest extends TestCase
35+
{
36+
/**
37+
* @var Validator|mixed|MockObject
38+
*/
39+
private mixed $validatorMock;
40+
41+
/**
42+
* @var RequestInterface|mixed|MockObject
43+
*/
44+
private mixed $requestMock;
45+
46+
/**
47+
* @var AdminAdobeImsLogger|mixed|MockObject
48+
*/
49+
private mixed $loggerMock;
50+
51+
/**
52+
* @var Data|mixed|MockObject
53+
*/
54+
private mixed $helperMock;
55+
56+
/**
57+
* @var Manager|mixed|MockObject
58+
*/
59+
private mixed $messagesMock;
60+
61+
/**
62+
* @var mixed|ImsCallback
63+
*/
64+
private mixed $controller;
65+
66+
/**
67+
* @var Session|mixed|MockObject
68+
*/
69+
private mixed $authSessionMock;
70+
71+
/**
72+
* @var ActionFlag|mixed|MockObject
73+
*/
74+
private mixed $actionFlagMock;
75+
76+
/**
77+
* @var Session|mixed|MockObject
78+
*/
79+
private mixed $authMock;
80+
81+
/**
82+
* @var ObjectManager|mixed|MockObject
83+
*/
84+
private mixed $objectManagerMock;
85+
86+
/**
87+
* @var Locale|mixed|MockObject
88+
*/
89+
private mixed $localeMock;
90+
91+
/**
92+
* @var \Magento\Backend\Model\Locale\Manager|mixed|MockObject
93+
*/
94+
private mixed $managerMock;
95+
96+
/**
97+
* @var ImsConnection|mixed|MockObject
98+
*/
99+
private $imsConnectionMock;
100+
101+
/**
102+
* @inheritDoc
103+
*/
104+
protected function setUp(): void
105+
{
106+
$this->objectManagerMock = $this->getMockBuilder(ObjectManager::class)
107+
->disableOriginalConstructor()
108+
->onlyMethods(['get', 'create'])
109+
->getMock();
110+
$this->requestMock = $this->getMockBuilder(Http::class)
111+
->disableOriginalConstructor()
112+
->onlyMethods(['getParam', 'setParam'])
113+
->getMock();
114+
$responseMock = $this->getMockBuilder(\Magento\Framework\App\Response\Http::class)
115+
->disableOriginalConstructor()
116+
->addMethods([])
117+
->getMock();
118+
$this->validatorMock = $this->getMockBuilder(Validator::class)
119+
->disableOriginalConstructor()
120+
->getMock();
121+
$this->loggerMock = $this->getMockBuilder(AdminAdobeImsLogger::class)
122+
->disableOriginalConstructor()
123+
->getMock();
124+
$this->messagesMock = $this->getMockBuilder(Manager::class)
125+
->disableOriginalConstructor()
126+
->onlyMethods(['addComplexErrorMessage'])
127+
->getMockForAbstractClass();
128+
$this->authSessionMock = $this->getMockBuilder(Session::class)
129+
->disableOriginalConstructor()
130+
->addMethods(['setIsUrlNotice', 'getLocale'])
131+
->getMock();
132+
$this->authMock = $this->getMockBuilder(Session::class)
133+
->disableOriginalConstructor()
134+
->getMock();
135+
$this->actionFlagMock = $this->getMockBuilder(ActionFlag::class)
136+
->disableOriginalConstructor()
137+
->getMock();
138+
$this->imsConnectionMock = $this->getMockBuilder(ImsConnection::class)
139+
->disableOriginalConstructor()
140+
->getMock();
141+
$this->localeMock = $this->getMockBuilder(Locale::class)
142+
->disableOriginalConstructor()
143+
->onlyMethods(['isValid'])
144+
->getMock();
145+
$this->managerMock = $this->getMockBuilder(\Magento\Backend\Model\Locale\Manager::class)
146+
->disableOriginalConstructor()
147+
->onlyMethods(['switchBackendInterfaceLocale'])
148+
->getMock();
149+
$this->helperMock = $this->getMockBuilder(Data::class)
150+
->disableOriginalConstructor()
151+
->onlyMethods(['getHomePageUrl', 'getUrl'])
152+
->getMock();
153+
$imsConfigMock = $this->getMockBuilder(ImsConfig::class)
154+
->disableOriginalConstructor()
155+
->getMock();
156+
$imsOrganizationServiceMock = $this->getMockBuilder(ImsOrganizationService::class)
157+
->disableOriginalConstructor()
158+
->getMock();
159+
$loginProcessServiceMock = $this->createMock(AdminLoginProcessService::class);
160+
$contextMock = $this->getMockBuilder(Context::class)
161+
->addMethods(['getFrontController', 'getTranslator'])
162+
->onlyMethods([
163+
'getRequest',
164+
'getFormKeyValidator',
165+
'getMessageManager',
166+
'getHelper',
167+
'getActionFlag',
168+
'getResponse',
169+
'getSession',
170+
'getAuth',
171+
'getObjectManager'
172+
])
173+
->disableOriginalConstructor()
174+
->getMock();
175+
$contextMock->expects($this->once())->method('getObjectManager')->willReturn($this->objectManagerMock);
176+
$contextMock->expects($this->once())->method('getResponse')->willReturn($responseMock);
177+
$contextMock->expects($this->once())->method('getAuth')->willReturn($this->authMock);
178+
$contextMock->expects($this->once())->method('getRequest')->willReturn($this->requestMock);
179+
$contextMock->expects($this->once())->method('getFormKeyValidator')->willReturn($this->validatorMock);
180+
$contextMock->expects($this->once())->method('getActionFlag')->willReturn($this->actionFlagMock);
181+
$contextMock->expects($this->once())->method('getSession')->willReturn($this->authSessionMock);
182+
$contextMock->expects($this->once())->method('getHelper')->willReturn($this->helperMock);
183+
$contextMock->expects($this->once())->method('getMessageManager')->willReturn($this->messagesMock);
184+
185+
$this->controller = new ImsCallback(
186+
$contextMock,
187+
$this->imsConnectionMock,
188+
$imsConfigMock,
189+
$imsOrganizationServiceMock,
190+
$loginProcessServiceMock,
191+
$this->loggerMock,
192+
);
193+
}
194+
195+
/**
196+
* Validate if state exists in ims callback url.
197+
* @return void
198+
*/
199+
public function testStateExistsInImsCallback(): void
200+
{
201+
$this->addMockData();
202+
$this->validatorMock->expects($this->once())->method('validate')
203+
->with($this->requestMock)
204+
->willReturn(true);
205+
$response = $this->controller->dispatch($this->requestMock);
206+
$this->assertEquals(200, $response->getHttpResponseCode());
207+
}
208+
209+
/**
210+
* Validate if state not exists in ims callback url.
211+
* @return void
212+
*/
213+
public function testStateNotExistsInImsCallback(): void
214+
{
215+
$this->addMockData();
216+
$this->validatorMock->expects($this->once())->method('validate')
217+
->with($this->requestMock)
218+
->willReturn(false);
219+
$response = $this->controller->dispatch($this->requestMock);
220+
$this->assertEquals(302, $response->getHttpResponseCode());
221+
}
222+
223+
/**
224+
* Add mock data for tests
225+
* @return void
226+
*/
227+
private function addMockData(): void
228+
{
229+
$this->requestMock->expects($this->any())->method('setParam')
230+
->with('form_key')
231+
->willReturnSelf();
232+
$this->requestMock->expects($this->any())->method('getParam')
233+
->withConsecutive(['state'], ['locale'])
234+
->willReturnOnConsecutiveCalls('abc', 'en');
235+
$this->authSessionMock->expects($this->any())->method('setIsUrlNotice')
236+
->willReturnSelf();
237+
$this->authSessionMock->expects($this->any())->method('getLocale')
238+
->willReturn('en');
239+
$this->actionFlagMock->expects($this->any())->method('get')
240+
->with('', 'check_url_settings')
241+
->willReturn(true);
242+
$this->helperMock->expects($this->any())->method('getHomePageUrl')
243+
->willReturn('https://magento.test/admin');
244+
$this->helperMock->expects($this->any())->method('getUrl')
245+
->willReturn('https://magento.test/admin');
246+
$this->authMock->expects($this->any())->method('isLoggedIn')->willReturn(false);
247+
$this->objectManagerMock
248+
->method('get')
249+
->withConsecutive([Locale::class], [\Magento\Backend\Model\Locale\Manager::class])
250+
->willReturnOnConsecutiveCalls($this->localeMock, $this->managerMock);
251+
}
252+
}

0 commit comments

Comments
 (0)