effective_test_bot 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/effective_test_bot.rb +5 -0
- data/lib/effective_test_bot.rb +2 -0
- data/lib/effective_test_bot/version.rb +1 -1
- data/test/concerns/test_botable/base_dsl.rb +14 -8
- data/test/concerns/test_botable/crud_dsl.rb +5 -3
- data/test/concerns/test_botable/member_dsl.rb +4 -2
- data/test/concerns/test_botable/page_dsl.rb +4 -2
- data/test/concerns/test_botable/redirect_dsl.rb +4 -2
- data/test/concerns/test_botable/wizard_dsl.rb +4 -2
- data/test/support/effective_test_bot_form_filler.rb +2 -0
- data/test/test_bot/integration/application_test.rb +1 -15
- data/test/test_botable/crud_test.rb +6 -6
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a39eb4dbe99bb9e9e190dcdea42b98217e899fbb
|
4
|
+
data.tar.gz: f3de18d8e670326b43977a17eaec8abc1bc9afc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6602fcc1c63846384499ff4c3d20109dc113f20ed8e3d18f804e7a960da289dd15ab3700f7de6c45ea186963af1397627d7062abba896008bc1a00882e0259b4
|
7
|
+
data.tar.gz: 430925ce013e377568e84a0e12295694adb9fe13355f7cb8129c0191f2c1b0db44f302af128d412c70f3310af2af111db8530cbf394e9cd40b8f535f8ff2da77
|
@@ -18,6 +18,11 @@ if Rails.env.test?
|
|
18
18
|
# Silence skipped routes
|
19
19
|
config.silence_skipped_routes = false
|
20
20
|
|
21
|
+
# Set the current user on a per test basis. You must have at least 1 user seeded.
|
22
|
+
# test is a String as per the except, only and TEST= test names
|
23
|
+
# proc = { |test| user = User.first; puts "#{test} #{user}"; user }
|
24
|
+
config.user = proc { |test| User.first }
|
25
|
+
|
21
26
|
# Exits immediately if there is a test failure
|
22
27
|
config.fail_fast = false
|
23
28
|
|
data/lib/effective_test_bot.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
require 'effective_resources'
|
1
2
|
require 'effective_test_bot/engine'
|
2
3
|
require 'effective_test_bot/dsl'
|
3
4
|
require 'effective_test_bot/middleware'
|
4
5
|
require 'effective_test_bot/version'
|
5
6
|
|
6
7
|
module EffectiveTestBot
|
8
|
+
mattr_accessor :user
|
7
9
|
mattr_accessor :except
|
8
10
|
mattr_accessor :only
|
9
11
|
mattr_accessor :fail_fast
|
@@ -5,10 +5,6 @@ module TestBotable
|
|
5
5
|
module ClassMethods
|
6
6
|
TEST_BOT_TEST_PREFIXES = ['crud_test', 'devise_test', 'member_test', 'page_test', 'redirect_test', 'wizard_test']
|
7
7
|
|
8
|
-
def _test_bot_user
|
9
|
-
@test_bot_user
|
10
|
-
end
|
11
|
-
|
12
8
|
# Parses and validates lots of options
|
13
9
|
# This is a big manual merge wherein we translate some DSL methods into one consistent Hash here
|
14
10
|
# The output is what gets sent to each test and defined as lets
|
@@ -28,8 +24,6 @@ module TestBotable
|
|
28
24
|
|
29
25
|
def normalize_test_bot_options!(options)
|
30
26
|
raise 'expected options to be a Hash' unless options.kind_of?(Hash)
|
31
|
-
raise 'expected key :user to be a User' unless (options[:user].kind_of?(User) || options[:user] == false)
|
32
|
-
#raise 'expected key :current_test to be a String' unless options[:current_test].kind_of?(String)
|
33
27
|
|
34
28
|
# Controller stuff
|
35
29
|
options[:controller_namespace] ||= options[:namespace]
|
@@ -123,8 +117,20 @@ module TestBotable
|
|
123
117
|
|
124
118
|
# Instance Methods
|
125
119
|
|
126
|
-
def
|
127
|
-
@test_bot_user
|
120
|
+
def test_bot_user(test_name)
|
121
|
+
return @test_bot_user if @test_bot_user
|
122
|
+
|
123
|
+
unless EffectiveTestBot.user.kind_of?(Proc)
|
124
|
+
raise 'expected EffectiveTestBot.user to be a proc. Set config.user = Proc.new { |test| User.first }'
|
125
|
+
end
|
126
|
+
|
127
|
+
user = EffectiveTestBot.user.call(test_name)
|
128
|
+
|
129
|
+
unless user
|
130
|
+
raise "no user returned for #{test_name}. Please make sure the /config/initializers/effective_test_bot.rb config.user proc returns a user for this test."
|
131
|
+
end
|
132
|
+
|
133
|
+
user
|
128
134
|
end
|
129
135
|
|
130
136
|
# Using reverse_merge! in the dsl action_tests makes sure that the
|
@@ -18,7 +18,7 @@ module TestBotable
|
|
18
18
|
|
19
19
|
# All this does is define a 'test_bot' method for each required action on this class
|
20
20
|
# So that MiniTest will see the test functions and run them
|
21
|
-
def crud_test(resource:, user:
|
21
|
+
def crud_test(resource:, user: nil, label: nil, skip: {}, only: nil, except: nil, **options)
|
22
22
|
# This skips paramaters is different than the initializer skips, which affect just the rake task
|
23
23
|
|
24
24
|
# These are specificially for the DSL
|
@@ -28,7 +28,7 @@ module TestBotable
|
|
28
28
|
current_crud_tests = crud_tests_to_define(only, except)
|
29
29
|
|
30
30
|
begin
|
31
|
-
normalize_test_bot_options!(options.merge!(resource: resource,
|
31
|
+
normalize_test_bot_options!(options.merge!(resource: resource, current_crud_tests: current_crud_tests))
|
32
32
|
rescue => e
|
33
33
|
raise "Error: #{e.message}. Expected usage: crud_test(resource: (Post || Post.new), user: User.first, only: [:new, :create], skip: {create_invalid: [:path]})"
|
34
34
|
end
|
@@ -78,7 +78,9 @@ module TestBotable
|
|
78
78
|
#
|
79
79
|
# If obj is a Hash {:resource => ...} just skip over parsing options
|
80
80
|
# And assume it's already been done (by the ClassMethod crud_test)
|
81
|
-
def crud_action_test(test:, resource:, user:
|
81
|
+
def crud_action_test(test:, resource:, user: nil, **options)
|
82
|
+
user ||= test_bot_user(options[:current_test])
|
83
|
+
|
82
84
|
begin
|
83
85
|
assign_test_bot_lets!(options.reverse_merge!(resource: resource, user: user))
|
84
86
|
rescue => e
|
@@ -16,7 +16,7 @@ module TestBotable
|
|
16
16
|
extend ActiveSupport::Concern
|
17
17
|
|
18
18
|
module ClassMethods
|
19
|
-
def member_test(controller:, action:, user:
|
19
|
+
def member_test(controller:, action:, user: nil, member: nil, label: nil, **options)
|
20
20
|
options[:current_test] = label || "#{controller}##{action}"
|
21
21
|
return if EffectiveTestBot.skip?(options[:current_test])
|
22
22
|
|
@@ -28,7 +28,9 @@ module TestBotable
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# Instance Methods - Call me from within a test
|
31
|
-
def member_action_test(controller:, action:, user:
|
31
|
+
def member_action_test(controller:, action:, user: nil, member:, **options)
|
32
|
+
user ||= test_bot_user(options[:current_test])
|
33
|
+
|
32
34
|
begin
|
33
35
|
assign_test_bot_lets!(options.reverse_merge!(resource: controller, action: action, user: user, member: member))
|
34
36
|
rescue => e
|
@@ -15,7 +15,7 @@ module TestBotable
|
|
15
15
|
|
16
16
|
module ClassMethods
|
17
17
|
|
18
|
-
def page_test(path:, user:
|
18
|
+
def page_test(path:, user: nil, label: nil, **options)
|
19
19
|
options[:current_test] = label || path.to_s
|
20
20
|
return if EffectiveTestBot.skip?(options[:current_test])
|
21
21
|
|
@@ -27,7 +27,9 @@ module TestBotable
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Instance Methods - Call me from within a test
|
30
|
-
def page_action_test(path:, user:
|
30
|
+
def page_action_test(path:, user: nil, **options)
|
31
|
+
user ||= test_bot_user(options[:current_test])
|
32
|
+
|
31
33
|
begin
|
32
34
|
assign_test_bot_lets!(options.reverse_merge!(user: user, page_path: path))
|
33
35
|
rescue => e
|
@@ -14,7 +14,7 @@ module TestBotable
|
|
14
14
|
|
15
15
|
module ClassMethods
|
16
16
|
|
17
|
-
def redirect_test(from:, to:, user:
|
17
|
+
def redirect_test(from:, to:, user: nil, label: nil, **options)
|
18
18
|
options[:current_test] = label || "#{from} to #{to}"
|
19
19
|
return if EffectiveTestBot.skip?(options[:current_test])
|
20
20
|
|
@@ -25,7 +25,9 @@ module TestBotable
|
|
25
25
|
end
|
26
26
|
|
27
27
|
# Instance Methods - Call me from within a test
|
28
|
-
def redirect_action_test(from:, to:, user:
|
28
|
+
def redirect_action_test(from:, to:, user: nil, **options)
|
29
|
+
user ||= test_bot_user(options[:current_test])
|
30
|
+
|
29
31
|
begin
|
30
32
|
assign_test_bot_lets!(options.reverse_merge!(from: from, to: to, user: user))
|
31
33
|
rescue => e
|
@@ -19,7 +19,7 @@ module TestBotable
|
|
19
19
|
|
20
20
|
module ClassMethods
|
21
21
|
|
22
|
-
def wizard_test(from:, to: nil, user:
|
22
|
+
def wizard_test(from:, to: nil, user: nil, label: nil, **options)
|
23
23
|
options[:current_test] = label || (to.present? ? "#{from} to #{to}" : from.to_s)
|
24
24
|
return if EffectiveTestBot.skip?(options[:current_test])
|
25
25
|
|
@@ -31,7 +31,9 @@ module TestBotable
|
|
31
31
|
end
|
32
32
|
|
33
33
|
# Instance Methods - Call me from within a test
|
34
|
-
def wizard_action_test(from:, to: nil, user:
|
34
|
+
def wizard_action_test(from:, to: nil, user: nil, **options)
|
35
|
+
user ||= test_bot_user(options[:current_test])
|
36
|
+
|
35
37
|
begin
|
36
38
|
assign_test_bot_lets!(options.reverse_merge!(from: from, to: to, user: user))
|
37
39
|
rescue => e
|
@@ -72,6 +72,8 @@ module EffectiveTestBotFormFiller
|
|
72
72
|
case [field.tag_name, field['type']].compact.join('_')
|
73
73
|
when 'input_text', 'input_email', 'input_password', 'input_tel', 'input_number', 'input_checkbox', 'input_radio', 'input_url', 'input_color'
|
74
74
|
field.set(value_for_field(field, fills))
|
75
|
+
|
76
|
+
close_effective_date_time_picker(field) if field['class'].to_s.include?('effective_date')
|
75
77
|
when 'textarea'
|
76
78
|
value = value_for_field(field, fills)
|
77
79
|
ckeditor_text_area?(field) ? fill_ckeditor_text_area(field, value) : field.set(value)
|
@@ -11,8 +11,6 @@ module TestBot
|
|
11
11
|
|
12
12
|
# Go through every route, and run an appropriate test suite on it
|
13
13
|
def initialize_tests
|
14
|
-
@test_bot_user = User.first
|
15
|
-
|
16
14
|
routes = Rails.application.routes.routes.to_a
|
17
15
|
seen_actions = Hash.new([]) # {posts: ['new', 'edit'], events: ['new', 'edit', 'show']}
|
18
16
|
|
@@ -127,20 +125,8 @@ module TestBot
|
|
127
125
|
return :none unless route.defaults[:controller] && route.defaults[:action]
|
128
126
|
|
129
127
|
@_controller_instances ||= {}
|
130
|
-
@_controller_instances[route.defaults[:controller]] ||=
|
131
|
-
end
|
132
|
-
|
133
|
-
def build_controller_instance(route)
|
134
|
-
# Find the correct route.app that links to the controller
|
135
|
-
# If there is a routing constraint, we have to traverse the route.app linked list to find the route with a controller
|
136
|
-
route_app = route
|
137
|
-
route_app = route_app.app while (route_app.respond_to?(:app) && route_app != route_app.app)
|
138
|
-
|
139
|
-
return :none unless route_app.respond_to?(:controller)
|
140
|
-
|
141
|
-
(route_app.controller(route.defaults).new() rescue :none)
|
128
|
+
@_controller_instances[route.defaults[:controller]] ||= (Effective::Resource.new(route).controller_klass.new() rescue :none)
|
142
129
|
end
|
143
|
-
|
144
130
|
end
|
145
131
|
|
146
132
|
initialize_tests
|
@@ -48,7 +48,7 @@ module CrudTest
|
|
48
48
|
def test_bot_create_invalid_test
|
49
49
|
sign_in(user) and visit(new_resource_path)
|
50
50
|
|
51
|
-
before = { count: resource_class.count }
|
51
|
+
before = { count: (resource_class.count if resource_class.respond_to?(:count)) }
|
52
52
|
|
53
53
|
assert_form("form#new_#{resource_name}") unless test_bot_skip?(:form)
|
54
54
|
|
@@ -59,14 +59,14 @@ module CrudTest
|
|
59
59
|
|
60
60
|
save_test_bot_screenshot
|
61
61
|
|
62
|
-
after = { count: resource_class.count }
|
62
|
+
after = { count: (resource_class.count if resource_class.respond_to?(:count)) }
|
63
63
|
|
64
64
|
assert_page_normal
|
65
65
|
|
66
66
|
assert_assigns(resource_name) unless test_bot_skip?(:assigns)
|
67
67
|
assert_assigns_errors(resource_name) unless test_bot_skip?(:assigns_errors)
|
68
68
|
|
69
|
-
assert_equal
|
69
|
+
assert_equal(before[:count], after[:count], "Expected #{resource_class}.count to be unchanged") if resource_class.respond_to?(:count)
|
70
70
|
assert_equal(resources_path, page.current_path, "(path) Expected current_path to match resource #create path #{resources_path}") unless test_bot_skip?(:path)
|
71
71
|
|
72
72
|
assert_flash(:danger) unless test_bot_skip?(:flash)
|
@@ -76,7 +76,7 @@ module CrudTest
|
|
76
76
|
sign_in(user) and visit(new_resource_path)
|
77
77
|
save_test_bot_screenshot
|
78
78
|
|
79
|
-
before = { count: resource_class.count, path: page.current_path }
|
79
|
+
before = { count: (resource_class.count if resource_class.respond_to?(:count)), path: page.current_path }
|
80
80
|
|
81
81
|
assert_form("form#new_#{resource_name}") unless test_bot_skip?(:form)
|
82
82
|
|
@@ -87,7 +87,7 @@ module CrudTest
|
|
87
87
|
|
88
88
|
save_test_bot_screenshot
|
89
89
|
|
90
|
-
after = { count: resource_class.count, path: page.current_path }
|
90
|
+
after = { count: (resource_class.count if resource_class.respond_to?(:count)), path: page.current_path }
|
91
91
|
|
92
92
|
assert_page_normal
|
93
93
|
assert_no_flash_errors unless test_bot_skip?(:no_flash_errors)
|
@@ -97,7 +97,7 @@ module CrudTest
|
|
97
97
|
assert_assigns(resource_name) if (after[:path].include?('/edit/') && !test_bot_skip?(:assigns))
|
98
98
|
assert_no_assigns_errors(resource_name) unless test_bot_skip?(:no_assigns_errors)
|
99
99
|
|
100
|
-
refute_equal
|
100
|
+
refute_equal(before[:count], after[:count], "Expected fill_form to create a #{resource_class} object") if resource_class.respond_to?(:count)
|
101
101
|
refute_equal(before[:path], after[:path], "(path) Expected unique before and after paths") unless test_bot_skip?(:path)
|
102
102
|
end
|
103
103
|
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_test_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.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: 2017-
|
11
|
+
date: 2017-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: effective_resources
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|