magento2-docker/dev/tests/integration/testsuite/Magento/SalesRule/Model/Coupon/CodeLimitManagerTest.php

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');
}
}