effective_test_bot 0.3.0 → 0.4.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
2
  SHA1:
3
- metadata.gz: 50ef005db97e70ce2576d749a0a4542409319da7
4
- data.tar.gz: c12dc73aacd70b89fc4d4bcdde5b875c723f7c90
3
+ metadata.gz: 8daba6efe86cb1bdf02b6894c786581de4b1a0d1
4
+ data.tar.gz: d894f71336ba73f58c5bc968b5eae7e69272f476
5
5
  SHA512:
6
- metadata.gz: 4c71082a5e0e90643d1bb90ceca1f01d9aaa37200c4d5a31cbc71dcfc59faa224c0572d1f13ceef05643b75d8df99665f816bf815617a4d2786402cc1418c047
7
- data.tar.gz: 820f5070944df5997434796a7ce0d775fd809c3b686c19ac03e95589b80b1b74fef6b7b6bf17741c9bc3e4353422f58860664dfcb5227df8c164fdcff645881a
6
+ metadata.gz: 1d76c1ec917029ebed79bbb2b8c457573cc699aed07b45957831be86f0edddd08aea345054a29a89e5f799866071cc79d10a6abdad1ee21b4b7e91365e8ae2fd
7
+ data.tar.gz: 0602b7675e99bffc14cf809230532d2277c4285a11f069ead884f92c4c2575b6c3018f3ccb55e35732565246343fe8fb6b6b4df415457229e60e70b5eec66d03
@@ -1,3 +1,3 @@
1
1
  module EffectiveTestBot
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
@@ -45,6 +45,7 @@ Capybara.javascript_driver = :webkit
45
45
  Capybara::Screenshot.autosave_on_failure = true
46
46
  Capybara::Screenshot.prune_strategy = :keep_last_run
47
47
  Capybara::Screenshot.webkit_options = { width: 1024, height: 768 }
48
+ Capybara::Webkit.configure { |config| config.allow_unknown_urls }
48
49
 
49
50
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
50
51
 
@@ -14,6 +14,11 @@ module TestBotable
14
14
  raise 'invalid parameters passed to crud_test(), expecting crud_test(Post || Post.new(), User.first, options_hash)'
15
15
  end
16
16
 
17
+ if (options[:skip] || options[:skips]).present? && (options[:skip] || options[:skips]).kind_of?(Hash) == false
18
+ raise 'invalid skip syntax, expecting skip: {create_invalid: [:path]}'
19
+ end
20
+
21
+ skips = options.delete(:skip) || options.delete(:skips) || {} # So you can skip sub tests
17
22
  test_options = crud_test_options(obj, user, options) # returns a Hash of let! options
18
23
  tests_prefix = crud_tests_prefix(options) # returns a string something like "test_bot (3)"
19
24
 
@@ -30,7 +35,11 @@ module TestBotable
30
35
  when :destroy ; "#{tests_prefix} #destroy"
31
36
  end
32
37
 
33
- define_method(test_name) { crud_action_test(test, test_options) }
38
+ if skips[test].present?
39
+ define_method(test_name) { crud_action_test(test, test_options.merge(skips: Array(skips[test]))) }
40
+ else
41
+ define_method(test_name) { crud_action_test(test, test_options) }
42
+ end
34
43
  end
35
44
  end
36
45
 
@@ -60,14 +69,15 @@ module TestBotable
60
69
  resource_name: resource_class.name.underscore,
61
70
  resource_attributes: resource_attributes,
62
71
  controller_namespace: options[:namespace],
63
- user: user
72
+ user: user,
73
+ skips: Array(options[:skip] || options[:skips])
64
74
  }
65
75
  end
66
76
 
67
77
  # Run any test_bot tests first, in the order they're defined
68
78
  # then the rest of the tests with whatever order they come in
69
79
  def runnable_methods
70
- self.public_instance_methods.select { |name| name.to_s.starts_with?('test_bot') }.map(&:to_s) +
80
+ self.public_instance_methods.select { |name| name.to_s.starts_with?('crud_test') }.map(&:to_s) +
71
81
  super.reject { |name| name.starts_with?('test_bot') }
72
82
  end
73
83
 
@@ -100,11 +110,11 @@ module TestBotable
100
110
  @num_defined_crud_tests = (@num_defined_crud_tests || 0) + 1
101
111
 
102
112
  if options[:label].present?
103
- "test_bot: (#{options[:label]})"
113
+ "crud_test: (#{options[:label]})"
104
114
  elsif @num_defined_crud_tests > 1
105
- "test_bot: (#{@num_defined_crud_tests})"
115
+ "crud_test: (#{@num_defined_crud_tests})"
106
116
  else
107
- 'test_bot:'
117
+ 'crud_test:'
108
118
  end
109
119
  end
110
120
 
@@ -129,7 +139,7 @@ module TestBotable
129
139
  self.class.crud_test_options(obj, user, options)
130
140
  end.each { |k, v| self.class.let(k) { v } } # Using the regular let(:foo) { 'bar'} syntax
131
141
 
132
- self.send(test)
142
+ self.public_send(test)
133
143
  end
134
144
  end
135
145
  end
@@ -11,7 +11,7 @@ module EffectiveTestBotAssertions
11
11
  assert page.has_selector?('form#new_user')
12
12
  end
13
13
 
14
- def assert_page_title(title = :any, message = 'expected page title to be present')
14
+ def assert_page_title(title = :any, message = 'Expected page title to be present')
15
15
  if title.present? && title != :any
16
16
  assert_title(title) # Capybara TitleQuery, match this text
17
17
  else
@@ -20,8 +20,8 @@ module EffectiveTestBotAssertions
20
20
  end
21
21
  end
22
22
 
23
- def assert_page_status(status = 200)
24
- assert_equal status, page.status_code, "expected page to load with #{status} HTTP status code"
23
+ def assert_page_status(status = 200, message = 'Expected :status: HTTP status code')
24
+ assert_equal status, page.status_code, message.sub(':status:', status.to_s)
25
25
  end
26
26
 
27
27
  def assert_no_js_errors
@@ -36,9 +36,9 @@ module EffectiveTestBotAssertions
36
36
  if key.present? && value.present?
37
37
  assert_equal value, flash[key.to_s]
38
38
  elsif key.present?
39
- assert flash[key.to_s].present?, "expected flash[#{key}] to be present"
39
+ assert flash[key.to_s].present?, "Expected flash[#{key}] to be present"
40
40
  else
41
- assert flash.present?, 'expected flash to be present'
41
+ assert flash.present?, 'Expected flash to be present'
42
42
  end
43
43
  end
44
44
 
@@ -49,9 +49,9 @@ module EffectiveTestBotAssertions
49
49
  if key.present? && value.present?
50
50
  assert_equal value, assigns[key.to_s]
51
51
  elsif key.present?
52
- assert assigns[key.to_s].present?, "expected @#{key} to be assigned"
52
+ assert assigns[key.to_s].present?, "Expected @#{key} to be assigned"
53
53
  else
54
- assert assigns.present?, 'expected assigns to be present'
54
+ assert assigns.present?, 'Expected assigns to be present'
55
55
  end
56
56
  end
57
57
 
@@ -30,10 +30,13 @@ module EffectiveTestBotFormHelper
30
30
  raise "unsupported field type #{[field.tag_name, field['type']].compact.join('_')}"
31
31
  end
32
32
  end
33
+
34
+ true
33
35
  end
34
36
 
35
37
  def clear_form
36
38
  all('input,select,textarea').each { |field| (field.set('') rescue false) }
39
+ true
37
40
  end
38
41
 
39
42
  # Operates on just string keys
@@ -60,7 +63,7 @@ module EffectiveTestBotFormHelper
60
63
  when 'input_number'
61
64
  Faker::Number.number(4)
62
65
  when 'input_password'
63
- Faker::Internet.password
66
+ @test_bot_password ||= Faker::Internet.password # Use the same password throughout a single test. Allows passwords and password_confirmations to match.
64
67
  when 'input_tel'
65
68
  d = 10.times.map { DIGITS.sample }
66
69
  d[0] + d[1] + d[2] + '-' + d[3] + d[4] + d[5] + '-' + d[6] + d[7] + d[8] + d[9]
@@ -111,6 +114,7 @@ module EffectiveTestBotFormHelper
111
114
  first(:css, "input[type='submit']").click
112
115
  end
113
116
  synchronize!
117
+ true
114
118
  end
115
119
 
116
120
  # Submit form after disabling any HTML5 validations
@@ -125,8 +129,6 @@ module EffectiveTestBotFormHelper
125
129
  files = Array(files)
126
130
  uid = field['id']
127
131
 
128
- page.driver.allow_url(Effective::Asset.s3_base_path)
129
-
130
132
  js = "fileList = Array();"
131
133
 
132
134
  files.each_with_index do |file, i|
@@ -22,11 +22,11 @@ module EffectiveTestBotTestHelper
22
22
  # EffectiveTestBot includes an after_filter on ApplicationController to set an http header
23
23
  # that encodes the flash message, and some of the assigns
24
24
  def flash
25
- @flash ||= (JSON.parse(Base64.decode64(page.driver.browser.response_headers['Test-Bot-Flash'])) rescue {})
25
+ @flash ||= (JSON.parse(Base64.decode64(page.response_headers['Test-Bot-Flash'])) rescue {})
26
26
  end
27
27
 
28
28
  def assigns
29
- @assigns ||= (JSON.parse(Base64.decode64(page.driver.browser.response_headers['Test-Bot-Assigns'])) rescue {})
29
+ @assigns ||= (JSON.parse(Base64.decode64(page.response_headers['Test-Bot-Assigns'])) rescue {})
30
30
  end
31
31
 
32
32
  end
@@ -5,14 +5,14 @@ module CrudTest
5
5
  assert_page_status
6
6
  assert_page_title
7
7
  assert_no_js_errors
8
- assert_assigns resource_name
8
+ assert_assigns(resource_name)
9
9
 
10
10
  # Make sure there's a form with a submit button
11
11
  form_selector = "form#new_#{resource_name}"
12
12
 
13
- assert_selector form_selector, "page does not contain a form with selector #{form_selector}"
13
+ assert_selector form_selector, "Expected form with selector #{form_selector}"
14
14
  within(form_selector) do
15
- assert_selector 'input[type=submit]', 'page form does not contain a submit button'
15
+ assert_selector 'input[type=submit]', 'Expected submit button to be present'
16
16
  end
17
17
  end
18
18
 
@@ -28,13 +28,13 @@ module CrudTest
28
28
 
29
29
  after = { count: resource_class.count, path: page.current_path }
30
30
 
31
- refute_equal before[:count], after[:count], "unable to create #{resource_class} object"
32
- refute_equal before[:path], after[:path], "unable to create #{resource_class} object"
31
+ refute_equal before[:count], after[:count], "Expected fill_form to create a #{resource_class} object"
32
+ refute_equal(before[:path], after[:path], "[create_valid: :path] Expected unique before and after paths") unless skip?(:path)
33
33
 
34
- # In a rails controller, if i redirect to resources_path it may not assign the instance variable
34
+ # In a rails controller, if I redirect to resources_path it may not assign the instance variable
35
35
  # Wheras if I redirect to edit_resource_path I must ensure that the instance variable is set
36
36
  assert_assigns(resource_name) if after[:path].include?('/edit/')
37
- assert(assigns[resource_name]['errors'].blank?) if assigns[resource_name].present?
37
+ assert_equal(nil, assigns[resource_name]['errors'], "Expected @#{resource_name}['errors'] to be blank") if assigns[resource_name].present?
38
38
  end
39
39
 
40
40
  def create_invalid
@@ -42,18 +42,20 @@ module CrudTest
42
42
  before = { count: resource_class.count }
43
43
 
44
44
  within("form#new_#{resource_name}") do
45
+ clear_form
45
46
  submit_novalidate_form
46
47
  end
47
48
 
48
49
  after = { count: resource_class.count }
49
50
 
50
- assert_equal before[:count], after[:count], 'unexpectedly created object anyway'
51
- assert_equal resources_path, page.current_path, 'did not return to #create url'
52
- assert_page_title :any, 'page title missing after failed validation'
51
+ assert_equal before[:count], after[:count], "Expected: #{resource_class}.count to be unchanged"
52
+ assert_page_title :any, 'Expected page title to be present after failed validation'
53
53
 
54
54
  assert_flash :danger
55
55
  assert_assigns resource_name
56
- assert assigns[resource_name]['errors'].present?
56
+ refute_equal nil, assigns[resource_name]['errors'], "Expected @#{resource_name}['errors'] to be present"
57
+
58
+ assert_equal(resources_path, page.current_path, "[create_invalid: :path] Expected current_path to match resource #create path") unless skip?(:path)
57
59
  end
58
60
 
59
61
  def edit
@@ -69,12 +71,10 @@ module CrudTest
69
71
  # Make sure there's a form with a submit button
70
72
  form_selector = "form#edit_#{resource_name}_#{resource.id}"
71
73
 
72
- assert_selector form_selector, "page does not contain a form with selector #{form_selector}"
74
+ assert_selector form_selector, "Expected form with selector #{form_selector}"
73
75
  within(form_selector) do
74
- assert_selector 'input[type=submit]', 'page form does not contain a submit button'
76
+ assert_selector 'input[type=submit]', 'Expected submit button to be present'
75
77
  end
76
-
77
- assert_assigns resource_name
78
78
  end
79
79
 
80
80
  def update_valid
@@ -92,14 +92,15 @@ module CrudTest
92
92
 
93
93
  after = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
94
94
 
95
- assert_equal before[:count], after[:count], "updating resource unexpectedly changed #{resource_class}.count"
96
- assert(after[:updated_at] > before[:updated_at], "failed to update resource") if resource.respond_to?(:updated_at)
95
+ assert_equal before[:count], after[:count], "Expected #{resource_class}.count to be unchanged"
96
+ refute_equal(before[:updated_at], after[:updated_at], "Expected @#{resource_name}.updated_at to have changed") if resource.respond_to?(:updated_at)
97
97
 
98
98
  assert_flash :success
99
+
99
100
  # In a rails controller, if i redirect to resources_path it may not assign the instance variable
100
101
  # Wheras if I redirect to edit_resource_path I must ensure that the instance variable is set
101
102
  assert_assigns(resource_name) if after[:path] == edit_resource_path(resource)
102
- assert(assigns[resource_name]['errors'].blank?) if assigns[resource_name].present?
103
+ assert_equal(nil, assigns[resource_name]['errors'], "Expected @#{resource_name}['errors'] to be blank") if assigns[resource_name].present?
103
104
  end
104
105
 
105
106
  def update_invalid
@@ -117,14 +118,15 @@ module CrudTest
117
118
 
118
119
  after = { count: resource_class.count, updated_at: (resource.updated_at rescue nil) }
119
120
 
120
- assert_equal before[:count], after[:count], "updating resource unexpectedly changed #{resource_class}.count"
121
- assert_equal(after[:updated_at], before[:updated_at], 'unexpectedly updated object anyway') if resource.respond_to?(:updated_at)
122
- assert_equal resource_path(resource), page.current_path, 'did not return to #update url'
123
- assert_page_title :any, 'page title missing after failed validation'
121
+ assert_equal before[:count], after[:count], "Expected: #{resource_class}.count to be unchanged"
122
+ assert_equal(before[:updated_at], after[:updated_at], "Expected @#{resource_name}.updated_at to be unchanged") if resource.respond_to?(:updated_at)
123
+ assert_page_title :any, 'Expected page title to be present after failed validation'
124
124
 
125
125
  assert_flash :danger
126
126
  assert_assigns resource_name
127
- assert assigns[resource_name]['errors'].present?
127
+ refute_equal(nil, assigns[resource_name]['errors'], "Expected @#{resource_name}['errors'] to be present") if assigns[resource_name].present?
128
+
129
+ assert_equal(resource_path(resource), page.current_path, "[update_invalid: :path] Expected current_path to match resource #update path") unless skip?(:path)
128
130
  end
129
131
 
130
132
  def index
@@ -135,7 +137,7 @@ module CrudTest
135
137
  assert_page_status
136
138
  assert_page_title
137
139
  assert_no_js_errors
138
- assert (assigns['datatable'].present? || assigns[resource_name.pluralize].present?), "expected @datatable or @#{resource_name.pluralize} to be set"
140
+ assert((assigns['datatable'].present? || assigns[resource_name.pluralize].present?), "[index: :assigns] Expected @#{resource_name.pluralize} or @datatable to be present") unless skip?(:assigns)
139
141
  end
140
142
 
141
143
  def show
@@ -161,17 +163,21 @@ module CrudTest
161
163
  assert_flash :success
162
164
 
163
165
  if resource.respond_to?(:archived)
164
- assert after[:archived] == true, "expected #{resource_class}.archived == true"
166
+ assert after[:archived] == true, "Expected #{resource_class}.archived? to be true"
165
167
  else
166
- refute_equal before[:count], after[:count], "unable to delete #{resource_class}"
168
+ refute_equal before[:count], after[:count], "Expected: #{resource_class}.count to decrement by 1"
167
169
  end
168
170
  end
169
171
 
170
172
  protected
171
173
 
174
+ def skip?(test)
175
+ skips.include?(test)
176
+ end
177
+
172
178
  def find_or_create_resource!
173
179
  existing = resource_class.last
174
- existing.present? ? existing : create_resource!
180
+ (existing.present? && !existing.kind_of?(User)) ? existing : create_resource!
175
181
  end
176
182
 
177
183
  def create_resource!
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.3.0
4
+ version: 0.4.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: 2015-06-26 00:00:00.000000000 Z
11
+ date: 2015-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 1.6.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 1.6.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: capybara-screenshot
127
127
  requirement: !ruby/object:Gem::Requirement