effective_test_bot 0.4.2 → 0.4.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: faf3170be69a804110713bd4fffd0d2802841fa2
4
- data.tar.gz: 3ac29840a0b524fad45cded4d7d81c3bcb56bee4
3
+ metadata.gz: 836a02fd7342588742c06d55d4f64d06382b5db5
4
+ data.tar.gz: a136f7e711237d2038d86b64273f9d2d54248183
5
5
  SHA512:
6
- metadata.gz: e1bc8fe65d07f530b193e9498e5d3537944d09903727f0407cc7c93bccfeed52addaa1383a56faea2bc005be2429b1e5d856da74da5bc7209e5949425dfb3d7c
7
- data.tar.gz: 4174f5a21a7cfa52081df5d86de979b48cfe1a44fe167a5974b84653cb64f4bcd24555d0787b269336f33540376684bafc566937c46df7186e91b6a6c48c607e
6
+ metadata.gz: a81518d383fabca6561057e0262c33487f8c377b90f7b0569ec18da26cae2910546a983af8afe2614dfa217a7206c95f2e952539d77a0345086a172226483364
7
+ data.tar.gz: fe6980136e37b6881cf11ea673340d69af4d3c766c6932e0adb40b8c7db87a978bf27488371d768cfff4b5dada780972a5447241bf3f2c2d320dec4a95166e8e
data/README.md CHANGED
@@ -35,14 +35,69 @@ Run the test suite with:
35
35
 
36
36
  ```ruby
37
37
  bundle exec rake test:bot
38
+ bundle exec rake test:bot:environment
38
39
  ```
39
40
 
40
41
  You should now see multiple -- hopefully passing -- tests that you didn't write!
41
42
 
43
+ ## TODO
42
44
 
45
+ Document this gem
46
+
47
+ Minitest:
43
48
 
44
49
  rake test TEST=test/integration/clinic_assets_test.rb
45
50
 
51
+ TestBot:
52
+
53
+ rake test:bot TEST=posts
54
+ rake test:bot TEST=posts#index
55
+ rake test:bot TEST=
56
+
57
+ Excepts will always work and be accounted for in test:bot
58
+ Definign TEST= works with test names 'documents#new' or 'documents' or 'something_path' but not with 'flash' assertions
59
+
60
+
61
+ # config.except = [
62
+ # 'flash',
63
+ # 'users#show',
64
+ # 'users#create_invalid' => ['path', 'page_title'],
65
+ # 'users#create_invalid' => 'no_unpermitted_params',
66
+ # 'report_total_allocation_index_path'
67
+ # 'documents#destroy flash'
68
+ # ]
69
+
70
+
71
+ require 'test_helper'
72
+
73
+ class UsersTest < ActionDispatch::IntegrationTest
74
+ # The Create and Update action return to /members/12345 instead of /users/12345 when failing validation
75
+ # This is a side effect of working in the same namespace as devise
76
+ crud_test(User, User.find_by_email('admin@agilestyle.com'), except: :show, skip: {create_invalid: :path, update_invalid: :path})
77
+ end
78
+
79
+ require 'test_helper'
80
+
81
+ class SettingTest < ActionDispatch::IntegrationTest
82
+ crud_test(Setting, User.first, only: [:new, :create])
83
+ end
84
+
85
+ require 'test_helper'
86
+
87
+ class PhysiciansTest < ActionDispatch::IntegrationTest
88
+ page_test(:user_settings_path, User.first)
89
+ page_test(:user_settings_path, User.first)
90
+ page_test(:user_settings_path, User.first)
91
+ crud_test(Physician, User.first, except: :show)
92
+ crud_test('physicians', User.first, except: :show)
93
+
94
+ test 'another action' do
95
+ crud_action_test(:new, Physician, User.first)
96
+ end
97
+ end
98
+
99
+
100
+
46
101
 
47
102
  ## Fixtures
48
103
 
@@ -25,10 +25,15 @@ module EffectiveTestBotControllerHelper
25
25
  end
26
26
 
27
27
  # We get here if ApplicationController raised a ActionController::UnpermittedParameters error
28
- def assign_test_bot_unpermitted_params_headers(exception)
28
+ def assign_test_bot_unpermitted_params_header(exception)
29
29
  if exception.kind_of?(ActionController::UnpermittedParameters)
30
30
  response.headers['Test-Bot-Unpermitted-Params'] = Base64.encode64(exception.params.to_json)
31
31
  end
32
32
  end
33
33
 
34
+ def assign_test_bot_exceptions_header(exception)
35
+ info = [exception.message] + exception.backtrace.first(8)
36
+ response.headers['Test-Bot-Exceptions'] = Base64.encode64(info.to_json)
37
+ end
38
+
34
39
  end
@@ -9,17 +9,33 @@ module EffectiveTestBot
9
9
  yield self
10
10
  end
11
11
 
12
+ # Test could be something like "crud_test", "crud_test (documents#new)", "documents", documents#new"
13
+ # Assertion will be page_title, or flash
14
+
12
15
  def self.skip?(test, assertion = nil)
13
- value = [test.to_s.presence, assertion.to_s.presence].compact.join(' ')
14
- return false if value.blank?
15
-
16
- if onlies.present?
17
- onlies.find { |only| value.start_with?(only) }.blank? # Let partial matches work
18
- elsif excepts.present?
19
- excepts.find { |except| except == value }.present?
20
- else
21
- false
16
+ return false if (test || assertion).blank?
17
+
18
+ test = test.to_s
19
+ assertion = assertion.to_s
20
+
21
+ # If I get passed a method_name, "crud_test: (posts#create_invalid)" extract the inner test name from it
22
+ # I dunno why this is needed really, but it might help someone one day.
23
+ if test.include?('_test: (') # This is how the BaseDsl test_bot_method_name formats the test names.
24
+ left = test.index('(') || -1
25
+ right = test.rindex(')') || (test.length+1)
26
+ test = test[(left+1)..(right-1)]
22
27
  end
28
+
29
+ value = "#{test} #{assertion}".strip # This is the format config.excepts is flattened into
30
+
31
+ # Excepts are defined in the app's config/initializers/effective_test_bot.rb file
32
+ return true if excepts.any? { |except| [test, assertion, value].include?(except) }
33
+
34
+ # Onlies are defined in the same config file, or on the command like rake test:bot TEST=posts#new
35
+ # It doesn't match just 'flash' or 'page_title' assertions
36
+ return true if onlies.present? && onlies.find { |only| test.start_with?(only) }.blank?
37
+
38
+ false # Don't skip this test
23
39
  end
24
40
 
25
41
  private
@@ -17,6 +17,7 @@ module EffectiveTestBot
17
17
  # test/test_botable/
18
18
  ActionDispatch::IntegrationTest.include BaseTest
19
19
  ActionDispatch::IntegrationTest.include CrudTest
20
+ ActionDispatch::IntegrationTest.include DeviseTest
20
21
  ActionDispatch::IntegrationTest.include MemberTest
21
22
  ActionDispatch::IntegrationTest.include PageTest
22
23
  ActionDispatch::IntegrationTest.include RedirectTest
@@ -25,6 +26,7 @@ module EffectiveTestBot
25
26
  # test/concerns/test_botable/
26
27
  ActionDispatch::IntegrationTest.include TestBotable::BaseDsl
27
28
  ActionDispatch::IntegrationTest.include TestBotable::CrudDsl
29
+ ActionDispatch::IntegrationTest.include TestBotable::DeviseDsl
28
30
  ActionDispatch::IntegrationTest.include TestBotable::MemberDsl
29
31
  ActionDispatch::IntegrationTest.include TestBotable::PageDsl
30
32
  ActionDispatch::IntegrationTest.include TestBotable::RedirectDsl
@@ -48,7 +50,12 @@ module EffectiveTestBot
48
50
 
49
51
  ApplicationController.instance_exec do
50
52
  rescue_from ActionController::UnpermittedParameters do |exception|
51
- assign_test_bot_unpermitted_params_headers(exception)
53
+ assign_test_bot_unpermitted_params_header(exception)
54
+ end
55
+
56
+ rescue_from Exception do |exception| # Not sure if I should rescue Exception or StandardError
57
+ assign_test_bot_exceptions_header(exception)
58
+ render status: 500, text: "<html><body><h1>Uncaught Exception</h1><p>#{exception.message}</p><p>#{exception.backtrace.first(20).join('<br>')}</p></body></html>"
52
59
  end
53
60
  end
54
61
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveTestBot
2
- VERSION = '0.4.2'.freeze
2
+ VERSION = '0.4.3'.freeze
3
3
  end
@@ -36,7 +36,6 @@ class ActionDispatch::IntegrationTest
36
36
  def after_teardown # I reset sessions here so capybara-screenshot can still make screenshots when tests fail
37
37
  super(); Capybara.reset_sessions!
38
38
  end
39
-
40
39
  end
41
40
 
42
41
 
@@ -53,14 +52,19 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
53
52
  ### That gets run just once before the whole test suite loads
54
53
 
55
54
  # So the very first thing I do is set up a consistent database
56
- Rake::Task['db:schema:load'].invoke
55
+ silence_stream(STDOUT) do
56
+ Rake::Task['db:schema:load'].invoke
57
+ end
58
+
57
59
  ActiveRecord::Migration.maintain_test_schema!
58
60
 
59
61
  # or the following 3:
60
62
 
61
- #Rake::Task['db:drop'].invoke
62
- #Rake::Task['db:create'].invoke
63
- #Rake::Task['db:migrate'].invoke
63
+ # silence_stream(STDOUT) do
64
+ # Rake::Task['db:drop'].invoke
65
+ # Rake::Task['db:create'].invoke
66
+ # Rake::Task['db:migrate'].invoke
67
+ # end
64
68
 
65
69
  Rake::Task['db:fixtures:load'].invoke # There's just no way to get the seeds first, as this has to delete everything
66
70
  Rake::Task['db:seed'].invoke
@@ -6,6 +6,8 @@ require 'rails/test_unit/sub_test_task'
6
6
  # rake test:bot TEST=documents#new,documents#show
7
7
  # rake test:bot TEST=documents#new path,documents#show,documents#update_valid no_unpermitted_params
8
8
 
9
+ # rake test:bot:environment
10
+
9
11
  namespace :test do
10
12
  desc 'Runs Effective Test Bot'
11
13
  task :bot do
@@ -17,9 +19,21 @@ namespace :test do
17
19
  Rake::Task["test:effective_test_bot"].invoke
18
20
  end
19
21
 
22
+ namespace :bot do
23
+ desc 'Runs Effective Test Bot environment test'
24
+ task :environment do
25
+ Rake::Task["test:effective_test_bot_environment"].invoke
26
+ end
27
+ end
28
+
20
29
  Rails::TestTask.new('effective_test_bot' => 'test:prepare') do |t|
21
30
  t.libs << 'test'
22
- t.test_files = FileList["#{File.dirname(__FILE__)}/../../test/test_bot/**/*_test.rb"]
31
+ t.test_files = FileList["#{File.dirname(__FILE__)}/../../test/test_bot/integration/application_test.rb"]
32
+ end
33
+
34
+ Rails::TestTask.new('effective_test_bot_environment' => 'test:prepare') do |t|
35
+ t.libs << 'test'
36
+ t.test_files = FileList["#{File.dirname(__FILE__)}/../../test/test_bot/integration/environment_test.rb"]
23
37
  end
24
38
 
25
39
  desc 'loads test/fixtures/seeds.rb'
@@ -3,7 +3,7 @@ module TestBotable
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  module ClassMethods
6
- TEST_BOT_TEST_PREFIXES = ['crud_test', 'member_test', 'page_test', 'redirect_test', 'wizard_test']
6
+ TEST_BOT_TEST_PREFIXES = ['crud_test', 'devise_test', 'member_test', 'page_test', 'redirect_test', 'wizard_test']
7
7
 
8
8
  # Parses and validates lots of options
9
9
  # This is a big manual merge wherein we translate some DSL methods into one consistent Hash here
@@ -80,10 +80,10 @@ module TestBotable
80
80
  options[:resource_class] = resource_class
81
81
  options[:resource_name] = resource_class.name.underscore
82
82
  options[:resource_attributes] = resource_attributes
83
-
84
- options[:normalized] = true
85
83
  end
86
84
 
85
+ options[:normalized] = true
86
+
87
87
  options
88
88
  end
89
89
 
@@ -106,6 +106,7 @@ module TestBotable
106
106
  @num_defined_test_bot_tests[test_family] = (@num_defined_test_bot_tests[test_family] || 0) + 1
107
107
  end
108
108
 
109
+ # If we change the format here, also update effective_test_bot.skip? method
109
110
  if current_test.present?
110
111
  "#{test_family}: (#{current_test})"
111
112
  elsif number_of_tests > 1
@@ -46,6 +46,7 @@ module TestBotable
46
46
  ].compact.join('/') + '#' + test.to_s
47
47
 
48
48
  method_name = test_bot_method_name('crud_test', label || options_for_method[:current_test])
49
+ next if EffectiveTestBot.skip?(label || options_for_method[:current_test])
49
50
 
50
51
  define_method(method_name) { crud_action_test(test, resource, user, options_for_method) }
51
52
  end
@@ -83,7 +84,7 @@ module TestBotable
83
84
  begin
84
85
  assign_test_bot_lets!(options.reverse_merge!(user: user, resource: resource))
85
86
  rescue => e
86
- raise "Error: #{e.message}. Expected usage: crud_action_test(:new, Post || Post.new, User.first, options_hash)"
87
+ raise "Error: #{e.message}. Expected usage: crud_action_test(:new, Post || Post.new, User.first)"
87
88
  end
88
89
 
89
90
  self.send("test_bot_#{test}_test")
@@ -0,0 +1,50 @@
1
+ # This DSL gives a class level and an instance level way of calling specific test suite
2
+ #
3
+ # class DeviseTest < ActionDispatch::IntegrationTest
4
+ # devise_test()
5
+ #
6
+ # test 'a one-off action' do
7
+ # devise_action_test(:sign_up)
8
+ # devise_action_test(:sign_in_valid)
9
+ # devise_action_test(:sign_in_invalid)
10
+ # end
11
+ # end
12
+
13
+ module TestBotable
14
+ module DeviseDsl
15
+ extend ActiveSupport::Concern
16
+
17
+ module ClassMethods
18
+
19
+ def devise_test(options = {})
20
+ label = options.delete(:label).presence
21
+
22
+ [:sign_up, :sign_in_valid, :sign_in_invalid].each do |test|
23
+ options[:current_test] = label || test
24
+
25
+ method_name = test_bot_method_name('devise_test', options[:current_test])
26
+ next if EffectiveTestBot.skip?(options[:current_test])
27
+
28
+ define_method(method_name) { devise_action_test(test, options) }
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ # Instance Methods - Call me from within a test
35
+ def devise_action_test(test, options = {})
36
+ options[:email] ||= "unique-#{Time.zone.now.to_i}@example.com"
37
+ options[:password] ||= '!Password123'
38
+ options[:user] ||= User.new
39
+
40
+ begin
41
+ assign_test_bot_lets!(options)
42
+ rescue => e
43
+ raise "Error: #{e.message}. Expected usage: devise_action_test(:sign_up)"
44
+ end
45
+
46
+ self.send("test_bot_devise_#{test}_test")
47
+ end
48
+
49
+ end
50
+ end
@@ -18,8 +18,10 @@ module TestBotable
18
18
  module ClassMethods
19
19
 
20
20
  def member_test(controller, action, user, obj_to_param = nil, options = {})
21
- options[:current_test] = "#{controller}##{action}"
22
- method_name = test_bot_method_name('member_test', options.delete(:label) || options[:current_test])
21
+ options[:current_test] = options.delete(:label) || "#{controller}##{action}"
22
+
23
+ method_name = test_bot_method_name('member_test', options[:current_test])
24
+ return if EffectiveTestBot.skip?(options[:current_test])
23
25
 
24
26
  define_method(method_name) { member_action_test(controller, action, user, obj_to_param, options) }
25
27
  end
@@ -16,8 +16,10 @@ module TestBotable
16
16
  module ClassMethods
17
17
 
18
18
  def page_test(path, user, options = {})
19
- options[:current_test] = path.to_s
20
- method_name = test_bot_method_name('page_test', options.delete(:label) || options[:current_test])
19
+ options[:current_test] = options.delete(:label) || path.to_s
20
+
21
+ method_name = test_bot_method_name('page_test', options[:current_test])
22
+ return if EffectiveTestBot.skip?(options[:current_test])
21
23
 
22
24
  define_method(method_name) { page_action_test(path, user, options) }
23
25
  end
@@ -29,7 +31,7 @@ module TestBotable
29
31
  begin
30
32
  assign_test_bot_lets!(options.reverse_merge!(user: user, page_path: path))
31
33
  rescue => e
32
- raise "Error: #{e.message}. Expected usage: crud_action_test(:new, Post || Post.new, User.first, options_hash)"
34
+ raise "Error: #{e.message}. Expected usage: page_action_test(root_path, User.first)"
33
35
  end
34
36
 
35
37
  self.send(:test_bot_page_test)
@@ -15,8 +15,10 @@ module TestBotable
15
15
  module ClassMethods
16
16
 
17
17
  def redirect_test(from_path, to_path, user, options = {})
18
- options[:current_test] = "#{from_path} to #{to_path}"
19
- method_name = test_bot_method_name('redirect_test', options.delete(:label) || options[:current_test])
18
+ options[:current_test] = options.delete(:label) || "#{from_path} to #{to_path}"
19
+
20
+ method_name = test_bot_method_name('redirect_test', options[:current_test])
21
+ return if EffectiveTestBot.skip?(options[:current_test])
20
22
 
21
23
  define_method(method_name) { redirect_action_test(from_path, to_path, user, options) }
22
24
  end
@@ -18,8 +18,10 @@ module TestBotable
18
18
  module ClassMethods
19
19
 
20
20
  def wizard_test(from_path, to_path, user, options = {})
21
- options[:current_test] = "#{from_path} to #{to_path}"
22
- method_name = test_bot_method_name('wizard_test', options.delete(:label) || options[:current_test])
21
+ options[:current_test] = options.delete(:label) || "#{from_path} to #{to_path}"
22
+
23
+ method_name = test_bot_method_name('wizard_test', options[:current_test])
24
+ return if EffectiveTestBot.skip?(options[:current_test])
23
25
 
24
26
  define_method(method_name) { wizard_action_test(from_path, to_path, user, options) }
25
27
  end
@@ -12,6 +12,8 @@ module EffectiveTestBotAssertions
12
12
  end
13
13
 
14
14
  def assert_page_title(title = :any, message = '(page_title) Expected page title to be present')
15
+ return if was_download? # If this was a download, it correctly won't have a page title
16
+
15
17
  if title.present? && title != :any
16
18
  assert_title(title) # Capybara TitleQuery, match this text
17
19
  else
@@ -39,16 +41,19 @@ module EffectiveTestBotAssertions
39
41
  end
40
42
  end
41
43
 
42
-
43
44
  def assert_no_js_errors(message = nil)
44
45
  errors = page.driver.error_messages
45
- assert_equal 0, errors.size, message || "(no_js_errors) Unexpected javascript error: #{errors.join(', ')}"
46
+ assert errors.blank?, message || "(no_js_errors) Unexpected javascript error:\n#{errors.first.to_s}"
46
47
  end
47
48
 
48
49
  def assert_no_unpermitted_params(message = '(no_unpermitted_params) Expected no unpermitted params')
49
50
  assert_equal [], unpermitted_params, message
50
51
  end
51
52
 
53
+ def assert_no_exceptions(message = nil)
54
+ assert exceptions.blank?, message || "(no_exceptions) Unexpected exception:\n#{exceptions.join("\n")}\n========== End Exception ==========\n"
55
+ end
56
+
52
57
  # assert_flash
53
58
  # assert_flash :success
54
59
  # assert_flash :error, 'there was a specific error'
@@ -10,6 +10,7 @@ module EffectiveTestBotFormHelper
10
10
 
11
11
  # Support for the cocoon gem
12
12
  all('a.add_fields[data-association-insertion-template]').each do |cocoon_add_field|
13
+ next unless cocoon_add_field.visible?
13
14
  [1,2].sample.times { cocoon_add_field.click() }
14
15
  end
15
16
 
@@ -65,7 +66,10 @@ module EffectiveTestBotFormHelper
65
66
  when 'input_email'
66
67
  Faker::Internet.email
67
68
  when 'input_number'
68
- Faker::Number.number(4)
69
+ min = (Float(field['min']) rescue 1)
70
+ max = (Float(field['max']) rescue 1000)
71
+ number = Random.new.rand(min..max)
72
+ number.kind_of?(Float) ? number.round(2) : number
69
73
  when 'input_password'
70
74
  @test_bot_password ||= Faker::Internet.password # Use the same password throughout a single test. Allows passwords and password_confirmations to match.
71
75
  when 'input_tel'
@@ -75,9 +79,16 @@ module EffectiveTestBotFormHelper
75
79
  classes = field['class'].to_s.split(' ')
76
80
 
77
81
  if classes.include?('date') # Let's assume this is a date input.
78
- Faker::Date.backward(365).strftime('%y-%m-%d')
82
+ Faker::Date.backward(365).strftime('%Y-%m-%d')
79
83
  elsif classes.include?('datetime')
80
- Faker::Date.backward(365).strftime('%y-%m-%d %H:%m')
84
+ Faker::Date.backward(365).strftime('%Y-%m-%d %H:%m')
85
+ elsif classes.include?('price')
86
+ 4.times.map { DIGITS.sample }.join('') + '.00'
87
+ elsif classes.include?('numeric')
88
+ min = (Float(field['min']) rescue 1)
89
+ max = (Float(field['max']) rescue 1000)
90
+ number = Random.new.rand(min..max)
91
+ number.kind_of?(Float) ? number.round(2) : number
81
92
  elsif attributes.last.to_s.include?('first_name')
82
93
  Faker::Name.first_name
83
94
  elsif attributes.last.to_s.include?('last_name')
@@ -17,12 +17,23 @@ module EffectiveTestBotTestHelper
17
17
  @flash = (JSON.parse(Base64.decode64(session.driver.response_headers['Test-Bot-Flash'])) rescue {})
18
18
  @assigns = (JSON.parse(Base64.decode64(session.driver.response_headers['Test-Bot-Assigns'])) rescue {})
19
19
  @unpermitted_params = (JSON.parse(Base64.decode64(session.driver.response_headers['Test-Bot-Unpermitted-Params'])) rescue [])
20
+
21
+ @visit_delete_page = session
20
22
  end
21
23
 
22
24
  def was_redirect?(from_path, to_path = nil)
23
25
  from_path != (to_path || page.current_path)
24
26
  end
25
27
 
28
+ def was_download?(filename = nil)
29
+ if filename.present?
30
+ page.response_headers['Content-Disposition'].to_s.include?('filename=') &&
31
+ page.response_headers['Content-Disposition'].to_s.include?(filename)
32
+ else
33
+ page.response_headers['Content-Disposition'].to_s.include?('filename=')
34
+ end
35
+ end
36
+
26
37
  # EffectiveTestBot includes an after_filter on ApplicationController to set an http header
27
38
  # that encodes the flash message, and some of the assigns
28
39
  def flash
@@ -36,4 +47,9 @@ module EffectiveTestBotTestHelper
36
47
  def unpermitted_params
37
48
  @unpermitted_params ||= (JSON.parse(Base64.decode64(page.response_headers['Test-Bot-Unpermitted-Params'])) rescue [])
38
49
  end
50
+
51
+ def exceptions
52
+ @exceptions ||= (JSON.parse(Base64.decode64(page.response_headers['Test-Bot-Exceptions'])) rescue [])
53
+ end
54
+
39
55
  end
@@ -13,10 +13,6 @@ module TestBot
13
13
  routes = Rails.application.routes.routes.to_a
14
14
  seen_actions = Hash.new([]) # {posts: ['new', 'edit'], events: ['new', 'edit', 'show']}
15
15
 
16
- #Rails.application.routes.recognize_path('/your/path/here')
17
- #Rails.application.routes.recognize_path('/admin/jobs/3/unarchive')
18
- # => {:action=>"unarchive", :controller=>"admin/jobs", :id=>"3"}
19
-
20
16
  routes.each_with_index do |route, index|
21
17
  controller = route.defaults[:controller]
22
18
  action = route.defaults[:action]
@@ -24,10 +20,10 @@ module TestBot
24
20
  # Devise Test
25
21
  if (controller || '').include?('devise')
26
22
  next if seen_actions['devise'].present?
27
-
28
- puts 'define devise test!!'
29
23
  seen_actions['devise'] = true # So we don't repeat it
30
24
 
25
+ devise_test()
26
+
31
27
  # Redirect Test
32
28
  elsif route.app.kind_of?(ActionDispatch::Routing::PathRedirect) && route.path.required_names.blank?
33
29
  path = route.path.spec.to_s
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module TestBot
4
- class MinitestTest < ActionDispatch::IntegrationTest
4
+ class EnvironmentTest < ActionDispatch::IntegrationTest
5
5
  @@original_users_count = User.count
6
6
  let(:original_users_count) { @@original_users_count }
7
7
 
@@ -6,6 +6,7 @@ module BaseTest
6
6
 
7
7
  def assert_page_normal(message = nil)
8
8
  unless test_bot_skip?(:normal)
9
+ assert_no_exceptions unless test_bot_skip?(:exceptions)
9
10
  assert_page_status unless test_bot_skip?(:page_status)
10
11
  assert_page_title unless test_bot_skip?(:page_title)
11
12
  assert_no_js_errors unless test_bot_skip?(:no_js_errors)
@@ -21,11 +22,12 @@ module BaseTest
21
22
  # if you use the action_test_ instance methods, current_test is nil, and test skips won't apply
22
23
  # Any global assertion skips will tho
23
24
  def test_bot_skip?(assertion = nil)
24
- # Skip the whole test
25
+ # Skip the whole test 'documents#new'
25
26
  # this will put SKIP into the minitest output
26
27
  skip if (defined?(current_test) && EffectiveTestBot.skip?(current_test))
27
28
 
28
- # Check if the individual assertion should be skipped
29
+ # Skip just this assertion sub test 'flash'
30
+ # this will not print anything to the minitest output
29
31
  EffectiveTestBot.skip?((current_test if defined?(current_test)), assertion)
30
32
  end
31
33
 
@@ -5,7 +5,6 @@ module CrudTest
5
5
  protected
6
6
 
7
7
  def test_bot_new_test
8
- test_bot_skip?
9
8
  sign_in(user) and visit(new_resource_path)
10
9
 
11
10
  assert_page_normal
@@ -21,7 +20,6 @@ module CrudTest
21
20
  end
22
21
 
23
22
  def test_bot_create_valid_test
24
- test_bot_skip?
25
23
  sign_in(user) and visit(new_resource_path)
26
24
 
27
25
  before = { count: resource_class.count, path: page.current_path }
@@ -46,7 +44,6 @@ module CrudTest
46
44
  end
47
45
 
48
46
  def test_bot_create_invalid_test
49
- test_bot_skip?
50
47
  sign_in(user) and visit(new_resource_path)
51
48
 
52
49
  before = { count: resource_class.count }
@@ -58,11 +55,11 @@ module CrudTest
58
55
 
59
56
  after = { count: resource_class.count }
60
57
 
61
- assert_equal before[:count], after[:count], "Expected #{resource_class}.count to be unchanged"
62
- assert_page_title(:any, '(page_title) Expected page title to be present after failed validation') unless test_bot_skip?(:page_title)
58
+ assert_page_normal
63
59
 
64
- assert_no_js_errors unless test_bot_skip?(:no_js_errors)
60
+ assert_equal before[:count], after[:count], "Expected #{resource_class}.count to be unchanged"
65
61
  assert_flash(:danger) unless test_bot_skip?(:flash)
62
+
66
63
  assert_assigns(resource_name) unless test_bot_skip?(:assigns)
67
64
  assert_assigns_errors(resource_name) unless test_bot_skip?(:assigns_errors)
68
65
 
@@ -70,7 +67,6 @@ module CrudTest
70
67
  end
71
68
 
72
69
  def test_bot_edit_test
73
- test_bot_skip?
74
70
  sign_in(user) and (resource = find_or_create_resource!)
75
71
 
76
72
  visit(edit_resource_path(resource))
@@ -88,7 +84,6 @@ module CrudTest
88
84
  end
89
85
 
90
86
  def test_bot_update_valid_test
91
- test_bot_skip?
92
87
  sign_in(user) and (resource = find_or_create_resource!)
93
88
 
94
89
  visit(edit_resource_path(resource))
@@ -103,8 +98,7 @@ module CrudTest
103
98
 
104
99
  after = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
105
100
 
106
- assert_no_js_errors unless test_bot_skip?(:no_js_errors)
107
- assert_no_unpermitted_params unless test_bot_skip?(:unpermitted_params)
101
+ assert_page_normal
108
102
 
109
103
  assert_equal before[:count], after[:count], "Expected #{resource_class}.count to be unchanged"
110
104
  refute_equal(before[:updated_at], after[:updated_at], "(updated_at_changed) Expected @#{resource_name}.updated_at to have changed") if (resource.respond_to?(:updated_at) && !test_bot_skip?(:updated_at_changed))
@@ -118,7 +112,6 @@ module CrudTest
118
112
  end
119
113
 
120
114
  def test_bot_update_invalid_test
121
- test_bot_skip?
122
115
  sign_in(user) and (resource = find_or_create_resource!)
123
116
 
124
117
  visit(edit_resource_path(resource))
@@ -133,12 +126,13 @@ module CrudTest
133
126
 
134
127
  after = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
135
128
 
136
- assert_no_js_errors unless test_bot_skip?(:no_js_errors)
129
+ assert_page_normal
130
+
137
131
  assert_equal before[:count], after[:count], "Expected: #{resource_class}.count to be unchanged"
138
132
  assert_equal(before[:updated_at], after[:updated_at], "Expected @#{resource_name}.updated_at to be unchanged") if resource.respond_to?(:updated_at)
139
- assert_page_title(:any, '(page_title) Expected page title to be present after failed validation') unless test_bot_skip?(:page_title)
140
133
 
141
134
  assert_flash(:danger) unless test_bot_skip?(:flash)
135
+
142
136
  assert_assigns(resource_name) unless test_bot_skip?(:assigns)
143
137
  assert_assigns_errors(resource_name) unless test_bot_skip?(:assigns_errors)
144
138
 
@@ -146,7 +140,6 @@ module CrudTest
146
140
  end
147
141
 
148
142
  def test_bot_index_test
149
- test_bot_skip?
150
143
  sign_in(user) and (resource = (find_or_create_resource! rescue nil))
151
144
 
152
145
  visit resources_path
@@ -160,7 +153,6 @@ module CrudTest
160
153
  end
161
154
 
162
155
  def test_bot_show_test
163
- test_bot_skip?
164
156
  sign_in(user) and (resource = find_or_create_resource!)
165
157
 
166
158
  visit resource_path(resource)
@@ -170,7 +162,6 @@ module CrudTest
170
162
  end
171
163
 
172
164
  def test_bot_destroy_test
173
- test_bot_skip?
174
165
  sign_in(user) and (resource = find_or_create_resource!)
175
166
 
176
167
  before = { count: resource_class.count, archived: (resource.archived rescue nil) }
@@ -179,6 +170,12 @@ module CrudTest
179
170
 
180
171
  after = { count: resource_class.count, archived: (resource_class.find(resource.id).archived rescue nil) }
181
172
 
173
+ # Because of the way delete works, we can't use assert_page_normal()
174
+ # So we just assert the 200 status code, and page title present manually
175
+ # Javascript errors cannot be detected
176
+ assert_equal(200, @visit_delete_page.try(:status_code), '(page_status) Expected 200 HTTP status code') unless test_bot_skip?(:page_status)
177
+ assert((@visit_delete_page.find(:xpath, '//title', visible: false) rescue nil).present?, '(page_title) Expected page title to be present') unless test_bot_skip?(:page_title)
178
+
182
179
  assert_flash(:success) unless test_bot_skip?(:flash)
183
180
 
184
181
  if resource.respond_to?(:archived)
@@ -0,0 +1,55 @@
1
+ # All the methods in this file should not be called from the outside world
2
+ # See the DSL files in concerns/test_botable/ for how to call these tests
3
+
4
+ module DeviseTest
5
+ protected
6
+
7
+ def test_bot_devise_sign_up_test
8
+ visit new_user_registration_path
9
+
10
+ within('form#new_user') do
11
+ fill_form(email: email, password: password, password_confirmation: password)
12
+ submit_form
13
+ end
14
+
15
+ assert_page_normal
16
+
17
+ assert_content I18n.t('devise.registrations.signed_up')
18
+ assert User.find_by_email(email).present?
19
+ assert_assigns :current_user
20
+ end
21
+
22
+ def test_bot_devise_sign_in_valid_test
23
+ User.new(email: email, password: password, password_confirmation: password).save(validate: false)
24
+
25
+ visit new_user_session_path
26
+
27
+ within('form#new_user') do
28
+ fill_form(email: email, password: password)
29
+ submit_form
30
+ end
31
+
32
+ assert_page_normal
33
+
34
+ assert_content I18n.t('devise.sessions.signed_in')
35
+ assert_equal 1, User.find_by_email(email).sign_in_count
36
+ assert_assigns :current_user
37
+ end
38
+
39
+ def test_bot_devise_sign_in_invalid_test
40
+ User.new(email: email, password: password, password_confirmation: password).save(validate: false)
41
+
42
+ visit new_user_session_path
43
+
44
+ within('form#new_user') do
45
+ fill_form(email: email, password: 'not-correct-password')
46
+ submit_form
47
+ end
48
+
49
+ assert_page_normal
50
+
51
+ assert_content I18n.t('devise.failure.invalid', authentication_keys: Devise.authentication_keys.join(', '))
52
+ assert assigns[:current_user].blank?
53
+ end
54
+
55
+ end
@@ -5,7 +5,6 @@ module MemberTest
5
5
  protected
6
6
 
7
7
  def test_bot_member_test
8
- test_bot_skip?
9
8
  sign_in(user) and (resource = find_or_create_resource!)
10
9
 
11
10
  path = url_for(controller: controller, action: action, id: resource.id, only_path: true)
@@ -13,7 +12,6 @@ module MemberTest
13
12
  visit(path)
14
13
 
15
14
  assert_page_normal
16
- assert_flash unless test_bot_skip?(:flash)
17
15
  assert_assigns(resource_name) unless (was_redirect?(path) || test_bot_skip?(:assigns))
18
16
  end
19
17
 
@@ -5,8 +5,6 @@ module PageTest
5
5
  protected
6
6
 
7
7
  def test_bot_page_test
8
- test_bot_skip?
9
-
10
8
  sign_in(user)
11
9
 
12
10
  if page_path.kind_of?(Symbol)
@@ -5,8 +5,6 @@ module RedirectTest
5
5
  protected
6
6
 
7
7
  def test_bot_redirect_test
8
- test_bot_skip?
9
-
10
8
  sign_in(user) and visit(from_path)
11
9
 
12
10
  assert_redirect(from_path, to_path)
@@ -5,8 +5,6 @@ module WizardTest
5
5
  protected
6
6
 
7
7
  def test_bot_wizard_test
8
- test_bot_skip?
9
-
10
8
  sign_in(user) and visit(from_path)
11
9
 
12
10
  0.upto(50) do |index| # Can only test wizards 51 steps long
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.4.2
4
+ version: 0.4.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: 2015-08-24 00:00:00.000000000 Z
11
+ date: 2015-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -213,6 +213,7 @@ files:
213
213
  - lib/tasks/effective_test_bot_tasks.rake
214
214
  - test/concerns/test_botable/base_dsl.rb
215
215
  - test/concerns/test_botable/crud_dsl.rb
216
+ - test/concerns/test_botable/devise_dsl.rb
216
217
  - test/concerns/test_botable/member_dsl.rb
217
218
  - test/concerns/test_botable/page_dsl.rb
218
219
  - test/concerns/test_botable/redirect_dsl.rb
@@ -223,11 +224,10 @@ files:
223
224
  - test/support/effective_test_bot_login_helper.rb
224
225
  - test/support/effective_test_bot_test_helper.rb
225
226
  - test/test_bot/integration/application_test.rb
226
- - test/test_bot/integration/devise_test.rb
227
- - test/test_bot/integration/minitest_test.rb
228
- - test/test_bot/models/user_test.rb
227
+ - test/test_bot/integration/environment_test.rb
229
228
  - test/test_botable/base_test.rb
230
229
  - test/test_botable/crud_test.rb
230
+ - test/test_botable/devise_test.rb
231
231
  - test/test_botable/member_test.rb
232
232
  - test/test_botable/page_test.rb
233
233
  - test/test_botable/redirect_test.rb
@@ -1,54 +0,0 @@
1
- require 'test_helper'
2
-
3
- if defined?(Devise) && defined?(User)
4
- module TestBot
5
- class DeviseTest < ActionDispatch::IntegrationTest
6
- let(:email) { 'unique@testbot.com'}
7
- let(:password) { '!Password123' }
8
- let(:create_user!) { User.new(email: email, password: password, password_confirmation: password).save(validate: false) }
9
-
10
- test 'sign up' do
11
- visit new_user_registration_path
12
-
13
- within('form#new_user') do
14
- fill_form(email: email, password: password, password_confirmation: password)
15
- submit_form
16
- end
17
-
18
- assert_equal page.status_code, 200
19
- assert_content I18n.t('devise.registrations.signed_up')
20
- assert User.find_by_email(email).present?
21
- assert_assigns :current_user
22
- end
23
-
24
- test 'sign in' do
25
- create_user!
26
- visit new_user_session_path
27
-
28
- within('form#new_user') do
29
- fill_form(email: email, password: password)
30
- submit_form
31
- end
32
-
33
- assert_equal 200, page.status_code
34
- assert_content I18n.t('devise.sessions.signed_in')
35
- assert_equal 1, User.find_by_email(email).sign_in_count
36
- assert_assigns :current_user
37
- end
38
-
39
- test 'invalid sign in' do
40
- create_user!
41
- visit new_user_session_path
42
-
43
- within('form#new_user') do
44
- fill_form(email: email, password: 'not-correct-password')
45
- submit_form
46
- end
47
-
48
- assert_equal 200, page.status_code
49
- assert_content I18n.t('devise.failure.invalid', authentication_keys: Devise.authentication_keys.join(', '))
50
- assert assigns[:current_user].blank?
51
- end
52
- end
53
- end
54
- end
@@ -1,22 +0,0 @@
1
- require 'test_helper'
2
-
3
- if defined?(Devise) && defined?(User)
4
- module TestBot
5
- class UserTest < ActiveSupport::TestCase
6
- let(:user) { User.new() }
7
-
8
- # These are mostly here as an example of using shoulda
9
- # I don't find that I use the gem, but I see it's value
10
- should validate_presence_of(:email)
11
- should validate_presence_of(:password)
12
- should validate_presence_of(:encrypted_password)
13
-
14
- test "user invalid when password and confirmation mismatch" do
15
- user.password = '123456789'
16
- user.password_confirmation = '987654321'
17
-
18
- refute user.valid?, 'user should be invalid with mismatched passwords'
19
- end
20
- end
21
- end
22
- end