casecumber-rails 1.0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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,89 @@
1
+ Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support$/ do |app_name|
2
+ steps %Q{
3
+ When I successfully run `rails new #{app_name}`
4
+ Then it should pass with:
5
+ """
6
+ README
7
+ """
8
+ And I cd to "#{app_name}"
9
+ And I append to "Gemfile" with:
10
+ """
11
+ gem "cucumber-rails", :group => :test, :path => "../../.."
12
+ gem "capybara", :group => :test
13
+ gem "rspec-rails", :group => :test
14
+ gem "database_cleaner", :group => :test
15
+ gem 'factory_girl', :group => :test
16
+
17
+ """
18
+ And I successfully run `bundle exec rails generate cucumber:install`
19
+ }
20
+ if(ENV['ARUBA_REPORT_DIR'])
21
+ @aruba_report_start = Time.new
22
+ sleep(1)
23
+ end
24
+ end
25
+
26
+ Given /^a project without ActiveRecord$/ do
27
+ steps %Q{
28
+ Given I successfully run `rails new cuke-app`
29
+ And I cd to "cuke-app"
30
+ And I append to "Gemfile" with:
31
+ """
32
+ gem "cucumber-rails", :group => :test, :path => "../../.."
33
+ gem "capybara", :group => :test
34
+ gem "rspec-rails", :group => :test
35
+
36
+ """
37
+ And I successfully run `bundle exec rails generate cucumber:install`
38
+ And I overwrite "features/support/env.rb" with:
39
+ """
40
+ require 'cucumber/rails'
41
+
42
+ """
43
+
44
+ And I write to "config/application.rb" with:
45
+ """
46
+ require File.expand_path('../boot', __FILE__)
47
+
48
+ require 'action_controller/railtie'
49
+ require 'action_mailer/railtie'
50
+ require 'active_resource/railtie'
51
+ require 'rails/test_unit/railtie'
52
+
53
+ Bundler.require(:default, Rails.env) if defined?(Bundler)
54
+
55
+ module CukeApp
56
+ class Application < Rails::Application
57
+ config.encoding = "utf-8"
58
+ config.filter_parameters += [:password]
59
+ end
60
+ end
61
+
62
+ """
63
+ And I remove the file "config/database.yml"
64
+ }
65
+ if(ENV['ARUBA_REPORT_DIR'])
66
+ @aruba_report_start = Time.new
67
+ sleep(1)
68
+ end
69
+ end
70
+
71
+ And /^a cukes resource$/ do
72
+ steps %Q{
73
+ Given I write to "config/routes.rb" with:
74
+ """
75
+ CukeApp::Application.routes.draw do
76
+ resources :cukes
77
+ end
78
+
79
+ """
80
+ And I write to "app/controllers/cukes_controller.rb" with:
81
+ """
82
+ class CukesController < ApplicationController
83
+ def index
84
+ end
85
+ end
86
+
87
+ """
88
+ }
89
+ end
@@ -0,0 +1,37 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ require 'rspec/expectations'
5
+ require 'aruba/cucumber'
6
+
7
+ Before do
8
+ @aruba_timeout_seconds = 120 # A long time needed some times
9
+ unset_bundler_env_vars
10
+ end
11
+
12
+ if(ENV['ARUBA_REPORT_DIR'])
13
+ # Override reporting behaviour so we don't document all files, only the ones
14
+ # that have been created after @aruba_report_start (a Time object). This is
15
+ # given a value after the Rails app is generated (see cucumber_rails_steps.rb)
16
+ module Aruba
17
+ module Reporting
18
+ def children(dir)
19
+ children = Dir["#{dir}/*"].sort
20
+
21
+ # include
22
+ children = children.select do |child|
23
+ File.directory?(child) ||
24
+ (@aruba_report_start && File.stat(child).mtime > @aruba_report_start)
25
+ end
26
+
27
+ # exclude
28
+ children = children.reject do |child|
29
+ child =~ /Gemfile/ ||
30
+ child =~ /\.log$/
31
+ end
32
+
33
+ children
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ Feature: Run with Test::Unit
2
+
3
+ Scenario: Delete a widget
4
+ Given I have created a new Rails 3 app "widgets" with cucumber-rails support
5
+ And I overwrite "Gemfile" with:
6
+ """
7
+ gem 'rails'
8
+ gem 'sqlite3'
9
+ gem "cucumber-rails", :group => :test, :path => "../../.."
10
+ gem "capybara", :group => :test
11
+ gem "database_cleaner", :group => :test
12
+ gem 'factory_girl', :group => :test
13
+
14
+ """
15
+ And I successfully run `rails generate scaffold widget name:string`
16
+ And I write to "features/f.feature" with:
17
+ """
18
+ Feature: Widget inventory
19
+ Scenario: Delete a widget
20
+ Given there is a widget named "wrench"
21
+ When I go to the widgets page
22
+ Then I should see "wrench"
23
+ """
24
+ And I write to "features/step_definitions/s.rb" with:
25
+ """
26
+ Given /^there is a widget named "([^"]*)"$/ do |name|
27
+ Factory(:widget, :name => name)
28
+ end
29
+ """
30
+ And I write to "features/support/factories.rb" with:
31
+ """
32
+ Factory.define :widget do |f|
33
+ f.name 'testwidget'
34
+ end
35
+ """
36
+ When I run `bundle exec rake db:migrate`
37
+ And I run `bundle exec rake cucumber`
38
+ Then it should pass with:
39
+ """
40
+ 1 scenario (1 passed)
41
+ 3 steps (3 passed)
42
+ """
43
+
@@ -0,0 +1,23 @@
1
+ require 'rails'
2
+ require 'cucumber/rails/application'
3
+ ENV["RAILS_ENV"] ||= "test"
4
+ ENV["RAILS_ROOT"] ||= File.expand_path(File.dirname(caller.detect{|f| f =~ /\/env\.rb:/}) + '/../..')
5
+ require File.expand_path(ENV["RAILS_ROOT"] + '/config/environment')
6
+ require 'cucumber/rails/action_controller'
7
+
8
+ if defined?(ActiveRecord::Base)
9
+ require 'rails/test_help'
10
+ else
11
+ require 'action_dispatch/testing/test_process'
12
+ require 'action_dispatch/testing/integration'
13
+ end
14
+
15
+ if !Rails.application.config.cache_classes
16
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to cause problems with database transactions. Set config.cache_classes to true if you want to use transactions. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
17
+ end
18
+
19
+ require 'cucumber/rails/world'
20
+ require 'cucumber/rails/hooks'
21
+ require 'cucumber/rails/capybara'
22
+
23
+ require 'cucumber/web/tableish'
@@ -0,0 +1,12 @@
1
+ ActionController::Base.class_eval do
2
+ cattr_accessor :allow_rescue
3
+ end
4
+
5
+ class ActionDispatch::ShowExceptions
6
+ alias __cucumber_orig_call__ call
7
+
8
+ def call(env)
9
+ env['action_dispatch.show_exceptions'] = !!ActionController::Base.allow_rescue
10
+ __cucumber_orig_call__(env)
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'rails/application'
2
+
3
+ # Make sure the ActionDispatch::ShowExceptions middleware is always enabled,
4
+ # regardless of what is in config/environments/test.rb
5
+ # Instead we are overriding ActionDispatch::ShowExceptions to be able to
6
+ # toggle whether or not exceptions are raised.
7
+ class Rails::Application
8
+ alias __cucumber_orig_initialize__ initialize!
9
+
10
+ def initialize!
11
+ ad = config.action_dispatch
12
+ def ad.show_exceptions
13
+ true
14
+ end
15
+ __cucumber_orig_initialize__
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ require 'capybara'
2
+ require 'capybara/rails'
3
+ require 'capybara/cucumber'
4
+ require 'capybara/session'
5
+ require 'cucumber/rails/capybara/javascript_emulation'
6
+ require 'cucumber/rails/capybara/select_dates_and_times'
@@ -0,0 +1,83 @@
1
+ module Cucumber
2
+ module Rails
3
+ module Capybara
4
+ module JavascriptEmulation
5
+ def self.included(base)
6
+ base.class_eval do
7
+ alias_method :click_without_javascript_emulation, :click
8
+ alias_method :click, :click_with_javascript_emulation
9
+ end
10
+ end
11
+
12
+ def click_with_javascript_emulation
13
+ if link_with_non_get_http_method?
14
+ ::Capybara::RackTest::Form.new(driver, js_form(element_node.document, self[:href], emulated_method)).submit(self)
15
+ else
16
+ click_without_javascript_emulation
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def js_form(document, action, emulated_method, method = 'POST')
23
+ js_form = document.create_element('form')
24
+ js_form['action'] = action
25
+ js_form['method'] = method
26
+
27
+ if emulated_method and emulated_method.downcase != method.downcase
28
+ input = document.create_element('input')
29
+ input['type'] = 'hidden'
30
+ input['name'] = '_method'
31
+ input['value'] = emulated_method
32
+ js_form.add_child(input)
33
+ end
34
+
35
+ js_form
36
+ end
37
+
38
+ def link_with_non_get_http_method?
39
+ if ::Rails.version.to_f >= 3.0
40
+ tag_name == 'a' && element_node['data-method'] && element_node['data-method'] =~ /(?:delete|put|post)/
41
+ else
42
+ tag_name == 'a' && element_node['onclick'] && element_node['onclick'] =~ /var f = document\.createElement\('form'\); f\.style\.display = 'none';/
43
+ end
44
+ end
45
+
46
+ def emulated_method
47
+ if ::Rails.version.to_f >= 3.0
48
+ element_node['data-method']
49
+ else
50
+ element_node['onclick'][/m\.setAttribute\('value', '([^']*)'\)/, 1]
51
+ end
52
+ end
53
+
54
+ def element_node
55
+ if self.respond_to? :native
56
+ self.native
57
+ else
58
+ warn "DEPRECATED: cucumber-rails loves you, just not your version of Capybara. Please update Capybara to >= 0.4.0"
59
+ self.node
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ class Capybara::RackTest::Node
68
+ include ::Cucumber::Rails::Capybara::JavascriptEmulation
69
+ end
70
+
71
+ Before('~@no-js-emulation') do
72
+ # Enable javascript emulation
73
+ ::Capybara::RackTest::Node.class_eval do
74
+ alias_method :click, :click_with_javascript_emulation
75
+ end
76
+ end
77
+
78
+ Before('@no-js-emulation') do
79
+ # Disable javascript emulation
80
+ ::Capybara::RackTest::Node.class_eval do
81
+ alias_method :click, :click_without_javascript_emulation
82
+ end
83
+ end
@@ -0,0 +1,50 @@
1
+ module Cucumber
2
+ module Rails
3
+ module Capybara
4
+ module SelectDatesAndTimes
5
+ def select_date(field, options = {})
6
+ date = Date.parse(options[:with])
7
+ base_dom_id = get_base_dom_id_from_label_tag(field)
8
+
9
+ find(:xpath, "//select[@id='#{base_dom_id}_1i']").select(date.year.to_s)
10
+ find(:xpath, "//select[@id='#{base_dom_id}_2i']").select(I18n.l date, :format => '%B')
11
+ find(:xpath, "//select[@id='#{base_dom_id}_3i']").select(date.day.to_s)
12
+ end
13
+
14
+ def select_time(field, options = {})
15
+ time = Time.zone.parse(options[:with])
16
+ base_dom_id = get_base_dom_id_from_label_tag(field)
17
+
18
+ find(:xpath, "//select[@id='#{base_dom_id}_4i']").select(time.hour.to_s.rjust(2, '0'))
19
+ find(:xpath, "//select[@id='#{base_dom_id}_5i']").select(time.min.to_s.rjust(2, '0'))
20
+ end
21
+
22
+ def select_datetime(field, options = {})
23
+ select_date(field, options)
24
+ select_time(field, options)
25
+ end
26
+
27
+ private
28
+
29
+ # @example "event_starts_at_"
30
+ def get_base_dom_id_from_label_tag(field)
31
+ find(:xpath, "//label[contains(., '#{field}')]")['for'].gsub(/(_[1-5]i)$/, '')
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ World(::Cucumber::Rails::Capybara::SelectDatesAndTimes)
39
+
40
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" time$/ do |time, selector|
41
+ select_time(selector, :with => time)
42
+ end
43
+
44
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" date$/ do |date, selector|
45
+ select_date(selector, :with => date)
46
+ end
47
+
48
+ When /^(?:|I )select "([^"]+)" as the "([^"]+)" date and time$/ do |datetime, selector|
49
+ select_datetime(selector, :with => datetime)
50
+ end
@@ -0,0 +1,4 @@
1
+ require 'cucumber/rails/hooks/active_record'
2
+ require 'cucumber/rails/hooks/database_cleaner'
3
+ require 'cucumber/rails/hooks/allow_rescue'
4
+ require 'cucumber/rails/hooks/mail'
@@ -0,0 +1,21 @@
1
+ if defined?(ActiveRecord::Base)
2
+ class ActiveRecord::Base
3
+ mattr_accessor :shared_connection
4
+ @@shared_connection = nil
5
+
6
+ def self.connection
7
+ @@shared_connection || retrieve_connection
8
+ end
9
+ end
10
+
11
+ Before('@javascript') do
12
+ # Forces all threads to share the same connection. This works on
13
+ # Capybara because it starts the web server in a thread.
14
+ ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
15
+ end
16
+
17
+ Before('~@javascript') do
18
+ # Do not use a shared connection unless we're in a @javascript scenario
19
+ ActiveRecord::Base.shared_connection = nil
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ Before('@allow-rescue') do
2
+ @__orig_allow_rescue = ActionController::Base.allow_rescue
3
+ ActionController::Base.allow_rescue = true
4
+ end
5
+
6
+ After('@allow-rescue') do
7
+ ActionController::Base.allow_rescue = @__orig_allow_rescue
8
+ end
@@ -0,0 +1,13 @@
1
+ begin
2
+ require 'database_cleaner'
3
+
4
+ Before('~@no-database-cleaner') do
5
+ DatabaseCleaner.start
6
+ end
7
+
8
+ After('~@no-database-cleaner') do
9
+ DatabaseCleaner.clean
10
+ end
11
+
12
+ rescue LoadError => ignore_if_database_cleaner_not_present
13
+ end
@@ -0,0 +1,5 @@
1
+ if defined?(ActionMailer::Base)
2
+ Before do
3
+ ActionMailer::Base.deliveries = []
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ require 'cucumber/rails/world'
2
+
3
+ begin
4
+ require 'rspec/rails/matchers'
5
+
6
+ [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
7
+ klass.class_eval do
8
+ include RSpec::Matchers
9
+ end
10
+ end
11
+ rescue LoadError => try_rspec_1
12
+ require 'spec/expectations'
13
+ require 'spec/rails'
14
+
15
+ [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
16
+ klass.class_eval do
17
+ include Spec::Matchers
18
+ include Spec::Rails::Matchers if defined?(Spec::Rails::Matchers)
19
+ end
20
+ end
21
+ end