kelp 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kelp (0.1.8)
4
+ kelp (0.1.9)
5
5
  capybara (>= 0.4.0)
6
6
 
7
7
  GEM
data/History.md CHANGED
@@ -1,6 +1,15 @@
1
1
  Kelp History
2
2
  ============
3
3
 
4
+ 0.1.9
5
+ -----
6
+
7
+ - Fill-in methods now accept checkbox and dropdown fields
8
+ - Generated step definitions now replace those of cucumber-rails (web_steps.rb)
9
+ - should_be_on_page and should_have_query methods added
10
+ - should_see_button and should_not_see_button visibility methods added
11
+
12
+
4
13
  0.1.8
5
14
  -----
6
15
 
data/README.md CHANGED
@@ -97,13 +97,20 @@ for more information.
97
97
  Rails generator
98
98
  ---------------
99
99
 
100
- Kelp provides a generator for Rails 2.x projects, to quickly add some generic
101
- step definitions. Simply run:
100
+ Kelp provides a generator for Rails 2.x projects, which writes step definitions
101
+ to `features/step_definitions/web_steps.rb`. This file provides all of the same
102
+ step definitions normally provided by
103
+ [cucumber-rails](http://github.com/aslakhellesoy/cucumber-rails), with several
104
+ enhancements. If you have made customizations to your `web_steps.rb`, they will
105
+ be overwritten! Consider yourself warned.
106
+
107
+ To generate `web_steps.rb`, simply run:
102
108
 
103
109
  $ script/generate kelp
104
110
 
105
- This will create `features/step_definitions/kelp_steps.rb` with some example
106
- step definitions using Kelp's helper methods.
111
+ *Note*: If you are upgrading from a version of Kelp prior to 0.1.9, you should
112
+ remove `kelp_steps.rb` from your `features/step_definitions` directory; these
113
+ are obsolete, and conflict with the newer step definitions in `web_steps.rb`.
107
114
 
108
115
  A Rails 3.x generator is not currently provided. Contributions are welcome!
109
116
 
@@ -142,7 +149,7 @@ Kelp comes with a `Rakefile`, so you can run the RSpec tests and generate an
142
149
  $ rake spec
143
150
 
144
151
  This will write an HTML report to `coverage/index.html`. Finally, there are
145
- some Cucumber self-tests included, mainly for testing the `kelp_steps.rb`
152
+ some Cucumber self-tests included, mainly for testing the `web_steps.rb`
146
153
  file used by the Rails generator. Run via:
147
154
 
148
155
  $ rake cucumber
@@ -33,14 +33,12 @@
33
33
  <option value="heavy">Heavy</option>
34
34
  </select>
35
35
  </p>
36
- <p>
37
- <label for="quotes">Quotes</label>
38
- <select id="quotes">
39
- <option value="1">Single 'quotes'</option>
40
- <option value="2">"Double" quotes</option>
41
- <option value="3">'Single' and "Double" quotes</option>
42
- </select>
43
- </p>
36
+ <p><button value="Submit person form" /></p>
37
+ </div>
38
+ </form>
39
+
40
+ <div id="preferences_form">
41
+ <form action="/thanks" method="get">
44
42
  <p>
45
43
  <label for="favorite_colors">Favorite Colors</label>
46
44
  <select id="favorite_colors" multiple="multiple">
@@ -57,23 +55,6 @@
57
55
  <label for="like_salami">I like salami</label>
58
56
  <input id="like_salami" type="checkbox" />
59
57
  </p>
60
- <p>
61
- <label for="message">Message</label>
62
- <input id="message" type="text" value="Your message goes here" />
63
- </p>
64
- <p><input type="submit" value="Submit" /></p>
65
- </form>
66
- </div>
67
-
68
- <div id="other_form">
69
- <form action="/thanks" method="get">
70
- <p><input id="readonly" type="text" disabled="disabled" /></p>
71
- <p><input type="submit" value="Submit" disabled="disabled" /></p>
72
- </form>
73
- </div>
74
-
75
- <div id="checkbox_form">
76
- <form action="/thanks" method="get">
77
58
  <table>
78
59
  <tr>
79
60
  <th>Apple</th>
@@ -90,6 +71,26 @@
90
71
  </td>
91
72
  </tr>
92
73
  </table>
74
+ <p>
75
+ <label for="message">Message</label>
76
+ <input id="message" type="text" value="Your message goes here" />
77
+ </p>
78
+ <p><input type="submit" value="Save preferences" /></p>
79
+ </form>
80
+ </div>
81
+
82
+ <div id="other_form">
83
+ <form action="/thanks" method="get">
84
+ <p>
85
+ <label for="quotes">Quotes</label>
86
+ <select id="quotes">
87
+ <option value="1">Single 'quotes'</option>
88
+ <option value="2">"Double" quotes</option>
89
+ <option value="3">'Single' and "Double" quotes</option>
90
+ </select>
91
+ </p>
92
+ <p><input id="readonly" type="text" disabled="disabled" /></p>
93
+ <p><input type="submit" value="Save is disabled" disabled="disabled" /></p>
93
94
  </form>
94
95
  </div>
95
96
 
@@ -20,7 +20,7 @@
20
20
  <div id="fields">
21
21
  <form action="/thanks" method="get">
22
22
  <input type="text" name="message" />
23
- <input type="submit" value="Submit" />
23
+ <input type="submit" value="Submit message" />
24
24
  </form>
25
25
  </div>
26
26
 
@@ -4,9 +4,9 @@ require 'fileutils'
4
4
 
5
5
  Given /^the latest Kelp step definitions$/ do
6
6
  app_dir = File.join(root_dir, 'examples', "sinatra_app")
7
- installed_steps = File.join(app_dir, 'features', 'step_definitions', 'kelp_steps.rb')
8
- latest_steps = File.join(root_dir, 'rails_generators', 'kelp', 'templates', 'kelp_steps.rb')
9
- # Remove the installed kelp_steps.rb, if any, then install the latest one
7
+ installed_steps = File.join(app_dir, 'features', 'step_definitions', 'web_steps.rb')
8
+ latest_steps = File.join(root_dir, 'rails_generators', 'kelp', 'templates', 'web_steps.rb')
9
+ # Remove the installed web_steps.rb, if any, then install the latest one
10
10
  FileUtils.mkdir_p(File.dirname(installed_steps))
11
11
  FileUtils.rm(installed_steps) if File.exists?(installed_steps)
12
12
  FileUtils.cp_r(latest_steps, installed_steps)
data/kelp.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "kelp"
3
- s.version = "0.1.8"
3
+ s.version = "0.1.9"
4
4
  s.summary = "Cucumber helper methods"
5
5
  s.description = <<-EOS
6
6
  Kelp is a collection of helper methods for Cucumber to ease the process of
data/lib/kelp/field.rb CHANGED
@@ -9,27 +9,99 @@ module Kelp
9
9
  include Scoping
10
10
  include Helper
11
11
 
12
+ # Select a value from a dropdown or listbox, or fill in a text field,
13
+ # depending on what kind of form field is available. If `field` is a
14
+ # dropdown or listbox, select `value` from that; otherwise, assume
15
+ # `field` is a text box.
16
+ #
17
+ # @param [String] field
18
+ # Capybara locator for the field (name, id, or label text)
19
+ # @param [String] value
20
+ # Text to select from a dropdown or enter in a text box
21
+ #
22
+ # @since 0.1.9
23
+ #
24
+ def select_or_fill(field, value)
25
+ begin
26
+ select(value, :from => field)
27
+ rescue
28
+ fill_in(field, :with => value)
29
+ end
30
+ end
31
+
32
+
33
+ # Check a checkbox, select from a dropdown or listbox, or fill in a text
34
+ # field, depending on what kind of form field is available. If value
35
+ # is `checked` or `unchecked`, assume `field` is a checkbox; otherwise,
36
+ # fall back on {#select_or_fill}.
37
+ #
38
+ # @param [String] field
39
+ # Capybara locator for the field (name, id, or label text)
40
+ # @param [String] value
41
+ # Text to select from a dropdown or enter in a text box, or
42
+ # `checked` or `unchecked` to operate on a checkbox
43
+ #
44
+ # @since 0.1.9
45
+ #
46
+ def check_or_select_or_fill(field, value)
47
+ # If value is "checked" or "unchecked", assume
48
+ # field is a checkbox
49
+ if value == "checked"
50
+ begin
51
+ check(field)
52
+ rescue
53
+ select_or_fill(field, value)
54
+ end
55
+ elsif value == "unchecked"
56
+ begin
57
+ uncheck(field)
58
+ rescue
59
+ select_or_fill(field, value)
60
+ end
61
+ else
62
+ select_or_fill(field, value)
63
+ end
64
+ end
65
+
66
+
12
67
  # Fill in multiple fields according to values in a `Hash`.
68
+ # Fields may be text boxes, dropdowns/listboxes, or checkboxes.
69
+ # See {#check_or_select_or_fill} for details.
13
70
  #
14
71
  # @example
15
72
  # fill_in_fields "First name" => "Otto", "Last name" => "Scratchansniff"
16
73
  # fill_in_fields "phone" => "303-224-7428", :within => "#home"
17
74
  #
18
- # @param [Hash] fields
19
- # "field" => "value" for each field to fill in
75
+ # @param [Hash] field_values
76
+ # "field" => "value" for each field to fill in, select, or check/uncheck
20
77
  # @param [Hash] scope
21
78
  # Scoping keywords as understood by {#in_scope}
22
79
  #
23
- def fill_in_fields(fields, scope={})
80
+ def fill_in_fields(field_values, scope={})
24
81
  in_scope(scope) do
25
- fields.each do |name, value|
26
- fill_in name, :with => value
82
+ field_values.each do |field, value|
83
+ check_or_select_or_fill(field, value)
27
84
  end
28
85
  end
29
86
  end
30
87
 
31
88
 
32
89
  # Fill in a single field within the scope of a given selector.
90
+ # The field may be a text box, dropdown/listbox, or checkbox.
91
+ # See {#check_or_select_or_fill} for details.
92
+ #
93
+ # @example
94
+ # fill_in_field "Email", "otto@scratchansniff.wb"
95
+ # fill_in_field "Send me junk email", "unchecked"
96
+ #
97
+ # @param [String] field
98
+ # Capybara locator for the field (name, id, or label text)
99
+ # @param [String] value
100
+ # Text to select from a dropdown or enter in a text box, or
101
+ # `checked` or `unchecked` to operate on a checkbox
102
+ # @param [Hash] scope
103
+ # Scoping keywords as understood by {#in_scope}
104
+ #
33
105
  def fill_in_field(field, value, scope={})
34
106
  fields = {field => value}
35
107
  fill_in_fields fields, scope
@@ -57,6 +129,12 @@ module Kelp
57
129
 
58
130
 
59
131
  # Verify that the given field is empty or nil.
132
+ #
133
+ # @param [String] field
134
+ # Capybara locator for the field (name, id, or label text)
135
+ # @param [Hash] scope
136
+ # Scoping keywords as understood by {#in_scope}
137
+ #
60
138
  def field_should_be_empty(field, scope={})
61
139
  in_scope(scope) do
62
140
  _field = nice_find_field(field)
@@ -73,6 +151,8 @@ module Kelp
73
151
  # Capybara locator for the field (name, id, or label text)
74
152
  # @param [String] value
75
153
  # Value you expect to see in the text field
154
+ # @param [Hash] scope
155
+ # Scoping keywords as understood by {#in_scope}
76
156
  #
77
157
  def field_should_contain(field, value, scope={})
78
158
  in_scope(scope) do
data/lib/kelp/helper.rb CHANGED
@@ -1,5 +1,16 @@
1
1
  module Kelp
2
2
  module Helper
3
+ # Convert a Cucumber::Ast::Table or multiline string into
4
+ # a list of strings
5
+ def listify(items)
6
+ if items.class == Cucumber::Ast::Table
7
+ strings = items.raw.flatten
8
+ else
9
+ strings = items.split(/[\r\n]+/)
10
+ end
11
+ end
12
+
13
+
3
14
  # A slightly friendlier version of Capybara's `find_field`, which actually
4
15
  # tells you which locator failed to match (instead of giving a useless
5
16
  # Unable to find '#<XPath::Union:0xXXXXXXX>' message).
@@ -11,6 +22,7 @@ module Kelp
11
22
  end
12
23
  end
13
24
 
25
+
14
26
  # Return the appropriate "ExpectationNotMetError" class for the current
15
27
  # version of RSpec
16
28
  def rspec_unexpected
@@ -20,5 +32,6 @@ module Kelp
20
32
  Spec::Expectations::ExpectationNotMetError
21
33
  end
22
34
  end
35
+
23
36
  end
24
37
  end
@@ -1,13 +1,16 @@
1
+ require 'uri'
2
+ require 'cgi'
1
3
  require 'kelp/scoping'
2
4
  require 'kelp/xpath'
3
5
 
4
6
  module Kelp
5
7
  # This module defines helper methods for navigating a webpage, including
6
- # clicking links and pressing buttons.
8
+ # clicking links and pressing buttons, and for verifying the current
9
+ # page's path and query parameters.
7
10
  #
8
11
  module Navigation
9
12
  include Scoping
10
- include XPath
13
+ include XPaths
11
14
 
12
15
  # Follow a link on the page.
13
16
  #
@@ -59,5 +62,60 @@ module Kelp
59
62
  row.click_link(link)
60
63
  end
61
64
 
65
+
66
+ # Verify that the current page matches the path of `page_name_or_path`. The
67
+ # cucumber-generated `path_to` function will be used, if it's defined, to
68
+ # translate human-readable names into URL paths. Otherwise, assume a raw,
69
+ # absolute path string.
70
+ #
71
+ # @example
72
+ # should_be_on_page 'home page'
73
+ # should_be_on_page '/admin/login'
74
+ #
75
+ # @param [String] page_name_or_path
76
+ # Human-readable page name (mapped to a pathname by your `path_to` function),
77
+ # or an absolute path beginning with `/`.
78
+ #
79
+ # @since 0.1.9
80
+ #
81
+ def should_be_on_page(page_name_or_path)
82
+ # Use the path_to translator function if it's defined
83
+ # (normally in features/support/paths.rb)
84
+ if defined? path_to
85
+ expect_path = path_to(page_name_or_path)
86
+ # Otherwise, expect a raw path string
87
+ else
88
+ expect_path = page_name_or_path
89
+ end
90
+ actual_path = URI.parse(current_url).path
91
+ if actual_path.respond_to? :should
92
+ actual_path.should == expect_path
93
+ else
94
+ assert_equal actual_path, expect_path
95
+ end
96
+ end
97
+
98
+
99
+ # Verify that the current page has the given query parameters.
100
+ #
101
+ # @param [Hash] params
102
+ # Key => value parameters, as they would appear in the URL
103
+ #
104
+ # @since 0.1.9
105
+ #
106
+ def should_have_query(params)
107
+ query = URI.parse(current_url).query
108
+ actual_params = query ? CGI.parse(query) : {}
109
+ expected_params = {}
110
+ params.each_pair do |k,v|
111
+ expected_params[k] = v.split(',')
112
+ end
113
+ if actual_params.respond_to? :should
114
+ actual_params.should == expected_params
115
+ else
116
+ assert_equal expected_params, actual_params
117
+ end
118
+ end
119
+
62
120
  end
63
121
  end
data/lib/kelp/scoping.rb CHANGED
@@ -8,7 +8,8 @@ module Kelp
8
8
  # assumed to be a CSS selector.
9
9
  def scope_within(locator)
10
10
  if locator
11
- # Use the selector_for method if it's defined
11
+ # Use the selector_for method if it's defined. This may be provided
12
+ # by features/support/selectors.rb, generated by cucumber-rails.
12
13
  if defined? selector_for
13
14
  within(*selector_for(locator)) { yield }
14
15
  # Otherwise, remove any surrounding double-quotes
@@ -32,7 +33,7 @@ module Kelp
32
33
  #
33
34
  # @example
34
35
  # in_scope :within => '#footer'
35
- # click_link "Contact Us"
36
+ # click_link "Contact Us"
36
37
  # end
37
38
  #
38
39
  # @param [Hash] scope
@@ -1,3 +1,4 @@
1
+ require 'xpath'
1
2
  require 'kelp/scoping'
2
3
  require 'kelp/xpath'
3
4
  require 'kelp/exceptions'
@@ -9,7 +10,7 @@ module Kelp
9
10
  #
10
11
  module Visibility
11
12
  include Scoping
12
- include XPath
13
+ include XPaths
13
14
 
14
15
  # Verify the presence of content on the page. Passes when all the given items
15
16
  # are found on the page, and fails if any of them are not found.
@@ -25,6 +26,9 @@ module Kelp
25
26
  # @param [Hash] scope
26
27
  # Scoping keywords as understood by {#in_scope}
27
28
  #
29
+ # @raise [Kelp::Unexpected]
30
+ # If any of the expected text strings are not seen in the given scope
31
+ #
28
32
  def should_see(texts, scope={})
29
33
  texts = [texts] if (texts.class == String || texts.class == Regexp)
30
34
  unexpected = []
@@ -52,6 +56,9 @@ module Kelp
52
56
  # @param [Hash] scope
53
57
  # Scoping keywords as understood by {#in_scope}
54
58
  #
59
+ # @raise [Kelp::Unexpected]
60
+ # If any of the expected text strings are seen in the given scope
61
+ #
55
62
  def should_not_see(texts, scope={})
56
63
  texts = [texts] if (texts.class == String || texts.class == Regexp)
57
64
  unexpected = []
@@ -248,6 +255,64 @@ module Kelp
248
255
  end
249
256
  end
250
257
 
258
+
259
+ # Verify that a button with the given text appears on the page.
260
+ # Works for `<input...>` as well as `<button...>` elements.
261
+ #
262
+ # @example
263
+ # should_see_button "Submit"
264
+ # should_see_button "Save changes", :within => "#preferences"
265
+ #
266
+ # @param [String] button_text
267
+ # Visible button text to look for
268
+ # @param [Hash] scope
269
+ # Scoping keywords as understood by {#in_scope}
270
+ #
271
+ # @raise [Kelp::Unexpected]
272
+ # If no button with the given text exists in the given scope
273
+ #
274
+ # @since 0.1.9
275
+ #
276
+ def should_see_button(button_text, scope={})
277
+ in_scope(scope) do
278
+ xpath = XPath::HTML.button(button_text)
279
+ begin
280
+ page.should have_xpath(xpath)
281
+ rescue rspec_unexpected
282
+ raise Kelp::Unexpected, "Expected to see button '#{button_text}', but button does not exist."
283
+ end
284
+ end
285
+ end
286
+
287
+
288
+ # Verify that a button with the given text does not appear on the page.
289
+ # Works for `<input...>` as well as `<button...>` elements.
290
+ #
291
+ # @example
292
+ # should_not_see_button "Delete"
293
+ # should_not_see_button "Save changes", :within => "#read_only"
294
+ #
295
+ # @param [String] button_text
296
+ # Visible button text to look for
297
+ # @param [Hash] scope
298
+ # Scoping keywords as understood by {#in_scope}
299
+ #
300
+ # @raise [Kelp::Unexpected]
301
+ # If a button with the given text does exist in the given scope
302
+ #
303
+ # @since 0.1.9
304
+ #
305
+ def should_not_see_button(button_text, scope={})
306
+ in_scope(scope) do
307
+ xpath = XPath::HTML.button(button_text)
308
+ begin
309
+ page.should have_no_xpath(xpath)
310
+ rescue rspec_unexpected
311
+ raise Kelp::Unexpected, "Did not expect to see button '#{button_text}', but button exists."
312
+ end
313
+ end
314
+ end
315
+
251
316
  end
252
317
  end
253
318
 
data/lib/kelp/xpath.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Kelp
2
2
  # This module defines helper methods for building XPath expressions.
3
3
  #
4
- module XPath
4
+ module XPaths
5
5
  # Return an XPath for any table row containing all strings in `texts`,
6
6
  # within the current context.
7
7
  def xpath_row_containing(texts)
@@ -1,4 +1,5 @@
1
- # This generator adds Kelp steps to the step_definitions directory
1
+ # This generator adds web_steps.rb to the step_definitions directory,
2
+ # replacing any web_steps.rb added by cucumber-rails.
2
3
 
3
4
  generator_base = defined?(Rails) ? Rails::Generator::Base : RubiGen::Base
4
5
 
@@ -6,7 +7,7 @@ class KelpGenerator < generator_base
6
7
  def manifest
7
8
  record do |m|
8
9
  m.directory 'features/step_definitions'
9
- m.file 'kelp_steps.rb', 'features/step_definitions/kelp_steps.rb'
10
+ m.file 'web_steps.rb', 'features/step_definitions/web_steps.rb'
10
11
  end
11
12
  end
12
13
 
@@ -1,7 +1,6 @@
1
1
 
2
- require 'uri'
3
- require 'cgi'
4
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
2
+ # May not be needed?
3
+ #require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
5
4
  #require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "selectors"))
6
5
 
7
6
  # Single-line step scoper
@@ -14,119 +13,4 @@ When /^(.*) within ([^:]+):$/ do |step, parent, table_or_string|
14
13
  scope_within(parent) { When "#{step}:", table_or_string }
15
14
  end
16
15
 
17
- Given /^(?:|I )am on (.+)$/ do |page_name|
18
- visit path_to(page_name)
19
- end
20
-
21
- When /^(?:|I )go to (.+)$/ do |page_name|
22
- visit path_to(page_name)
23
- end
24
-
25
- When /^(?:|I )press "([^"]*)"$/ do |button|
26
- click_button button
27
- end
28
-
29
- When /^(?:|I )follow "([^"]*)"$/ do |link|
30
- click_link link
31
- end
32
-
33
- When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
34
- fill_in field, :with => value
35
- end
36
-
37
- When /^(?:|I )fill in "([^"]*)" for "([^"]*)"$/ do |value, field|
38
- fill_in field, :with => value
39
- end
40
-
41
- # Use this to fill in an entire form with data from a table. Example:
42
- #
43
- # When I fill in the following:
44
- # | Account Number | 5002 |
45
- # | Expiry date | 2009-11-01 |
46
- # | Note | Nice guy |
47
- # | Wants Email? | |
48
- #
49
- # TODO: Add support for checkbox, select og option
50
- # based on naming conventions.
51
- #
52
- When /^(?:|I )fill in the following:$/ do |fields|
53
- fill_in_fields fields.rows_hash
54
- end
55
-
56
- When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
57
- select value, :from => field
58
- end
59
-
60
- When /^(?:|I )check "([^"]*)"$/ do |field|
61
- check field
62
- end
63
-
64
- When /^(?:|I )uncheck "([^"]*)"$/ do |field|
65
- uncheck field
66
- end
67
-
68
- When /^(?:|I )choose "([^"]*)"$/ do |field|
69
- choose field
70
- end
71
-
72
- When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field|
73
- attach_file field, File.expand_path(path)
74
- end
75
16
 
76
- Then /^(?:|I )should see "([^"]*)"$/ do |text|
77
- should_see text
78
- end
79
-
80
- Then /^(?:|I )should see \/([^\/]*)\/$/ do |regexp|
81
- should_see Regexp.new(regexp)
82
- end
83
-
84
- Then /^(?:|I )should not see "([^"]*)"$/ do |text|
85
- should_not_see text
86
- end
87
-
88
- Then /^(?:|I )should not see \/([^\/]*)\/$/ do |regexp|
89
- should_not_see Regexp.new(regexp)
90
- end
91
-
92
- Then /^the "([^"]*)" field(?: within (.*))? should contain "([^"]*)"$/ do |field, parent, value|
93
- field_should_contain field, value, :within => parent
94
- end
95
-
96
- Then /^the "([^"]*)" field(?: within (.*))? should not contain "([^"]*)"$/ do |field, parent, value|
97
- field_should_not_contain field, value, :within => parent
98
- end
99
-
100
- Then /^the "([^"]*)" checkbox(?: within (.*))? should be checked$/ do |label, parent|
101
- checkbox_should_be_checked label, :within => parent
102
- end
103
-
104
- Then /^the "([^"]*)" checkbox(?: within (.*))? should not be checked$/ do |label, parent|
105
- checkbox_should_not_be_checked label, :within => parent
106
- end
107
-
108
- Then /^(?:|I )should be on (.+)$/ do |page_name|
109
- current_path = URI.parse(current_url).path
110
- if current_path.respond_to? :should
111
- current_path.should == path_to(page_name)
112
- else
113
- assert_equal path_to(page_name), current_path
114
- end
115
- end
116
-
117
- Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
118
- query = URI.parse(current_url).query
119
- actual_params = query ? CGI.parse(query) : {}
120
- expected_params = {}
121
- expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
122
-
123
- if actual_params.respond_to? :should
124
- actual_params.should == expected_params
125
- else
126
- assert_equal expected_params, actual_params
127
- end
128
- end
129
-
130
- Then /^show me the page$/ do
131
- save_and_open_page
132
- end