diff --git a/lib/Form/Renderer.php b/lib/Form/Renderer.php index 56f32a3155..310ac9b2ac 100644 --- a/lib/Form/Renderer.php +++ b/lib/Form/Renderer.php @@ -64,7 +64,7 @@ class Renderer { } private function renderHoneypot(): string { - return ''; + return ''; } private function renderReCaptcha(): string { diff --git a/tests/unit/Form/HtmlParser.php b/tests/unit/Form/HtmlParser.php new file mode 100644 index 0000000000..b3cc09ff70 --- /dev/null +++ b/tests/unit/Form/HtmlParser.php @@ -0,0 +1,12 @@ +loadHTML($html); + $value = (new \DOMXPath($dom))->query($xpath); + return $value ?: new \DOMNodeList(); + } +} diff --git a/tests/unit/Form/RendererTest.php b/tests/unit/Form/RendererTest.php new file mode 100644 index 0000000000..9262058c6a --- /dev/null +++ b/tests/unit/Form/RendererTest.php @@ -0,0 +1,100 @@ +stylesMock = $this->createMock(Styles::class); + $this->settingsMock = $this->createMock(SettingsController::class); + $this->blocksRendererMock = $this->createMock(BlocksRenderer::class); + $this->renderer = new Renderer($this->stylesMock, $this->settingsMock, $this->blocksRendererMock); + $this->htmlParser = new HtmlParser(); + } + + public function testItShouldRenderBlocks() { + $this->blocksRendererMock + ->expects($this->exactly(2)) + ->method('renderBlock') + ->willReturn('
Dummy
'); + $this->settingsMock + ->method('get') + ->with('captcha.type') + ->willReturn(Captcha::TYPE_DISABLED); + $html = $this->renderer->renderBlocks(Fixtures::get('simple_form_body')); + $blocks = $this->htmlParser->findByXpath($html, "//div[@class='block']"); + expect($blocks->count())->equals(2); + } + + public function testItShouldRenderHoneypot() { + $this->blocksRendererMock->method('renderBlock')->willReturn('
Dummy
'); + $this->settingsMock + ->method('get') + ->with('captcha.type') + ->willReturn(Captcha::TYPE_DISABLED); + $html = $this->renderer->renderBlocks(Fixtures::get('simple_form_body')); + $hpLabel = $this->htmlParser->findByXpath($html, "//label[@class='mailpoet_hp_email_label']"); + expect($hpLabel->count())->equals(1); + $hpInput = $this->htmlParser->findByXpath($html, "//input[@type='email']"); + expect($hpInput->count())->equals(1); + } + + public function testItShouldRenderReCaptcha() { + $token = '123456'; + $this->blocksRendererMock->method('renderBlock')->willReturn('
Dummy
'); + $this->settingsMock + ->method('get') + ->will($this->returnValueMap([ + ['captcha.type', null, Captcha::TYPE_RECAPTCHA], + ['captcha.recaptcha_site_token', null, $token], + ])); + $html = $this->renderer->renderBlocks(Fixtures::get('simple_form_body')); + $recaptcha = $this->htmlParser->findByXpath($html, "//div[@class='mailpoet_recaptcha']"); + expect($recaptcha->count())->equals(1); + $recaptchaIframes = $this->htmlParser->findByXpath($html, "//iframe"); + expect($recaptchaIframes->count())->equals(1); + $iframe = $recaptchaIframes->item(0); + assert($iframe instanceof \DOMNode); + $source = $iframe->attributes->getNamedItem('src'); + assert($source instanceof \DOMAttr); + expect($source->value)->equals("https://www.google.com/recaptcha/api/fallback?k=$token"); + } + + public function testItShouldNotRenderHoneypotAndRecaptcha() { + $this->blocksRendererMock->method('renderBlock')->willReturn('
Dummy
'); + $this->settingsMock + ->method('get') + ->with('captcha.type') + ->willReturn(Captcha::TYPE_DISABLED); + $html = $this->renderer->renderBlocks(Fixtures::get('simple_form_body'), false); + $hpLabel = $this->htmlParser->findByXpath($html, "//label[@class='mailpoet_hp_email_label']"); + expect($hpLabel->count())->equals(0); + $recaptcha = $this->htmlParser->findByXpath($html, "//div[@class='mailpoet_recaptcha']"); + expect($recaptcha->count())->equals(0); + } +} diff --git a/tests/unit/_fixtures.php b/tests/unit/_fixtures.php index 93123cd509..65029bc706 100644 --- a/tests/unit/_fixtures.php +++ b/tests/unit/_fixtures.php @@ -48,6 +48,36 @@ Fixtures::add( ] ); +Fixtures::add( + 'simple_form_body', + [ + [ + 'id' => 'email', + 'name' => 'Email', + 'position' => '1', + 'type' => 'text', + 'unique' => '0', + 'static' => '1', + 'params' => [ + 'label' => 'Email', + 'label_within' => '1', + 'required' => '1', + ], + ], + [ + 'id' => 'submit', + 'name' => 'Submit', + 'position' => '2', + 'type' => 'submit', + 'unique' => '0', + 'static' => '1', + 'params' => [ + 'label' => 'Subscribe!', + ], + ], + ] +); + Fixtures::add( 'form_body_template', [