acceptance_test 1.5.5 → 1.6.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.
Files changed (32) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGES +5 -1
  3. data/Gemfile +4 -1
  4. data/Gemfile.lock +11 -11
  5. data/Rakefile +0 -6
  6. data/features/wikipedia/step_definitions/steps.rb +2 -2
  7. data/lib/acceptance_test/acceptance_test.rb +57 -140
  8. data/lib/acceptance_test/driver_manager.rb +138 -0
  9. data/lib/acceptance_test/{gherkin_helper.rb → gherkin_ext.rb} +2 -5
  10. data/lib/acceptance_test/page_set.rb +38 -1
  11. data/lib/acceptance_test/turnip_ext.rb +177 -0
  12. data/lib/acceptance_test/version.rb +1 -1
  13. data/lib/tasks/rspec.rake +7 -0
  14. data/spec/{features/data.csv → data.csv} +0 -0
  15. data/spec/features/search_with_drivers.feature +4 -3
  16. data/spec/features/search_with_examples_from_csv.feature +1 -1
  17. data/spec/features/search_with_pages.feature +13 -0
  18. data/spec/support/pages/main_page.rb +17 -0
  19. data/spec/support/{wikipedia/wikipedia_page_set.rb → pages/wikipedia_pages.rb} +8 -5
  20. data/spec/{features → support}/steps/common_steps.rb +0 -0
  21. data/spec/{features → support}/steps/search_with_drivers_steps.rb +2 -17
  22. data/spec/{features → support}/steps/search_with_examples_from_csv_steps.rb +1 -1
  23. data/spec/support/steps/search_with_pages_steps.rb +37 -0
  24. data/spec/{features → support}/steps/search_with_table_steps.rb +1 -1
  25. data/spec/test_helper.rb +1 -0
  26. data/spec/turnip_helper.rb +8 -9
  27. data/spec/wikipedia_search_spec.rb +5 -0
  28. data/spec/wikipedia_search_with_pages_spec.rb +8 -8
  29. metadata +26 -19
  30. data/lib/acceptance_test/turnip_helper.rb +0 -76
  31. data/spec/support/wikipedia/main_page.rb +0 -13
  32. data/turnip +0 -1
@@ -1,11 +1,8 @@
1
- require 'singleton'
2
-
3
1
  require 'gherkin/lexer/i18n_lexer'
4
2
 
5
- class GherkinHelper
6
- include Singleton
3
+ class GherkinExt
7
4
 
8
- def enable_external_source data_reader
5
+ def self.enable_external_source data_reader
9
6
  lexer = Gherkin::Lexer::I18nLexer
10
7
 
11
8
  lexer.class_eval do
@@ -5,8 +5,14 @@ require 'acceptance_test/page'
5
5
  class PageSet
6
6
  extend Forwardable
7
7
 
8
+ attr_reader :pages
8
9
  attr_accessor :session
9
10
 
11
+ def initialize session=nil
12
+ @session = session
13
+ @pages = []
14
+ end
15
+
10
16
  def page
11
17
  session
12
18
  end
@@ -22,16 +28,47 @@ class PageSet
22
28
  end
23
29
 
24
30
  def delegate_to_page page
31
+ @pages << page
32
+
25
33
  self.class.send :attr_reader, page
26
34
 
35
+ self.class.def_delegators page, *page_methods(page)
36
+ end
37
+
38
+ def page_methods page
27
39
  clazz = self.send(page).class
28
40
 
29
- self.class.def_delegators page, *(clazz.instance_methods - Page.instance_methods)
41
+ clazz.instance_methods - Page.instance_methods
42
+ end
43
+
44
+ def enable_smart_completion context
45
+ if context
46
+ context.class.send(:define_method, :method_missing) do |method_name, *args, &block|
47
+ page_set.send method_name, *args, &block
48
+ end
49
+
50
+ page_set = self
51
+
52
+ pages.each do |page|
53
+ page_methods(page).each do |method_name|
54
+ method = page_set.method(method_name)
55
+
56
+ context.class.step "I #{method_name.to_s.gsub('_', ' ')}" do |*args|
57
+ page_set.send method_name, *args
58
+ end
59
+
60
+ context.class.step "#{method.to_s.gsub('_', ' ')}" do
61
+ page_set.send method_name, *args
62
+ end
63
+ end
64
+ end
30
65
  end
66
+ end
31
67
 
32
68
  private
33
69
 
34
70
  def camelize string
35
71
  string.split("_").each {|s| s.capitalize! }.join("")
36
72
  end
73
+
37
74
  end
@@ -0,0 +1,177 @@
1
+ require 'turnip/define'
2
+
3
+ class TurnipExt
4
+ def self.shared_context_with_turnip context_name
5
+ turnip_rspec = Turnip::RSpec
6
+
7
+ turnip_rspec.class_eval do
8
+ @context_name = context_name # class instance variable
9
+
10
+ def self.context_name # access to class instance variable
11
+ @context_name
12
+ end
13
+
14
+ class << self
15
+ def run(feature_file)
16
+ Turnip::Builder.build(feature_file).features.each do |feature|
17
+ ::RSpec.describe feature.name, feature.metadata_hash do
18
+
19
+ include_context Turnip::RSpec.context_name
20
+
21
+ before do
22
+ example = Turnip::RSpec.fetch_current_example(self)
23
+ # This is kind of a hack, but it will make RSpec throw way nicer exceptions
24
+ example.metadata[:file_path] ||= feature_file
25
+
26
+ feature.backgrounds.map(&:steps).flatten.each do |step|
27
+ run_step(feature_file, step)
28
+ end
29
+ end
30
+ feature.scenarios.each do |scenario|
31
+ instance_eval <<-EOS, feature_file, scenario.line
32
+ describe scenario.name, scenario.metadata_hash do it(scenario.steps.map(&:to_s).join(' -> ')) do
33
+ scenario.steps.each do |step|
34
+ run_step(feature_file, step)
35
+ end
36
+ end
37
+ end
38
+ EOS
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.build_dynamic_steps page_set, context
48
+ # if context
49
+ # context.class.send(:define_method, :method_missing) do |meth, *args, &block|
50
+ # page_set.send meth, *args, &block
51
+ # end
52
+ # end
53
+
54
+ ##self.class.step :enter_word, "I enter word :word"
55
+
56
+ # turnip_rspec_execute = Turnip::RSpec::Execute
57
+ #
58
+ # turnip_rspec_execute.class_eval do
59
+ # alias_method :old_run_step, :run_step
60
+ #
61
+ # def run_step(feature_file, step)
62
+ # begin
63
+ # instance_eval <<-EOS, feature_file, step.line
64
+ # step(step)
65
+ # EOS
66
+ # rescue Turnip::Pending => e
67
+ #
68
+ # # instance_eval <<-EOS, feature_file, step.line
69
+ # # step(:visit_home_page, "I am on wikipedia.com")
70
+ # # EOS
71
+ #
72
+ # # page_set.pages.each do |page|
73
+ # # page_set.page_methods(page).each do |method|
74
+ # # context.class.step "I #{method.to_s.gsub('_', ' ')}" do
75
+ # # send method
76
+ # # end
77
+ # #
78
+ # # # context.class.step method, "I #{method.to_s.gsub('_', ' ')}"
79
+ # # #
80
+ # # # context.class.step method, "#{method.to_s.gsub('_', ' ')}"
81
+ # # end
82
+ # # end
83
+ #
84
+ # old_run_step feature_file, step
85
+ # end
86
+ # end
87
+ # end
88
+
89
+
90
+ # page_set.pages.each do |page|
91
+ # page_set.page_methods(page).each do |method|
92
+ # page_set.class.step "I #{method.to_s.gsub('_', ' ')}" do
93
+ # send method
94
+ # end
95
+ #
96
+ # page_set.class.step "#{method.to_s.gsub('_', ' ')}" do
97
+ # send method
98
+ # end
99
+ # end
100
+ # end
101
+ end
102
+
103
+ def extend_turnip
104
+ turnip_define = Turnip::Define
105
+
106
+ turnip_define.class_eval do
107
+ def before &block
108
+ send(:define_method, "before", &block) if block
109
+ end
110
+
111
+ def after &block
112
+ send(:define_method, "after", &block) if block
113
+ end
114
+ end
115
+
116
+ turnip_rspec_execute = Turnip::RSpec::Execute
117
+
118
+ turnip_rspec_execute.class_eval do
119
+ def run_before rspec_root
120
+ self.class.send(:define_method, :rspec_root, lambda { rspec_root })
121
+
122
+ before
123
+ end
124
+
125
+ def run_after rspec_root
126
+ self.class.send(:define_method, :rspec_root, lambda { rspec_root })
127
+
128
+ after
129
+ end
130
+ end
131
+
132
+ turnip_rspec = Turnip::RSpec
133
+
134
+ turnip_rspec.class_eval do
135
+ @shared_context_name = shared_context_name # class instance variable
136
+
137
+ def self.shared_context_name # access to class instance variable
138
+ @shared_context_name
139
+ end
140
+
141
+ class << self
142
+ def run(feature_file)
143
+ Turnip::Builder.build(feature_file).features.each do |feature|
144
+ ::RSpec.describe feature.name, feature.metadata_hash do
145
+ rspec_root = self
146
+
147
+ before do
148
+ run_before rspec_root
149
+ example = Turnip::RSpec.fetch_current_example(self)
150
+ # This is kind of a hack, but it will make RSpec throw way nicer exceptions
151
+ example.metadata[:file_path] ||= feature_file
152
+
153
+ feature.backgrounds.map(&:steps).flatten.each do |step|
154
+ run_step(feature_file, step)
155
+ end
156
+ end
157
+ feature.scenarios.each do |scenario|
158
+ instance_eval <<-EOS, feature_file, scenario.line
159
+ describe scenario.name, scenario.metadata_hash do it(scenario.steps.map(&:to_s).join(' -> ')) do
160
+ scenario.steps.each do |step|
161
+ run_step(feature_file, step)
162
+ end
163
+ end
164
+ end
165
+ EOS
166
+ end
167
+ after do
168
+ run_after rspec_root
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+
177
+ end
@@ -1,3 +1,3 @@
1
1
  class AcceptanceTest
2
- VERSION = "1.5.5"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -0,0 +1,7 @@
1
+ namespace :spec do
2
+ desc 'Run turnip acceptance tests'
3
+ RSpec::Core::RakeTask.new :turnip do |t|
4
+ t.pattern = './spec{,/*/**}/*.feature'
5
+ t.rspec_opts = ['-r turnip/rspec']
6
+ end
7
+ end
File without changes
@@ -4,13 +4,14 @@ Feature: Using Wikipedia
4
4
  Given I am within wikipedia.com
5
5
 
6
6
  @selenium
7
+ @chrome
7
8
  @search_with_drivers
8
9
  Scenario: Searching with selenium for a term with submit
9
10
 
10
11
  Given I am on wikipedia.com
11
12
  When I enter word "Capybara"
12
13
  And I click submit button
13
- Then I should see "Capybara"
14
+ Then I should see "Hydrochoerus hydrochaeris"
14
15
 
15
16
  @webkit
16
17
  @search_with_drivers
@@ -19,7 +20,7 @@ Feature: Using Wikipedia
19
20
  Given I am on wikipedia.com
20
21
  When I enter word "Capybara"
21
22
  And I click submit button
22
- Then I should see "Capybara"
23
+ Then I should see "Hydrochoerus hydrochaeris"
23
24
 
24
25
  @poltergeist
25
26
  @search_with_drivers
@@ -28,4 +29,4 @@ Feature: Using Wikipedia
28
29
  Given I am on wikipedia.com
29
30
  When I enter word "Capybara"
30
31
  And I click submit button
31
- Then I should see "Capybara"
32
+ Then I should see "Hydrochoerus hydrochaeris"
@@ -29,4 +29,4 @@ Feature: Using Wikipedia
29
29
 
30
30
  Examples:
31
31
  | keyword | result |
32
- | file:spec/features/data.csv ||
32
+ | file:spec/data.csv ||
@@ -0,0 +1,13 @@
1
+ Feature: Using Wikipedia
2
+
3
+ Background: within wikipedia.com context
4
+ Given I am within wikipedia.com
5
+
6
+ @selenium
7
+ @search_with_pages
8
+ Scenario: Searching with selenium for a term with submit
9
+
10
+ Given I am on wikipedia.com
11
+ When I enter word "Capybara"
12
+ And I submit request
13
+ Then I should see "Capybara"
@@ -0,0 +1,17 @@
1
+ require 'acceptance_test/page'
2
+
3
+ class MainPage < Page
4
+ def visit_home_page
5
+ session.visit('/')
6
+ end
7
+
8
+ def enter_word word
9
+ with_session do
10
+ fill_in "searchInput", :with => word
11
+ end
12
+ end
13
+
14
+ def submit_request
15
+ session.find(".formBtn", match: :first).click
16
+ end
17
+ end
@@ -1,18 +1,21 @@
1
1
  require 'rspec/expectations'
2
2
  require 'acceptance_test/page_set'
3
3
 
4
- require 'wikipedia/main_page'
4
+ require 'pages/main_page'
5
5
 
6
- class WikipediaPageSet < PageSet
6
+ class WikipediaPages < PageSet
7
7
  include Capybara::DSL
8
8
  include RSpec::Matchers
9
9
 
10
- def initialize session=nil
11
- @session = session
10
+ attr_reader :context
11
+
12
+ def initialize session
13
+ super session
12
14
 
13
15
  @main_page = MainPage.new self
14
16
 
15
17
  delegate_to_pages :main_page
16
18
  end
17
19
 
18
- end
20
+ end
21
+
File without changes
@@ -1,27 +1,12 @@
1
- require 'features/steps/common_steps'
2
-
3
- RSpec.configure do |config|
4
- config.before(:search_with_drivers => true) do |example|
5
- AcceptanceTest.instance.configure_rspec example
6
- end
7
- end
1
+ require 'steps/common_steps'
8
2
 
9
3
  steps_for :search_with_drivers do
10
4
  include CommonSteps
11
5
 
12
- # before do
13
- # AcceptanceTest.instance.configure_rspec rspec_root
14
- #
15
- # end
16
- #
17
- # after do
18
- # puts "after"
19
- # end
20
-
21
6
  step "I am within wikipedia.com" do
22
7
  puts Capybara.current_driver
23
8
 
24
- AcceptanceTest.instance.set_app_host
9
+ AcceptanceTest.instance.setup
25
10
  end
26
11
 
27
12
  step "I am on wikipedia.com" do
@@ -1,7 +1,7 @@
1
1
  steps_for :search_with_examples_from_csv do
2
2
 
3
3
  step "I am within wikipedia.com" do
4
- self.class.include_context "SearchWithExamplesFromCsvAcceptanceTest"
4
+ AcceptanceTest.instance.setup
5
5
  end
6
6
 
7
7
  step "I am on wikipedia.com" do
@@ -0,0 +1,37 @@
1
+ require 'steps/common_steps'
2
+ require 'pages/wikipedia_pages'
3
+
4
+ steps_for :search_with_pages do
5
+ include CommonSteps
6
+
7
+ attr_reader :page_set
8
+
9
+ step "I am within wikipedia.com" do
10
+ AcceptanceTest.instance.setup
11
+
12
+ puts Capybara.current_driver
13
+
14
+ @page_set = WikipediaPages.new(page)
15
+
16
+ page_set.enable_smart_completion(self)
17
+ end
18
+
19
+ step :visit_home_page, "I am on wikipedia.com"
20
+
21
+ step :enter_word, "I enter word :word"
22
+
23
+ # step :submit_request, "I submit request"
24
+
25
+ # step "I am on wikipedia.com" do
26
+ # page_set.visit_home_page
27
+ # end
28
+
29
+ # step "I enter word :word" do |word|
30
+ # page_set.enter_word word
31
+ # end
32
+
33
+ # step "I submit request" do
34
+ # page_set.submit_request
35
+ # end
36
+
37
+ end