2012-11-09 17:34:24 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace SilverStripe\BehatExtension\Context;
|
|
|
|
|
|
|
|
use Behat\Behat\Context\ClosuredContextInterface,
|
|
|
|
Behat\Behat\Context\TranslatedContextInterface,
|
|
|
|
Behat\Behat\Context\BehatContext,
|
|
|
|
Behat\Behat\Context\Step,
|
|
|
|
Behat\Behat\Exception\PendingException;
|
|
|
|
use Behat\Gherkin\Node\PyStringNode,
|
|
|
|
Behat\Gherkin\Node\TableNode;
|
|
|
|
|
|
|
|
// PHPUnit
|
|
|
|
require_once 'PHPUnit/Autoload.php';
|
|
|
|
require_once 'PHPUnit/Framework/Assert/Functions.php';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* LoginContext
|
|
|
|
*
|
|
|
|
* Context used to define steps related to login and logout functionality
|
|
|
|
*/
|
|
|
|
class LoginContext extends BehatContext
|
|
|
|
{
|
|
|
|
protected $context;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cache for logInWithPermission()
|
|
|
|
*/
|
|
|
|
protected $cache_generatedMembers = array();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes context.
|
|
|
|
* Every scenario gets it's own context object.
|
|
|
|
*
|
|
|
|
* @param array $parameters context parameters (set them up through behat.yml)
|
|
|
|
*/
|
|
|
|
public function __construct(array $parameters)
|
|
|
|
{
|
|
|
|
// Initialize your context here
|
|
|
|
$this->context = $parameters;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get Mink session from MinkContext
|
|
|
|
*/
|
|
|
|
public function getSession($name = null)
|
|
|
|
{
|
|
|
|
return $this->getMainContext()->getSession($name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @Given /^I am logged in$/
|
|
|
|
*/
|
|
|
|
public function stepIAmLoggedIn()
|
|
|
|
{
|
2012-11-14 00:29:20 +01:00
|
|
|
$c = $this->getMainContext();
|
2012-11-15 18:12:21 +01:00
|
|
|
$adminUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getAdminUrl());
|
|
|
|
$loginUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getLoginUrl());
|
2012-11-09 17:34:24 +01:00
|
|
|
|
2012-11-15 18:12:21 +01:00
|
|
|
$this->getSession()->visit($adminUrl);
|
2012-11-09 17:34:24 +01:00
|
|
|
|
2012-11-15 18:12:21 +01:00
|
|
|
if (0 == strpos($this->getSession()->getCurrentUrl(), $loginUrl)) {
|
2012-11-09 17:34:24 +01:00
|
|
|
$this->stepILogInWith('admin', 'password');
|
2012-11-15 18:12:21 +01:00
|
|
|
assertStringStartsWith($adminUrl, $this->getSession()->getCurrentUrl());
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-06-05 13:27:39 +02:00
|
|
|
* Creates a member in a group with the correct permissions.
|
|
|
|
* Example: Given I am logged in with "ADMIN" permissions
|
|
|
|
*
|
2012-11-09 17:34:24 +01:00
|
|
|
* @Given /^I am logged in with "([^"]*)" permissions$/
|
|
|
|
*/
|
|
|
|
function iAmLoggedInWithPermissions($permCode)
|
|
|
|
{
|
|
|
|
if (!isset($this->cache_generatedMembers[$permCode])) {
|
2013-11-28 10:30:45 +01:00
|
|
|
$group = \Group::get()->filter('Title', "$permCode group")->first();
|
|
|
|
if (!$group) {
|
|
|
|
$group = \Injector::inst()->create('Group');
|
|
|
|
}
|
|
|
|
|
2012-11-09 17:34:24 +01:00
|
|
|
$group->Title = "$permCode group";
|
|
|
|
$group->write();
|
|
|
|
|
|
|
|
$permission = \Injector::inst()->create('Permission');
|
|
|
|
$permission->Code = $permCode;
|
|
|
|
$permission->write();
|
|
|
|
$group->Permissions()->add($permission);
|
|
|
|
|
|
|
|
$member = \DataObject::get_one('Member', sprintf('"Email" = \'%s\'', "$permCode@example.org"));
|
|
|
|
if (!$member) {
|
|
|
|
$member = \Injector::inst()->create('Member');
|
|
|
|
}
|
|
|
|
|
2014-04-02 11:07:07 +02:00
|
|
|
// make sure any validation for password is skipped, since we're not testing complexity here
|
|
|
|
$validator = \Member::password_validator();
|
|
|
|
\Member::set_password_validator(null);
|
2012-11-09 17:34:24 +01:00
|
|
|
$member->FirstName = $permCode;
|
|
|
|
$member->Surname = "User";
|
|
|
|
$member->Email = "$permCode@example.org";
|
|
|
|
$member->changePassword('secret');
|
|
|
|
$member->write();
|
|
|
|
$group->Members()->add($member);
|
2014-04-02 11:07:07 +02:00
|
|
|
\Member::set_password_validator($validator);
|
2012-11-09 17:34:24 +01:00
|
|
|
|
|
|
|
$this->cache_generatedMembers[$permCode] = $member;
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Step\Given(sprintf('I log in with "%s" and "%s"', "$permCode@example.org", 'secret'));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @Given /^I am not logged in$/
|
|
|
|
*/
|
|
|
|
public function stepIAmNotLoggedIn()
|
|
|
|
{
|
2013-11-29 00:49:36 +01:00
|
|
|
$c = $this->getMainContext();
|
|
|
|
$this->getSession()->visit($c->joinUrlParts($c->getBaseUrl(), 'Security/logout'));
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|
|
|
|
|
2014-04-07 03:03:40 +02:00
|
|
|
/**
|
2013-06-05 13:27:39 +02:00
|
|
|
* @When /^I log in with "(?<username>[^"]*)" and "(?<password>[^"]*)"$/
|
2012-11-09 17:34:24 +01:00
|
|
|
*/
|
|
|
|
public function stepILogInWith($email, $password)
|
2014-04-07 03:03:40 +02:00
|
|
|
{
|
2012-11-09 17:34:24 +01:00
|
|
|
$page = $this->getSession()->getPage();
|
2014-04-07 03:03:40 +02:00
|
|
|
$forms = $page->findAll('css', 'form[action="Security/LoginForm"]');
|
|
|
|
assertNotNull($forms, 'Login form not found');
|
2014-04-07 08:08:56 +02:00
|
|
|
|
|
|
|
// Try to find visible forms on current page
|
|
|
|
// Allow multiple login forms (e.g. social login) by filering for "Email" field
|
|
|
|
$visibleForm = null;
|
|
|
|
foreach($forms as $form) {
|
|
|
|
if($form->isVisible() && $form->find('css', '[name=Email]')) {
|
|
|
|
$visibleForm = $form;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-07 03:03:40 +02:00
|
|
|
// If no login form, go to /security/login page
|
2014-04-07 08:08:56 +02:00
|
|
|
if(!$visibleForm) {
|
2014-04-07 03:03:40 +02:00
|
|
|
$c = $this->getMainContext();
|
|
|
|
$loginUrl = $c->joinUrlParts($c->getBaseUrl(), $c->getLoginUrl());
|
|
|
|
$this->getSession()->visit($loginUrl);
|
|
|
|
$page = $this->getSession()->getPage();
|
|
|
|
$forms = $page->findAll('css', 'form[action="Security/LoginForm"]');
|
|
|
|
}
|
2014-04-07 08:08:56 +02:00
|
|
|
|
|
|
|
// Try to find visible forms again on login page.
|
|
|
|
$visibleForm = null;
|
2014-04-07 03:03:40 +02:00
|
|
|
foreach($forms as $form) {
|
2014-04-07 08:08:56 +02:00
|
|
|
if($form->isVisible() && $form->find('css', '[name=Email]')) {
|
|
|
|
$visibleForm = $form;
|
|
|
|
}
|
2014-04-07 03:03:40 +02:00
|
|
|
}
|
2014-04-07 08:08:56 +02:00
|
|
|
|
|
|
|
assertNotNull($visibleForm, 'Could not find login form');
|
2014-04-07 03:03:40 +02:00
|
|
|
|
2014-04-07 08:08:56 +02:00
|
|
|
$emailField = $visibleForm->find('css', '[name=Email]');
|
|
|
|
$passwordField = $visibleForm->find('css', '[name=Password]');
|
|
|
|
$submitButton = $visibleForm->find('css', '[type=submit]');
|
|
|
|
|
|
|
|
assertNotNull($emailField, 'Email field on login form not found');
|
|
|
|
assertNotNull($passwordField, 'Password field on login form not found');
|
|
|
|
assertNotNull($submitButton, 'Submit button on login form not found');
|
|
|
|
|
|
|
|
$emailField->setValue($email);
|
|
|
|
$passwordField->setValue($password);
|
|
|
|
$submitButton->press();
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @Given /^I should see a log-in form$/
|
|
|
|
*/
|
|
|
|
public function stepIShouldSeeALogInForm()
|
|
|
|
{
|
|
|
|
$page = $this->getSession()->getPage();
|
2012-11-15 18:12:21 +01:00
|
|
|
$loginForm = $page->find('css', '#MemberLoginForm_LoginForm');
|
|
|
|
assertNotNull($loginForm, 'I should see a log-in form');
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-11-28 10:50:58 +01:00
|
|
|
* @Then /^I will see a "([^"]*)" log-in message$/
|
2012-11-09 17:34:24 +01:00
|
|
|
*/
|
2013-11-28 10:50:58 +01:00
|
|
|
public function stepIWillSeeALogInMessage($type)
|
2012-11-09 17:34:24 +01:00
|
|
|
{
|
|
|
|
$page = $this->getSession()->getPage();
|
2013-11-28 10:50:58 +01:00
|
|
|
$message = $page->find('css', sprintf('.message.%s', $type));
|
|
|
|
assertNotNull($message, sprintf('%s message not found.', $type));
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|
2013-10-22 00:04:04 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @Then /^the password for "([^"]*)" should be "([^"]*)"$/
|
|
|
|
*/
|
|
|
|
public function stepPasswordForEmailShouldBe($id, $password)
|
|
|
|
{
|
|
|
|
$member = \Member::get()->filter('Email', $id)->First();
|
|
|
|
assertNotNull($member);
|
2013-10-22 00:04:04 +02:00
|
|
|
assertTrue($member->checkPassword($password)->valid());
|
2013-10-22 00:04:04 +02:00
|
|
|
}
|
2012-11-09 17:34:24 +01:00
|
|
|
}
|