casecumber-rails 1.0.2.1

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.
Files changed (84) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +1 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +2 -0
  5. data/Gemfile.lock +205 -0
  6. data/History.md +219 -0
  7. data/LICENSE +22 -0
  8. data/README.md +77 -0
  9. data/Rakefile +9 -0
  10. data/config/.gitignore +1 -0
  11. data/config/cucumber.yml +1 -0
  12. data/cucumber-rails.gemspec +46 -0
  13. data/dev_tasks/cucumber.rake +5 -0
  14. data/dev_tasks/rspec.rake +8 -0
  15. data/dev_tasks/yard.rake +0 -0
  16. data/dev_tasks/yard/default/layout/html/bubble_32x32.png +0 -0
  17. data/dev_tasks/yard/default/layout/html/footer.erb +5 -0
  18. data/dev_tasks/yard/default/layout/html/index.erb +1 -0
  19. data/dev_tasks/yard/default/layout/html/layout.erb +25 -0
  20. data/dev_tasks/yard/default/layout/html/logo.erb +1 -0
  21. data/dev_tasks/yard/default/layout/html/setup.rb +4 -0
  22. data/features/allow_rescue.feature +63 -0
  23. data/features/capybara_javascript_drivers.feature +87 -0
  24. data/features/database_cleaner.feature +44 -0
  25. data/features/emulate_javascript.feature +34 -0
  26. data/features/inspect_query_string.feature +37 -0
  27. data/features/install_cucumber_rails.feature +16 -0
  28. data/features/mongoid.feature +53 -0
  29. data/features/multiple_databases.feature +74 -0
  30. data/features/named_selectors.feature +33 -0
  31. data/features/no_database.feature +70 -0
  32. data/features/pseduo_class_selectors.feature +24 -0
  33. data/features/rerun_profile.feature +38 -0
  34. data/features/rest_api.feature +47 -0
  35. data/features/routing.feature +18 -0
  36. data/features/select_dates.feature +99 -0
  37. data/features/step_definitions/cucumber_rails_steps.rb +89 -0
  38. data/features/support/env.rb +37 -0
  39. data/features/test_unit.feature +43 -0
  40. data/lib/cucumber/rails.rb +23 -0
  41. data/lib/cucumber/rails/action_controller.rb +12 -0
  42. data/lib/cucumber/rails/application.rb +17 -0
  43. data/lib/cucumber/rails/capybara.rb +6 -0
  44. data/lib/cucumber/rails/capybara/javascript_emulation.rb +83 -0
  45. data/lib/cucumber/rails/capybara/select_dates_and_times.rb +50 -0
  46. data/lib/cucumber/rails/hooks.rb +4 -0
  47. data/lib/cucumber/rails/hooks/active_record.rb +21 -0
  48. data/lib/cucumber/rails/hooks/allow_rescue.rb +8 -0
  49. data/lib/cucumber/rails/hooks/database_cleaner.rb +13 -0
  50. data/lib/cucumber/rails/hooks/mail.rb +5 -0
  51. data/lib/cucumber/rails/rspec.rb +21 -0
  52. data/lib/cucumber/rails/world.rb +26 -0
  53. data/lib/cucumber/web/tableish.rb +118 -0
  54. data/lib/generators/cucumber/feature/USAGE +16 -0
  55. data/lib/generators/cucumber/feature/feature_generator.rb +28 -0
  56. data/lib/generators/cucumber/feature/named_arg.rb +19 -0
  57. data/lib/generators/cucumber/feature/templates/feature.erb +63 -0
  58. data/lib/generators/cucumber/feature/templates/steps.erb +14 -0
  59. data/lib/generators/cucumber/install/USAGE +15 -0
  60. data/lib/generators/cucumber/install/install_generator.rb +88 -0
  61. data/lib/generators/cucumber/install/templates/config/cucumber.yml.erb +8 -0
  62. data/lib/generators/cucumber/install/templates/script/cucumber +10 -0
  63. data/lib/generators/cucumber/install/templates/step_definitions/web_steps.rb.erb +192 -0
  64. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_cs.rb.erb +127 -0
  65. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_da.rb.erb +105 -0
  66. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_de.rb.erb +127 -0
  67. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_es.rb.erb +127 -0
  68. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_ja.rb.erb +140 -0
  69. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_ko.rb.erb +142 -0
  70. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_no.rb.erb +105 -0
  71. data/lib/generators/cucumber/install/templates/step_definitions/web_steps_pt-BR.rb.erb +132 -0
  72. data/lib/generators/cucumber/install/templates/support/_rails_each_run.rb.erb +36 -0
  73. data/lib/generators/cucumber/install/templates/support/_rails_prefork.rb.erb +1 -0
  74. data/lib/generators/cucumber/install/templates/support/capybara.rb +5 -0
  75. data/lib/generators/cucumber/install/templates/support/edit_warning.txt +5 -0
  76. data/lib/generators/cucumber/install/templates/support/paths.rb +33 -0
  77. data/lib/generators/cucumber/install/templates/support/rails.rb.erb +4 -0
  78. data/lib/generators/cucumber/install/templates/support/rails_spork.rb.erb +13 -0
  79. data/lib/generators/cucumber/install/templates/support/selectors.rb +39 -0
  80. data/lib/generators/cucumber/install/templates/support/web_steps_warning.txt +19 -0
  81. data/lib/generators/cucumber/install/templates/tasks/cucumber.rake.erb +60 -0
  82. data/spec/cucumber/web/tableish_spec.rb +239 -0
  83. data/spec/spec_helper.rb +3 -0
  84. metadata +514 -0
@@ -0,0 +1,26 @@
1
+ begin
2
+ # Try to load it so we can assign @_result below if needed.
3
+ require 'test/unit/testresult'
4
+ rescue LoadError => ignore
5
+ end
6
+
7
+ module Cucumber #:nodoc:
8
+ module Rails #:nodoc:
9
+ class World < ActionController::IntegrationTest #:nodoc:
10
+ include Rack::Test::Methods
11
+ include ActiveSupport::Testing::SetupAndTeardown if ActiveSupport::Testing.const_defined?("SetupAndTeardown")
12
+
13
+ def initialize #:nodoc:
14
+ @_result = Test::Unit::TestResult.new if defined?(Test::Unit::TestResult)
15
+ end
16
+
17
+ if !defined?(ActiveRecord::Base)
18
+ def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ World do
25
+ Cucumber::Rails::World.new
26
+ end
@@ -0,0 +1,118 @@
1
+ require 'nokogiri'
2
+
3
+ module Cucumber
4
+ module Web
5
+ module Tableish
6
+ # This method returns an Array of Array of String, using CSS3 selectors.
7
+ # This is particularly handy when using Cucumber's Table#diff! method.
8
+ #
9
+ # The +row_selector+ argument must be a String, and picks out all the rows
10
+ # from the web page's DOM. If the number of cells in each row differs, it
11
+ # will be constrained by (or padded with) the number of cells in the first row
12
+ #
13
+ # The +column_selectors+ argument must be a String or a Proc, picking out
14
+ # cells from each row. If you pass a Proc, it will be yielded an instance
15
+ # of Nokogiri::HTML::Element.
16
+ #
17
+ # == Example with a table
18
+ #
19
+ # <table id="tools">
20
+ # <tr>
21
+ # <th>tool</th>
22
+ # <th>dude</th>
23
+ # </tr>
24
+ # <tr>
25
+ # <td>webrat</td>
26
+ # <td>bryan</td>
27
+ # </tr>
28
+ # <tr>
29
+ # <td>cucumber</td>
30
+ # <td>aslak</td>
31
+ # </tr>
32
+ # </table>
33
+ #
34
+ # t = tableish('table#tools tr', 'td,th')
35
+ #
36
+ # == Example with a dl
37
+ #
38
+ # <dl id="tools">
39
+ # <dt>webrat</dt>
40
+ # <dd>bryan</dd>
41
+ # <dt>cucumber</dt>
42
+ # <dd>aslak</dd>
43
+ # </dl>
44
+ #
45
+ # t = tableish('dl#tools dt', lambda{|dt| [dt, dt.next.next]})
46
+ #
47
+ def tableish(row_selector, column_selectors)
48
+ html = defined?(Capybara) ? body : response_body
49
+ _tableish(html, row_selector, column_selectors)
50
+ end
51
+
52
+ def _tableish(html, row_selector, column_selectors) #:nodoc
53
+ doc = Nokogiri::HTML(html)
54
+ spans = nil
55
+ max_cols = 0
56
+
57
+ # Parse the table.
58
+ rows = doc.search(row_selector).map do |row|
59
+ cells = case(column_selectors)
60
+ when String
61
+ row.search(column_selectors)
62
+ when Proc
63
+ column_selectors.call(row)
64
+ end
65
+
66
+ # TODO: max_cols should be sum of colspans
67
+ max_cols = [max_cols, cells.length].max
68
+
69
+ spans ||= Array.new(max_cols, 1)
70
+
71
+ cell_index = 0
72
+
73
+ cells = (0...spans.length).inject([]) do |array, n|
74
+ span = spans[n]
75
+
76
+ cell = if span > 1
77
+ row_span, col_span = 1, 1
78
+ nil
79
+ else
80
+ cell = cells[cell_index]
81
+
82
+ row_span, col_span = _parse_spans(cell)
83
+
84
+ if col_span > 1
85
+ ((n + 1)...(n + col_span)).each do |m|
86
+ spans[m] = row_span + 1
87
+ end
88
+ end
89
+
90
+ cell_index +=1
91
+ cell
92
+ end
93
+
94
+ spans[n] = row_span > 1 ? row_span : ([span - 1, 1].max)
95
+
96
+ array << case cell
97
+ when String then cell.strip
98
+ when nil then ''
99
+ else cell.text.strip
100
+ end
101
+
102
+ array
103
+ end
104
+
105
+ cells
106
+ end
107
+ end
108
+
109
+ def _parse_spans(cell)
110
+ cell.is_a?(Nokogiri::XML::Node) ?
111
+ [cell.attributes['rowspan'].to_s.to_i || 1, cell.attributes['colspan'].to_s.to_i || 1] :
112
+ [1, 1]
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ World(Cucumber::Web::Tableish)
@@ -0,0 +1,16 @@
1
+ Description:
2
+ Generates a skeleton for a new feature. Both a simple .feature file and
3
+ a steps.rb file is generated. This generator should be used with moderation.
4
+ See http://github.com/aslakhellesoy/cucumber/wikis/feature-coupled-steps-antipattern
5
+ for details about the dangers involved.
6
+
7
+ This generator can take an optional list of attribute pairs similar to Rails'
8
+ built-in resource generator.
9
+
10
+ Examples (Rails 3):
11
+ `script/rails generate cucumber:feature post` # no attributes
12
+ `script/rails generate cucumber:feature post title:string body:text published:boolean`
13
+
14
+ Examples (Rails 2):
15
+ `script/generate feature post` # no attributes
16
+ `script/generate feature post title:string body:text published:boolean`
@@ -0,0 +1,28 @@
1
+ require File.join(File.dirname(__FILE__), 'named_arg')
2
+
3
+ module Cucumber
4
+ class FeatureGenerator < ::Rails::Generators::NamedBase
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ argument :fields, :optional => true, :type => :array, :banner => "[field:type, field:type]"
8
+
9
+ attr_reader :named_args
10
+
11
+ def parse_fields
12
+ @named_args = @fields.nil? ? [] : @fields.map { |arg| NamedArg.new(arg) }
13
+ end
14
+
15
+ def generate
16
+ empty_directory 'features/step_definitions'
17
+ template 'feature.erb', "features/manage_#{plural_name}.feature"
18
+ template 'steps.erb', "features/step_definitions/#{singular_name}_steps.rb"
19
+ gsub_file 'features/support/paths.rb', /'\/'/mi do |match|
20
+ "#{match}\n when /the new #{singular_name} page/\n new_#{singular_name}_path\n"
21
+ end
22
+ end
23
+
24
+ def self.banner
25
+ "#{$0} cucumber:feature ModelName [field:type, field:type]"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ class NamedArg
2
+ attr_reader :name
3
+ attr_reader :type
4
+
5
+ def initialize(s)
6
+ @name, @type = *s.split(':')
7
+ end
8
+
9
+ def value(n)
10
+ if @type == 'boolean'
11
+ (n % 2) == 0
12
+ elsif @type == 'integer'
13
+ n
14
+ else
15
+ "#{@name} #{n}"
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,63 @@
1
+ Feature: Manage <%= plural_name %>
2
+ In order to [goal]
3
+ [stakeholder]
4
+ wants [behaviour]
5
+
6
+ Scenario: Register new <%= singular_name %>
7
+ Given I am on the new <%= singular_name %> page
8
+ <% keyword = 'When' -%>
9
+ <% named_args.each do |arg| -%>
10
+ <% if arg.type == 'boolean' -%>
11
+ <%= keyword %> I uncheck "<%= arg.name.humanize %>"
12
+ <% else -%>
13
+ <%= keyword %> I fill in "<%= arg.name.humanize %>" with "<%= arg.value(1) %>"
14
+ <% end -%>
15
+ <% keyword = 'And' -%>
16
+ <% end -%>
17
+ And I press "Create"
18
+ <% keyword = 'Then' -%>
19
+ <% named_args.each do |arg| -%>
20
+ <%= keyword %> I should see "<%= arg.value(1) %>"
21
+ <% keyword = 'And' -%>
22
+ <% end -%>
23
+
24
+ <% if IO.read('features/support/env.rb') =~ /capybara/n -%>
25
+ # Rails generates Delete links that use Javascript to pop up a confirmation
26
+ # dialog and then do a HTTP POST request (emulated DELETE request).
27
+ #
28
+ # Capybara must use Culerity/Celerity or Selenium2 (webdriver) when pages rely
29
+ # on Javascript events. Only Culerity/Celerity supports clicking on confirmation
30
+ # dialogs.
31
+ #
32
+ # Since Culerity/Celerity and Selenium2 has some overhead, Cucumber-Rails will
33
+ # detect the presence of Javascript behind Delete links and issue a DELETE request
34
+ # instead of a GET request.
35
+ #
36
+ # You can turn this emulation off by tagging your scenario with @no-js-emulation.
37
+ # Turning on browser testing with @selenium, @culerity, @celerity or @javascript
38
+ # will also turn off the emulation. (See the Capybara documentation for
39
+ # details about those tags). If any of the browser tags are present, Cucumber-Rails
40
+ # will also turn off transactions and clean the database with DatabaseCleaner
41
+ # after the scenario has finished. This is to prevent data from leaking into
42
+ # the next scenario.
43
+ #
44
+ # Another way to avoid Cucumber-Rails' javascript emulation without using any
45
+ # of the tags above is to modify your views to use <button> instead. You can
46
+ # see how in http://github.com/jnicklas/capybara/issues#issue/12
47
+ #
48
+ <% if options[:capybara] -%>
49
+ @<%= options[:capybara] %>
50
+ <% end -%>
51
+ <% end -%>
52
+ Scenario: Delete <%= singular_name %>
53
+ Given the following <%= plural_name %>:
54
+ |<%= named_args.map(&:name).join('|') %>|
55
+ <% (1..4).each do |n| -%>
56
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
57
+ <% end -%>
58
+ When I delete the 3rd <%= singular_name %>
59
+ Then I should see the following <%= plural_name %>:
60
+ |<%= named_args.map{|arg| arg.name.humanize}.join('|') %>|
61
+ <% [1,2,4].each do |n| -%>
62
+ |<%= named_args.map{|arg| arg.value(n)}.join('|') %>|
63
+ <% end -%>
@@ -0,0 +1,14 @@
1
+ Given /^the following <%= plural_name %>:$/ do |<%= plural_name %>|
2
+ <%= class_name %>.create!(<%= plural_name %>.hashes)
3
+ end
4
+
5
+ When /^I delete the (\d+)(?:st|nd|rd|th) <%= singular_name %>$/ do |pos|
6
+ visit <%= plural_name %>_path
7
+ within("table tr:nth-child(#{pos.to_i+1})") do
8
+ click_link "Destroy"
9
+ end
10
+ end
11
+
12
+ Then /^I should see the following <%= plural_name %>:$/ do |expected_<%= plural_name %>_table|
13
+ expected_<%= plural_name %>_table.diff!(tableish('table tr', 'td,th'))
14
+ end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Sets up Cucumber in your Rails project. After running this generator you will
3
+ get a new rake task called features.
4
+
5
+ This also generates the necessary files in the features directory.
6
+
7
+ Also see the cucumber:feature generator.
8
+
9
+ Examples:
10
+ `rails generate cucumber:install`
11
+
12
+ `rails generate cucumber:install --help`
13
+
14
+ You can also provide a language argument for localized web_steps:
15
+ `rails generate cucumber:install de`
@@ -0,0 +1,88 @@
1
+ require 'rbconfig'
2
+
3
+ module Cucumber
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
8
+
9
+ argument :language, :type => :string, :banner => "LANG", :optional => true
10
+
11
+ class_option :rspec, :type => :boolean, :desc => "Use RSpec"
12
+ class_option :testunit, :type => :boolean, :desc => "Use Test::Unit"
13
+ class_option :spork, :type => :boolean, :desc => "Use Spork"
14
+ class_option :skip_database, :type => :boolean, :desc => "Skip modification of database.yml", :aliases => '-D', :default => false
15
+
16
+ attr_reader :framework
17
+
18
+ def create_templates
19
+ template 'config/cucumber.yml.erb', 'config/cucumber.yml'
20
+ end
21
+
22
+ def create_scripts
23
+ copy_file 'script/cucumber', 'script/cucumber'
24
+ chmod 'script/cucumber', 0755
25
+ end
26
+
27
+ def create_step_definitions
28
+ empty_directory 'features/step_definitions'
29
+
30
+ template "step_definitions/web_steps.rb.erb", 'features/step_definitions/web_steps.rb'
31
+ if language
32
+ template "step_definitions/web_steps_#{language}.rb.erb", "features/step_definitions/web_steps_#{language}.rb"
33
+ end
34
+ end
35
+
36
+ def create_feature_support
37
+ empty_directory 'features/support'
38
+ copy_file 'support/paths.rb', 'features/support/paths.rb'
39
+ copy_file 'support/selectors.rb', 'features/support/selectors.rb'
40
+
41
+ if spork?
42
+ template 'support/rails_spork.rb.erb', 'features/support/env.rb'
43
+ else
44
+ template 'support/rails.rb.erb', 'features/support/env.rb'
45
+ end
46
+ end
47
+
48
+ def create_tasks
49
+ empty_directory 'lib/tasks'
50
+ template 'tasks/cucumber.rake.erb', 'lib/tasks/cucumber.rake'
51
+ end
52
+
53
+ def create_database
54
+ return unless File.exist?('config/database.yml')
55
+ unless File.read('config/database.yml').include? 'cucumber:'
56
+ gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
57
+ gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test"
58
+
59
+ # Since gsub_file doesn't ask the user, just inform user that the file was overwritten.
60
+ puts " force config/database.yml"
61
+ end
62
+ end
63
+
64
+ protected
65
+
66
+ def spork?
67
+ options[:spork]
68
+ end
69
+
70
+ def embed_file(source, indent='')
71
+ IO.read(File.join(self.class.source_root, source)).gsub(/^/, indent)
72
+ end
73
+
74
+ def embed_template(source, indent='')
75
+ template = File.join(self.class.source_root, source)
76
+ ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
77
+ end
78
+
79
+ private
80
+
81
+ def framework_from_options
82
+ return 'rspec-rails' if options[:rspec]
83
+ return 'testunit' if options[:testunit]
84
+ return 'rspec-rails'
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,8 @@
1
+ <%%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
5
+ %>
6
+ default: <%= spork? ? '--drb ' : '' %><%%= std_opts %> features
7
+ wip: <%= spork? ? '--drb ' : '' %>--tags @wip:3 --wip features
8
+ rerun: <%= spork? ? '--drb ' : '' %><%%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
4
+ if vendored_cucumber_bin
5
+ load File.expand_path(vendored_cucumber_bin)
6
+ else
7
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
8
+ require 'cucumber'
9
+ load Cucumber::BINARY
10
+ end
@@ -0,0 +1,192 @@
1
+ <%= embed_file('support/web_steps_warning.txt') %>
2
+
3
+ require 'uri'
4
+ require 'cgi'
5
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
6
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "selectors"))
7
+
8
+ module WithinHelpers
9
+ def with_scope(locator)
10
+ locator ? within(*selector_for(locator)) { yield } : yield
11
+ end
12
+ end
13
+ World(WithinHelpers)
14
+
15
+ # Single-line step scoper
16
+ When /^(.*) within (.*[^:])$/ do |step, parent|
17
+ with_scope(parent) { When step }
18
+ end
19
+
20
+ # Multi-line step scoper
21
+ When /^(.*) within (.*[^:]):$/ do |step, parent, table_or_string|
22
+ with_scope(parent) { When "#{step}:", table_or_string }
23
+ end
24
+
25
+ Given /^(?:|I )am on (.+)$/ do |page_name|
26
+ visit path_to(page_name)
27
+ end
28
+
29
+ When /^(?:|I )go to (.+)$/ do |page_name|
30
+ visit path_to(page_name)
31
+ end
32
+
33
+ When /^(?:|I )press "([^"]*)"$/ do |button|
34
+ click_button(button)
35
+ end
36
+
37
+ When /^(?:|I )follow "([^"]*)"$/ do |link|
38
+ click_link(link)
39
+ end
40
+
41
+ When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
42
+ fill_in(field, :with => value)
43
+ end
44
+
45
+ When /^(?:|I )fill in "([^"]*)" for "([^"]*)"$/ do |value, field|
46
+ fill_in(field, :with => value)
47
+ end
48
+
49
+ # Use this to fill in an entire form with data from a table. Example:
50
+ #
51
+ # When I fill in the following:
52
+ # | Account Number | 5002 |
53
+ # | Expiry date | 2009-11-01 |
54
+ # | Note | Nice guy |
55
+ # | Wants Email? | |
56
+ #
57
+ # TODO: Add support for checkbox, select og option
58
+ # based on naming conventions.
59
+ #
60
+ When /^(?:|I )fill in the following:$/ do |fields|
61
+ fields.rows_hash.each do |name, value|
62
+ When %{I fill in "#{name}" with "#{value}"}
63
+ end
64
+ end
65
+
66
+ When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
67
+ select(value, :from => field)
68
+ end
69
+
70
+ When /^(?:|I )check "([^"]*)"$/ do |field|
71
+ check(field)
72
+ end
73
+
74
+ When /^(?:|I )uncheck "([^"]*)"$/ do |field|
75
+ uncheck(field)
76
+ end
77
+
78
+ When /^(?:|I )choose "([^"]*)"$/ do |field|
79
+ choose(field)
80
+ end
81
+
82
+ When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field|
83
+ attach_file(field, File.expand_path(path))
84
+ end
85
+
86
+ Then /^(?:|I )should see "([^"]*)"$/ do |text|
87
+ if page.respond_to? :should
88
+ page.should have_content(text)
89
+ else
90
+ assert page.has_content?(text)
91
+ end
92
+ end
93
+
94
+ Then /^(?:|I )should see \/([^\/]*)\/$/ do |regexp|
95
+ regexp = Regexp.new(regexp)
96
+
97
+ if page.respond_to? :should
98
+ page.should have_xpath('//*', :text => regexp)
99
+ else
100
+ assert page.has_xpath?('//*', :text => regexp)
101
+ end
102
+ end
103
+
104
+ Then /^(?:|I )should not see "([^"]*)"$/ do |text|
105
+ if page.respond_to? :should
106
+ page.should have_no_content(text)
107
+ else
108
+ assert page.has_no_content?(text)
109
+ end
110
+ end
111
+
112
+ Then /^(?:|I )should not see \/([^\/]*)\/$/ do |regexp|
113
+ regexp = Regexp.new(regexp)
114
+
115
+ if page.respond_to? :should
116
+ page.should have_no_xpath('//*', :text => regexp)
117
+ else
118
+ assert page.has_no_xpath?('//*', :text => regexp)
119
+ end
120
+ end
121
+
122
+ Then /^the "([^"]*)" field(?: within (.*))? should contain "([^"]*)"$/ do |field, parent, value|
123
+ with_scope(parent) do
124
+ field = find_field(field)
125
+ field_value = (field.tag_name == 'textarea') ? field.text : field.value
126
+ if field_value.respond_to? :should
127
+ field_value.should =~ /#{value}/
128
+ else
129
+ assert_match(/#{value}/, field_value)
130
+ end
131
+ end
132
+ end
133
+
134
+ Then /^the "([^"]*)" field(?: within (.*))? should not contain "([^"]*)"$/ do |field, parent, value|
135
+ with_scope(parent) do
136
+ field = find_field(field)
137
+ field_value = (field.tag_name == 'textarea') ? field.text : field.value
138
+ if field_value.respond_to? :should_not
139
+ field_value.should_not =~ /#{value}/
140
+ else
141
+ assert_no_match(/#{value}/, field_value)
142
+ end
143
+ end
144
+ end
145
+
146
+ Then /^the "([^"]*)" checkbox(?: within (.*))? should be checked$/ do |label, parent|
147
+ with_scope(parent) do
148
+ field_checked = find_field(label)['checked']
149
+ if field_checked.respond_to? :should
150
+ field_checked.should be_true
151
+ else
152
+ assert field_checked
153
+ end
154
+ end
155
+ end
156
+
157
+ Then /^the "([^"]*)" checkbox(?: within (.*))? should not be checked$/ do |label, parent|
158
+ with_scope(parent) do
159
+ field_checked = find_field(label)['checked']
160
+ if field_checked.respond_to? :should
161
+ field_checked.should be_false
162
+ else
163
+ assert !field_checked
164
+ end
165
+ end
166
+ end
167
+
168
+ Then /^(?:|I )should be on (.+)$/ do |page_name|
169
+ current_path = URI.parse(current_url).path
170
+ if current_path.respond_to? :should
171
+ current_path.should == path_to(page_name)
172
+ else
173
+ assert_equal path_to(page_name), current_path
174
+ end
175
+ end
176
+
177
+ Then /^(?:|I )should have the following query string:$/ do |expected_pairs|
178
+ query = URI.parse(current_url).query
179
+ actual_params = query ? CGI.parse(query) : {}
180
+ expected_params = {}
181
+ expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')}
182
+
183
+ if actual_params.respond_to? :should
184
+ actual_params.should == expected_params
185
+ else
186
+ assert_equal expected_params, actual_params
187
+ end
188
+ end
189
+
190
+ Then /^show me the page$/ do
191
+ save_and_open_page
192
+ end