cucumber-wordpress 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +8 -3
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/examples/features/step_definitions/webrat_steps.rb +1 -6
- data/examples/features/support/config.yml +1 -0
- data/examples/features/support/env.rb +1 -0
- data/examples/features/wordpress.feature +3 -3
- data/lib/cucumber-wordpress.rb +36 -30
- data/lib/cucumber-wordpress/path_to.rb +38 -0
- data/lib/cucumber-wordpress/steps.rb +17 -92
- data/lib/cucumber-wordpress/steps/given.rb +135 -0
- data/lib/cucumber-wordpress/steps/should.rb +32 -0
- data/lib/cucumber-wordpress/webrat-patches.rb +84 -0
- metadata +45 -16
data/README.rdoc
CHANGED
@@ -7,13 +7,18 @@ Environment setup and step definitions for testing WordPress with Cucumber.
|
|
7
7
|
Install the gem:
|
8
8
|
gem install cucumber-wordpress --source http://gemcutter.org
|
9
9
|
|
10
|
-
Copy the examples/features/ directory into an existing WordPress installation
|
11
|
-
|
10
|
+
Copy the examples/features/ directory into an existing WordPress installation
|
11
|
+
(or plugin/theme):
|
12
|
+
cd wordpress-plugin
|
12
13
|
cp -R /usr/lib/ruby/gems/1.8/gems/cucumber-wordpress-1.0/examples/features .
|
13
14
|
|
14
15
|
Configure wp-config variables:
|
15
16
|
vim features/support/config.yml
|
16
17
|
|
18
|
+
ABSPATH should be WordPress' ABSPATH constant (the directory where
|
19
|
+
wp-config.php is) relative to the directory you'd run cucumber in (where
|
20
|
+
features/ is).
|
21
|
+
|
17
22
|
Run cucumber:
|
18
23
|
cucumber
|
19
24
|
|
@@ -35,4 +40,4 @@ Run cucumber:
|
|
35
40
|
|
36
41
|
== Copyright
|
37
42
|
|
38
|
-
Copyright © 2009 The Dextrous Web. See LICENCE for details.
|
43
|
+
Copyright © 2009-2010 The Dextrous Web. See LICENCE for details.
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
@@ -146,12 +146,7 @@ Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
|
|
146
146
|
end
|
147
147
|
|
148
148
|
Then /^I should be on (.+)$/ do |page_name|
|
149
|
-
|
150
|
-
if uri.query.blank?
|
151
|
-
uri.path.should == path_to(page_name)
|
152
|
-
else
|
153
|
-
"#{uri.path}?#{uri.query}".should include(path_to(page_name))
|
154
|
-
end
|
149
|
+
current_url.to_s.should include(path_to(page_name).to_s)
|
155
150
|
end
|
156
151
|
|
157
152
|
Then /^show me the page$/ do
|
@@ -1,5 +1,5 @@
|
|
1
1
|
Feature: WordPress example
|
2
|
-
WordPress should be as easy to test as Rails
|
2
|
+
WordPress should be as easy to test as Rails
|
3
3
|
|
4
4
|
Background:
|
5
5
|
Given WordPress is installed
|
@@ -10,9 +10,9 @@ Feature: WordPress example
|
|
10
10
|
When I follow "Add New" within "#menu-posts"
|
11
11
|
Then I should see "Add New Post"
|
12
12
|
When I fill in "title" with "hullo thar"
|
13
|
-
And I fill in "content" with "
|
13
|
+
And I fill in "content" with "We all love WordPress."
|
14
14
|
And I press "publish"
|
15
15
|
Then there should be 1 post
|
16
16
|
Given I am on homepage
|
17
17
|
Then I should see "hullo thar"
|
18
|
-
And I should see "
|
18
|
+
And I should see "We all love WordPress."
|
data/lib/cucumber-wordpress.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
require 'singleton'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'uri'
|
2
4
|
require 'mysql'
|
3
5
|
Mysql::Result.send(:include, Enumerable)
|
4
6
|
|
5
7
|
class WordPress
|
8
|
+
require 'cucumber-wordpress/path_to'
|
6
9
|
include Singleton
|
7
10
|
|
8
|
-
def self.method_missing(method, *args)
|
9
|
-
self.instance.send(method, *args)
|
11
|
+
def self.method_missing(method, *args, &block)
|
12
|
+
self.instance.send(method, *args, &block)
|
10
13
|
end
|
11
14
|
|
12
15
|
attr_accessor :config, :passwords, :original_contents, :tables
|
@@ -41,7 +44,7 @@ class WordPress
|
|
41
44
|
end
|
42
45
|
|
43
46
|
def create_db
|
44
|
-
mysql.query("create database #{@DB_NAME} character set = #{@DB_CHARSET}#{@DB_COLLATE.
|
47
|
+
mysql.query("create database #{@DB_NAME} character set = #{@DB_CHARSET}#{@DB_COLLATE.empty? ? '' : " collate = #{@DB_COLLATE}"}")
|
45
48
|
mysql.query("use #{@DB_NAME}")
|
46
49
|
end
|
47
50
|
|
@@ -54,6 +57,9 @@ class WordPress
|
|
54
57
|
@has_config = File.exist? File.join(@ABSPATH,'wp-config.php')
|
55
58
|
FileUtils.cp File.join(@ABSPATH,'wp-config.php'), File.join(@ABSPATH,'.wp-config.php') if @has_config
|
56
59
|
|
60
|
+
extra_config = ''
|
61
|
+
yield extra_config if block_given?
|
62
|
+
|
57
63
|
# Write our own
|
58
64
|
open(File.join(@ABSPATH,'wp-config.php'),'w+') do |f|
|
59
65
|
f.write <<HERE
|
@@ -67,6 +73,7 @@ define('DB_CHARSET', '#{@DB_CHARSET}');
|
|
67
73
|
define('DB_COLLATE', '#{@DB_COLLATE}');
|
68
74
|
$table_prefix = '#{@TABLE_PREFIX}';
|
69
75
|
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
|
76
|
+
#{extra_config}
|
70
77
|
require_once(ABSPATH . 'wp-settings.php');
|
71
78
|
HERE
|
72
79
|
end
|
@@ -87,35 +94,34 @@ HERE
|
|
87
94
|
end
|
88
95
|
end
|
89
96
|
|
90
|
-
def
|
91
|
-
|
92
|
-
when /^homepage$/
|
93
|
-
'/'
|
94
|
-
when /^login page$/
|
95
|
-
'/wp-login.php'
|
96
|
-
when /^admin dashboard$/
|
97
|
-
'/wp-admin/'
|
98
|
-
when /^new post$/
|
99
|
-
'/wp-admin/post-new.php'
|
100
|
-
when /^media library$/
|
101
|
-
"/wp-admin/upload.php"
|
102
|
-
when /^manage themes$/
|
103
|
-
'/wp-admin/themes.php'
|
104
|
-
when /^new page$/
|
105
|
-
'/wp-admin/page-new.php'
|
106
|
-
when /^(post|page) "(.+?)"$/
|
107
|
-
id = WordPress.mysql.query(%Q'SELECT ID FROM #{WordPress.TABLE_PREFIX}posts WHERE post_title="#{$2}"').fetch_row.first.to_i
|
108
|
-
WordPress.php("echo get_permalink(#{id})")
|
109
|
-
when /^edit (post|page) "(.+?)"$/
|
110
|
-
id = WordPress.mysql.query(%Q'SELECT ID FROM #{WordPress.TABLE_PREFIX}posts WHERE post_title="#{$2}"').fetch_row.first.to_i
|
111
|
-
"/wp-admin/#{$1}.php?action=edit&post=#{id}"
|
112
|
-
else
|
113
|
-
return nil
|
114
|
-
end
|
115
|
-
URI::join("http://#{@WEBHOST}/", partial)
|
97
|
+
def get_post_id(title)
|
98
|
+
WordPress.mysql.query(%Q'SELECT ID FROM #{WordPress.TABLE_PREFIX}posts WHERE post_title="#{title}"').fetch_row.first.to_i
|
116
99
|
end
|
117
100
|
|
118
101
|
def php code
|
119
|
-
`php -r 'include "#{WordPress.ABSPATH}/wp-load.php"; #{code};' 2>/dev/null`
|
102
|
+
`php -r '$_SERVER["SERVER_SOFTWARE"]=""; $_SERVER["REQUEST_URI"]="/"; include "#{WordPress.ABSPATH}/wp-load.php"; #{code};' 2>/dev/null`
|
103
|
+
end
|
104
|
+
|
105
|
+
def version
|
106
|
+
return @version if @version
|
107
|
+
@version = php 'global $wp_version; echo $wp_version;'
|
108
|
+
@version.match(/^(\d+)\.(\d+)(:?\.(\d+))?$/)
|
109
|
+
@major = $1.to_i
|
110
|
+
@minor = $2.to_i
|
111
|
+
@patch = $3.to_i
|
112
|
+
@version
|
113
|
+
end
|
114
|
+
|
115
|
+
def major
|
116
|
+
version
|
117
|
+
@major
|
118
|
+
end
|
119
|
+
def minor
|
120
|
+
version
|
121
|
+
@minor
|
122
|
+
end
|
123
|
+
def patch
|
124
|
+
version
|
125
|
+
@patch
|
120
126
|
end
|
121
127
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class WordPress
|
2
|
+
def path_to(page_name)
|
3
|
+
partial = case page_name
|
4
|
+
when /^homepage$/
|
5
|
+
'/'
|
6
|
+
when /^login page$/
|
7
|
+
'/wp-login.php'
|
8
|
+
when /^admin dashboard$/
|
9
|
+
'/wp-admin/'
|
10
|
+
when /^new post$/
|
11
|
+
'/wp-admin/post-new.php'
|
12
|
+
when /^media library$/
|
13
|
+
"/wp-admin/upload.php"
|
14
|
+
when /^manage themes$/
|
15
|
+
'/wp-admin/themes.php'
|
16
|
+
when /^plugins$/
|
17
|
+
'/wp-admin/plugins.php'
|
18
|
+
when /^new user$/
|
19
|
+
'/wp-admin/user-new.php'
|
20
|
+
when /^new page$/
|
21
|
+
case major
|
22
|
+
when 2
|
23
|
+
'/wp-admin/page-new.php'
|
24
|
+
when 3
|
25
|
+
'/wp-admin/post-new.php?post_type=page'
|
26
|
+
else
|
27
|
+
raise
|
28
|
+
end
|
29
|
+
when /^(post|page) "(.+?)"$/
|
30
|
+
WordPress.php("echo get_permalink(#{get_post_id($2)})")
|
31
|
+
when /^edit (post|page) "(.+?)"$/
|
32
|
+
"/wp-admin/#{$1}.php?action=edit&post=#{get_post_id($2)}"
|
33
|
+
else
|
34
|
+
return nil
|
35
|
+
end
|
36
|
+
URI::join("http://#{@WEBHOST}/", partial).to_s
|
37
|
+
end
|
38
|
+
end
|
@@ -1,101 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
title = 'A Very Boring Test Title'
|
4
|
-
if response.include? '<title>WordPress › Installation</title>'
|
5
|
-
fill_in('Blog Title', :with => title)
|
6
|
-
fill_in('Your E-mail', :with => 'test@example.org')
|
7
|
-
click_button('Install WordPress')
|
8
|
-
WordPress.passwords = {'admin' => response.match(%r[<td><code>(.+)</code><br />])[1]}
|
9
|
-
end
|
10
|
-
visit path_to 'login page'
|
11
|
-
response.should include "<title>#{title} › Log In</title>"
|
12
|
-
|
13
|
-
# Take this so we can reset the DB before each scenario
|
14
|
-
WordPress.original_contents = {}
|
15
|
-
WordPress.tables.each do |table|
|
16
|
-
WordPress.original_contents[table] = WordPress.mysql.query("select * from #{table}").map{|row|row}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Given /^I am logged in as "([^\"]*)"$/ do |user|
|
21
|
-
visit path_to 'login page'
|
22
|
-
fill_in('Username', :with => user)
|
23
|
-
fill_in('Password', :with => WordPress.passwords[user])
|
24
|
-
click_button('Log In')
|
25
|
-
end
|
26
|
-
|
27
|
-
Given /^I am not logged in$/ do
|
28
|
-
visit path_to 'admin dashboard'
|
29
|
-
click_link('Log Out')
|
30
|
-
end
|
31
|
-
|
32
|
-
Given /^theme "([^\"]*)" is enabled$/ do |theme|
|
33
|
-
Given 'I am logged in as "admin"'
|
34
|
-
Given 'I am on manage themes'
|
35
|
-
click_link_within %Q&//a[contains(@title,"#{theme}")]/..&, 'Activate'
|
1
|
+
def see? content
|
2
|
+
see_within? '.', content
|
36
3
|
end
|
37
4
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
link = %Q&//a[contains(@href,"#{plugin}")]&
|
43
|
-
if dom.xpath("#{link}/child::text()").any?{|t|t.to_s == 'Activate'}
|
44
|
-
if able == 'enabled'
|
45
|
-
click_link_within("#{link}/..",'Activate')
|
5
|
+
def see_within? selector, content
|
6
|
+
within(selector) do |item|
|
7
|
+
if item.nil?
|
8
|
+
has_content? content
|
46
9
|
else
|
47
|
-
|
10
|
+
item.dom.to_s.include? content
|
48
11
|
end
|
49
12
|
end
|
50
13
|
end
|
51
14
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
fill_in 'metakeyinput', :with => key
|
61
|
-
fill_in 'metavalue', :with => value
|
62
|
-
click_button 'Update'
|
63
|
-
end
|
64
|
-
|
65
|
-
Given /^the page "([^\"]*)" has template "([^\"]*)"$/ do |title,template|
|
66
|
-
visit path_to %Q%edit page "#{title}"%
|
67
|
-
select template, :from => 'Page Template'
|
68
|
-
click_button 'Update'
|
69
|
-
end
|
70
|
-
|
71
|
-
Given /^permalinks are set as "([^\"]*)"$/ do |structure|
|
72
|
-
visit '/wp-admin/options-permalink.php'
|
73
|
-
fill_in 'permalink_structure', :with => structure
|
74
|
-
click_button 'Save Changes'
|
75
|
-
end
|
76
|
-
|
77
|
-
Given /^option "([^\"]*)" is set to "(.*)"$/ do |option, value|
|
78
|
-
WordPress.mysql.query(%Q'DELETE FROM #{WordPress.TABLE_PREFIX}options WHERE option_name="#{Mysql.escape_string option}"')
|
79
|
-
WordPress.mysql.query(%Q'INSERT INTO #{WordPress.TABLE_PREFIX}options SET option_name="#{Mysql.escape_string option}", option_value="#{Mysql.escape_string value}"')
|
80
|
-
end
|
81
|
-
|
82
|
-
Then /^there should be (\d+) posts?$/ do |count|
|
83
|
-
WordPress.mysql.query("select count(*) from #{WordPress.TABLE_PREFIX}posts where ID != 1 and post_type = 'post' and post_status != 'trash'").fetch_row.first.to_i.should == count.to_i
|
84
|
-
end
|
85
|
-
|
86
|
-
Then /^there should be (\d+) categories?$/ do |count|
|
87
|
-
# Two initial categories, which we won't count: Uncategorized and Blogroll
|
88
|
-
WordPress.mysql.query("select count(*) from #{WordPress.TABLE_PREFIX}terms where term_id > 2").fetch_row.first.to_i.should == count.to_i
|
89
|
-
end
|
90
|
-
|
91
|
-
Then /^there should be a category called "([^\"]*)"$/ do |category|
|
92
|
-
WordPress.mysql.query("select count(*) > 0 from #{WordPress.TABLE_PREFIX}terms where name = '#{Mysql.escape_string(category)}' or slug = '#{Mysql.escape_string(category)}'").fetch_row.first.to_i.should == 1
|
93
|
-
end
|
94
|
-
|
95
|
-
Then /^there should be a post called "([^\"]*)"$/ do |post|
|
96
|
-
WordPress.mysql.query("select count(*) > 0 from #{WordPress.TABLE_PREFIX}posts where post_title = '#{Mysql.escape_string(post)}' or post_name = '#{Mysql.escape_string(post)}'").fetch_row.first.to_i.should == 1
|
15
|
+
def should_see_within selector, content
|
16
|
+
within(selector) do |item|
|
17
|
+
if item.nil?
|
18
|
+
page.should have_content content
|
19
|
+
else
|
20
|
+
item.dom.to_s.should include content
|
21
|
+
end
|
22
|
+
end
|
97
23
|
end
|
98
24
|
|
99
|
-
|
100
|
-
|
101
|
-
end
|
25
|
+
require 'cucumber-wordpress/steps/given'
|
26
|
+
require 'cucumber-wordpress/steps/should'
|
@@ -0,0 +1,135 @@
|
|
1
|
+
Given /^WordPress is installed$/ do
|
2
|
+
visit path_to 'homepage'
|
3
|
+
title = 'A Very Boring Test Title'
|
4
|
+
|
5
|
+
username = 'admin'
|
6
|
+
password = 'password'
|
7
|
+
|
8
|
+
if see_within?('//title', 'WordPress › Installation')
|
9
|
+
if see? 'Blog Title'
|
10
|
+
# WordPress 2
|
11
|
+
fill_in('Blog Title', :with => title)
|
12
|
+
fill_in('Your E-mail', :with => 'test@example.org')
|
13
|
+
uncheck('blog_public')
|
14
|
+
click_button('Install WordPress')
|
15
|
+
|
16
|
+
xpath = '/html/body/table/tr/th[text()="%s"]/../td/code/text()'
|
17
|
+
password = response.root.xpath(xpath % 'Password').to_s
|
18
|
+
|
19
|
+
|
20
|
+
elsif see? 'Site Title'
|
21
|
+
# WordPress 3
|
22
|
+
fill_in('Site Title', :with => title)
|
23
|
+
|
24
|
+
fill_in('user_name', :with => username)
|
25
|
+
# webrat puts values into blank fields, so set these manually
|
26
|
+
fill_in('admin_password', :with => password)
|
27
|
+
fill_in('admin_password2', :with => password)
|
28
|
+
|
29
|
+
fill_in('Your E-mail', :with => 'test@example.org')
|
30
|
+
uncheck('blog_public')
|
31
|
+
click_button('Install WordPress')
|
32
|
+
|
33
|
+
else
|
34
|
+
raise Exception, 'This version of WordPress is probably not supported'
|
35
|
+
end
|
36
|
+
|
37
|
+
WordPress.passwords = {username => password}
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
visit path_to 'login page'
|
42
|
+
should_see_within('//title', "#{title} › Log In")
|
43
|
+
|
44
|
+
# Take this so we can reset the DB before each scenario
|
45
|
+
WordPress.original_contents = {}
|
46
|
+
WordPress.tables.each do |table|
|
47
|
+
WordPress.original_contents[table] = WordPress.mysql.query("select * from #{table}").map{|row|row}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Given /^I am logged in as "([^\"]*)"$/ do |user|
|
52
|
+
visit path_to 'login page'
|
53
|
+
|
54
|
+
if respond_to? :find_field
|
55
|
+
# This always fails for some unknown reason
|
56
|
+
until find_field('user_login').value == user
|
57
|
+
fill_in('user_login', :with => user)
|
58
|
+
end
|
59
|
+
else
|
60
|
+
fill_in('user_login', :with => user)
|
61
|
+
end
|
62
|
+
|
63
|
+
fill_in('user_pass', :with => WordPress.passwords[user])
|
64
|
+
click_button('Log In')
|
65
|
+
end
|
66
|
+
|
67
|
+
Given /^I am not logged in$/ do
|
68
|
+
visit path_to 'admin dashboard'
|
69
|
+
click_link('Log Out')
|
70
|
+
end
|
71
|
+
|
72
|
+
Given /^theme "([^\"]*)" is enabled$/ do |theme|
|
73
|
+
Given 'I am logged in as "admin"'
|
74
|
+
Given 'I am on manage themes'
|
75
|
+
click_link_within %Q&//a[contains(@title,"#{theme}")]/..&, 'Activate'
|
76
|
+
end
|
77
|
+
|
78
|
+
Given /^plugin "([^\"]*)" is (enabled|disabled)$/ do |plugin,able|
|
79
|
+
Given 'I am logged in as "admin"'
|
80
|
+
Given 'I am on plugins'
|
81
|
+
link = %Q&//a[contains(@href,"#{plugin}")]&
|
82
|
+
if able == 'enabled'
|
83
|
+
text = 'Activate'
|
84
|
+
else
|
85
|
+
text = 'Deactivate'
|
86
|
+
end
|
87
|
+
click_link_within "#{link}/..", text
|
88
|
+
end
|
89
|
+
|
90
|
+
Given /^there is a (post|page) called "([^\"]*)"$/ do |post_type,title|
|
91
|
+
visit path_to "new #{post_type}"
|
92
|
+
case WordPress.major
|
93
|
+
when 2
|
94
|
+
fill_in 'title', :with => title
|
95
|
+
when 3
|
96
|
+
fill_in 'post_title', :with => title
|
97
|
+
end
|
98
|
+
click_button 'Publish'
|
99
|
+
end
|
100
|
+
|
101
|
+
Given /^the (post|page) "([^\"]*)" has meta "([^\"]*)" as "(.*)"$/ do |post_type,title,key,value|
|
102
|
+
WordPress.mysql.query(%Q'INSERT INTO #{WordPress.TABLE_PREFIX}postmeta SET post_id=(SELECT ID FROM #{WordPress.TABLE_PREFIX}posts WHERE post_title="#{title}" AND post_type != "revision"), meta_key="#{Mysql.escape_string(key)}", meta_value="#{Mysql.escape_string(value)}"')
|
103
|
+
end
|
104
|
+
|
105
|
+
Given /^the page "([^\"]*)" has template "([^\"]*)"$/ do |title,template|
|
106
|
+
visit path_to %Q%edit page "#{title}"%
|
107
|
+
select template, :from => 'Page Template'
|
108
|
+
click_button 'Update'
|
109
|
+
end
|
110
|
+
|
111
|
+
Given /^permalinks are set as "([^\"]*)"$/ do |structure|
|
112
|
+
visit '/wp-admin/options-permalink.php'
|
113
|
+
fill_in 'permalink_structure', :with => structure
|
114
|
+
click_button 'Save Changes'
|
115
|
+
end
|
116
|
+
|
117
|
+
Given /^option "([^\"]*)" is set to "(.*)"$/ do |option, value|
|
118
|
+
WordPress.mysql.query(%Q'DELETE FROM #{WordPress.TABLE_PREFIX}options WHERE option_name="#{Mysql.escape_string option}"')
|
119
|
+
WordPress.mysql.query(%Q'INSERT INTO #{WordPress.TABLE_PREFIX}options SET option_name="#{Mysql.escape_string option}", option_value="#{Mysql.escape_string value}"')
|
120
|
+
end
|
121
|
+
|
122
|
+
Given /^there is a user "([^"]*)" with role "([^"]*)"$/ do |username, role|
|
123
|
+
password = username
|
124
|
+
|
125
|
+
visit path_to 'new user'
|
126
|
+
|
127
|
+
fill_in 'user_login', :with => username
|
128
|
+
fill_in 'email', :with => username+'@example.org'
|
129
|
+
fill_in 'pass1', :with => password
|
130
|
+
fill_in 'pass2', :with => password
|
131
|
+
select role.capitalize, :from => 'role'
|
132
|
+
click_button 'Add User'
|
133
|
+
|
134
|
+
WordPress.passwords.merge!({username => password})
|
135
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Then /^plugin "([^\"]*)" should be (enabled|disabled)$/ do |plugin,able|
|
2
|
+
Given 'I am logged in as "admin"'
|
3
|
+
Given 'I am on plugins'
|
4
|
+
link = %Q&//a[contains(@href,"#{plugin}")]&
|
5
|
+
if able == 'enabled'
|
6
|
+
text = 'Deactivate'
|
7
|
+
else
|
8
|
+
text = 'Activate'
|
9
|
+
end
|
10
|
+
should_see_within "#{link}/..", text
|
11
|
+
end
|
12
|
+
|
13
|
+
Then /^there should be (\d+) posts?$/ do |count|
|
14
|
+
WordPress.mysql.query("select count(*) from #{WordPress.TABLE_PREFIX}posts where ID != 1 and post_type = 'post' and post_status != 'trash'").fetch_row.first.to_i.should == count.to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
Then /^there should be (\d+) categories?$/ do |count|
|
18
|
+
# Two initial categories, which we won't count: Uncategorized and Blogroll
|
19
|
+
WordPress.mysql.query("select count(*) from #{WordPress.TABLE_PREFIX}terms where term_id > 2").fetch_row.first.to_i.should == count.to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
Then /^there should be a category called "([^\"]*)"$/ do |category|
|
23
|
+
WordPress.mysql.query("select count(*) > 0 from #{WordPress.TABLE_PREFIX}terms where name = '#{Mysql.escape_string(category)}' or slug = '#{Mysql.escape_string(category)}'").fetch_row.first.to_i.should == 1
|
24
|
+
end
|
25
|
+
|
26
|
+
Then /^there should be a post called "([^\"]*)"$/ do |post|
|
27
|
+
WordPress.mysql.query("select count(*) > 0 from #{WordPress.TABLE_PREFIX}posts where post_title = '#{Mysql.escape_string(post)}' or post_name = '#{Mysql.escape_string(post)}'").fetch_row.first.to_i.should == 1
|
28
|
+
end
|
29
|
+
|
30
|
+
Then /^there should be a post called "([^\"]*)" in the "([^\"]*)" category$/ do |post, category|
|
31
|
+
WordPress.mysql.query("select count(*) > 0 from #{WordPress.TABLE_PREFIX}terms join #{WordPress.TABLE_PREFIX}term_relationships join #{WordPress.TABLE_PREFIX}posts where term_id = term_taxonomy_id and ID = object_id and (post_title = '#{Mysql.escape_string(post)}' or post_name = '#{Mysql.escape_string(post)}') and (name = '#{Mysql.escape_string(category)}' or slug = '#{Mysql.escape_string(category)}')").fetch_row.first.to_i.should == 1
|
32
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#
|
2
|
+
# Let's fix a few bugs in Webrat!
|
3
|
+
#
|
4
|
+
|
5
|
+
# For some reason the MechanizeAdapter uses response_body instead of response.body.
|
6
|
+
# This is needed
|
7
|
+
module Webrat
|
8
|
+
class Session
|
9
|
+
include Spec::Mocks::ExampleMethods
|
10
|
+
def response
|
11
|
+
m = mock
|
12
|
+
m.should_receive(:body).any_number_of_times.and_return(response_body)
|
13
|
+
m
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Use XPath in click_link_within, etc.
|
19
|
+
# This is needed too
|
20
|
+
module Webrat
|
21
|
+
class Scope
|
22
|
+
def scoped_dom
|
23
|
+
begin
|
24
|
+
@scope.dom.css(@selector).first
|
25
|
+
rescue Nokogiri::CSS::SyntaxError => e
|
26
|
+
begin
|
27
|
+
@scope.dom.xpath(@selector).first
|
28
|
+
rescue Nokogiri::XML::XPath::SyntaxError
|
29
|
+
raise e
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Fix attach_file so it works with mechanize
|
37
|
+
# Thanks: https://webrat.lighthouseapp.com/projects/10503/tickets/303-tiny-patch-for-attach_file-to-work-with-mechanize
|
38
|
+
# This is not needed for cucumber-wordpress (yet)
|
39
|
+
module Webrat
|
40
|
+
class FileField < Field
|
41
|
+
def test_uploaded_file
|
42
|
+
return "" if @original_value.blank?
|
43
|
+
|
44
|
+
case Webrat.configuration.mode
|
45
|
+
when :rails
|
46
|
+
if content_type
|
47
|
+
ActionController::TestUploadedFile.new(@original_value, content_type)
|
48
|
+
else
|
49
|
+
ActionController::TestUploadedFile.new(@original_value)
|
50
|
+
end
|
51
|
+
when :rack, :merb
|
52
|
+
Rack::Test::UploadedFile.new(@original_value, content_type)
|
53
|
+
when :mechanize
|
54
|
+
open(@original_value) if @original_value.present?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Basic auth
|
61
|
+
module Webrat
|
62
|
+
class Session
|
63
|
+
def basic_auth(user, pass)
|
64
|
+
encoded_login = ["#{user}:#{pass}"].pack("m*").gsub(/\n/, '')
|
65
|
+
header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
|
66
|
+
if Webrat.adapter_class == MechanizeAdapter
|
67
|
+
self.adapter.mechanize.auth(user, pass)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Redirects
|
74
|
+
module Webrat
|
75
|
+
class MechanizeAdapter
|
76
|
+
def mechanize
|
77
|
+
@mechanize ||= begin
|
78
|
+
mechanize = Mechanize.new
|
79
|
+
mechanize.redirect_ok = true
|
80
|
+
mechanize
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cucumber-wordpress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 1.3.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Tom Adams
|
@@ -9,39 +14,57 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-09-15 00:00:00 +01:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: cucumber
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
23
29
|
version: "0"
|
24
|
-
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
25
32
|
- !ruby/object:Gem::Dependency
|
26
33
|
name: webrat
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
27
42
|
type: :runtime
|
28
|
-
|
29
|
-
|
43
|
+
version_requirements: *id002
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: mechanize
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
30
48
|
requirements:
|
31
49
|
- - ">="
|
32
50
|
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
33
53
|
version: "0"
|
34
|
-
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
35
56
|
- !ruby/object:Gem::Dependency
|
36
57
|
name: mysql
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
40
60
|
requirements:
|
41
61
|
- - ">="
|
42
62
|
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
43
65
|
version: "0"
|
44
|
-
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id004
|
45
68
|
description:
|
46
69
|
email: tom@thedextrousweb.com
|
47
70
|
executables: []
|
@@ -62,7 +85,11 @@ files:
|
|
62
85
|
- examples/features/support/paths.rb
|
63
86
|
- examples/features/wordpress.feature
|
64
87
|
- lib/cucumber-wordpress.rb
|
88
|
+
- lib/cucumber-wordpress/path_to.rb
|
65
89
|
- lib/cucumber-wordpress/steps.rb
|
90
|
+
- lib/cucumber-wordpress/steps/given.rb
|
91
|
+
- lib/cucumber-wordpress/steps/should.rb
|
92
|
+
- lib/cucumber-wordpress/webrat-patches.rb
|
66
93
|
has_rdoc: true
|
67
94
|
homepage: http://github.com/dxw/cucumber-wordpress
|
68
95
|
licenses: []
|
@@ -76,18 +103,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
103
|
requirements:
|
77
104
|
- - ">="
|
78
105
|
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
79
108
|
version: "0"
|
80
|
-
version:
|
81
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
110
|
requirements:
|
83
111
|
- - ">="
|
84
112
|
- !ruby/object:Gem::Version
|
113
|
+
segments:
|
114
|
+
- 0
|
85
115
|
version: "0"
|
86
|
-
version:
|
87
116
|
requirements: []
|
88
117
|
|
89
118
|
rubyforge_project:
|
90
|
-
rubygems_version: 1.3.
|
119
|
+
rubygems_version: 1.3.6
|
91
120
|
signing_key:
|
92
121
|
specification_version: 3
|
93
122
|
summary: Environment setup and step definitions for testing WordPress with Cucumber
|