| Current Path : /home/rtorresani/www/vendor/magento/module-re-captcha-review/Test/Integration/ |
| Current File : //home/rtorresani/www/vendor/magento/module-re-captcha-review/Test/Integration/ReviewFormTest.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\ReCaptchaReview\Test\Integration;
use Magento\Framework\App\Request\Http;
use Magento\Framework\App\Response\RedirectInterface;
use Magento\Framework\Data\Form\FormKey;
use Magento\Framework\Message\MessageInterface;
use Magento\Framework\Validation\ValidationResult;
use Magento\ReCaptchaUi\Model\CaptchaResponseResolverInterface;
use Magento\ReCaptchaValidation\Model\Validator;
use Magento\Review\Model\ResourceModel\Review as ReviewResourceModel;
use Magento\Store\Model\ScopeInterface;
use Magento\TestFramework\App\MutableScopeConfig;
use Magento\TestFramework\TestCase\AbstractController;
use PHPUnit\Framework\MockObject\MockObject;
/**
* @magentoDataFixture Magento/Catalog/_files/product_simple.php
* @magentoAppArea frontend
* @magentoAppIsolation enabled
*/
class ReviewFormTest extends AbstractController
{
/**
* @var MutableScopeConfig
*/
private $mutableScopeConfig;
/**
* @var FormKey
*/
private $formKey;
/**
* @var
*/
private $reviewResourceModel;
/**
* @var ValidationResult|MockObject
*/
private $captchaValidationResultMock;
/**
* @inheritDoc
*/
protected function setUp(): void
{
parent::setUp();
$this->mutableScopeConfig = $this->_objectManager->get(MutableScopeConfig::class);
$this->formKey = $this->_objectManager->get(FormKey::class);
$this->reviewResourceModel = $this->_objectManager->get(ReviewResourceModel::class);
$this->captchaValidationResultMock = $this->createMock(ValidationResult::class);
$captchaValidatorMock = $this->createMock(Validator::class);
$captchaValidatorMock->expects($this->any())
->method('isValid')
->willReturn($this->captchaValidationResultMock);
$this->_objectManager->addSharedInstance($captchaValidatorMock, Validator::class);
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture default_store recaptcha_frontend/type_for/product_review invisible
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
*/
public function testGetRequestIfReCaptchaIsDisabled(): void
{
$this->setConfig(false, 'test_public_key', 'test_private_key');
$this->checkSuccessfulGetResponse();
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*
* It's needed for proper work of "ifconfig" in layout during tests running
* @magentoConfigFixture default_store recaptcha_frontend/type_for/product_review invisible
*/
public function testGetRequestIfReCaptchaKeysAreNotConfigured(): void
{
$this->setConfig(true, null, null);
$this->checkSuccessfulGetResponse();
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*
* It's needed for proper work of "ifconfig" in layout during tests running
* @magentoConfigFixture default_store recaptcha_frontend/type_for/product_review invisible
*/
public function testGetRequestIfReCaptchaIsEnabled(): void
{
$this->setConfig(true, 'test_public_key', 'test_private_key');
$this->checkSuccessfulGetResponse(true);
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
*/
public function testPostRequestIfReCaptchaIsDisabled(): void
{
$this->setConfig(false, 'test_public_key', 'test_private_key');
$this->checkSuccessfulPostResponse();
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*/
public function testPostRequestIfReCaptchaKeysAreNotConfigured(): void
{
$this->setConfig(true, null, null);
$this->checkSuccessfulPostResponse();
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*/
public function testPostRequestWithSuccessfulReCaptchaValidation(): void
{
$this->setConfig(true, 'test_public_key', 'test_private_key');
$this->captchaValidationResultMock->expects($this->once())->method('isValid')->willReturn(true);
$this->checkSuccessfulPostResponse(
[CaptchaResponseResolverInterface::PARAM_RECAPTCHA => 'test']
);
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*/
public function testPostRequestIfReCaptchaParameterIsMissed(): void
{
$this->setConfig(true, 'test_public_key', 'test_private_key');
$this->checkFailedPostResponse();
}
/**
* @magentoConfigFixture default_store customer/captcha/enable 0
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/public_key test_public_key
* @magentoConfigFixture base_website recaptcha_frontend/type_invisible/private_key test_private_key
* @magentoConfigFixture base_website recaptcha_frontend/type_for/product_review invisible
*/
public function testPostRequestWithFailedReCaptchaValidation(): void
{
$this->setConfig(true, 'test_public_key', 'test_private_key');
$this->captchaValidationResultMock->expects($this->once())->method('isValid')->willReturn(false);
$this->checkFailedPostResponse(
[CaptchaResponseResolverInterface::PARAM_RECAPTCHA => 'test']
);
}
/**
* @param bool $shouldContainReCaptcha
* @return void
*/
private function checkSuccessfulGetResponse($shouldContainReCaptcha = false): void
{
$this->dispatch('/simple-product.html');
$content = $this->getResponse()->getBody();
self::assertNotEmpty($content);
$shouldContainReCaptcha
? self::assertStringContainsString('field-recaptcha', $content)
: self::assertStringNotContainsString('field-recaptcha', $content);
self::assertEmpty($this->getSessionMessages(MessageInterface::TYPE_ERROR));
}
/**
* @param array $postValues
* @return void
*/
private function checkSuccessfulPostResponse(array $postValues = []): void
{
$this->makePostRequest($postValues);
$this->assertSessionMessages(
self::containsEqual(
'You submitted your review for moderation.'
),
MessageInterface::TYPE_SUCCESS
);
self::assertEmpty($this->getSessionMessages(MessageInterface::TYPE_ERROR));
self::assertEquals(1, $this->reviewResourceModel->getTotalReviews(1));
}
/**
* @param array $postValues
* @return void
*/
private function checkFailedPostResponse(array $postValues = []): void
{
$this->makePostRequest($postValues);
$this->assertSessionMessages(
self::equalTo(['Something went wrong with reCAPTCHA. Please contact the store owner.']),
MessageInterface::TYPE_ERROR
);
self::assertEquals(0, $this->reviewResourceModel->getTotalReviews(1));
}
/**
* @param array $postValues
* @return void
*/
private function makePostRequest(array $postValues = []): void
{
$expectedRedirectUrl = 'http://localhost/index.php/simple-product.html';
$this->getRequest()
->setMethod(Http::METHOD_POST)
->setParam(RedirectInterface::PARAM_NAME_REFERER_URL, $expectedRedirectUrl)
->setPostValue(array_replace_recursive(
[
'form_key' => $this->formKey->getFormKey(),
'nickname' => 'review_author',
'title' => 'review_title',
'detail' => 'review_detail',
],
$postValues
));
$this->dispatch('review/product/post/id/1');
$this->assertRedirect(self::equalTo($expectedRedirectUrl));
}
/**
* @param bool $isEnabled
* @param string|null $public
* @param string|null $private
* @return void
*/
private function setConfig(bool $isEnabled, ?string $public, ?string $private): void
{
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_for/product_review',
$isEnabled ? 'invisible' : null,
ScopeInterface::SCOPE_WEBSITE
);
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_invisible/public_key',
$public,
ScopeInterface::SCOPE_WEBSITE
);
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_invisible/private_key',
$private,
ScopeInterface::SCOPE_WEBSITE
);
}
protected function tearDown(): void
{
parent::tearDown();
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_for/product_review',
null,
ScopeInterface::SCOPE_WEBSITE
);
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_invisible/public_key',
null,
ScopeInterface::SCOPE_WEBSITE
);
$this->mutableScopeConfig->setValue(
'recaptcha_frontend/type_invisible/private_key',
null,
ScopeInterface::SCOPE_WEBSITE
);
$this->reviewResourceModel->deleteReviewsByProductId(1);
}
}