effective_test_bot 1.0.8 → 1.1.0

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
- SHA1:
3
- metadata.gz: b617dc9e92a0ca135bb0d149425160036a5fb38b
4
- data.tar.gz: eae932d2212b4b4b7ee1e8d466886a2390627752
2
+ SHA256:
3
+ metadata.gz: a58127dee25edf6d59d56186bdadc7c6b20b46008d78757e9f29471ab4c77d08
4
+ data.tar.gz: ac0be189890058266890718946bb912bf34105ff39720a92a9041ae16e8ab973
5
5
  SHA512:
6
- metadata.gz: f989ddf451607d749d15d92a8b176406aa14cd2fa5fe51a4bbea8fdb77340e6c8d176c37ad8249c82b5896427001f19aef6c07abe8e6513a9989c4f75c85733e
7
- data.tar.gz: 9dc424026be148749ed9da6787de2f184cd8209290cbfc4bc641640ea4de6c85771336fd659dcb735a1c96a8c32a6bdf4668b6ce40e450574fab6c6cb03fc78b
6
+ metadata.gz: 4e039db2969eb5f7f3e1cebaaddb2d20987c2bafd05fac9832addf84c8b76632debad04a4988c60d5e647436e8bd01c1548fc067095d288dedf9167c1690f413
7
+ data.tar.gz: 4e5ca33c5de04e4e0fab7831a855bf6254a1c1ad94d8fd9c4b3e4b22546c17e24405cf9d43bf8530ff878a91bc930c92d2bfaa1271d12d9c1b615ff2b6edc070
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2018 Code and Effect Inc.
1
+ Copyright 2019 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -21,14 +21,18 @@ Turn on tour mode to programatically generate an animated .gif of every workflow
21
21
  Make sure everything actually works.
22
22
 
23
23
 
24
- ## Rails System Tests
24
+ ## effective_test_bot 1.0
25
25
 
26
- This is the 'Rails System Test' branch of effective_test_bot.
26
+ This is the 1.0 series of effective_test_bot.
27
27
 
28
28
  This requires Rails 5.1+
29
29
 
30
30
  Please check out [Effective TestBot Capybara-Webkit branch](https://github.com/code-and-effect/effective_test_bot/tree/capybara-webit) for more information using this gem with Capybara Webkit and Rails < 5.1.
31
31
 
32
+ This works with Rails 6.0.0.rc1 and parallelization.
33
+
34
+ See [effective_website](https://github.com/code-and-effect/effective_website) for a working rails website example that uses effective_test_bot.
35
+
32
36
  ## Getting Started
33
37
 
34
38
  First, make sure your site is using [devise](https://github.com/plataformatec/devise) and that your application javascript includes [jQuery](http://jquery.com/) and rails' [jquery_ujs](https://github.com/rails/jquery-ujs).
@@ -49,7 +53,13 @@ Then you're ready to install `effective_test_bot`:
49
53
 
50
54
  ```ruby
51
55
  group :test do
56
+ gem 'capybara'
57
+ gem 'selenium-webdriver'
58
+ gem 'webdrivers'
52
59
  gem 'effective_test_bot'
60
+
61
+ # Optional. Only required if you want animated gifs.
62
+ gem 'rmagick'
53
63
  end
54
64
  ```
55
65
 
@@ -73,28 +83,28 @@ Fixture or seed one user. At least one user -- ideally a fully priviledged admin
73
83
 
74
84
  To create the initial user, please add it to either `test/fixtures/users.yml`, the `db/seeds.db` file or the effective_test_bot specific `test/fixtures/seeds.rb` file.
75
85
 
76
- As per the included `test/test_helper.rb`, the following tasks run when minitest starts:
86
+ Finally, to test that your testing environment is set up correctly run and work through any issues with:
77
87
 
78
88
  ```
79
- # Rails default task, load fixtures from test/fixtures/*.yml (including users.yml if it exists)
80
- rails db:fixtures:load
89
+ rails test:bot:environment
90
+ ```
81
91
 
82
- # Rails default task, loads db/seeds.rb
83
- rails db:seed
92
+ You now have effective_test_bot configured and you're ready to go:
84
93
 
85
- # Added by effective_test_bot. loads test/fixtures/seeds.rb. 'cause screw yaml.
86
- rails test:load_fixture_seeds
87
94
  ```
95
+ rails test
96
+ rails test:system
88
97
 
89
- Your initial user may be created by any of the above 3 tasks.
98
+ rails test:bot
99
+ rails test:bot TEST=posts#index
90
100
 
91
- Finally, to test that your testing environment is set up correctly run and work through any issues with:
101
+ rails test:bot:tour
92
102
 
93
- ```
94
- rails test:bot:environment
95
- ```
103
+ rails test:bot:fails
104
+ rails test:bot:fails TOUR=true
96
105
 
97
- You now have effective_test_bot configured and you're ready to go.
106
+ rails test:bot:fail # Kind of weird with parallelization
107
+ ```
98
108
 
99
109
  ## How to use this gem
100
110
 
@@ -155,8 +165,6 @@ You can pass a Hash of 'fills' to specify specific input values:
155
165
 
156
166
  ```ruby
157
167
  # app/test/system/posts_test.rb
158
- require 'application_system_test_case'
159
-
160
168
  class PostTest < ApplicationSystemTestCase
161
169
  test 'creating a new post' do
162
170
  visit new_post_path
@@ -189,8 +197,6 @@ Clicks the first `input[type='submit']` field (or first submit field with the gi
189
197
  Automatically checks for `assert_no_html5_form_validation_errors`, `assert_jquery_ujs_disable_with` and `assert_no_unpermitted_params`
190
198
 
191
199
  ```ruby
192
- require 'application_system_test_case'
193
-
194
200
  class PostTest < ApplicationSystemTestCase
195
201
  test 'creating a new post' do
196
202
  visit(new_post_path) and fill_form
@@ -260,8 +266,6 @@ A quick note on speed: You can speed up these test suites by fixturing, seeding
260
266
  There are a few variations on the one-liner method:
261
267
 
262
268
  ```ruby
263
- require 'application_system_test_case'
264
-
265
269
  class PostTest < ApplicationSystemTestCase
266
270
  # Runs all 9 crud_action tests against /posts
267
271
  crud_test(resource: Post)
@@ -286,8 +290,6 @@ end
286
290
  The individual test suites may also be used as part of a larger test:
287
291
 
288
292
  ```ruby
289
- require 'application_system_test_case'
290
-
291
293
  class PostTest < ApplicationSystemTestCase
292
294
  test 'user may only update a post once' do
293
295
  crud_action_test(test: :create_valid, resource: Post, user: User.first)
@@ -522,6 +524,15 @@ rails test:bot TEST=posts
522
524
 
523
525
  # Test a specific controller and action
524
526
  rails test:bot TEST=posts#index
527
+
528
+ # Only runs previously failed tests
529
+ rails test:bot:fails
530
+
531
+ # Only runs failed tests and stops after first failure
532
+ rails test:bot:fails
533
+
534
+ # Purges all screenshots and fails
535
+ rails test:bot:purge
525
536
  ```
526
537
 
527
538
  ## Animated gifs and screenshots
@@ -532,6 +543,7 @@ This method is already called by `fill_form` and `submit_form`.
532
543
 
533
544
  To disable taking screenshots entirely set `config.screenshots = false` in the `config/initializers/effective_test_bot.rb` initializer file.
534
545
 
546
+ You must have `gem 'rmagick'` installed to use animated gifs.
535
547
 
536
548
  ### Tour mode
537
549
 
@@ -595,6 +607,8 @@ rails test:bot FAILFAST=true
595
607
 
596
608
  This functionality is provided thanks to [minitest-fail-fast](https://github.com/teoljungberg/minitest-fail-fast/)
597
609
 
610
+ It's kind of busted with parallelization but mostly works.
611
+
598
612
  ### Failed tests only
599
613
 
600
614
  Skip any previously passed tests by running the following:
@@ -1,7 +1,7 @@
1
1
  module EffectiveTestBotControllerHelper
2
2
  BODY_TAG = '</body>'
3
3
 
4
- # This is included as an after_action in the controller
4
+ # This is included automatically as an after_action in the controller
5
5
  def assign_test_bot_payload(payload = {})
6
6
  payload.merge!({ response_code: response.code, assigns: test_bot_view_assigns, flash: flash.to_hash })
7
7
 
@@ -1,24 +1,14 @@
1
+ # Working as per Rails 6.0.0.rc1
1
2
  require 'test_helper'
2
3
 
3
- require 'capybara'
4
- require 'selenium-webdriver'
5
-
6
- Capybara.register_driver :effective_headless do |app|
7
- options = Selenium::WebDriver::Chrome::Options.new
8
-
9
- ['headless', 'disable-gpu', 'window-size=1366x1366'].each { |arg| options.add_argument(arg) }
10
-
11
- Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
12
- end
13
-
14
4
  class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
15
- driven_by :effective_headless
5
+ driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
16
6
 
17
7
  include Warden::Test::Helpers if defined?(Devise)
18
8
  include EffectiveTestBot::DSL
19
9
  end
20
10
 
21
- # "Connection not rolling back" snippets
11
+ # "Connection not rolling back" snippets from previous rails versions
22
12
  # These are some snippets that the internet has collected to fix test threading issues.
23
13
  # They are unneeded with effective_test_bot. On my machine. But I leave them here as a reference.
24
14
  # Try one or both if you are having issues passing rake test:bot:environment
@@ -52,6 +52,19 @@ if Rails.env.test?
52
52
  # Valid values are true / false / :verbose
53
53
  config.tour_mode = false
54
54
 
55
+ # Rmagick gem is required for animated gifs
56
+ #
57
+ # Include the following in your Gemfile:
58
+ # gem 'rmagick'
59
+ config.image_processing_class_name = 'Magick'
60
+
61
+ # FUTURE SUPPORT: ImageProcessing gem is required for animated gifs
62
+ # I'm not sure how to make an animated gif with this gem!
63
+ # gem 'image_processing'
64
+ # ImageProcessing::MiniMagick
65
+ # ImageProcessing::Vips
66
+ # config.image_processing_class_name = 'ImageProcessing::MiniMagick'
67
+
55
68
  # How long to delay in between animated gif frames
56
69
  # The last frame is applied animated_gif_frame_delay * 3
57
70
  # 100 equals 1 second. (a bit on the slow side, but suitable for a demo)
@@ -1,28 +1,36 @@
1
1
  ENV['RAILS_ENV'] ||= 'test'
2
2
  require_relative '../config/environment'
3
-
4
3
  require 'rails/test_help'
5
- require 'minitest/spec'
6
- require 'minitest/reporters'
4
+
7
5
  require 'minitest/fail_fast' if EffectiveTestBot.fail_fast?
6
+ require 'minitest/reporters'
7
+ require 'minitest/spec'
8
8
 
9
9
  class ActiveSupport::TestCase
10
- fixtures :all # Loads all fixtures in test/fixtures/*.yml
11
- extend Minitest::Spec::DSL # For the let syntax
10
+ # Run tests in parallel with specified workers
11
+ parallelize(workers: :number_of_processors) if respond_to?(:parallelize)
12
+
13
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
14
+ fixtures :all
15
+
16
+ # Loads your db/seeds.rb and test/fixtures/seeds.rb before all tests run. Valid options are :all :db and :test
17
+ seeds :all
18
+
19
+ extend Minitest::Spec::DSL # For the let syntax
12
20
  end
13
21
 
14
22
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
15
23
 
16
24
  Rails.backtrace_cleaner.remove_silencers!
17
25
  Rails.backtrace_cleaner.add_silencer { |line| line =~ /minitest/ }
18
- #Rails.backtrace_cleaner.add_silencer { |line| line =~ /effective_test_bot/ }
19
-
20
- # rails test:bot:seed
26
+ Rails.backtrace_cleaner.add_silencer { |line| line =~ /parallelization/ }
21
27
 
22
28
  # rails test
23
29
  # rails test:system
24
30
  # rails test:bot:environment
25
31
  # rails test:bot
32
+ # rails test:bot:fails
33
+ # rails test:bot:fail
26
34
 
27
35
  # rails test:system TOUR=true
28
- # rails test:bot TEST=posts#index
36
+ # rails test:bot TEST=posts#index
@@ -16,6 +16,7 @@ module EffectiveTestBot
16
16
  mattr_accessor :tour_mode_extreme
17
17
  mattr_accessor :animated_gif_delay
18
18
  mattr_accessor :animated_gif_background_color
19
+ mattr_accessor :image_processing_class_name
19
20
  mattr_accessor :backtrace_lines
20
21
  mattr_accessor :silence_skipped_routes
21
22
 
@@ -64,8 +65,16 @@ module EffectiveTestBot
64
65
  screenshots == true
65
66
  end
66
67
 
68
+ def self.gifs?
69
+ image_processing_class.present?
70
+ end
71
+
72
+ def self.image_processing_class
73
+ @@image_processing_class ||= image_processing_class_name.safe_constantize
74
+ end
75
+
67
76
  def self.autosave_animated_gif_on_failure?
68
- screenshots? && autosave_animated_gif_on_failure
77
+ autosave_animated_gif_on_failure && gifs?
69
78
  end
70
79
 
71
80
  def self.fail_fast?
@@ -2,9 +2,10 @@ module EffectiveTestBot
2
2
  class Engine < ::Rails::Engine
3
3
  engine_name 'effective_test_bot'
4
4
 
5
- config.autoload_paths += Dir["#{config.root}/test/test_botable/**/"]
6
- config.autoload_paths += Dir["#{config.root}/test/concerns/**/"]
7
- config.autoload_paths += Dir["#{config.root}/test/support/**/"]
5
+ config.autoload_paths += Dir["#{config.root}/test/test_botable/", "#{config.root}/test/concerns/", "#{config.root}/test/support/"]
6
+ # config.autoload_paths += Dir["#{config.root}/test/test_botable/**/"]
7
+ # config.autoload_paths += Dir["#{config.root}/test/concerns/**/"]
8
+ # config.autoload_paths += Dir["#{config.root}/test/support/**/"]
8
9
 
9
10
  # Set up our default configuration options.
10
11
  initializer 'effective_test_bot.defaults', before: :load_config_initializers do |app|
@@ -38,5 +39,14 @@ module EffectiveTestBot
38
39
  end
39
40
  end
40
41
 
42
+ # Provide the seeds DSL in Ac
43
+ initializer 'effective_test_bot.test_case' do |app|
44
+ if Rails.env.test?
45
+ ActiveSupport.on_load :active_record do
46
+ ActiveSupport::TestCase.send :include, TestSeedable::Seed
47
+ end
48
+ end
49
+ end
50
+
41
51
  end
42
52
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveTestBot
2
- VERSION = '1.0.8'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -0,0 +1,50 @@
1
+ # This is automatically included into ActiveSupport::TestCase
2
+ # To give us the seeds :all dsl
3
+ module TestSeedable
4
+ module Seed
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def seeds(seed = :all)
9
+ raise 'unexpected argument. try :all, :db, :test' unless [:all, :db, :test].include?(seed)
10
+
11
+ ActiveSupport::TestCase.class_eval do
12
+ case seed
13
+ when :all
14
+ def before_setup
15
+ @@_loaded_seeds ||= load_seeds(:all); super
16
+ end
17
+ when :db
18
+ def before_setup
19
+ @@_loaded_seeds ||= load_seeds(:db); super
20
+ end
21
+ when :test
22
+ def before_setup
23
+ @@_loaded_seeds ||= load_seeds(:test); super
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # Instance Methods
31
+ def load_seeds(seed = :all)
32
+ db_seeds = "#{Rails.root}/db/seeds.rb"
33
+ test_seeds = "#{Rails.root}/test/fixtures/seeds.rb"
34
+
35
+ case seed
36
+ when :all
37
+ load(db_seeds) if File.exists?(db_seeds)
38
+ load(test_seeds) if File.exists?(test_seeds)
39
+ when :db
40
+ load(db_seeds) if File.exists?(db_seeds)
41
+ when :test
42
+ load(test_seeds) if File.exists?(test_seeds)
43
+ else
44
+ raise('unexpected seed argument. use :all, :db or :test')
45
+ end
46
+
47
+ true
48
+ end
49
+ end
50
+ end
@@ -1,23 +1,25 @@
1
1
  module EffectiveTestBotAssertions
2
- def assert_page_content(content, message = "(page_content) Expected page content :content: to be present")
2
+ def assert_page_content(content, message: "(page_content) Expected page content :content: to be present")
3
3
  assert page.has_text?(/#{Regexp.escape(content)}/i, wait: 0), message.sub(':content:', content)
4
4
  end
5
5
 
6
- def assert_no_page_content(content, message = "(page_content) Expected page content :content: to be blank")
6
+ def assert_no_page_content(content, message: "(page_content) Expected page content :content: to be blank")
7
7
  assert page.has_no_text?(/#{Regexp.escape(content)}/i, wait: 0), message.sub(':content:', content)
8
8
  end
9
9
 
10
- def assert_signed_in(message = nil)
11
- visit(root_path) if page.current_path.blank?
12
- assert assigns['current_user'].present?, message || 'Expected @current_user to be present when signed in'
10
+ def assert_signed_in(message: 'Expected @current_user to be present when signed in')
11
+ visit(root_path)
12
+ assert_page_normal
13
+ assert assigns['current_user'].present?, message
13
14
  end
14
15
 
15
- def assert_signed_out(message = nil)
16
- visit(root_path) if page.current_path.blank? || assigns['current_user'].present?
17
- assert assigns['current_user'].blank?, message || 'Expected @current_user to be blank when signed out'
16
+ def assert_signed_out(message: 'Expected @current_user to be blank when signed out')
17
+ visit(root_path)
18
+ assert_page_normal
19
+ assert assigns['current_user'].blank?, message
18
20
  end
19
21
 
20
- def assert_no_exceptions(message = "(no_exceptions) Unexpected rails server exception:\n:exception:")
22
+ def assert_no_exceptions(message: "(no_exceptions) Unexpected rails server exception:\n:exception:")
21
23
  # this file is created by EffectiveTestBot::Middleware when an exception is encountered in the rails app
22
24
  file = File.join(Dir.pwd, 'tmp', 'test_bot', 'exception.txt')
23
25
  return unless File.exist?(file)
@@ -28,7 +30,7 @@ module EffectiveTestBotAssertions
28
30
  assert false, message.sub(':exception:', exception)
29
31
  end
30
32
 
31
- def assert_can_execute_javascript(message = "Expected page.evaluate_script() to be successful")
33
+ def assert_can_execute_javascript(message: "Expected page.evaluate_script() to be successful")
32
34
  error = nil; result = nil;
33
35
 
34
36
  begin
@@ -40,15 +42,15 @@ module EffectiveTestBotAssertions
40
42
  assert (result == '2'), "#{message}. Error was: #{error}"
41
43
  end
42
44
 
43
- def assert_jquery_present(message = "Expected jquery ($.fn.jquery) to be present")
45
+ def assert_jquery_present(message: "Expected jquery ($.fn.jquery) to be present")
44
46
  assert((page.evaluate_script('$.fn.jquery') rescue nil).to_s.length > 0, message)
45
47
  end
46
48
 
47
- def assert_jquery_ujs_present(message = "Expected rails' jquery_ujs ($.rails) to be present")
49
+ def assert_jquery_ujs_present(message: "Expected rails' jquery_ujs ($.rails) to be present")
48
50
  assert((page.evaluate_script('$.rails') rescue nil).to_s.length > 0, message)
49
51
  end
50
52
 
51
- def assert_page_title(title = :any, message = '(page_title) Expected page title to be present')
53
+ def assert_page_title(title = :any, message: '(page_title) Expected page title to be present')
52
54
  if title.present? && title != :any
53
55
  assert_title(title) # Capybara TitleQuery, match this text
54
56
  else
@@ -57,15 +59,15 @@ module EffectiveTestBotAssertions
57
59
  end
58
60
  end
59
61
 
60
- def assert_form(selector, message = "(form) Expected visible form with selector :selector: to be present")
62
+ def assert_form(selector, message: "(form) Expected visible form with selector :selector: to be present")
61
63
  assert all(selector).present?, message.sub(':selector:', selector)
62
64
  end
63
65
 
64
- def assert_submit_input(message = "(submit_input) Expected one or more visible input[type='submit'] or button[type='submit'] to be present")
66
+ def assert_submit_input(message: "(submit_input) Expected one or more visible input[type='submit'] or button[type='submit'] to be present")
65
67
  assert all("input[type='submit'],button[type='submit']").present?, message
66
68
  end
67
69
 
68
- def assert_authorization(message = '(authorization) Expected authorized access')
70
+ def assert_authorization(message: '(authorization) Expected authorized access')
69
71
  if response_code == 403
70
72
  exception = access_denied_exception
71
73
 
@@ -80,18 +82,18 @@ module EffectiveTestBotAssertions
80
82
  end
81
83
  end
82
84
 
83
- def assert_page_status(status = 200, message = '(page_status) Expected :status: HTTP status code')
85
+ def assert_page_status(status = 200, message: '(page_status) Expected :status: HTTP status code')
84
86
  assert_equal status, response_code, message.sub(':status:', status.to_s)
85
87
  end
86
88
 
87
- def assert_current_path(path, message = '(current_path) Expected current_path to be :path:')
89
+ def assert_current_path(path, message: '(current_path) Expected current_path to be :path:')
88
90
  path = public_send(path) if path.kind_of?(Symbol)
89
91
  assert_equal path, page.current_path, message.sub(':path:', path.to_s)
90
92
  end
91
93
 
92
94
  # assert_redirect '/about'
93
95
  # assert_redirect '/about', '/about-us'
94
- def assert_redirect(from_path, to_path = nil, message = nil)
96
+ def assert_redirect(from_path, to_path = nil, message: nil)
95
97
  if to_path.present?
96
98
  assert_equal to_path, page.current_path, message || "(redirect) Expected redirect from #{from_path} to #{to_path}"
97
99
  else
@@ -99,12 +101,12 @@ module EffectiveTestBotAssertions
99
101
  end
100
102
  end
101
103
 
102
- def assert_no_ajax_requests(message = "(no_ajax_requests) :count: Unexpected AJAX requests present")
104
+ def assert_no_ajax_requests(message: "(no_ajax_requests) :count: Unexpected AJAX requests present")
103
105
  active = page.evaluate_script('$.active')
104
106
  assert (active.blank? || active.zero?), message.sub(':count:', active.to_s)
105
107
  end
106
108
 
107
- def assert_no_active_jobs(message = "(no_active_jobs) :count: Unexpected ActiveJob jobs present")
109
+ def assert_no_active_jobs(message: "(no_active_jobs) :count: Unexpected ActiveJob jobs present")
108
110
  jobs = if defined?(SuckerPunch)
109
111
  SuckerPunch::Queue.all.length
110
112
  else
@@ -114,7 +116,7 @@ module EffectiveTestBotAssertions
114
116
  assert (jobs == 0), message.sub(':count:', jobs.to_s)
115
117
  end
116
118
 
117
- def assert_no_js_errors(message = nil, strict: false)
119
+ def assert_no_js_errors(message: nil, strict: false)
118
120
  error = page.driver.browser.manage.logs.get(:browser).first # headless_chrome
119
121
 
120
122
  if strict == false
@@ -124,21 +126,21 @@ module EffectiveTestBotAssertions
124
126
  assert error.blank?, message || "(no_js_errors) Unexpected javascript error:\n#{error}"
125
127
  end
126
128
 
127
- def assert_no_flash_errors(message = "(no_flash_errors) Unexpected flash error:\n:flash_errors:")
129
+ def assert_no_flash_errors(message: "(no_flash_errors) Unexpected flash error:\n:flash_errors:")
128
130
  assert (!flash.key?('error') && !flash.key?('danger')), message.sub(':flash_errors:', flash.to_s)
129
131
  end
130
132
 
131
133
  # This must be run after submit_form()
132
134
  # It ensures there are no HTML5 validation errors that would prevent the form from being submit
133
135
  # Browsers seem to only consider visible fields, so we will to
134
- def assert_no_html5_form_validation_errors(message = nil)
136
+ def assert_no_html5_form_validation_errors(message: nil)
135
137
  errors = all(':invalid', visible: true).map { |field| field['name'] }
136
138
  assert errors.blank?, message || "(no_html5_form_validation_errors) Unable to submit form, unexpected HTML5 validation error present on the following fields:\n#{errors.join("\n")}"
137
139
  end
138
140
 
139
141
  # Rails jquery-ujs data-disable-with
140
142
  # = f.button :submit, 'Save', data: { disable_with: 'Saving...' }
141
- def assert_jquery_ujs_disable_with(label = nil, message = nil)
143
+ def assert_jquery_ujs_disable_with(label = nil, message: nil)
142
144
  submits = label.present? ? all("input[type='submit']", text: label) : all("input[type='submit']")
143
145
  all_disabled_with = submits.all? { |submit| submit['data-disable-with'].present? }
144
146
 
@@ -148,7 +150,7 @@ module EffectiveTestBotAssertions
148
150
  # assert_flash
149
151
  # assert_flash :success
150
152
  # assert_flash :error, 'there was a specific error'
151
- def assert_flash(key = nil, value = nil, message = nil)
153
+ def assert_flash(key = nil, value = nil, message: nil)
152
154
  if key.present? && value.present?
153
155
  assert_equal value, flash[key.to_s], message || "(flash) Expected flash[#{key}] to equal #{value}. Instead, it was: #{value}"
154
156
  elsif key.present?
@@ -161,7 +163,7 @@ module EffectiveTestBotAssertions
161
163
  # assert_assigns
162
164
  # assert_assigns :current_user
163
165
  # assert_assigns :current_user, 'there should a current user'
164
- def assert_assigns(key = nil, value = nil, message = nil)
166
+ def assert_assigns(key = nil, value = nil, message: nil)
165
167
  if key.present? && value.present?
166
168
  assert_equal value, assigns[key.to_s], message || "(assigns) Expected assigns[#{key}] to equal #{value}. Instead, it was: #{value}"
167
169
  elsif key.present?
@@ -173,7 +175,7 @@ module EffectiveTestBotAssertions
173
175
 
174
176
  # assert_no_assigns_errors
175
177
  # assert_no_assigns_errors :post
176
- def assert_no_assigns_errors(key = nil, message = nil)
178
+ def assert_no_assigns_errors(key = nil, message: nil)
177
179
  if key.present?
178
180
  errors = (assigns[key.to_s] || {})['errors']
179
181
  assert errors.blank?, message || "(no_assigns_errors) Unexpected @#{key} rails validation errors:\n#{errors}"
@@ -186,7 +188,7 @@ module EffectiveTestBotAssertions
186
188
  end
187
189
 
188
190
  # assert_assigns_errors :post
189
- def assert_assigns_errors(key, message = nil)
191
+ def assert_assigns_errors(key, message: nil)
190
192
  errors = (assigns[key.to_s] || {})['errors']
191
193
  assert errors.present?, message || "(assigns_errors) Expected @#{key}.errors to be present"
192
194
  end
@@ -225,7 +227,7 @@ module EffectiveTestBotAssertions
225
227
  assert false, message || "(assert_email) Expected email with #{expected} to have been delivered"
226
228
  end
227
229
 
228
- def assert_access_denied(message = nil)
230
+ def assert_access_denied(message: nil)
229
231
  assert_equal 403, response_code, message || "Expected response code 403 when access denied, but it was: #{response_code || 'nil'}"
230
232
  assert_content 'Access Denied'
231
233
  assert_no_exceptions
@@ -7,7 +7,7 @@ module EffectiveTestBotMinitestHelper
7
7
  def before_teardown
8
8
  super
9
9
 
10
- if EffectiveTestBot.screenshots? && (@test_bot_screenshot_id || 0) > 0
10
+ if EffectiveTestBot.gifs? && (@test_bot_screenshot_id || 0) > 0
11
11
  if !passed? && EffectiveTestBot.autosave_animated_gif_on_failure?
12
12
  save_test_bot_screenshot
13
13
  save_test_bot_failure_gif
@@ -1,8 +1,4 @@
1
- require 'RMagick'
2
-
3
1
  module EffectiveTestBotScreenshotsHelper
4
- include Magick
5
-
6
2
  # Creates a screenshot based on the current test and the order in this test.
7
3
  def debug_test_bot_screenshot
8
4
  filepath = "#{current_test_temp_path}/#{current_test_screenshot_id}.png"
@@ -17,6 +13,9 @@ module EffectiveTestBotScreenshotsHelper
17
13
  end
18
14
 
19
15
  def save_test_bot_failure_gif
16
+ return unless EffectiveTestBot.screenshots?
17
+ return unless EffectiveTestBot.gifs?
18
+
20
19
  Dir.mkdir(current_test_failure_path) unless File.exist?(current_test_failure_path)
21
20
  full_path = (current_test_failure_path + '/' + current_test_failure_filename)
22
21
 
@@ -25,6 +24,9 @@ module EffectiveTestBotScreenshotsHelper
25
24
  end
26
25
 
27
26
  def save_test_bot_tour_gif
27
+ return unless EffectiveTestBot.screenshots?
28
+ return unless EffectiveTestBot.gifs?
29
+
28
30
  Dir.mkdir(current_test_tour_path) unless File.exist?(current_test_tour_path)
29
31
  full_path = (current_test_tour_path + '/' + current_test_tour_filename)
30
32
 
@@ -43,6 +45,15 @@ module EffectiveTestBotScreenshotsHelper
43
45
  protected
44
46
 
45
47
  def save_test_bot_gif(full_path)
48
+ case EffectiveTestBot.image_processing_class_name
49
+ when 'Magick'
50
+ save_test_bot_gif_with_rmagick(full_path)
51
+ else
52
+ save_test_bot_gif_with_image_processing(full_path)
53
+ end
54
+ end
55
+
56
+ def save_test_bot_gif_with_rmagick(full_path)
46
57
  png_images = @test_bot_screenshot_id.times.map do |x|
47
58
  current_test_temp_path + '/' + format_screenshot_id(x+1) + '.png'
48
59
  end
@@ -79,6 +90,16 @@ module EffectiveTestBotScreenshotsHelper
79
90
  animation.write(full_path)
80
91
  end
81
92
 
93
+ def save_test_bot_gif_with_image_processing(full_path)
94
+ png_images = @test_bot_screenshot_id.times.map do |x|
95
+ current_test_temp_path + '/' + format_screenshot_id(x+1) + '.png'
96
+ end
97
+
98
+ # png_images is an Array of file paths
99
+
100
+ raise('unsupported. Accepting PRs.')
101
+ end
102
+
82
103
  private
83
104
 
84
105
  # There are 3 different paths we're working with
@@ -2,8 +2,9 @@ require 'application_system_test_case'
2
2
 
3
3
  module TestBot
4
4
  class EnvironmentTest < ApplicationSystemTestCase
5
- @@original_users_count = User.count
6
- let(:original_users_count) { @@original_users_count }
5
+ setup do
6
+ @@original_users_count ||= (defined?(User) ? User.unscoped.count : 0)
7
+ end
7
8
 
8
9
  def self.test_order
9
10
  :alpha
@@ -27,35 +28,33 @@ module TestBot
27
28
  end
28
29
 
29
30
  test '03: at least one user is present' do
30
- assert (User.count > 0), 'please fixture or seed at least 1 user for effective_test_bot to function'
31
+ assert (User.unscoped.count > 0), 'please fixture or seed at least 1 user for effective_test_bot to function'
31
32
  end
32
33
 
33
34
  test '04: activerecord can save a resource' do
34
35
  User.new(email: 'unique@testbot.com', password: '!Password123', password_confirmation: '!Password123').save(validate: false)
35
- assert_equal (original_users_count + 1), User.count
36
+ assert_equal (@@original_users_count + 1), User.unscoped.count
36
37
  end
37
38
 
38
39
  test '05: database has rolled back' do
39
- assert_equal original_users_count, User.count, 'the activerecord resource created in a previous test is still present'
40
+ assert_equal @@original_users_count, User.unscoped.count, 'the activerecord resource created in a previous test is still present'
40
41
  end
41
42
 
42
43
  test '06: capybara can sign_in' do
43
- sign_in(User.first)
44
- assert_signed_in
44
+ sign_in(User.unscoped.first)
45
+ assert_signed_in(message: 'capybara is unable to sign in via the warden devise helpers')
45
46
  end
46
47
 
47
48
  test '07: capybara session has reset' do
48
- assert_signed_out
49
+ assert_signed_out(message: 'capybara should be signed out at the start of a new test')
49
50
  end
50
51
 
51
52
  test '08: capybara database connection is shared' do
52
53
  user = User.new(email: 'unique@testbot.com', password: '!Password123', password_confirmation: '!Password123')
53
- user.username = 'unique-username' if user.respond_to?(:username)
54
- user.login = 'unique-login' if user.respond_to?(:login)
55
- user.save!
54
+ user.save!(validate: false)
56
55
 
57
56
  without_screenshots { sign_in_manually(user, '!Password123') }
58
- assert_signed_in("expected successful devise manual sign in with user created in this test.\nTry using one of the ActiveRecord shared_connection snippets in test/test_helper.rb")
57
+ assert_signed_in(message: "expected successful devise manual sign in with user created in this test.\nTry using one of the ActiveRecord shared_connection snippets in test/test_helper.rb")
59
58
  end
60
59
 
61
60
  test '09: capybara can execute javascript' do
@@ -53,25 +53,27 @@ module BaseTest
53
53
 
54
54
  visit(new_path)
55
55
 
56
- assert_authorization(hint)
56
+ assert_authorization(message: hint)
57
57
  assert_no_exceptions
58
58
  assert_page_status
59
59
 
60
- assert_form("form#new_#{resource_name}", "TestBotError: Failed to find form#new_#{resource_name}. #{hint}") unless test_bot_skip?(:form)
60
+ assert_form("form#new_#{resource_name}", message: "TestBotError: Failed to find form#new_#{resource_name}. #{hint}") unless test_bot_skip?(:form)
61
61
 
62
62
  within_if("form#new_#{resource_name}", !test_bot_skip?(:form)) do
63
- assert_submit_input("TestBotError: Failed to find a visible input[type='submit'] on #{page.current_path}. #{hint}")
63
+ assert_submit_input(message: "TestBotError: Failed to find a visible input[type='submit'] on #{page.current_path}. #{hint}")
64
64
 
65
65
  fill_form(resource_attributes)
66
66
  submit_novalidate_form
67
67
 
68
- assert_authorization(hint)
68
+ assert_authorization(message: hint)
69
69
  assert_no_exceptions
70
70
  assert_page_status
71
71
  end
72
72
 
73
73
  obj = resource_class.last
74
74
  assert obj.present?, "TestBotError: Failed to create a resource after submitting form. Errors: #{(assigns[resource_name] || {})['errors']}\n#{hint}."
75
+
76
+ visit root_path
75
77
  end
76
78
 
77
79
  obj
@@ -17,7 +17,7 @@ module DeviseTest
17
17
  assert_page_normal
18
18
  assert_no_flash_errors unless test_bot_skip?(:no_flash_errors)
19
19
 
20
- assert_signed_in('Expected @current_user to be present after sign up')
20
+ assert_signed_in(message: 'Expected @current_user to be present after sign up')
21
21
  assert User.where(email: email).first.present?, "Expected user to be present after submitting sign up form at #{new_user_registration_path}"
22
22
  assert_page_content(I18n.t('devise.registrations.signed_up')) unless test_bot_skip?(:page_content)
23
23
  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: 1.0.8
4
+ version: 1.1.0
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: 2019-03-06 00:00:00.000000000 Z
11
+ date: 2019-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2.15'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '4.0'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,11 +38,8 @@ dependencies:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
40
  version: '2.15'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '4.0'
47
41
  - !ruby/object:Gem::Dependency
48
- name: chromedriver-helper
42
+ name: selenium-webdriver
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - ">="
@@ -59,7 +53,7 @@ dependencies:
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
55
  - !ruby/object:Gem::Dependency
62
- name: selenium-webdriver
56
+ name: webdrivers
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - ">="
@@ -128,20 +122,6 @@ dependencies:
128
122
  - - ">="
129
123
  - !ruby/object:Gem::Version
130
124
  version: '0'
131
- - !ruby/object:Gem::Dependency
132
- name: rmagick
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- type: :runtime
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
125
  description: A shared library of rails model & system tests that should pass in every
146
126
  Rails application.
147
127
  email:
@@ -171,6 +151,7 @@ files:
171
151
  - test/concerns/test_botable/page_dsl.rb
172
152
  - test/concerns/test_botable/redirect_dsl.rb
173
153
  - test/concerns/test_botable/wizard_dsl.rb
154
+ - test/concerns/test_seedable/seed.rb
174
155
  - test/fixtures/documents._test
175
156
  - test/fixtures/logo.png
176
157
  - test/support/effective_test_bot_assertions.rb
@@ -208,8 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
189
  - !ruby/object:Gem::Version
209
190
  version: '0'
210
191
  requirements: []
211
- rubyforge_project:
212
- rubygems_version: 2.4.5.1
192
+ rubygems_version: 3.0.3
213
193
  signing_key:
214
194
  specification_version: 4
215
195
  summary: A shared library of rails model & system tests that should pass in every