add Behat tests
This commit is contained in:
parent
88405438e4
commit
87270d8096
16
behat.yml
Normal file
16
behat.yml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
default:
|
||||||
|
context:
|
||||||
|
parameters:
|
||||||
|
base_url: http://localhost:8080/
|
||||||
|
role_map:
|
||||||
|
ender: subscriber
|
||||||
|
starter: editor
|
||||||
|
extensions:
|
||||||
|
Behat\MinkExtension\Extension:
|
||||||
|
base_url: http://localhost:8080/
|
||||||
|
goutte: ~
|
||||||
|
selenium2:
|
||||||
|
wd_host: http://localhost:8910/wd/hub
|
||||||
|
browser_name: phantomjs
|
||||||
|
default_session: selenium2
|
||||||
|
javascript_session: selenium2
|
67
features/bootstrap/FeatureContext.php
Normal file
67
features/bootstrap/FeatureContext.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Behat\Behat\Context\ClosuredContextInterface,
|
||||||
|
Behat\Behat\Context\TranslatedContextInterface,
|
||||||
|
Behat\Behat\Context\BehatContext,
|
||||||
|
Behat\Behat\Context\Step\When,
|
||||||
|
Behat\Behat\Exception\PendingException;
|
||||||
|
use Behat\Gherkin\Node\PyStringNode,
|
||||||
|
Behat\Gherkin\Node\TableNode;
|
||||||
|
|
||||||
|
require "WordPressContext.php";
|
||||||
|
use \WordPress\Mink\Context as WP_Context;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Require 3rd-party libraries here:
|
||||||
|
//
|
||||||
|
// require_once 'PHPUnit/Autoload.php';
|
||||||
|
// require_once 'PHPUnit/Framework/Assert/Functions.php';
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Features context.
|
||||||
|
*/
|
||||||
|
class FeatureContext extends WP_Context\WordPress_Context
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Given /^I am logged in as "([^"]*)" with "([^"]*)"$/
|
||||||
|
*/
|
||||||
|
public function iAmLoggedInAsWith($username, $password) {
|
||||||
|
// Works out of the box (with a base_url of course)
|
||||||
|
// And makes sure the current user is logged out first!
|
||||||
|
$this->login($username, $password);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @When /^I write a post with title "([^"]*)" and content "([^"]*)"$/
|
||||||
|
*/
|
||||||
|
public function iWriteAPostWithTitleAndContent($post_title, $content)
|
||||||
|
{
|
||||||
|
$this->fill_in_post('post', $post_title, 'publish', $content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Given /^the plugin "([^"]*)" is "([^"]*)"$/
|
||||||
|
*/
|
||||||
|
public function thePluginIs($plugin, $state)
|
||||||
|
{
|
||||||
|
if ($state == "active") {
|
||||||
|
$action = "activate";
|
||||||
|
} else {
|
||||||
|
$action = "deactivate";
|
||||||
|
}
|
||||||
|
shell_exec(escapeshellcmd("wp plugin $action $plugin"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @When /^I search for "([^"]*)"$/
|
||||||
|
*/
|
||||||
|
public function iSearchFor($term)
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
new When("I fill in \"s\" with \"$term\""),
|
||||||
|
new When("I press \"searchsubmit\""),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
248
features/bootstrap/WordPressContext.php
Normal file
248
features/bootstrap/WordPressContext.php
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
# copied and adapted from
|
||||||
|
# https://github.com/maartenJacobs/WordPress-Behat-Context/blob/master/WordPressContext.php
|
||||||
|
namespace WordPress\Mink\Context;
|
||||||
|
use Behat\MinkExtension\Context\MinkContext as BehatContext;
|
||||||
|
|
||||||
|
class WordPress_Context extends BehatContext {
|
||||||
|
|
||||||
|
protected $base_url;
|
||||||
|
protected $role_map;
|
||||||
|
protected $session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 $params) {
|
||||||
|
$this->base_url = $params['base_url'];
|
||||||
|
$this->role_map = $params['role_map'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a list of usernames (user_login field), checks for every username
|
||||||
|
* if they exist. Returns a list of the users that do not exist.
|
||||||
|
*
|
||||||
|
* @param array $users
|
||||||
|
* @return array
|
||||||
|
* @author Maarten Jacobs
|
||||||
|
**/
|
||||||
|
protected function check_users_exist(array $users) {
|
||||||
|
$session = $this->getSession();
|
||||||
|
|
||||||
|
// Check if the users exist, saving the inexistent users
|
||||||
|
$inexistent_users = array();
|
||||||
|
$this->visit( 'wp-admin/users.php' );
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
foreach ($users as $username) {
|
||||||
|
if (!$current_page->hasContent($username)) {
|
||||||
|
$inexistent_users[] = $username;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $inexistent_users;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a user for every username given (user_login field).
|
||||||
|
* The inner values can also maps of the following type:
|
||||||
|
* array(
|
||||||
|
* 'username' =>
|
||||||
|
* 'password' => (default: pass)
|
||||||
|
* 'email' => (default: username@test.dev)
|
||||||
|
* 'role' => (default: checks rolemap, or 'subscriber')
|
||||||
|
* )
|
||||||
|
*
|
||||||
|
* @param array $users
|
||||||
|
* @author Maarten Jacobs
|
||||||
|
**/
|
||||||
|
protected function create_users(array $users) {
|
||||||
|
$session = $this->getSession();
|
||||||
|
|
||||||
|
foreach ($users as $username) {
|
||||||
|
if (is_array($username)) {
|
||||||
|
$name = $username['username'];
|
||||||
|
$password = array_key_exists('password', $username) ? $username['password'] : 'pass';
|
||||||
|
$email = array_key_exists('email', $username) ? $username['email'] : str_replace(' ', '_', $name) . '@test.dev';
|
||||||
|
} else {
|
||||||
|
$name = $username;
|
||||||
|
$password = 'pass';
|
||||||
|
$email = str_replace(' ', '_', $name) . '@test.dev';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->visit( 'wp-admin/user-new.php' );
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
|
||||||
|
// Fill in the form
|
||||||
|
$current_page->findField('user_login')->setValue($name);
|
||||||
|
$current_page->findField('email')->setValue($email);
|
||||||
|
$current_page->findField('pass1')->setValue($password);
|
||||||
|
$current_page->findField('pass2')->setValue($password);
|
||||||
|
|
||||||
|
// Set role
|
||||||
|
$role = ucfirst( strtolower( $this->role_map[$name] ) );
|
||||||
|
$current_page->findField('role')->selectOption($role);
|
||||||
|
|
||||||
|
// Submit form
|
||||||
|
$current_page->findButton('Add New User')->click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills in the form of a generic post.
|
||||||
|
* Given the status, will either publish or save as draft.
|
||||||
|
*
|
||||||
|
* @param string $post_type
|
||||||
|
* @param string $post_title
|
||||||
|
* @param string $status Either 'draft' or anything else for 'publish'
|
||||||
|
* @author Maarten Jacobs
|
||||||
|
**/
|
||||||
|
protected function fill_in_post($post_type, $post_title, $status = 'publish', $content = '<p>Testing all the things. All the time.</p>') {
|
||||||
|
// The post type, if not post, will be appended.
|
||||||
|
// Rather than a separate page per type, this is how WP works with forms for separate post types.
|
||||||
|
$uri_suffix = $post_type !== 'post' ? '?post_type=' . $post_type : '';
|
||||||
|
$this->visit( 'wp-admin/post-new.php' . $uri_suffix );
|
||||||
|
$session = $this->session = $this->getSession();
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
|
||||||
|
// Fill in the title
|
||||||
|
$current_page->findField( 'post_title' )->setValue( $post_title );
|
||||||
|
// Fill in some nonsencical data for the body
|
||||||
|
// clickLink and setValue seem to be failing for TinyMCE (same for Cucumber unfortunately)
|
||||||
|
$session->executeScript( 'jQuery( "#content-html" ).click()' );
|
||||||
|
$session->executeScript( 'jQuery( "#content" ).val( "' . $content . '" )' );
|
||||||
|
|
||||||
|
// Click the appropriate button depending on the given status
|
||||||
|
$state_button = 'Save Draft';
|
||||||
|
switch ($status) {
|
||||||
|
case 'draft':
|
||||||
|
// We're good.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'publish':
|
||||||
|
default:
|
||||||
|
// Save as draft first
|
||||||
|
$current_page->findButton($state_button)->click();
|
||||||
|
$state_button = 'Publish';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$current_page->findButton($state_button)->click();
|
||||||
|
// go to view of new post
|
||||||
|
$session->getPage()->clickLink("View $post_type");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes sure the current user is logged out, and then logs in with
|
||||||
|
* the given username and password.
|
||||||
|
*
|
||||||
|
* @param string $username
|
||||||
|
* @param string $password
|
||||||
|
* @author Maarten Jacobs
|
||||||
|
**/
|
||||||
|
protected function login($username, $password = 'pass') {
|
||||||
|
$session = $this->session = $this->getSession();
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
|
||||||
|
// Check if logged in as that user
|
||||||
|
$this->visit( 'wp-admin' );
|
||||||
|
if ($current_page->hasContent( "Howdy, {$username}" )) {
|
||||||
|
// We're already logged in as this user.
|
||||||
|
// Double-check
|
||||||
|
$this->assertPageContainsText('Dashboard');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logout
|
||||||
|
$this->visit( 'wp-login.php?action=logout' );
|
||||||
|
if ($session->getPage()->hasLink('log out')) {
|
||||||
|
$session->getPage()->clickLink('log out');
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// And login
|
||||||
|
$current_page->fillField('user_login', $username);
|
||||||
|
$current_page->fillField('user_pass', $password);
|
||||||
|
$current_page->findButton('wp-submit')->click();
|
||||||
|
|
||||||
|
// Assert that we are on the dashboard
|
||||||
|
$this->assertPageContainsText('Dashboard');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given the current page is post list page, we enter the title in the searchbox
|
||||||
|
* and search for that post.
|
||||||
|
*
|
||||||
|
* @param string $post_title The title of the post as it would appear in the WP backend
|
||||||
|
* @param boolean $do_assert If set to anything but false, will assert for the existence of the post title after the search
|
||||||
|
* @return void
|
||||||
|
* @author Maarten Jacobs
|
||||||
|
**/
|
||||||
|
protected function searchForPost( $post_title, $do_assert = FALSE ) {
|
||||||
|
|
||||||
|
$current_page = $this->getSession()->getPage();
|
||||||
|
|
||||||
|
// Search for the post
|
||||||
|
$search_field = $current_page->findField( 'post-search-input' ); // Searching on #id
|
||||||
|
// When there is no content, then the searchbox is not shown
|
||||||
|
// So we skip search in that case
|
||||||
|
if ($search_field) {
|
||||||
|
$search_field->setValue( $post_title );
|
||||||
|
|
||||||
|
$current_page->findField( 'Search Posts' ) // Searching on value
|
||||||
|
->click();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't stop tests even if the searchbox does not exist.
|
||||||
|
// That would prevent the dev from knowing what the hell's going on.
|
||||||
|
// Can I assert all the things?
|
||||||
|
if ( $do_assert ) {
|
||||||
|
$this->assertPageContainsText($post_title);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Given /^I trash the "([^"]*)" titled "([^"]*)"$/
|
||||||
|
*/
|
||||||
|
public function iTrashThePostTitled( $post_type, $post_title ) {
|
||||||
|
|
||||||
|
$session = $this->session = $this->getSession();
|
||||||
|
|
||||||
|
// Visit the posts page
|
||||||
|
$uri_suffix = $post_type !== 'post' ? '?post_type=' . $post_type : '';
|
||||||
|
$postlist_uri = 'wp-admin/edit.php' . $uri_suffix;
|
||||||
|
$this->visit( $postlist_uri );
|
||||||
|
$current_page = $session->getPage();
|
||||||
|
|
||||||
|
// Check if the post with that title is on the current page
|
||||||
|
if (!$current_page->hasContent( $post_title )) {
|
||||||
|
// If not, search for the post
|
||||||
|
$this->searchForPost( $post_title );
|
||||||
|
}
|
||||||
|
$this->assertPageContainsText($post_title);
|
||||||
|
|
||||||
|
// Select the post in the checkbox column
|
||||||
|
// This is tricky: the checkbox has a non-unique name (of course, that's the way to do it)
|
||||||
|
// So we need to check the box in a different way
|
||||||
|
// The easiest: jQuery
|
||||||
|
$session->executeScript( "jQuery( \"tr:contains('$post_title') :checkbox\" ).click()" );
|
||||||
|
|
||||||
|
// Trash it
|
||||||
|
// - Select the 'Move to Trash' option
|
||||||
|
$current_page->selectFieldOption( 'action', 'Move to Trash' );
|
||||||
|
// - Click to Apply
|
||||||
|
$current_page->findButton( 'doaction' )->click();
|
||||||
|
|
||||||
|
// Check if the post is no longer visible on the posts page
|
||||||
|
$this->visit( $postlist_uri );
|
||||||
|
$this->assertPageNotContainsText( $post_title );
|
||||||
|
// Make a search, because it could be on another page
|
||||||
|
$this->searchForPost( $post_title );
|
||||||
|
$this->assertPageNotContainsText( $post_title );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
21
features/shortcodes.feature
Normal file
21
features/shortcodes.feature
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
Feature: Use Shortcodes
|
||||||
|
In order to use my Plugin
|
||||||
|
As a website author
|
||||||
|
I need to write posts with shortcodes
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given I am logged in as "admin" with "vagrant"
|
||||||
|
|
||||||
|
Scenario: Without the plugin
|
||||||
|
Given the plugin "freifunkmeta" is "inactive"
|
||||||
|
When I write a post with title "test" and content "[ff_contact]"
|
||||||
|
#Then print current URL
|
||||||
|
Then I should see "ff_contact"
|
||||||
|
|
||||||
|
Scenario: With the plugin
|
||||||
|
Given the plugin "freifunkmeta" is "active"
|
||||||
|
When I write a post with title "test" and content "[ff_contact]"
|
||||||
|
#Then print current URL
|
||||||
|
Then I should see "Twitter" in the ".ff_contact" element
|
||||||
|
And I should not see "ff_contact"
|
||||||
|
|
10
features/wp-search.feature
Normal file
10
features/wp-search.feature
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Feature: Search
|
||||||
|
In order to find older articles
|
||||||
|
As a website user
|
||||||
|
I need to be able to search for a word
|
||||||
|
|
||||||
|
Scenario: Searching for a post
|
||||||
|
Given I am on the homepage
|
||||||
|
When I search for "Welcome"
|
||||||
|
Then I should see "Hello world!"
|
||||||
|
And I should see "Welcome to WordPress. This is your first post."
|
Loading…
Reference in a new issue