effective_test_bot 0.5.2 → 0.5.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1af9730f46872f097b9d825a6d6e084aa9b152ff
4
- data.tar.gz: 3180d006dd3ff2fef23e86e68e8561f855bad160
3
+ metadata.gz: 8411cc5cae54d4456303dea648f1030f427c134f
4
+ data.tar.gz: 971478e8e7a6b523ca81e40152dc6f018023e7a5
5
5
  SHA512:
6
- metadata.gz: a1d4f26b996ebb47642951ef294656e0526bdc676163c5d25291696d661295fbe7091b6d4ee93e3bc344e232e7b44c167d34ed15aa3452552bac612a17df34ed
7
- data.tar.gz: 53d3c71075a40210e2ace8507497562cfbf9ca856396b2e6dca459ea47ea222359c3a453249351c8dc57e83c461a571f8655c6ca43823e8b642dec0a043a951a
6
+ metadata.gz: 41f82b5ef61e3addd71989a4171772ac0acc98869108eb9c5daf2cbf887271bd00fa69d2d5cbd43c91fffe2e4e9cf4215dd964269e66ed46274e70bb3c86dae3
7
+ data.tar.gz: 5c341d462afb03a6b2ecc4e839f0f690217b5160c56eb1bc2c35e09b766254ddb36645c0802d3af348234678ac092fb26e30e6cbf021e28c05ae63caf687ef8f
data/README.md CHANGED
@@ -79,7 +79,11 @@ rake test:load_fixture_seeds
79
79
 
80
80
  Your initial user may be created by any of the above 3 tasks.
81
81
 
82
- Finally, to test that your testing environment is set up correctly run `rake test:bot:environment` and have all tests pass.
82
+ Finally, to test that your testing environment is set up correctly run and work through any issues with:
83
+
84
+ ```
85
+ rake test:bot:environment
86
+ ```
83
87
 
84
88
  You now have effective_test_bot configured and you're ready to go.
85
89
 
@@ -570,6 +574,18 @@ rake test:tour
570
574
  rake test:tourv
571
575
  ```
572
576
 
577
+ ### Fail Fast
578
+
579
+ Set `config.fail_fast = true` to exit immediately if there is a test failure.
580
+
581
+ Or, override the config setting by running the following:
582
+
583
+ ```
584
+ rake test:bot FAILFAST=true
585
+ ```
586
+
587
+ This functionality is provided thanks to [minitest-fail-fast](https://github.com/teoljungberg/minitest-fail-fast/)
588
+
573
589
  ## License
574
590
 
575
591
  MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
@@ -5,6 +5,7 @@ require "effective_test_bot/version"
5
5
  module EffectiveTestBot
6
6
  mattr_accessor :except
7
7
  mattr_accessor :only
8
+ mattr_accessor :fail_fast
8
9
  mattr_accessor :screenshots
9
10
  mattr_accessor :autosave_animated_gif_on_failure
10
11
  mattr_accessor :tour_mode
@@ -55,6 +56,16 @@ module EffectiveTestBot
55
56
  screenshots && autosave_animated_gif_on_failure
56
57
  end
57
58
 
59
+ def self.fail_fast?
60
+ fails = ENV['FAIL_FAST'] || ENV['FAILFAST'] || ENV['FAIL']
61
+
62
+ if fails.present?
63
+ ['true', '1'].include?(fails).to_s.downcase)
64
+ else
65
+ fail_fast
66
+ end
67
+ end
68
+
58
69
  def self.tour_mode?
59
70
  if ENV['TOUR'].present?
60
71
  ['true', 'verbose', 'debug'].include?(ENV['TOUR'].to_s.downcase)
@@ -1,3 +1,3 @@
1
1
  module EffectiveTestBot
2
- VERSION = '0.5.2'.freeze
2
+ VERSION = '0.5.3'.freeze
3
3
  end
@@ -17,6 +17,9 @@ if Rails.env.test?
17
17
  # 'posts', 'events#index'
18
18
  # ]
19
19
 
20
+ # Exits immediately if there is a test failure
21
+ config.fail_fast = true
22
+
20
23
  # Should capybara generate a series of *.png screenshots as it goes through the test?
21
24
  # Disabling screenshots will also disable animated_gifs and touring
22
25
  config.screenshots = true
@@ -16,7 +16,6 @@ require 'capybara/slow_finder_errors'
16
16
  class ActiveSupport::TestCase
17
17
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
18
18
  fixtures :all
19
- # Add more helper methods to be used by all tests here...
20
19
  use_transactional_fixtures = true
21
20
  end
22
21
 
@@ -26,19 +25,8 @@ class ActionDispatch::IntegrationTest
26
25
  include Capybara::Assertions
27
26
  include Capybara::Screenshot::MiniTestPlugin
28
27
  include Warden::Test::Helpers if defined?(Devise)
29
-
30
- # def setup # Called before every test
31
- # end
32
-
33
- # def teardown # Called after every test
34
- # end
35
-
36
- def after_teardown # I reset sessions here so capybara-screenshot can still make screenshots when tests fail
37
- super(); Capybara.reset_sessions!
38
- end
39
28
  end
40
29
 
41
-
42
30
  Capybara.default_driver = :webkit
43
31
  Capybara.javascript_driver = :webkit
44
32
  Capybara::Screenshot.autosave_on_failure = true
@@ -52,9 +40,7 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
52
40
  Rails.backtrace_cleaner.remove_silencers!
53
41
  Rails.backtrace_cleaner.add_silencer { |line| line =~ /minitest/ }
54
42
 
55
-
56
- ### So this is EffectiveTestBot 'code' here
57
- ### That gets run just once before the whole test suite loads
43
+ ### Effective Test Bot specific stuff below ###
58
44
 
59
45
  # So the very first thing I do is set up a consistent database
60
46
  silence_stream(STDOUT) do
@@ -75,6 +61,10 @@ Rake::Task['db:fixtures:load'].invoke # There's just no way to get the seeds fir
75
61
  Rake::Task['db:seed'].invoke
76
62
  Rake::Task['test:load_fixture_seeds'].invoke # This is included by effective_test_bot. It just runs the app's test/fixtures/seeds.rb if it exists
77
63
 
64
+ if EffectiveTestBot.fail_fast?
65
+ require 'minitest/fail_fast'
66
+ end
67
+
78
68
  # Make all database transactions use the same thread, otherwise signing up in capybara won't get rolled back
79
69
  # This must be run after the Rake::Tasks above
80
70
  class ActiveRecord::Base
@@ -46,7 +46,7 @@ module TestBotable
46
46
 
47
47
  method_name = test_bot_method_name('crud_test', label || options_for_method[:current_test])
48
48
 
49
- define_method(method_name) { crud_action_test(test: test, resource: resource, user: user, options: options_for_method) }
49
+ define_method(method_name) { crud_action_test(test: test, resource: resource, user: user, **options_for_method) }
50
50
  end
51
51
  end
52
52
 
@@ -23,7 +23,7 @@ module TestBotable
23
23
 
24
24
  method_name = test_bot_method_name('devise_test', options[:current_test])
25
25
 
26
- define_method(method_name) { devise_action_test(test: test, options: options) }
26
+ define_method(method_name) { devise_action_test(test: test, **options) }
27
27
  end
28
28
  end
29
29
 
@@ -22,7 +22,7 @@ module TestBotable
22
22
 
23
23
  method_name = test_bot_method_name('member_test', options[:current_test])
24
24
 
25
- define_method(method_name) { member_action_test(controller: controller, action: action, user: user, member: member, options: options) }
25
+ define_method(method_name) { member_action_test(controller: controller, action: action, user: user, member: member, **options) }
26
26
  end
27
27
 
28
28
  end
@@ -21,7 +21,7 @@ module TestBotable
21
21
 
22
22
  method_name = test_bot_method_name('page_test', options[:current_test])
23
23
 
24
- define_method(method_name) { page_action_test(path: path, user: user, options: options) }
24
+ define_method(method_name) { page_action_test(path: path, user: user, **options) }
25
25
  end
26
26
 
27
27
  end
@@ -20,7 +20,7 @@ module TestBotable
20
20
 
21
21
  method_name = test_bot_method_name('redirect_test', options[:current_test])
22
22
 
23
- define_method(method_name) { redirect_action_test(from: from, to: to, user: user, options: options) }
23
+ define_method(method_name) { redirect_action_test(from: from, to: to, user: user, **options) }
24
24
  end
25
25
  end
26
26
 
@@ -31,7 +31,7 @@ module TestBotable
31
31
 
32
32
  method_name = test_bot_method_name('wizard_test', options[:current_test])
33
33
 
34
- define_method(method_name) { wizard_action_test(from: from, to: to, user: user, options: options) }
34
+ define_method(method_name) { wizard_action_test(from: from, to: to, user: user, **options) }
35
35
  end
36
36
 
37
37
  end
Binary file
@@ -30,11 +30,11 @@ module EffectiveTestBotAssertions
30
30
  end
31
31
 
32
32
  def assert_jquery_present(message = "Expected jquery ($.fn.jquery) to be present")
33
- assert((page.evaluate_script('$.fn.jquery') rescue '').length > 0, message)
33
+ assert((page.evaluate_script('$.fn.jquery') rescue nil).to_s.length > 0, message)
34
34
  end
35
35
 
36
36
  def assert_jquery_ujs_present(message = "Expected rails' jquery_ujs ($.rails) to be present")
37
- assert((page.evaluate_script('$.rails') rescue '').length > 0, message)
37
+ assert((page.evaluate_script('$.rails') rescue nil).to_s.length > 0, message)
38
38
  end
39
39
 
40
40
  def assert_page_title(title = :any, message = '(page_title) Expected page title to be present')
@@ -50,8 +50,8 @@ module EffectiveTestBotAssertions
50
50
  assert all(selector).present?, message.sub(':selector:', selector)
51
51
  end
52
52
 
53
- def assert_submit_input(message = "(submit_input) Expected one or more visible input[type='submit'] to be present")
54
- assert all('input[type=submit]').present?, message
53
+ def assert_submit_input(message = "(submit_input) Expected one or more visible input[type='submit'] or button[type='submit'] to be present")
54
+ assert all("input[type='submit'],button[type='submit']").present?, message
55
55
  end
56
56
 
57
57
  def assert_page_status(status = 200, message = '(page_status) Expected :status: HTTP status code')
@@ -73,6 +73,11 @@ module EffectiveTestBotAssertions
73
73
  end
74
74
  end
75
75
 
76
+ def assert_no_ajax_requests(message = "(no_ajax_requests) :count: Unexpected AJAX requests present")
77
+ active = page.evaluate_script('jQuery.active')
78
+ assert (active.blank? || active.zero?), message.sub(':count:', active.to_s)
79
+ end
80
+
76
81
  def assert_no_js_errors(message = nil)
77
82
  errors = page.driver.error_messages
78
83
  assert errors.blank?, message || "(no_js_errors) Unexpected javascript error:\n#{errors.first.to_s}"
@@ -1,4 +1,5 @@
1
1
  require 'timeout'
2
+ require 'faker'
2
3
 
3
4
  module EffectiveTestBotFormFiller
4
5
  DIGITS = ('1'..'9').to_a
@@ -53,7 +54,7 @@ module EffectiveTestBotFormFiller
53
54
  save_test_bot_screenshot
54
55
 
55
56
  # Support for the cocoon gem
56
- all('a.add_fields[data-association-insertion-template]').each do |field|
57
+ all('a.add_fields[data-association-insertion-template],a.has_many_add').each do |field|
57
58
  next if skip_form_field?(field)
58
59
 
59
60
  if EffectiveTestBot.tour_mode_extreme?
@@ -69,11 +70,11 @@ module EffectiveTestBotFormFiller
69
70
  skip_field_screenshot = false
70
71
 
71
72
  case [field.tag_name, field['type']].compact.join('_')
72
- when 'input_text', 'input_email', 'input_password', 'input_tel', 'input_number', 'input_checkbox', 'input_radio'
73
+ when 'input_text', 'input_email', 'input_password', 'input_tel', 'input_number', 'input_checkbox', 'input_radio', 'input_url'
73
74
  field.set(value_for_field(field, fills))
74
75
  when 'textarea'
75
76
  value = value_for_field(field, fills)
76
- field['class'].to_s.include?('ckeditor') ? fill_ckeditor_text_area(field, value) : field.set(value)
77
+ ckeditor_text_area?(field) ? fill_ckeditor_text_area(field, value) : field.set(value)
77
78
  when 'select'
78
79
  if EffectiveTestBot.tour_mode_extreme? && field['class'].to_s.include?('select2') # select2
79
80
  page.execute_script("try { $('select##{field['id']}').select2('open'); } catch(e) {};")
@@ -91,7 +92,7 @@ module EffectiveTestBotFormFiller
91
92
  else
92
93
  field.set(value_for_field(field, fills))
93
94
  end
94
- when 'input_submit', 'input_search'
95
+ when 'input_submit', 'input_search', 'input_button'
95
96
  skip_field_screenshot = true
96
97
  # Do nothing
97
98
  else
@@ -107,6 +108,7 @@ module EffectiveTestBotFormFiller
107
108
  @filled_numeric_fields = nil
108
109
  @filled_password_fields = nil
109
110
  @filled_radio_fields = nil
111
+ @filled_country_fields = nil
110
112
 
111
113
  save_test_bot_screenshot
112
114
  end
@@ -121,7 +123,7 @@ module EffectiveTestBotFormFiller
121
123
  attributes = field['name'].to_s.gsub(']', '').split('[') # user[something_attributes][last_name] => ['user', 'something_attributes', 'last_name']
122
124
  attribute = attributes.last.to_s
123
125
 
124
- fill_value = fill_value_for_field(fills, attributes)
126
+ fill_value = fill_value_for_field(fills, attributes, field['value'])
125
127
 
126
128
  # If there is a predefined fill value for this field return it now
127
129
  # except for select, checkbox and radio fields which we want to match by value or label
@@ -136,12 +138,16 @@ module EffectiveTestBotFormFiller
136
138
  if classes.include?('date') # Let's assume this is a date input.
137
139
  if attribute.include?('end') # Make sure end dates are after start dates
138
140
  Faker::Date.forward(365).strftime('%Y-%m-%d')
141
+ elsif attribute.include?('closing')
142
+ Faker::Date.forward(30).strftime('%Y-%m-%d')
139
143
  else
140
144
  Faker::Date.backward(365).strftime('%Y-%m-%d')
141
145
  end
142
146
  elsif classes.include?('datetime')
143
147
  if attribute.include?('end')
144
148
  Faker::Date.forward(365).strftime('%Y-%m-%d %H:%m')
149
+ elsif attribute.include?('closing')
150
+ Faker::Date.forward(30).strftime('%Y-%m-%d %H:%m')
145
151
  else
146
152
  Faker::Date.backward(365).strftime('%Y-%m-%d %H:%m')
147
153
  end
@@ -170,6 +176,12 @@ module EffectiveTestBotFormFiller
170
176
  Faker::Address.street_address
171
177
  elsif attribute.include?('name')
172
178
  Faker::Name.name
179
+ elsif attribute.include?('postal_code')
180
+ if @filled_country_fields == 'US'
181
+ DIGITS.sample + DIGITS.sample + DIGITS.sample + DIGITS.sample + DIGITS.sample
182
+ else
183
+ LETTERS.sample + DIGITS.sample + LETTERS.sample + ' ' + DIGITS.sample + LETTERS.sample + DIGITS.sample
184
+ end
173
185
  elsif attribute.include?('postal') # Make a Canadian postal code
174
186
  LETTERS.sample + DIGITS.sample + LETTERS.sample + ' ' + DIGITS.sample + LETTERS.sample + DIGITS.sample
175
187
  elsif attribute.include?('zip') && attribute.include?('code') # Make a US zip code
@@ -187,8 +199,11 @@ module EffectiveTestBotFormFiller
187
199
  Faker::Internet.email
188
200
 
189
201
  when 'input_file'
190
- "#{File.dirname(__FILE__)}/important_documents._test"
191
-
202
+ if field['class'].to_s.include?('asset-box-uploader-fileinput')
203
+ "#{File.dirname(__FILE__)}/../fixtures/documents._test"
204
+ else
205
+ "#{File.dirname(__FILE__)}/../fixtures/logo.png"
206
+ end
192
207
  when 'input_number'
193
208
  value_for_input_numeric_field(field, "input[type='number'][name$='[#{attribute}]']")
194
209
 
@@ -202,16 +217,25 @@ module EffectiveTestBotFormFiller
202
217
  when 'select'
203
218
  if fill_value.present? # accept a value or text
204
219
  field.all('option:enabled').each do |option|
205
- return option.text if (option.text == fill_value || option.value.to_s == fill_value)
220
+ if (option.text == fill_value || option.value.to_s == fill_value)
221
+ @filled_country_fields = option.value if attribute == 'country_code'
222
+ return option.text
223
+ end
206
224
  end
207
225
  end
208
226
 
209
- field.all('option:enabled').select { |option| option.value.present? }.sample.try(:text) || '' # Don't select an empty option
227
+ option = field.all('option:enabled').select { |option| option.value.present? }.sample
210
228
 
229
+ @filled_country_fields = option.try(:value) if attribute == 'country_code' # So Postal Code can be set to a valid one
230
+
231
+ option.try(:text) || ''
211
232
  when 'input_tel'
212
233
  d = 10.times.map { DIGITS.sample }
213
234
  d[0] + d[1] + d[2] + '-' + d[3] + d[4] + d[5] + '-' + d[6] + d[7] + d[8] + d[9]
214
235
 
236
+ when 'input_url'
237
+ Faker::Internet.url
238
+
215
239
  when 'textarea'
216
240
  Faker::Lorem.paragraph
217
241
 
@@ -221,24 +245,19 @@ module EffectiveTestBotFormFiller
221
245
  end
222
246
 
223
247
  def value_for_input_checkbox_field(field, fill_value)
224
- if fill_value.present?
248
+ if ::ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(fill_value)
249
+ true
250
+ elsif ::ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.include?(fill_value)
251
+ false
252
+ elsif fill_value.present?
225
253
  fill_values = Array(fill_value) # Allow an array of fill values to be passed
226
-
227
- if ::ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(fill_value)
228
- fill_values = ::ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.to_a
229
- end
230
-
231
- if ::ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.include?(fill_value)
232
- fill_values = ::ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.to_a
233
- end
234
-
235
254
  (fill_values.include?(field['value']) || fill_values.include?(field.find(:xpath, '..').text))
255
+ elsif field['required'].present?
256
+ true
236
257
  elsif field['value'] == 'true'
237
258
  true
238
259
  elsif field['value'] == 'false'
239
260
  false
240
- elsif field['required'].present?
241
- true
242
261
  else
243
262
  [true, false].sample
244
263
  end
@@ -337,8 +356,8 @@ module EffectiveTestBotFormFiller
337
356
 
338
357
  private
339
358
 
340
- def fill_value_for_field(fills, attributes)
341
- return if fills.blank? || attributes.blank?
359
+ def fill_value_for_field(fills, attributes, value)
360
+ return if fills.blank? || (attributes.blank? && value.blank?)
342
361
 
343
362
  key = nil
344
363
  attributes.reverse_each do |name| # match last_name, then something_attributes.last_name, then user.something_attributes.last_name
@@ -346,6 +365,8 @@ module EffectiveTestBotFormFiller
346
365
  return fills[key].to_s if fills.key?(key)
347
366
  end
348
367
 
368
+ return fills[value] if fills.key?(value)
369
+
349
370
  nil
350
371
  end
351
372
 
@@ -356,12 +377,15 @@ module EffectiveTestBotFormFiller
356
377
  @test_bot_excluded_fields_xpath = nil
357
378
  end
358
379
 
380
+ def ckeditor_text_area?(field)
381
+ return false unless field.tag_name == 'textarea'
382
+ (field['class'].to_s.include?('ckeditor') || all("span[id='cke_#{field['id']}']").present?)
383
+ end
384
+
359
385
  def skip_form_field?(field)
360
386
  field.reload # Handle a field changing visibility/disabled state from previous form field manipulations
361
387
 
362
- ckeditor = (field.tag_name == 'textarea' && field['class'].to_s.include?('ckeditor'))
363
-
364
- (field.visible? == false && !ckeditor) ||
388
+ (field.visible? == false && !ckeditor_text_area?(field)) ||
365
389
  field.disabled? ||
366
390
  ['true', true, 1].include?(field['data-test-bot-skip']) ||
367
391
  (@test_bot_excluded_fields_xpath.present? && field.path.include?(@test_bot_excluded_fields_xpath))
@@ -68,8 +68,8 @@ module EffectiveTestBotFormHelper
68
68
  submit = find(:link_or_button, label)
69
69
  assert submit.present?, "TestBotError: Unable to find a visible submit link or button on #{page.current_path} with the label #{label}"
70
70
  else
71
- submit = first(:css, "input[type='submit']")
72
- assert submit.present?, "TestBotError: Unable to find a visible input[type='submit'] on #{page.current_path}"
71
+ submit = first(:css, "input[type='submit'],button[type='submit']")
72
+ assert submit.present?, "TestBotError: Unable to find a visible input[type='submit'] or button[type='submit'] on #{page.current_path}"
73
73
  end
74
74
 
75
75
  if EffectiveTestBot.screenshots?
@@ -15,7 +15,6 @@ module EffectiveTestBotScreenshotsHelper
15
15
 
16
16
  # This gets called after every test. Minitest hook for plugin developers
17
17
  def after_teardown
18
- super
19
18
  return unless EffectiveTestBot.screenshots? && (@test_bot_screenshot_id || 0) > 0
20
19
 
21
20
  if !passed? && EffectiveTestBot.autosave_animated_gif_on_failure?
@@ -2,6 +2,23 @@ module EffectiveTestBotTestHelper
2
2
  # This makes sure capybara is done, and breaks out of any 'within' blocks
3
3
  def synchronize!
4
4
  page.document.find('html')
5
+ wait_for_ajax
6
+ end
7
+
8
+ # https://gist.github.com/josevalim/470808#gistcomment-1268491
9
+ def wait_for_ajax
10
+ begin
11
+ Timeout.timeout(Capybara.default_max_wait_time) do
12
+ loop until finished_all_ajax_requests?
13
+ end
14
+ rescue => e
15
+ assert_no_ajax_requests
16
+ end
17
+ end
18
+
19
+ def finished_all_ajax_requests?
20
+ ajax_request_count = page.evaluate_script('jQuery.active')
21
+ ajax_request_count.blank? || ajax_request_count.zero?
5
22
  end
6
23
 
7
24
  # Because capybara-webkit can't make delete requests, we need to use rack_test
@@ -36,13 +36,20 @@ module BaseTest
36
36
  obj = resource_class.last
37
37
  return obj if obj.present? && !obj.kind_of?(User)
38
38
 
39
- hint = "Unable to find_or_create_resource!\nEither fixture/seed an instance of #{resource_class} or ensure that submitting form#new_#{resource_name} on #{(new_resource_path rescue nil) || 'the resource new page'} creates a new #{resource_name}"
40
-
41
39
  # It doesn't exist, so lets go to the new page and submit a form to build one
42
40
  without_screenshots do
43
- assert((new_resource_path rescue nil), "TestBotError: Generated polymorphic route new_#{[*controller_namespace, resource_name].compact.join('_')}_path is undefined. #{hint}")
41
+ new_resource_paths = [ # TODO: enumerate all controller namespaces instead of just admin
42
+ (new_resource_path rescue nil),
43
+ (new_polymorphic_path(resource) rescue nil),
44
+ (new_polymorphic_path([:admin, resource]) rescue nil),
45
+ (new_polymorphic_path([:members, resource]) rescue nil)
46
+ ].compact
47
+
48
+ hint = "Unable to find_or_create_resource!\nEither fixture/seed an instance of #{resource_class} or ensure that submitting form#new_#{resource_name} on #{(new_resource_paths.first rescue nil) || 'the resource new page'} creates a new #{resource_name}"
49
+
50
+ assert(new_resource_paths.present?, "TestBotError: Generated polymorphic route new_#{[*controller_namespace, resource_name].compact.join('_')}_path is undefined. #{hint}")
44
51
 
45
- visit(new_resource_path)
52
+ visit(new_resource_paths.first)
46
53
 
47
54
  assert_form("form#new_#{resource_name}", "TestBotError: Failed to find form#new_#{resource_name}. #{hint}") unless test_bot_skip?(:form)
48
55
 
@@ -52,10 +59,10 @@ module BaseTest
52
59
  assert_submit_input "TestBotError: Failed to find a visible input[type='submit'] on #{page.current_path}. #{hint}"
53
60
  submit_novalidate_form
54
61
  end
55
- end
56
62
 
57
- obj = resource_class.last
58
- assert obj.present?, "TestBotError: Failed to create a resource after submitting form. #{hint}"
63
+ obj = resource_class.last
64
+ assert obj.present?, "TestBotError: Failed to create a resource after submitting form. Errors: #{(assigns[resource_name] || {})['errors']}\n#{hint}."
65
+ end
59
66
 
60
67
  obj
61
68
  end
@@ -118,9 +118,9 @@ module CrudTest
118
118
 
119
119
  assert_page_normal
120
120
  assert_assigns(resource_name) # unskippable
121
- assert_form("form#edit_#{resource_name}_#{resource.id}") unless test_bot_skip?(:form)
121
+ assert_form("form[id^='edit_#{resource_name}']") unless test_bot_skip?(:form)
122
122
 
123
- within_if("form#edit_#{resource_name}_#{resource.id}", !test_bot_skip?(:form)) do
123
+ within_if("form[id^='edit_#{resource_name}']", !test_bot_skip?(:form)) do
124
124
  assert_submit_input unless test_bot_skip?(:submit_input)
125
125
  assert_jquery_ujs_disable_with unless test_bot_skip?(:jquery_ujs_disable_with)
126
126
  end
@@ -134,9 +134,7 @@ module CrudTest
134
134
 
135
135
  before = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
136
136
 
137
- assert_form("form#edit_#{resource_name}_#{resource.id}") unless test_bot_skip?(:form)
138
-
139
- within_if("form#edit_#{resource_name}_#{resource.id}", !test_bot_skip?(:form)) do
137
+ within_if("form[id^='edit_#{resource_name}']", !test_bot_skip?(:form)) do
140
138
  clear_form
141
139
  submit_novalidate_form
142
140
  end
@@ -169,9 +167,7 @@ module CrudTest
169
167
 
170
168
  before = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
171
169
 
172
- assert_form("form#edit_#{resource_name}_#{resource.id}") unless test_bot_skip?(:form)
173
-
174
- within_if("form#edit_#{resource_name}_#{resource.id}", !test_bot_skip?(:form)) do
170
+ within_if("form[id^='edit_#{resource_name}']", !test_bot_skip?(:form)) do
175
171
  fill_form(resource_attributes)
176
172
  submit_form
177
173
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_test_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-18 00:00:00.000000000 Z
11
+ date: 2016-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-fail-fast
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: minitest-rails-capybara
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -233,13 +247,14 @@ files:
233
247
  - test/concerns/test_botable/page_dsl.rb
234
248
  - test/concerns/test_botable/redirect_dsl.rb
235
249
  - test/concerns/test_botable/wizard_dsl.rb
250
+ - test/fixtures/documents._test
251
+ - test/fixtures/logo.png
236
252
  - test/support/effective_test_bot_assertions.rb
237
253
  - test/support/effective_test_bot_form_filler.rb
238
254
  - test/support/effective_test_bot_form_helper.rb
239
255
  - test/support/effective_test_bot_login_helper.rb
240
256
  - test/support/effective_test_bot_screenshots_helper.rb
241
257
  - test/support/effective_test_bot_test_helper.rb
242
- - test/support/important_documents._test
243
258
  - test/test_bot/integration/application_test.rb
244
259
  - test/test_bot/integration/environment_test.rb
245
260
  - test/test_botable/base_test.rb
@@ -1 +0,0 @@
1
- This is a file that the EffectiveAssets file uploader will accept regardless of any :file_types passed