Skip to content

Commit

Permalink
Merge pull request #85 from jakzal/feature/subclass-inline-element
Browse files Browse the repository at this point in the history
Finish support for extending InlineElements
  • Loading branch information
jakzal authored May 22, 2017
2 parents 3348a58 + f6cb17f commit bd2a342
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 8 deletions.
3 changes: 2 additions & 1 deletion features/providing_a_custom_page_object_factory.feature
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,11 @@ Feature: Providing a custom page object factory
/**
* @param array|string $selector
* @param null|string $name
*
* @return InlineElement
*/
public function createInlineElement($selector)
public function createInlineElement($selector, $name = null)
{
return new InlineElement($selector, $this->mink->getSession(), $this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
use Behat\Mink\Selector\SelectorsHandler;
use Behat\Mink\Session;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use SensioLabs\Behat\PageObjectExtension\PageObject\Factory\ClassNameResolver;

require_once __DIR__.'/Fixtures/ArticleList.php';
require_once __DIR__.'/Fixtures/Element/SearchBox.php';
require_once __DIR__.'/Fixtures/Element/InlineSearchBox.php';

class DefaultFactorySpec extends ObjectBehavior
{
Expand All @@ -23,6 +25,7 @@ function let(Mink $mink, Session $session, SelectorsHandler $selectorsHandler, C
$session->getSelectorsHandler()->willReturn($selectorsHandler);
$session->getDriver()->willReturn($driver);
$selectorsHandler->selectorToXpath('xpath', '//div[@id="search"]')->willReturn('//div[@id="search"]');
$selectorsHandler->selectorToXpath('xpath', '//div[@id="inline-search"]')->willReturn('//div[@id="inline-search"]');
}

function it_is_a_page_object_factory()
Expand All @@ -44,13 +47,32 @@ function it_should_create_an_element(ClassNameResolver $classNameResolver)
$this->createElement('Search box')->shouldBeAnInstanceOf('SearchBox');
}

function it_should_create_an_inline_element()
function it_should_create_an_inline_element(ClassNameResolver $classNameResolver)
{
$classNameResolver->resolveElement('SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement')
->willReturn('SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement');

$element = $this->createInlineElement(array('xpath' => '//div[@id="search"]'));
$element->shouldBeAnInstanceOf('SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement');
$element->getXPath()->shouldReturn('//div[@id="search"]');
}

function it_create_inline_element_should_throw_an_exception_with_non_inline_element_class(ClassNameResolver $classNameResolver)
{
$classNameResolver->resolveElement(Argument::any())->willReturn('ArticleList');

$this->shouldThrow('InvalidArgumentException')->duringCreateInlineElement(array('xpath' => '//div[@id="search"]'), 'ArticleList');
}

function it_should_create_a_named_inline_element(ClassNameResolver $classNameResolver)
{
$classNameResolver->resolveElement('Inline Search Box')->willReturn('InlineSearchBox');

$element = $this->createInlineElement(array('xpath' => '//div[@id="inline-search"]'), 'Inline Search Box');
$element->shouldBeAnInstanceOf('InlineSearchBox');
$element->getXPath()->shouldReturn('//div[@id="inline-search"]');
}

function it_creates_a_page()
{
$this->create('ArticleList')->shouldBeAnInstanceOf('ArticleList');
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

use SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement;

class InlineSearchBox extends InlineElement
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ public function createPage($name);
public function createElement($name);

/**
* @param string|array
* @param string|array $selector
* @param null|string $name
*
* @return InlineElement
*/
public function createInlineElement($selector);
public function createInlineElement($selector, $name = null);

/**
* @param string $pageObjectClass
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,19 @@ public function createElement($name)

/**
* @param array|string $selector
* @param null|string $name
*
* @return InlineElement
*/
public function createInlineElement($selector)
public function createInlineElement($selector, $name = null)
{
return new InlineElement($selector, $this->mink->getSession(), $this);
$elementClass = $this->classNameResolver->resolveElement($name ? $name : 'SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement');

if ('SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement' !== $elementClass && !is_subclass_of($elementClass, 'SensioLabs\Behat\PageObjectExtension\PageObject\InlineElement')) {
throw new \InvalidArgumentException(sprintf('Not a page object class: %s', ''));
}

return new $elementClass($selector, $this->mink->getSession(), $this);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,12 @@ public function createElement($name)
}

/**
* @param string|array
* @param string|array $selector
* @param null|string $name
*
* @return InlineElement
*/
public function createInlineElement($selector)
public function createInlineElement($selector, $name = null)
{
return $this->decoratedFactory->createInlineElement($selector);
}
Expand Down

0 comments on commit bd2a342

Please sign in to comment.