effective_test_bot 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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