From 2449839962b1ee6a5e6f24e75c358b05942e9892 Mon Sep 17 00:00:00 2001 From: Karyna Tsymbal Date: Wed, 5 Feb 2020 13:13:58 +0200 Subject: [PATCH 1/3] Unit test for \Magento\Captcha\Observer\CheckUserForgotPasswordBackendObserver --- ...kUserForgotPasswordBackendObserverTest.php | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php diff --git a/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php new file mode 100644 index 0000000000000..346814aca2084 --- /dev/null +++ b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php @@ -0,0 +1,188 @@ +helperMock = $this->createMock(DataHelper::class); + $this->captchaStringResolverMock = $this->createMock(CaptchaStringResolver::class); + $this->sessionMock = $this->getMockBuilder(SessionManagerInterface::class) + ->setMethods(['setEmail']) + ->getMockForAbstractClass(); + $this->actionFlagMock = $this->createMock(ActionFlag::class); + $this->messageManagerMock = $this->createMock(ManagerInterface::class); + + $objectManager = new ObjectManagerHelper($this); + $this->observer = $objectManager->getObject( + CheckUserForgotPasswordBackendObserver::class, + [ + '_helper' => $this->helperMock, + 'captchaStringResolver' => $this->captchaStringResolverMock, + '_session' => $this->sessionMock, + '_actionFlag' => $this->actionFlagMock, + 'messageManager' => $this->messageManagerMock + ] + ); + + $this->captchaMock = $this->getMockBuilder(CaptchaInterface::class) + ->setMethods(['isRequired', 'isCorrect']) + ->getMockForAbstractClass(); + $this->helperMock->expects($this->once()) + ->method('getCaptcha') + ->with($formId) + ->willReturn($this->captchaMock); + + $requestMock = $this->createMock(HttpRequest::class); + $requestMock->expects($this->any()) + ->method('getParam') + ->with('email') + ->willReturn($email); + $requestMock->expects($this->any()) + ->method('getParams') + ->willReturn($requestParams); + $this->httpResponseMock = $this->createMock(HttpResponse::class); + + $this->controllerMock = $this->getMockBuilder(Action::class) + ->disableOriginalConstructor() + ->setMethods(['getUrl', 'getRequest', 'getResponse']) + ->getMockForAbstractClass(); + $this->controllerMock->expects($this->any()) + ->method('getRequest') + ->willReturn($requestMock); + $this->controllerMock->expects($this->any()) + ->method('getResponse') + ->willReturn($this->httpResponseMock); + + $this->eventObserverMock = $this->createPartialMock(Observer::class, ['getControllerAction']); + $this->eventObserverMock->expects($this->any()) + ->method('getControllerAction') + ->willReturn($this->controllerMock); + } + + /** + * Test case when Captcha is required and was entered correctly. + */ + public function testExecuteWhenCaptchaIsCorrect() + { + $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(true); + $this->captchaMock->expects($this->once())->method('isCorrect')->willReturn(true); + $this->messageManagerMock->expects($this->never())->method('addErrorMessage'); + $this->httpResponseMock->expects($this->never())->method('setRedirect'); + + $this->observer->execute($this->eventObserverMock); + } + + /** + * Test case when Captcha is required and was entered incorrectly. + */ + public function testExecuteWhenCaptchaIsIncorrect() + { + $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(true); + $this->captchaMock->expects($this->once())->method('isCorrect')->willReturn(false); + + $this->sessionMock->expects($this->once())->method('setEmail'); + $this->actionFlagMock->expects($this->once())->method('set'); + $this->controllerMock->expects($this->once())->method('getUrl'); + $this->messageManagerMock->expects($this->once()) + ->method('addErrorMessage') + ->with(__('Incorrect CAPTCHA')); + $this->httpResponseMock->expects($this->once())->method('setRedirect')->willReturnSelf(); + + $this->observer->execute($this->eventObserverMock); + } + + /** + * Test case when Captcha is not required. + */ + public function testExecuteWhenCaptchaIsNotRequired() + { + $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(false); + $this->messageManagerMock->expects($this->never())->method('addErrorMessage'); + $this->httpResponseMock->expects($this->never())->method('setRedirect'); + + $this->observer->execute($this->eventObserverMock); + } +} From 17990cb1670acc72e92d568aae43c48f5b5e23ee Mon Sep 17 00:00:00 2001 From: Karyna Tsymbal Date: Wed, 5 Feb 2020 14:32:24 +0200 Subject: [PATCH 2/3] Add annotation --- .../Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php index 346814aca2084..892494b4db8df 100644 --- a/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php +++ b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php @@ -25,6 +25,7 @@ /** * Unit Test for \Magento\Captcha\Observer\CheckUserForgotPasswordBackendObserver + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class CheckUserForgotPasswordBackendObserverTest extends TestCase { From 0d17e0af1904c1a8a7ac6aadd6280faa527ef1f8 Mon Sep 17 00:00:00 2001 From: Karyna Tsymbal Date: Wed, 5 Feb 2020 16:19:39 +0200 Subject: [PATCH 3/3] Add a new test case, refactoring --- ...kUserForgotPasswordBackendObserverTest.php | 71 +++++++++++++++---- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php index 892494b4db8df..584e7eb2e215f 100644 --- a/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php +++ b/app/code/Magento/Captcha/Test/Unit/Observer/CheckUserForgotPasswordBackendObserverTest.php @@ -29,6 +29,9 @@ */ class CheckUserForgotPasswordBackendObserverTest extends TestCase { + const STUB_EMAIL = 'stub@test.mail'; + const STUB_REQUEST_PARAMS = ['STUB_PARAM']; + /** * @var MockObject|DataHelper */ @@ -60,7 +63,7 @@ class CheckUserForgotPasswordBackendObserverTest extends TestCase private $observer; /** - * @var MockObject + * @var MockObject|CaptchaInterface */ private $captchaMock; @@ -79,14 +82,17 @@ class CheckUserForgotPasswordBackendObserverTest extends TestCase */ private $httpResponseMock; + /** + * @var MockObject|HttpRequest + */ + private $requestMock; + /** * @inheritDoc */ protected function setUp() { $formId = 'backend_forgotpassword'; - $email = 'stub@test.mail'; - $requestParams = ['STUB_PARAM']; $this->helperMock = $this->createMock(DataHelper::class); $this->captchaStringResolverMock = $this->createMock(CaptchaStringResolver::class); @@ -116,14 +122,7 @@ protected function setUp() ->with($formId) ->willReturn($this->captchaMock); - $requestMock = $this->createMock(HttpRequest::class); - $requestMock->expects($this->any()) - ->method('getParam') - ->with('email') - ->willReturn($email); - $requestMock->expects($this->any()) - ->method('getParams') - ->willReturn($requestParams); + $this->requestMock = $this->createMock(HttpRequest::class); $this->httpResponseMock = $this->createMock(HttpResponse::class); $this->controllerMock = $this->getMockBuilder(Action::class) @@ -132,7 +131,7 @@ protected function setUp() ->getMockForAbstractClass(); $this->controllerMock->expects($this->any()) ->method('getRequest') - ->willReturn($requestMock); + ->willReturn($this->requestMock); $this->controllerMock->expects($this->any()) ->method('getResponse') ->willReturn($this->httpResponseMock); @@ -148,12 +147,11 @@ protected function setUp() */ public function testExecuteWhenCaptchaIsCorrect() { + $this->configureRequestMockWithStubValues(); $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(true); $this->captchaMock->expects($this->once())->method('isCorrect')->willReturn(true); - $this->messageManagerMock->expects($this->never())->method('addErrorMessage'); - $this->httpResponseMock->expects($this->never())->method('setRedirect'); - $this->observer->execute($this->eventObserverMock); + $this->executeOriginalMethodExpectsNoError(); } /** @@ -161,6 +159,7 @@ public function testExecuteWhenCaptchaIsCorrect() */ public function testExecuteWhenCaptchaIsIncorrect() { + $this->configureRequestMockWithStubValues(); $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(true); $this->captchaMock->expects($this->once())->method('isCorrect')->willReturn(false); @@ -180,7 +179,49 @@ public function testExecuteWhenCaptchaIsIncorrect() */ public function testExecuteWhenCaptchaIsNotRequired() { + $this->configureRequestMockWithStubValues(); $this->captchaMock->expects($this->once())->method('isRequired')->willReturn(false); + + $this->executeOriginalMethodExpectsNoError(); + } + + /** + * Test case when email is not provided + */ + public function testExecuteWhenEmailParamIsNotPresent() + { + $this->requestMock->expects($this->any()) + ->method('getParam') + ->with('email') + ->willReturn(null); + $this->requestMock->expects($this->any()) + ->method('getParams') + ->willReturn(self::STUB_REQUEST_PARAMS); + $this->captchaMock->expects($this->never())->method('isRequired'); + $this->captchaMock->expects($this->never())->method('isCorrect'); + + $this->executeOriginalMethodExpectsNoError(); + } + + /** + * Stub params for Request Mock + */ + private function configureRequestMockWithStubValues() + { + $this->requestMock->expects($this->any()) + ->method('getParam') + ->with('email') + ->willReturn(self::STUB_EMAIL); + $this->requestMock->expects($this->any()) + ->method('getParams') + ->willReturn(self::STUB_REQUEST_PARAMS); + } + + /** + * Run original method, expect there is no error + */ + private function executeOriginalMethodExpectsNoError() + { $this->messageManagerMock->expects($this->never())->method('addErrorMessage'); $this->httpResponseMock->expects($this->never())->method('setRedirect');