effective_test_bot 0.4.16 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -19
- data/lib/effective_test_bot/version.rb +1 -1
- data/test/concerns/test_botable/base_dsl.rb +8 -0
- data/test/concerns/test_botable/crud_dsl.rb +11 -15
- data/test/concerns/test_botable/devise_dsl.rb +6 -8
- data/test/concerns/test_botable/member_dsl.rb +7 -8
- data/test/concerns/test_botable/page_dsl.rb +7 -7
- data/test/concerns/test_botable/redirect_dsl.rb +8 -8
- data/test/concerns/test_botable/wizard_dsl.rb +11 -10
- data/test/support/effective_test_bot_login_helper.rb +3 -1
- data/test/test_bot/integration/application_test.rb +7 -5
- data/test/test_botable/wizard_test.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9718dff008026433cc1541ce36c27eefbf396777
|
4
|
+
data.tar.gz: 6710d59f4c60c6861a450d7c1b277bc32b1d6eaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14251ee81b143df1aa5f70f72cde976fd2f288f8df5dda323f301799f4001f87962b84e4d3e0af3423e404c8ad27c801d81063147770e2cc2904807c57d141a4
|
7
|
+
data.tar.gz: f65722976ab5a9974736d7cabf9a7a6e3fb983711dbcae8ff8c88c6092fa17629be239c7ed3b17265149f88fca25ea1b0c35240b3a1a958d5f84b4bf6ef80a1d
|
data/README.md
CHANGED
@@ -248,22 +248,22 @@ There are a few variations on the one-liner method:
|
|
248
248
|
```ruby
|
249
249
|
class PostsTest < ActionDispatch::IntegrationTest
|
250
250
|
# Runs all 9 crud_action tests against /posts
|
251
|
-
crud_test(Post, User.first)
|
251
|
+
crud_test(resource: Post, user: User.first)
|
252
252
|
|
253
253
|
# Runs all 9 crud_action tests against /posts and use this Post's attributes when calling fill_form.
|
254
|
-
crud_test(Post.new(title: 'my first post'), User.first)
|
254
|
+
crud_test(resource: Post.new(title: 'my first post'), user: User.first)
|
255
255
|
|
256
256
|
# Runs all 9 crud_action tests against /admin/posts controller as a previously seeded or fixtured admin user
|
257
|
-
crud_test('admin/posts', User.where(admin: true).first)
|
257
|
+
crud_test(resource: 'admin/posts', user: User.where(admin: true).first)
|
258
258
|
|
259
259
|
# Run only some tests
|
260
|
-
crud_test(Post, User.first, only: [:new, :create_valid, :create_invalid, :show, :index])
|
260
|
+
crud_test(resource: Post, user: User.first, only: [:new, :create_valid, :create_invalid, :show, :index])
|
261
261
|
|
262
262
|
# Run all except some tests
|
263
|
-
crud_test(Post, User.first, except: [:edit, :update_valid, :update_invalid])
|
263
|
+
crud_test(resource: Post, user: User.first, except: [:edit, :update_valid, :update_invalid])
|
264
264
|
|
265
265
|
# Skip individual assertions
|
266
|
-
crud_test(Post, User.first, skip: {create_valid: :path, update_invalid: [:path, :flash]})
|
266
|
+
crud_test(resource: Post, user: User.first, skip: {create_valid: :path, update_invalid: [:path, :flash]})
|
267
267
|
end
|
268
268
|
```
|
269
269
|
|
@@ -272,13 +272,13 @@ The individual test suites may also be used as part of a larger test:
|
|
272
272
|
```ruby
|
273
273
|
class PostsTest < ActionDispatch::IntegrationTest
|
274
274
|
test 'user may only update a post once' do
|
275
|
-
crud_action_test(:create_valid, Post, User.first)
|
275
|
+
crud_action_test(test: :create_valid, resource: Post, user: User.first)
|
276
276
|
assert_text 'successfully created post. You may only update it once.'
|
277
277
|
|
278
|
-
crud_action_test(:update_valid, Post.last, User.first)
|
278
|
+
crud_action_test(test: :update_valid, resource: Post.last, user: User.first)
|
279
279
|
assert_text 'successfully updated post.'
|
280
280
|
|
281
|
-
crud_action_test(:update_valid, Post.last, User.first, skip: [:no_assigns_errors, :updated_at])
|
281
|
+
crud_action_test(test: :update_valid, resource: Post.last, user: User.first, skip: [:no_assigns_errors, :updated_at])
|
282
282
|
assert_assigns_errors(:post, 'you may no longer update this post.')
|
283
283
|
assert_text 'you may no longer update this post.'
|
284
284
|
end
|
@@ -308,7 +308,7 @@ Or each individually in part of a regular test:
|
|
308
308
|
```ruby
|
309
309
|
class MyApplicationTest < ActionDispatch::IntegrationTest
|
310
310
|
test 'user receives 10 tokens after signing up' do
|
311
|
-
devise_action_test(:sign_up)
|
311
|
+
devise_action_test(test: :sign_up)
|
312
312
|
assert_text 'Tokens: 10'
|
313
313
|
assert_equals 10, User.last.tokens
|
314
314
|
assert_equals 10, assigns(:current_user).tokens
|
@@ -333,10 +333,10 @@ Use it as a one-liner:
|
|
333
333
|
```ruby
|
334
334
|
class PostsTest < ActionDispatch::IntegrationTest
|
335
335
|
# Uses find_or_create_resource! to load a seeded resource or create a new one
|
336
|
-
member_test('posts', 'unarchive', User.first)
|
336
|
+
member_test(controller: 'posts', action: 'unarchive', user: User.first)
|
337
337
|
|
338
338
|
# Run the member_test with a specific post
|
339
|
-
member_test('posts', 'unarchive', User.first, Post.find(1))
|
339
|
+
member_test(controller: 'posts', action: 'unarchive', user: User.first, member: Post.find(1))
|
340
340
|
end
|
341
341
|
```
|
342
342
|
|
@@ -348,7 +348,7 @@ class PostsTest < ActionDispatch::IntegrationTest
|
|
348
348
|
post = Post.create(title: 'first post', archived: true)
|
349
349
|
|
350
350
|
assert Post.where(archived: false).empty?
|
351
|
-
member_action_test('posts', 'unarchive', User.first, post)
|
351
|
+
member_action_test(controller: 'posts', action: 'unarchive', user: User.first, member: post)
|
352
352
|
assert Post.where(archived: false).present?
|
353
353
|
end
|
354
354
|
end
|
@@ -362,7 +362,7 @@ Use it as a one-liner:
|
|
362
362
|
|
363
363
|
```ruby
|
364
364
|
class PostsTest < ActionDispatch::IntegrationTest
|
365
|
-
page_test(:posts_path, User.first) # Runs the page_test test suite against posts_path as User.first
|
365
|
+
page_test(path: :posts_path, user: User.first) # Runs the page_test test suite against posts_path as User.first
|
366
366
|
end
|
367
367
|
```
|
368
368
|
|
@@ -373,7 +373,7 @@ class PostsTest < ActionDispatch::IntegrationTest
|
|
373
373
|
test 'posts are displayed on the index page' do
|
374
374
|
Post.create(title: 'first post')
|
375
375
|
|
376
|
-
page_action_test(:posts_path, User.first)
|
376
|
+
page_action_test(path: :posts_path, user: User.first)
|
377
377
|
|
378
378
|
assert page.current_path, '/posts'
|
379
379
|
assert_text 'first post'
|
@@ -390,7 +390,7 @@ Use it as a one-liner:
|
|
390
390
|
```ruby
|
391
391
|
class PostsTest < ActionDispatch::IntegrationTest
|
392
392
|
# Visits /blog and tests that it redirects to a working /posts page
|
393
|
-
redirect_test('/blog', '/posts', User.first)
|
393
|
+
redirect_test(from: '/blog', to: '/posts', user: User.first)
|
394
394
|
end
|
395
395
|
```
|
396
396
|
|
@@ -400,7 +400,7 @@ Or as part of a regular test:
|
|
400
400
|
class PostsTest < ActionDispatch::IntegrationTest
|
401
401
|
test 'visiting blog redirects to posts' do
|
402
402
|
Post.create(title: 'first post')
|
403
|
-
redirect_action_test('/blog', '/posts', User.first)
|
403
|
+
redirect_action_test(from: '/blog', to: '/posts', user: User.first)
|
404
404
|
assert_text 'first post'
|
405
405
|
end
|
406
406
|
end
|
@@ -418,7 +418,7 @@ Use it as a one-liner:
|
|
418
418
|
|
419
419
|
```ruby
|
420
420
|
class PostsTest < ActionDispatch::IntegrationTest
|
421
|
-
wizard_test('/build_post/step1', '/build_post/step5', User.first)
|
421
|
+
wizard_test(from: '/build_post/step1', to: '/build_post/step5', user: User.first)
|
422
422
|
end
|
423
423
|
```
|
424
424
|
|
@@ -427,7 +427,7 @@ Or as part of a regular test:
|
|
427
427
|
```ruby
|
428
428
|
class PostsTest < ActionDispatch::IntegrationTest
|
429
429
|
test 'building a post in 5 steps' do
|
430
|
-
wizard_action_test('/build_post/step1', '/build_post/step5', User.first) do
|
430
|
+
wizard_action_test(from: '/build_post/step1', to: '/build_post/step5', user: User.first) do
|
431
431
|
if page.current_path.end_with?('step4')
|
432
432
|
assert_text 'your post is ready but must first be approved by an admin.'
|
433
433
|
end
|
@@ -5,6 +5,10 @@ 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
|
+
|
8
12
|
# Parses and validates lots of options
|
9
13
|
# This is a big manual merge wherein we translate some DSL methods into one consistent Hash here
|
10
14
|
# The output is what gets sent to each test and defined as lets
|
@@ -119,6 +123,10 @@ module TestBotable
|
|
119
123
|
|
120
124
|
# Instance Methods
|
121
125
|
|
126
|
+
def _test_bot_user
|
127
|
+
@test_bot_user
|
128
|
+
end
|
129
|
+
|
122
130
|
# Using reverse_merge! in the dsl action_tests makes sure that the
|
123
131
|
# class level can assign a current_test variable
|
124
132
|
# wheras the action level ones it's not present.
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# This DSL gives a class level and an instance level way of calling specific test suite
|
2
2
|
#
|
3
3
|
# class PostsTest < ActionDispatch::IntegrationTest
|
4
|
-
# crud_test(Post || 'admin/posts', User.first, except: :show, skip: {create_valid: :path, update_invalid: [:path, :flash]})
|
4
|
+
# crud_test(resource: (Post || 'admin/posts'), user: User.first, except: :show, skip: {create_valid: :path, update_invalid: [:path, :flash]})
|
5
5
|
#
|
6
6
|
# test 'a one-off action' do
|
7
|
-
# crud_action_test(:new, Post, User.first, skip: :title)
|
7
|
+
# crud_action_test(test: :new, resource: Post, user: User.first, skip: :title)
|
8
8
|
# end
|
9
9
|
# end
|
10
10
|
|
@@ -18,29 +18,25 @@ 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
|
21
|
+
def crud_test(resource:, user: _test_bot_user(), 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
|
25
25
|
# In the class method, this value is a Hash, in the instance method it's expecting an Array
|
26
|
-
|
27
|
-
raise 'invalid skip syntax, expecting skip: {create_invalid: [:path]}' unless skips.kind_of?(Hash)
|
26
|
+
raise 'invalid skip syntax, expecting skip: {create_invalid: [:path]}' unless skip.kind_of?(Hash)
|
28
27
|
|
29
|
-
label = options.delete(:label).presence
|
30
|
-
only = options.delete(:only)
|
31
|
-
except = options.delete(:except)
|
32
28
|
current_crud_tests = crud_tests_to_define(only, except)
|
33
29
|
|
34
30
|
begin
|
35
|
-
normalize_test_bot_options!(options.merge!(
|
31
|
+
normalize_test_bot_options!(options.merge!(resource: resource, user: user, current_crud_tests: current_crud_tests))
|
36
32
|
rescue => e
|
37
|
-
raise "Error: #{e.message}. Expected usage: crud_test(Post || Post.new, User.first, only: [:new, :create], skip: {create_invalid: [:path]})"
|
33
|
+
raise "Error: #{e.message}. Expected usage: crud_test(resource: (Post || Post.new), user: User.first, only: [:new, :create], skip: {create_invalid: [:path]})"
|
38
34
|
end
|
39
35
|
|
40
36
|
current_crud_tests.each do |test|
|
41
37
|
options_for_method = options.dup
|
42
38
|
|
43
|
-
options_for_method[:
|
39
|
+
options_for_method[:skip] = Array(skip[test]) if skip[test]
|
44
40
|
options_for_method[:current_test] = [
|
45
41
|
options[:controller_namespace].presence,
|
46
42
|
options[:resource_name].pluralize
|
@@ -50,7 +46,7 @@ module TestBotable
|
|
50
46
|
|
51
47
|
method_name = test_bot_method_name('crud_test', label || options_for_method[:current_test])
|
52
48
|
|
53
|
-
define_method(method_name) { crud_action_test(test, resource, user, options_for_method) }
|
49
|
+
define_method(method_name) { crud_action_test(test: test, resource: resource, user: user, options: options_for_method) }
|
54
50
|
end
|
55
51
|
end
|
56
52
|
|
@@ -82,11 +78,11 @@ module TestBotable
|
|
82
78
|
#
|
83
79
|
# If obj is a Hash {:resource => ...} just skip over parsing options
|
84
80
|
# And assume it's already been done (by the ClassMethod crud_test)
|
85
|
-
def crud_action_test(test
|
81
|
+
def crud_action_test(test:, resource:, user: _test_bot_user(), **options)
|
86
82
|
begin
|
87
|
-
assign_test_bot_lets!(options.reverse_merge!(
|
83
|
+
assign_test_bot_lets!(options.reverse_merge!(resource: resource, user: user))
|
88
84
|
rescue => e
|
89
|
-
raise "Error: #{e.message}. Expected usage: crud_action_test(:new, Post || Post.new, User.first)"
|
85
|
+
raise "Error: #{e.message}. Expected usage: crud_action_test(test: :new, resource: (Post || Post.new), user: User.first)"
|
90
86
|
end
|
91
87
|
|
92
88
|
self.send("test_bot_#{test}_test")
|
@@ -4,9 +4,9 @@
|
|
4
4
|
# devise_test()
|
5
5
|
#
|
6
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)
|
7
|
+
# devise_action_test(test: :sign_up)
|
8
|
+
# devise_action_test(test: :sign_in_valid)
|
9
|
+
# devise_action_test(test: :sign_in_invalid)
|
10
10
|
# end
|
11
11
|
# end
|
12
12
|
|
@@ -16,23 +16,21 @@ module TestBotable
|
|
16
16
|
|
17
17
|
module ClassMethods
|
18
18
|
|
19
|
-
def devise_test(
|
20
|
-
label = options.delete(:label).presence
|
21
|
-
|
19
|
+
def devise_test(label: nil, **options)
|
22
20
|
[:sign_up, :sign_in_valid, :sign_in_invalid].each do |test|
|
23
21
|
options[:current_test] = label || test
|
24
22
|
next if EffectiveTestBot.skip?(options[:current_test])
|
25
23
|
|
26
24
|
method_name = test_bot_method_name('devise_test', options[:current_test])
|
27
25
|
|
28
|
-
define_method(method_name) { devise_action_test(test, options) }
|
26
|
+
define_method(method_name) { devise_action_test(test: test, options: options) }
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
32
30
|
end
|
33
31
|
|
34
32
|
# Instance Methods - Call me from within a test
|
35
|
-
def devise_action_test(test
|
33
|
+
def devise_action_test(test:, **options)
|
36
34
|
options[:email] ||= "unique-#{Time.zone.now.to_i}@example.com"
|
37
35
|
options[:password] ||= '!Password123'
|
38
36
|
options[:username] ||= 'unique-username'
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# This DSL gives a class level and an instance level way of calling specific test suite
|
2
2
|
#
|
3
3
|
# class PostsTest < ActionDispatch::IntegrationTest
|
4
|
-
# member_test('admin/jobs', 'unarchive', User.first, Post.first)
|
4
|
+
# member_test(controller: 'admin/jobs', action: 'unarchive', user: User.first, member: Post.first)
|
5
5
|
#
|
6
6
|
# test 'a one-off action' do
|
7
|
-
# member_action_test('admin/jobs', 'unarchive', User.first)
|
7
|
+
# member_action_test(controller: 'admin/jobs', action: 'unarchive', user: User.first, member: Post.first)
|
8
8
|
# end
|
9
9
|
# end
|
10
10
|
|
@@ -16,24 +16,23 @@ module TestBotable
|
|
16
16
|
extend ActiveSupport::Concern
|
17
17
|
|
18
18
|
module ClassMethods
|
19
|
-
|
20
|
-
|
21
|
-
options[:current_test] = options.delete(:label) || "#{controller}##{action}"
|
19
|
+
def member_test(controller:, action:, user: _test_bot_user(), member: nil, label: nil, **options)
|
20
|
+
options[:current_test] = label || "#{controller}##{action}"
|
22
21
|
return if EffectiveTestBot.skip?(options[:current_test])
|
23
22
|
|
24
23
|
method_name = test_bot_method_name('member_test', options[:current_test])
|
25
24
|
|
26
|
-
define_method(method_name) { member_action_test(controller, action, user,
|
25
|
+
define_method(method_name) { member_action_test(controller: controller, action: action, user: user, member: member, options: options) }
|
27
26
|
end
|
28
27
|
|
29
28
|
end
|
30
29
|
|
31
30
|
# Instance Methods - Call me from within a test
|
32
|
-
def member_action_test(controller
|
31
|
+
def member_action_test(controller:, action:, user: _test_bot_user(), member:, **options)
|
33
32
|
begin
|
34
33
|
assign_test_bot_lets!(options.reverse_merge!(resource: controller, action: action, user: user, member: member))
|
35
34
|
rescue => e
|
36
|
-
raise "Error: #{e.message}. Expected usage: member_test('admin/jobs', 'unarchive', User.first, Post.first || nil)"
|
35
|
+
raise "Error: #{e.message}. Expected usage: member_test(controller: 'admin/jobs', action: 'unarchive', user: User.first, member: (Post.first || nil))"
|
37
36
|
end
|
38
37
|
|
39
38
|
self.send(:test_bot_member_test)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# This DSL gives a class level and an instance level way of calling specific test suite
|
2
2
|
#
|
3
3
|
# class PostsTest < ActionDispatch::IntegrationTest
|
4
|
-
# page_test(:posts_path, User.first)
|
4
|
+
# page_test(path: :posts_path, user: User.first)
|
5
5
|
#
|
6
6
|
# test 'a one-off action' do
|
7
|
-
# page_action_test(:posts_path, User.first)
|
7
|
+
# page_action_test(path: :posts_path, user: User.first)
|
8
8
|
# end
|
9
9
|
# end
|
10
10
|
|
@@ -15,23 +15,23 @@ module TestBotable
|
|
15
15
|
|
16
16
|
module ClassMethods
|
17
17
|
|
18
|
-
def page_test(path
|
19
|
-
options[:current_test] =
|
18
|
+
def page_test(path:, user: _test_bot_user(), label: nil, **options)
|
19
|
+
options[:current_test] = label || path.to_s
|
20
20
|
return if EffectiveTestBot.skip?(options[:current_test])
|
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, user, options) }
|
24
|
+
define_method(method_name) { page_action_test(path: path, user: user, options: options) }
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Instance Methods - Call me from within a test
|
30
|
-
def page_action_test(path
|
30
|
+
def page_action_test(path:, user: _test_bot_user(), **options)
|
31
31
|
begin
|
32
32
|
assign_test_bot_lets!(options.reverse_merge!(user: user, page_path: path))
|
33
33
|
rescue => e
|
34
|
-
raise "Error: #{e.message}. Expected usage: page_action_test(root_path, User.first)"
|
34
|
+
raise "Error: #{e.message}. Expected usage: page_action_test(path: root_path, user: User.first)"
|
35
35
|
end
|
36
36
|
|
37
37
|
self.send(:test_bot_page_test)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# This DSL gives a class level and an instance level way of calling specific test suite
|
2
2
|
#
|
3
3
|
# class AboutTest < ActionDispatch::IntegrationTest
|
4
|
-
# redirect_test('/about', '/new-about', User.first)
|
4
|
+
# redirect_test(from: '/about', to: '/new-about', user: User.first)
|
5
5
|
#
|
6
6
|
# test 'a one-off action' do
|
7
|
-
# redirect_action_test('/about', '/new-about', User.first)
|
7
|
+
# redirect_action_test(from: '/about', to: '/new-about', user: User.first)
|
8
8
|
# end
|
9
9
|
# end
|
10
10
|
|
@@ -14,22 +14,22 @@ module TestBotable
|
|
14
14
|
|
15
15
|
module ClassMethods
|
16
16
|
|
17
|
-
def redirect_test(
|
18
|
-
options[:current_test] =
|
17
|
+
def redirect_test(from:, to:, user: _test_bot_user(), label: nil, **options)
|
18
|
+
options[:current_test] = label || "#{from} to #{to}"
|
19
19
|
return if EffectiveTestBot.skip?(options[:current_test])
|
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(
|
23
|
+
define_method(method_name) { redirect_action_test(from: from, to: to, user: user, options: options) }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
# Instance Methods - Call me from within a test
|
28
|
-
def redirect_action_test(
|
28
|
+
def redirect_action_test(from:, to:, user: _test_bot_user(), options: {})
|
29
29
|
begin
|
30
|
-
assign_test_bot_lets!(options.reverse_merge!(
|
30
|
+
assign_test_bot_lets!(options.reverse_merge!(from: from, to: to, user: user))
|
31
31
|
rescue => e
|
32
|
-
raise "Error: #{e.message}. Expected usage: redirect_action_test('/about', '/new-about', User.first)"
|
32
|
+
raise "Error: #{e.message}. Expected usage: redirect_action_test(from: '/about', to: '/new-about', user: User.first)"
|
33
33
|
end
|
34
34
|
|
35
35
|
self.send(:test_bot_redirect_test)
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# This DSL gives a class level and an instance level way of calling specific test suite
|
2
2
|
#
|
3
3
|
# class PostsTest < ActionDispatch::IntegrationTest
|
4
|
-
# wizard_test('/fee_wizard/step1', '/fee_wizard/step5', User.first)
|
4
|
+
# wizard_test(from: '/fee_wizard/step1', to: ('/fee_wizard/step5' || nil), user: User.first)
|
5
5
|
#
|
6
6
|
# test 'a one-off action' do
|
7
|
-
# wizard_action_test('/fee_wizard/step1', '/fee_wizard/step5', User.first) do
|
7
|
+
# wizard_action_test(from: '/fee_wizard/step1', to: ('/fee_wizard/step5' || nil), user: User.first) do
|
8
8
|
# puts page.current_path
|
9
9
|
# end
|
10
10
|
# end
|
@@ -19,28 +19,29 @@ module TestBotable
|
|
19
19
|
|
20
20
|
module ClassMethods
|
21
21
|
|
22
|
-
def wizard_test(
|
23
|
-
|
24
|
-
|
22
|
+
def wizard_test(from:, to: nil, user: _test_bot_user(), label: nil, **options)
|
23
|
+
|
24
|
+
if to.present?
|
25
|
+
options[:current_test] = label || "#{from} to #{to}"
|
25
26
|
else
|
26
|
-
options[:current_test] =
|
27
|
+
options[:current_test] = label || "#{from}"
|
27
28
|
end
|
28
29
|
|
29
30
|
return if EffectiveTestBot.skip?(options[:current_test])
|
30
31
|
|
31
32
|
method_name = test_bot_method_name('wizard_test', options[:current_test])
|
32
33
|
|
33
|
-
define_method(method_name) { wizard_action_test(
|
34
|
+
define_method(method_name) { wizard_action_test(from: from, to: to, user: user, options: options) }
|
34
35
|
end
|
35
36
|
|
36
37
|
end
|
37
38
|
|
38
39
|
# Instance Methods - Call me from within a test
|
39
|
-
def wizard_action_test(
|
40
|
+
def wizard_action_test(from:, to: nil, user: _test_bot_user(), **options)
|
40
41
|
begin
|
41
|
-
assign_test_bot_lets!(options.reverse_merge!(
|
42
|
+
assign_test_bot_lets!(options.reverse_merge!(from: from, to: to, user: user))
|
42
43
|
rescue => e
|
43
|
-
raise "Error: #{e.message}. Expected usage: wizard_action_test('/fee_wizard/step1', '/fee_wizard/step5', User.first)"
|
44
|
+
raise "Error: #{e.message}. Expected usage: wizard_action_test(from: '/fee_wizard/step1', to: ('/fee_wizard/step5' || nil), user: User.first)"
|
44
45
|
end
|
45
46
|
|
46
47
|
block_given? ? test_bot_wizard_test { yield } : test_bot_wizard_test
|
@@ -13,6 +13,8 @@ module TestBot
|
|
13
13
|
def initialize_tests
|
14
14
|
puts 'test_bot scanning....'
|
15
15
|
|
16
|
+
@test_bot_user = User.first
|
17
|
+
|
16
18
|
routes = Rails.application.routes.routes.to_a
|
17
19
|
seen_actions = Hash.new([]) # {posts: ['new', 'edit'], events: ['new', 'edit', 'show']}
|
18
20
|
|
@@ -31,7 +33,7 @@ module TestBot
|
|
31
33
|
elsif route.app.kind_of?(ActionDispatch::Routing::PathRedirect) && route.path.required_names.blank?
|
32
34
|
path = route.path.spec.to_s
|
33
35
|
route.path.optional_names.each { |name| path.sub!("(.:#{name})", '') } # Removes (.:format) from path
|
34
|
-
redirect_test(path, route.app.path([], nil)
|
36
|
+
redirect_test(from: path, to: route.app.path([], nil))
|
35
37
|
|
36
38
|
# CRUD Test
|
37
39
|
elsif is_crud_controller?(route)
|
@@ -46,7 +48,7 @@ module TestBot
|
|
46
48
|
only_tests = seen_actions.delete(controller)
|
47
49
|
only_tests << :tour if EffectiveTestBot.tour_mode?
|
48
50
|
|
49
|
-
crud_test(controller,
|
51
|
+
crud_test(resource: controller, only: only_tests)
|
50
52
|
rescue => e
|
51
53
|
puts e.message # Sometimes there is an object that can't be instantiated, so we still want to continue the application test
|
52
54
|
end
|
@@ -55,15 +57,15 @@ module TestBot
|
|
55
57
|
# Wizard Test
|
56
58
|
elsif is_wicked_controller?(route)
|
57
59
|
first_step_path = "/#{controller}/#{controller_instance(route).wizard_steps.first}"
|
58
|
-
wizard_test(first_step_path
|
60
|
+
wizard_test(from: first_step_path)
|
59
61
|
|
60
62
|
# Member Test
|
61
63
|
elsif route.verb.to_s.include?('GET') && route.path.required_names == ['id']
|
62
|
-
member_test(controller, action
|
64
|
+
member_test(controller: controller, action: action)
|
63
65
|
|
64
66
|
# Page Test
|
65
67
|
elsif route.verb.to_s.include?('GET') && route.name.present? && Array(route.path.required_names).blank? # This could eventually be removed to supported nested routes
|
66
|
-
page_test("#{route.name}_path".to_sym,
|
68
|
+
page_test(path: "#{route.name}_path".to_sym, route: route, label: "#{route.name}_path")
|
67
69
|
|
68
70
|
else
|
69
71
|
puts "skipping #{route.name}_path | #{route.path.spec} | #{route.verb} | #{route.defaults[:controller]} | #{route.defaults[:action]}"
|
@@ -5,7 +5,7 @@ module WizardTest
|
|
5
5
|
protected
|
6
6
|
|
7
7
|
def test_bot_wizard_test(&block)
|
8
|
-
sign_in(user) and visit(
|
8
|
+
sign_in(user) and visit(from)
|
9
9
|
|
10
10
|
0.upto(50) do |index| # Can only test wizards 51 steps long
|
11
11
|
assert_page_normal
|
@@ -21,9 +21,9 @@ module WizardTest
|
|
21
21
|
|
22
22
|
assert_no_assigns_errors
|
23
23
|
|
24
|
-
if
|
24
|
+
if to.present?
|
25
25
|
# Keep going till we hit a certain to_path
|
26
|
-
break if page.current_path ==
|
26
|
+
break if page.current_path == to
|
27
27
|
else
|
28
28
|
# Keep going till there's no more submit buttons
|
29
29
|
break if all("input[type='submit']").blank?
|
@@ -32,7 +32,7 @@ module WizardTest
|
|
32
32
|
|
33
33
|
save_test_bot_screenshot
|
34
34
|
|
35
|
-
assert_current_path(
|
35
|
+
assert_current_path(to) if to.present?
|
36
36
|
end
|
37
37
|
|
38
38
|
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.
|
4
|
+
version: 0.5.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: 2016-04-
|
11
|
+
date: 2016-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|