Skip to content

Commit 71991bf

Browse files
committed
AC-1271: Add rate limiting for payment information endpoint and mutation
1 parent df0282e commit 71991bf

File tree

4 files changed

+171
-5
lines changed

4 files changed

+171
-5
lines changed

app/code/Magento/Authorization/Test/Unit/Model/IdentityProviderTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@
1111
use Magento\Authorization\Model\IdentityProvider;
1212
use Magento\Authorization\Model\UserContextInterface;
1313
use Magento\Framework\App\Backpressure\ContextInterface;
14+
use Magento\Framework\Exception\RuntimeException;
1415
use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
1516
use PHPUnit\Framework\MockObject\MockObject;
1617
use PHPUnit\Framework\TestCase;
1718

19+
/**
20+
* Tests the IdentityProvider class
21+
*/
1822
class IdentityProviderTest extends TestCase
1923
{
2024
/**
@@ -102,4 +106,28 @@ public function testFetchIdentity(
102106
$this->assertEquals($expectedType, $this->model->fetchIdentityType());
103107
$this->assertEquals($expectedIdentity, $this->model->fetchIdentity());
104108
}
109+
110+
/**
111+
* Tests fetching an identity type when user type can't be defined
112+
*/
113+
public function testFetchIdentityTypeUserTypeNotDefined()
114+
{
115+
$this->userContext->method('getUserId')->willReturn(2);
116+
$this->userContext->method('getUserType')->willReturn(null);
117+
$this->expectException(RuntimeException::class);
118+
$this->expectExceptionMessage(__('User type not defined')->getText());
119+
$this->model->fetchIdentityType();
120+
}
121+
122+
/**
123+
* Tests fetching an identity when user address can't be extracted
124+
*/
125+
public function testFetchIdentityFailedToExtractRemoteAddress()
126+
{
127+
$this->userContext->method('getUserId')->willReturn(null);
128+
$this->remoteAddress->method('getRemoteAddress')->willReturn(false);
129+
$this->expectException(RuntimeException::class);
130+
$this->expectExceptionMessage(__('Failed to extract remote address')->getText());
131+
$this->model->fetchIdentity();
132+
}
105133
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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\Checkout\Test\Unit\Model\Backpressure;
9+
10+
use Magento\Checkout\Model\Backpressure\WebapiRequestTypeExtractor;
11+
use Magento\Quote\Model\Backpressure\OrderLimitConfigManager;
12+
use PHPUnit\Framework\MockObject\MockObject;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* Tests the WebapiRequestTypeExtractor class
17+
*/
18+
class WebapiRequestTypeExtractorTest extends TestCase
19+
{
20+
/**
21+
* @var OrderLimitConfigManager|MockObject
22+
*/
23+
private $orderLimitConfigManagerMock;
24+
25+
/**
26+
* @var WebapiRequestTypeExtractor
27+
*/
28+
private WebapiRequestTypeExtractor $webapiRequestTypeExtractor;
29+
30+
/**
31+
* @inheritDoc
32+
*/
33+
protected function setUp(): void
34+
{
35+
$this->orderLimitConfigManagerMock = $this->createMock(OrderLimitConfigManager::class);
36+
37+
$this->webapiRequestTypeExtractor = new WebapiRequestTypeExtractor($this->orderLimitConfigManagerMock);
38+
}
39+
40+
/**
41+
* @param bool $isEnforcementEnabled
42+
* @param string $method
43+
* @param string|null $expected
44+
* @dataProvider dataProvider
45+
*/
46+
public function testExtract(bool $isEnforcementEnabled, string $method, $expected)
47+
{
48+
$this->orderLimitConfigManagerMock->method('isEnforcementEnabled')->willReturn($isEnforcementEnabled);
49+
50+
$this->assertEquals(
51+
$expected,
52+
$this->webapiRequestTypeExtractor->extract('someService', $method, 'someEndpoint')
53+
);
54+
}
55+
56+
/**
57+
* @return array
58+
*/
59+
public function dataProvider(): array
60+
{
61+
return [
62+
[false, 'someMethod', null],
63+
[false, 'savePaymentInformationAndPlaceOrder', null],
64+
[true, 'savePaymentInformationAndPlaceOrder', 'quote-order'],
65+
];
66+
}
67+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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\Quote\Test\Unit\Model\Backpressure;
9+
10+
use Magento\Quote\Model\Backpressure\WebapiRequestTypeExtractor;
11+
use PHPUnit\Framework\MockObject\MockObject;
12+
use Magento\Quote\Model\Backpressure\OrderLimitConfigManager;
13+
use PHPUnit\Framework\TestCase;
14+
use Magento\Quote\Api\CartManagementInterface;
15+
use Magento\Quote\Api\GuestCartManagementInterface;
16+
17+
/**
18+
* Tests the WebapiRequestTypeExtractor class
19+
*/
20+
class WebapiRequestTypeExtractorTest extends TestCase
21+
{
22+
/**
23+
* @var OrderLimitConfigManager|MockObject
24+
*/
25+
private $configManagerMock;
26+
27+
/**
28+
* @var WebapiRequestTypeExtractor
29+
*/
30+
private WebapiRequestTypeExtractor $typeExtractor;
31+
32+
/**
33+
* @inheritDoc
34+
*/
35+
protected function setUp(): void
36+
{
37+
$this->configManagerMock = $this->createMock(OrderLimitConfigManager::class);
38+
$this->typeExtractor = new WebapiRequestTypeExtractor($this->configManagerMock);
39+
}
40+
41+
/**
42+
* Tests CompositeRequestTypeExtractor
43+
*
44+
* @param string $service
45+
* @param string $method
46+
* @param bool $isEnforcementEnabled
47+
* @param mixed $expected
48+
* @dataProvider dataProvider
49+
*/
50+
public function testExtract(string $service, string $method, bool $isEnforcementEnabled, $expected)
51+
{
52+
$this->configManagerMock->method('isEnforcementEnabled')
53+
->willReturn($isEnforcementEnabled);
54+
55+
$this->assertEquals($expected, $this->typeExtractor->extract($service, $method, 'someEndPoint'));
56+
}
57+
58+
/**
59+
* @return array[]
60+
*/
61+
public function dataProvider(): array
62+
{
63+
return [
64+
['wrongService', 'wrongMethod', false, null],
65+
[CartManagementInterface::class, 'wrongMethod', false, null],
66+
[GuestCartManagementInterface::class, 'wrongMethod', false, null],
67+
[GuestCartManagementInterface::class, 'placeOrder', false, null],
68+
[GuestCartManagementInterface::class, 'placeOrder', true, 'quote-order'],
69+
];
70+
}
71+
}

app/code/Magento/Webapi/Controller/Soap/Request/Handler.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ class Handler
110110
* @param DataObjectProcessor $dataObjectProcessor
111111
* @param MethodsMap $methodsMapProcessor
112112
* @param ParamsOverrider|null $paramsOverrider
113+
* @param InputArraySizeLimitValue|null $inputArraySizeLimitValue
113114
* @param BackpressureContextFactory|null $backpressureContextFactory
114115
* @param BackpressureEnforcerInterface|null $backpressureEnforcer
115-
* @param InputArraySizeLimitValue|null $inputArraySizeLimitValue
116116
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
117117
*/
118118
public function __construct(
@@ -125,9 +125,9 @@ public function __construct(
125125
DataObjectProcessor $dataObjectProcessor,
126126
MethodsMap $methodsMapProcessor,
127127
?ParamsOverrider $paramsOverrider = null,
128+
?InputArraySizeLimitValue $inputArraySizeLimitValue = null,
128129
?BackpressureContextFactory $backpressureContextFactory = null,
129-
?BackpressureEnforcerInterface $backpressureEnforcer = null,
130-
?InputArraySizeLimitValue $inputArraySizeLimitValue = null
130+
?BackpressureEnforcerInterface $backpressureEnforcer = null
131131
) {
132132
$this->_request = $request;
133133
$this->_objectManager = $objectManager;
@@ -138,12 +138,12 @@ public function __construct(
138138
$this->_dataObjectProcessor = $dataObjectProcessor;
139139
$this->methodsMapProcessor = $methodsMapProcessor;
140140
$this->paramsOverrider = $paramsOverrider ?? ObjectManager::getInstance()->get(ParamsOverrider::class);
141+
$this->inputArraySizeLimitValue = $inputArraySizeLimitValue
142+
?? ObjectManager::getInstance()->get(InputArraySizeLimitValue::class);
141143
$this->backpressureContextFactory = $backpressureContextFactory
142144
?? ObjectManager::getInstance()->get(BackpressureContextFactory::class);
143145
$this->backpressureEnforcer = $backpressureEnforcer
144146
?? ObjectManager::getInstance()->get(BackpressureEnforcerInterface::class);
145-
$this->inputArraySizeLimitValue = $inputArraySizeLimitValue ?? ObjectManager::getInstance()
146-
->get(InputArraySizeLimitValue::class);
147147
}
148148

149149
/**

0 commit comments

Comments
 (0)