technicalpickles-shoulda 2.0.1 → 2.0.2
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.
- data/lib/shoulda/active_record/macros.rb +15 -14
- data/lib/shoulda/context.rb +5 -8
- data/lib/shoulda/controller/macros.rb +63 -14
- data/lib/shoulda/macros.rb +2 -8
- data/lib/shoulda.rb +1 -0
- data/rails/init.rb +1 -0
- data/test/fail_macros.rb +34 -0
- data/test/functional/posts_controller_test.rb +8 -1
- data/test/functional/users_controller_test.rb +2 -0
- data/test/rails_root/app/controllers/users_controller.rb +3 -0
- data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
- metadata +6 -5
@@ -3,7 +3,7 @@ module ThoughtBot # :nodoc:
|
|
3
3
|
module ActiveRecord # :nodoc:
|
4
4
|
DEFAULT_ERROR_MESSAGES =
|
5
5
|
if Object.const_defined?(:I18n)
|
6
|
-
I18n.translate('
|
6
|
+
I18n.translate('activerecord.errors.messages')
|
7
7
|
else
|
8
8
|
::ActiveRecord::Errors.default_error_messages
|
9
9
|
end
|
@@ -28,8 +28,9 @@ module ThoughtBot # :nodoc:
|
|
28
28
|
# For all of these helpers, the last parameter may be a hash of options.
|
29
29
|
#
|
30
30
|
module Macros
|
31
|
+
# <b>DEPRECATED:</b> Use <tt>fixtures :all</tt> instead
|
32
|
+
#
|
31
33
|
# Loads all fixture files (<tt>test/fixtures/*.yml</tt>)
|
32
|
-
# Deprecated: Use <tt>fixtures :all</tt> instead
|
33
34
|
def load_all_fixtures
|
34
35
|
warn "[DEPRECATION] load_all_fixtures is deprecated. Use `fixtures :all` instead."
|
35
36
|
fixtures :all
|
@@ -43,7 +44,7 @@ module ThoughtBot # :nodoc:
|
|
43
44
|
#
|
44
45
|
# Options:
|
45
46
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
46
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
47
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:blank]</tt>
|
47
48
|
#
|
48
49
|
# Example:
|
49
50
|
# should_require_attributes :name, :phone_number
|
@@ -65,7 +66,7 @@ module ThoughtBot # :nodoc:
|
|
65
66
|
#
|
66
67
|
# Options:
|
67
68
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
68
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
69
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:taken]</tt>
|
69
70
|
# * <tt>:scoped_to</tt> - field(s) to scope the uniqueness to.
|
70
71
|
#
|
71
72
|
# Examples:
|
@@ -163,7 +164,7 @@ module ThoughtBot # :nodoc:
|
|
163
164
|
#
|
164
165
|
# Options:
|
165
166
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
166
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
167
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:invalid]</tt>
|
167
168
|
#
|
168
169
|
# Example:
|
169
170
|
# should_not_allow_values_for :isbn, "bad 1", "bad 2"
|
@@ -206,9 +207,9 @@ module ThoughtBot # :nodoc:
|
|
206
207
|
#
|
207
208
|
# Options:
|
208
209
|
# * <tt>:short_message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
209
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
210
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:too_short] % range.first</tt>
|
210
211
|
# * <tt>:long_message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
211
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
212
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:too_long] % range.last</tt>
|
212
213
|
#
|
213
214
|
# Example:
|
214
215
|
# should_ensure_length_in_range :password, (6..20)
|
@@ -258,7 +259,7 @@ module ThoughtBot # :nodoc:
|
|
258
259
|
#
|
259
260
|
# Options:
|
260
261
|
# * <tt>:short_message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
261
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
262
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:too_short] % min_length</tt>
|
262
263
|
#
|
263
264
|
# Example:
|
264
265
|
# should_ensure_length_at_least :name, 3
|
@@ -289,7 +290,7 @@ module ThoughtBot # :nodoc:
|
|
289
290
|
#
|
290
291
|
# Options:
|
291
292
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
292
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
293
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:wrong_length] % length</tt>
|
293
294
|
#
|
294
295
|
# Example:
|
295
296
|
# should_ensure_length_is :ssn, 9
|
@@ -324,9 +325,9 @@ module ThoughtBot # :nodoc:
|
|
324
325
|
#
|
325
326
|
# Options:
|
326
327
|
# * <tt>:low_message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
327
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
328
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:inclusion]</tt>
|
328
329
|
# * <tt>:high_message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
329
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
330
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:inclusion]</tt>
|
330
331
|
#
|
331
332
|
# Example:
|
332
333
|
# should_ensure_value_in_range :age, (0..100)
|
@@ -369,7 +370,7 @@ module ThoughtBot # :nodoc:
|
|
369
370
|
#
|
370
371
|
# Options:
|
371
372
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
372
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
373
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:not_a_number]</tt>
|
373
374
|
#
|
374
375
|
# Example:
|
375
376
|
# should_only_allow_numeric_values_for :age
|
@@ -602,7 +603,7 @@ module ThoughtBot # :nodoc:
|
|
602
603
|
# should_have_index :age
|
603
604
|
#
|
604
605
|
def should_have_indices(*columns)
|
605
|
-
table = model_class.
|
606
|
+
table = model_class.table_name
|
606
607
|
indices = ::ActiveRecord::Base.connection.indexes(table).map(&:columns)
|
607
608
|
|
608
609
|
columns.each do |column|
|
@@ -623,7 +624,7 @@ module ThoughtBot # :nodoc:
|
|
623
624
|
#
|
624
625
|
# Options:
|
625
626
|
# * <tt>:message</tt> - value the test expects to find in <tt>errors.on(:attribute)</tt>.
|
626
|
-
# Regexp or string. Default = <tt>I18n.translate('
|
627
|
+
# Regexp or string. Default = <tt>I18n.translate('activerecord.errors.messages')[:accepted]</tt>
|
627
628
|
#
|
628
629
|
# Example:
|
629
630
|
# should_require_acceptance_of :eula
|
data/lib/shoulda/context.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Thoughtbot # :nodoc:
|
2
2
|
module Shoulda
|
3
|
-
VERSION = '2.0.
|
3
|
+
VERSION = '2.0.2'
|
4
4
|
|
5
5
|
class << self
|
6
6
|
attr_accessor :contexts
|
@@ -73,12 +73,12 @@ module Thoughtbot # :nodoc:
|
|
73
73
|
|
74
74
|
# == Before statements
|
75
75
|
#
|
76
|
-
# Before statements are
|
76
|
+
# Before statements are should statements that run before the current
|
77
77
|
# context's setup. These are especially useful when setting expectations.
|
78
78
|
#
|
79
79
|
# === Example:
|
80
80
|
#
|
81
|
-
# class UserControllerTest
|
81
|
+
# class UserControllerTest < Test::Unit::TestCase
|
82
82
|
# context "the index action" do
|
83
83
|
# setup do
|
84
84
|
# @users = [Factory(:user)]
|
@@ -86,14 +86,11 @@ module Thoughtbot # :nodoc:
|
|
86
86
|
# end
|
87
87
|
#
|
88
88
|
# context "on GET" do
|
89
|
-
# setup
|
90
|
-
# get :index
|
91
|
-
# end
|
89
|
+
# setup { get :index }
|
92
90
|
#
|
93
|
-
# # normal should statement
|
94
91
|
# should_respond_with :success
|
95
92
|
#
|
96
|
-
# # runs before get :index
|
93
|
+
# # runs before "get :index"
|
97
94
|
# before_should "find all users" do
|
98
95
|
# User.expects(:find).with(:all).returns(@users)
|
99
96
|
# end
|
@@ -26,7 +26,10 @@ module ThoughtBot # :nodoc:
|
|
26
26
|
# Furthermore, the should_be_restful helper will create an entire set of tests which will verify that your
|
27
27
|
# controller responds restfully to a variety of requested formats.
|
28
28
|
module Macros
|
29
|
-
#
|
29
|
+
# <b>DEPRECATED:</b> Please see
|
30
|
+
# http://thoughtbot.lighthouseapp.com/projects/5807/tickets/78 for more
|
31
|
+
# information.
|
32
|
+
#
|
30
33
|
# Generates a full suite of tests for a restful controller.
|
31
34
|
#
|
32
35
|
# The following definition will generate tests for the +index+, +show+, +new+,
|
@@ -52,6 +55,8 @@ module ThoughtBot # :nodoc:
|
|
52
55
|
# is used to configure the tests for the details of your resources.
|
53
56
|
#
|
54
57
|
def should_be_restful(&blk) # :yields: resource
|
58
|
+
warn "[DEPRECATION] should_be_restful is deprecated. Please see http://thoughtbot.lighthouseapp.com/projects/5807/tickets/78 for more information."
|
59
|
+
|
55
60
|
resource = ResourceOptions.new
|
56
61
|
blk.call(resource)
|
57
62
|
resource.normalize!(self)
|
@@ -95,17 +100,56 @@ module ThoughtBot # :nodoc:
|
|
95
100
|
def should_not_set_the_flash
|
96
101
|
should_set_the_flash_to nil
|
97
102
|
end
|
103
|
+
|
104
|
+
# Macro that creates a test asserting that filter_parameter_logging
|
105
|
+
# is set for the specified keys
|
106
|
+
#
|
107
|
+
# Example:
|
108
|
+
#
|
109
|
+
# should_filter_params :password, :ssn
|
110
|
+
def should_filter_params(*keys)
|
111
|
+
keys.each do |key|
|
112
|
+
should "filter #{key}" do
|
113
|
+
assert @controller.respond_to?(:filter_parameters),
|
114
|
+
"The key #{key} is not filtered"
|
115
|
+
filtered = @controller.send(:filter_parameters, {key.to_s => key.to_s})
|
116
|
+
assert_equal '[FILTERED]', filtered[key.to_s],
|
117
|
+
"The key #{key} is not filtered"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
98
121
|
|
99
122
|
# Macro that creates a test asserting that the controller assigned to
|
100
123
|
# each of the named instance variable(s).
|
101
124
|
#
|
125
|
+
# Options:
|
126
|
+
# * <tt>:class</tt> - The expected class of the instance variable being checked.
|
127
|
+
# * <tt>:equals</tt> - A string which is evaluated and compared for equality with
|
128
|
+
# the instance variable being checked.
|
129
|
+
#
|
102
130
|
# Example:
|
103
131
|
#
|
104
132
|
# should_assign_to :user, :posts
|
133
|
+
# should_assign_to :user, :class => User
|
134
|
+
# should_assign_to :user, :equals => '@user'
|
105
135
|
def should_assign_to(*names)
|
136
|
+
opts = names.extract_options!
|
106
137
|
names.each do |name|
|
107
|
-
|
108
|
-
|
138
|
+
test_name = "assign @#{name}"
|
139
|
+
test_name << " as class #{opts[:class]}" if opts[:class]
|
140
|
+
test_name << " which is equal to #{opts[:equals]}" if opts[:equals]
|
141
|
+
should test_name do
|
142
|
+
assigned_value = assigns(name.to_sym)
|
143
|
+
assert assigned_value, "The action isn't assigning to @#{name}"
|
144
|
+
assert_kind_of opts[:class], assigned_value if opts[:class]
|
145
|
+
if opts[:equals]
|
146
|
+
instantiate_variables_from_assigns do
|
147
|
+
expected_value = eval(opts[:equals], self.send(:binding), __FILE__, __LINE__)
|
148
|
+
assert_equal expected_value, assigned_value,
|
149
|
+
"Instance variable @#{name} expected to be #{expected_value}" +
|
150
|
+
" but was #{assigned_value}"
|
151
|
+
end
|
152
|
+
end
|
109
153
|
end
|
110
154
|
end
|
111
155
|
end
|
@@ -138,6 +182,8 @@ module ThoughtBot # :nodoc:
|
|
138
182
|
# Example:
|
139
183
|
#
|
140
184
|
# should_respond_with_content_type 'application/rss+xml'
|
185
|
+
# should_respond_with_content_type :rss
|
186
|
+
# should_respond_with_content_type /rss/
|
141
187
|
def should_respond_with_content_type(content_type)
|
142
188
|
should "respond with content type of #{content_type}" do
|
143
189
|
content_type = Mime::EXTENSION_LOOKUP[content_type.to_s].to_s if content_type.is_a? Symbol
|
@@ -183,13 +229,13 @@ module ThoughtBot # :nodoc:
|
|
183
229
|
if expected_layout
|
184
230
|
should "render with #{expected_layout} layout" do
|
185
231
|
response_layout = @response.layout.blank? ? "" : @response.layout.split('/').last
|
186
|
-
assert_equal expected_layout,
|
187
|
-
response_layout,
|
232
|
+
assert_equal expected_layout,
|
233
|
+
response_layout,
|
188
234
|
"Expected to render with layout #{expected_layout} but was rendered with #{response_layout}"
|
189
235
|
end
|
190
236
|
else
|
191
237
|
should "render without layout" do
|
192
|
-
assert_nil @response.layout,
|
238
|
+
assert_nil @response.layout,
|
193
239
|
"Expected no layout, but was rendered using #{@response.layout}"
|
194
240
|
end
|
195
241
|
end
|
@@ -222,7 +268,7 @@ module ThoughtBot # :nodoc:
|
|
222
268
|
assert_select "form", true, "The template doesn't contain a <form> element"
|
223
269
|
end
|
224
270
|
end
|
225
|
-
|
271
|
+
|
226
272
|
# Macro that creates a routing test. It tries to use the given HTTP
|
227
273
|
# +method+ on the given +path+, and asserts that it routes to the
|
228
274
|
# given +options+.
|
@@ -234,13 +280,16 @@ module ThoughtBot # :nodoc:
|
|
234
280
|
#
|
235
281
|
# Examples:
|
236
282
|
#
|
237
|
-
# should_route :get,
|
238
|
-
# should_route :
|
239
|
-
# should_route :
|
240
|
-
# should_route :
|
241
|
-
# should_route :
|
242
|
-
# should_route :
|
243
|
-
#
|
283
|
+
# should_route :get, "/posts", :controller => :posts, :action => :index
|
284
|
+
# should_route :get, "/posts/new", :action => :new
|
285
|
+
# should_route :post, "/posts", :action => :create
|
286
|
+
# should_route :get, "/posts/1", :action => :show, :id => 1
|
287
|
+
# should_route :edit, "/posts/1", :action => :show, :id => 1
|
288
|
+
# should_route :put, "/posts/1", :action => :update, :id => 1
|
289
|
+
# should_route :delete, "/posts/1", :action => :destroy, :id => 1
|
290
|
+
# should_route :get, "/users/1/posts/1",
|
291
|
+
# :action => :show, :id => 1, :user_id => 1
|
292
|
+
#
|
244
293
|
def should_route(method, path, options)
|
245
294
|
unless options[:controller]
|
246
295
|
options[:controller] = self.name.gsub(/ControllerTest$/, '').tableize
|
data/lib/shoulda/macros.rb
CHANGED
@@ -12,10 +12,7 @@ module ThoughtBot # :nodoc:
|
|
12
12
|
# Example:
|
13
13
|
#
|
14
14
|
# context "Creating a post"
|
15
|
-
# setup
|
16
|
-
# Post.create
|
17
|
-
# end
|
18
|
-
#
|
15
|
+
# setup { Post.create }
|
19
16
|
# should_change "Post.count", :by => 1
|
20
17
|
# end
|
21
18
|
#
|
@@ -57,10 +54,7 @@ module ThoughtBot # :nodoc:
|
|
57
54
|
# Example:
|
58
55
|
#
|
59
56
|
# context "Updating a post"
|
60
|
-
# setup
|
61
|
-
# @post.update_attributes(:title => "new")
|
62
|
-
# end
|
63
|
-
#
|
57
|
+
# setup { @post.update_attributes(:title => "new") }
|
64
58
|
# should_not_change "Post.count"
|
65
59
|
# end
|
66
60
|
def should_not_change(expression)
|
data/lib/shoulda.rb
CHANGED
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'shoulda/rails'
|
data/test/fail_macros.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
module Thoughtbot
|
2
|
+
module Shoulda
|
3
|
+
class << self
|
4
|
+
attr_accessor :expected_exceptions
|
5
|
+
end
|
6
|
+
|
7
|
+
# Enables the core shoulda test suite to test for failure scenarios. For
|
8
|
+
# example, to ensure that a set of test macros should fail, do this:
|
9
|
+
#
|
10
|
+
# should_fail do
|
11
|
+
# should_require_attributes :comments
|
12
|
+
# should_protect_attributes :name
|
13
|
+
# end
|
14
|
+
def should_fail(&block)
|
15
|
+
context "should fail when trying to run:" do
|
16
|
+
Shoulda.expected_exceptions = [Test::Unit::AssertionFailedError]
|
17
|
+
yield block
|
18
|
+
Shoulda.expected_exceptions = nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Context
|
23
|
+
# alias_method_chain hack to allow the should_fail macro to work
|
24
|
+
def should_with_failure_scenario(name, options = {}, &block)
|
25
|
+
if Shoulda.expected_exceptions
|
26
|
+
expected_exceptions = Shoulda.expected_exceptions
|
27
|
+
failure_block = lambda { assert_raise(*expected_exceptions, &block.bind(self)) }
|
28
|
+
end
|
29
|
+
should_without_failure_scenario(name, options, &(failure_block || block))
|
30
|
+
end
|
31
|
+
alias_method_chain :should, :failure_scenario
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -64,7 +64,14 @@ class PostsControllerTest < Test::Unit::TestCase
|
|
64
64
|
get :index, :user_id => users(:first)
|
65
65
|
end
|
66
66
|
should_respond_with :success
|
67
|
-
should_assign_to :user, :
|
67
|
+
should_assign_to :user, :class => User, :equals => 'users(:first)'
|
68
|
+
should_fail do
|
69
|
+
should_assign_to :user, :class => Post
|
70
|
+
end
|
71
|
+
should_fail do
|
72
|
+
should_assign_to :user, :equals => 'posts(:first)'
|
73
|
+
end
|
74
|
+
should_assign_to :posts
|
68
75
|
should_not_assign_to :foo, :bar
|
69
76
|
end
|
70
77
|
|
@@ -0,0 +1 @@
|
|
1
|
+
<html><%= yield %></html>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: technicalpickles-shoulda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tammer Saleh
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-09-
|
12
|
+
date: 2008-09-20 00:00:00 -07:00
|
13
13
|
default_executable: convert_to_should_syntax
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -53,9 +53,6 @@ files:
|
|
53
53
|
- lib/shoulda/controller/helpers.rb
|
54
54
|
- lib/shoulda/controller/macros.rb
|
55
55
|
- lib/shoulda/controller/resource_options.rb
|
56
|
-
- lib/shoulda/controller/routing
|
57
|
-
- lib/shoulda/controller/routing/macros.rb
|
58
|
-
- lib/shoulda/controller/routing.rb
|
59
56
|
- lib/shoulda/controller.rb
|
60
57
|
- lib/shoulda/helpers.rb
|
61
58
|
- lib/shoulda/macros.rb
|
@@ -67,6 +64,9 @@ files:
|
|
67
64
|
- lib/shoulda/tasks/yaml_to_shoulda.rake
|
68
65
|
- lib/shoulda/tasks.rb
|
69
66
|
- lib/shoulda.rb
|
67
|
+
- rails
|
68
|
+
- rails/init.rb
|
69
|
+
- test/fail_macros.rb
|
70
70
|
- test/fixtures
|
71
71
|
- test/fixtures/addresses.yml
|
72
72
|
- test/fixtures/friendships.yml
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- test/rails_root/app/views/layouts
|
109
109
|
- test/rails_root/app/views/layouts/posts.rhtml
|
110
110
|
- test/rails_root/app/views/layouts/users.rhtml
|
111
|
+
- test/rails_root/app/views/layouts/wide.html.erb
|
111
112
|
- test/rails_root/app/views/posts
|
112
113
|
- test/rails_root/app/views/posts/edit.rhtml
|
113
114
|
- test/rails_root/app/views/posts/index.rhtml
|