228 lines
7.6 KiB
PHP
Executable File
228 lines
7.6 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\SalesRule\Model\Coupon;
|
|
|
|
use Magento\Framework\App\Request\Http;
|
|
use Magento\Framework\App\RequestInterface;
|
|
use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
|
|
use Magento\SalesRule\Api\Exception\CodeRequestLimitException;
|
|
use Magento\TestFramework\ObjectManager;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\Customer\Model\Session as CustomerSession;
|
|
|
|
/**
|
|
* Test for captcha based implementation.
|
|
*
|
|
* @magentoAppArea frontend
|
|
*/
|
|
class CodeLimitManagerTest extends TestCase
|
|
{
|
|
/**
|
|
* @var CodeLimitManager
|
|
*/
|
|
private $manager;
|
|
|
|
/**
|
|
* @var CustomerSession
|
|
*/
|
|
private $customerSession;
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
/** @var ObjectManager $objectManager */
|
|
$objectManager = Bootstrap::getObjectManager();
|
|
$this->manager = $objectManager->get(CodeLimitManager::class);
|
|
$this->customerSession = $objectManager->get(CustomerSession::class);
|
|
/** @var Http $request */
|
|
$request = $objectManager->get(RequestInterface::class);
|
|
$request->getServer()->set('REMOTE_ADDR', '127.0.0.1');
|
|
$objectManager->removeSharedInstance(RemoteAddress::class);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function tearDown(): void
|
|
{
|
|
$this->customerSession->logout();
|
|
$this->customerSession->clearStorage();
|
|
}
|
|
|
|
/**
|
|
* Log in customer by ID.
|
|
*
|
|
* @param int $id
|
|
* @return void
|
|
*/
|
|
private function loginCustomer(int $id): void
|
|
{
|
|
if (!$this->customerSession->loginById($id)) {
|
|
throw new \RuntimeException('Failed to log in customer');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
*/
|
|
public function testCounterDisabled()
|
|
{
|
|
$this->manager->checkRequest('fakeCode1');
|
|
$this->loginCustomer(1);
|
|
$this->manager->checkRequest('fakeCode2');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 3
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 5
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*/
|
|
public function testUnderLimit()
|
|
{
|
|
$this->manager->checkRequest('fakeCode3');
|
|
$this->manager->checkRequest('fakeCode4');
|
|
|
|
$this->loginCustomer(1);
|
|
$this->manager->checkRequest('fakeCode5');
|
|
$this->manager->checkRequest('fakeCode6');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 10
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 2
|
|
*
|
|
*/
|
|
public function testAboveLimitNotLoggedIn()
|
|
{
|
|
$this->expectException(\Magento\SalesRule\Api\Exception\CodeRequestLimitException::class);
|
|
|
|
try {
|
|
$this->manager->checkRequest('fakeCode7');
|
|
$this->manager->checkRequest('fakeCode8');
|
|
} catch (CodeRequestLimitException $exception) {
|
|
$this->fail('Attempt denied before reaching the limit');
|
|
}
|
|
$this->manager->checkRequest('fakeCode9');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 2
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 10
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*
|
|
*/
|
|
public function testAboveLimitLoggedIn()
|
|
{
|
|
$this->expectException(\Magento\SalesRule\Api\Exception\CodeRequestLimitException::class);
|
|
|
|
try {
|
|
$this->loginCustomer(1);
|
|
$this->manager->checkRequest('fakeCode10');
|
|
$this->manager->checkRequest('fakeCode11');
|
|
} catch (CodeRequestLimitException $exception) {
|
|
$this->fail('Attempt denied before reaching the limit');
|
|
}
|
|
$this->manager->checkRequest('fakeCode12');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 10
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 10
|
|
* @magentoConfigFixture default_store customer/captcha/mode always
|
|
*
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*
|
|
*/
|
|
public function testCustomerNotAllowedWithoutCode()
|
|
{
|
|
$this->expectException(\Magento\SalesRule\Api\Exception\CodeRequestLimitException::class);
|
|
|
|
$this->loginCustomer(1);
|
|
$this->manager->checkRequest('fakeCode13');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 10
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 10
|
|
* @magentoConfigFixture default_store customer/captcha/mode always
|
|
*
|
|
*/
|
|
public function testGuestNotAllowedWithoutCode()
|
|
{
|
|
$this->expectException(\Magento\SalesRule\Api\Exception\CodeRequestLimitException::class);
|
|
|
|
$this->manager->checkRequest('fakeCode14');
|
|
}
|
|
|
|
/**
|
|
* @magentoDbIsolation enabled
|
|
* @magentoAppIsolation enabled
|
|
*
|
|
* @magentoConfigFixture default_store customer/captcha/enable 1
|
|
* @magentoConfigFixture default_store customer/captcha/forms sales_rule_coupon_request
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_login 2
|
|
* @magentoConfigFixture default_store customer/captcha/failed_attempts_ip 10
|
|
*
|
|
* @magentoDataFixture Magento/SalesRule/_files/rules.php
|
|
* @magentoDataFixture Magento/SalesRule/_files/coupons.php
|
|
* @magentoDataFixture Magento/Customer/_files/customer.php
|
|
*
|
|
*/
|
|
public function testLoggingOnlyInvalidCodes()
|
|
{
|
|
$this->expectException(\Magento\SalesRule\Api\Exception\CodeRequestLimitException::class);
|
|
|
|
try {
|
|
$this->loginCustomer(1);
|
|
$this->manager->checkRequest('coupon_code');
|
|
$this->manager->checkRequest('coupon_code');
|
|
$this->manager->checkRequest('fakeCode15');
|
|
$this->manager->checkRequest('fakeCode16');
|
|
} catch (CodeRequestLimitException $exception) {
|
|
$this->fail('Attempts are logged for existing codes');
|
|
}
|
|
$this->manager->checkRequest('fakeCode17');
|
|
}
|
|
}
|