thoughtbot-shoulda 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -90,6 +90,19 @@ Macros to test the most common controller patterns...
90
90
  end
91
91
  end
92
92
 
93
+ Test entire controllers in a few lines...
94
+
95
+ class PostsControllerTest < Test::Unit::TestCase
96
+ should_be_restful do |resource|
97
+ resource.parent = :user
98
+
99
+ resource.create.params = { :title => "first post", :body => 'blah blah blah'}
100
+ resource.update.params = { :title => "changed" }
101
+ end
102
+ end
103
+
104
+ should_be_restful generates 40 tests on the fly, for both html and xml requests.
105
+
93
106
  === Helpful Assertions (ThoughtBot::Shoulda::Assertions)
94
107
 
95
108
  More to come here, but have fun with what's there.
@@ -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
@@ -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.name.tableize
606
+ table = model_class.table_name
606
607
  indices = ::ActiveRecord::Base.connection.indexes(table).map(&:columns)
607
608
 
608
609
  columns.each do |column|
@@ -1,6 +1,6 @@
1
1
  module Thoughtbot # :nodoc:
2
2
  module Shoulda
3
- VERSION = '2.0.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 simply should statements that run before the current
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 << Test::Unit::TestCase
81
+ # class UserControllerTest < Test::Unit::TestCase
82
82
  # context "the index action" do
83
83
  # setup do
84
84
  # @users = [Factory(:user)]
@@ -86,11 +86,8 @@ module Thoughtbot # :nodoc:
86
86
  # end
87
87
  #
88
88
  # context "on GET" do
89
- # setup do
90
- # get :index
91
- # end
89
+ # setup { get :index }
92
90
  #
93
- # # normal should statement
94
91
  # should_respond_with :success
95
92
  #
96
93
  # # runs before "get :index"
@@ -22,7 +22,58 @@ module ThoughtBot # :nodoc:
22
22
  # end
23
23
  #
24
24
  # Would produce 5 tests for the +show+ action
25
+ #
26
+ # Furthermore, the should_be_restful helper will create an entire set of tests which will verify that your
27
+ # controller responds restfully to a variety of requested formats.
25
28
  module Macros
29
+ # <b>DEPRECATED:</b> Please see
30
+ # http://thoughtbot.lighthouseapp.com/projects/5807/tickets/78 for more
31
+ # information.
32
+ #
33
+ # Generates a full suite of tests for a restful controller.
34
+ #
35
+ # The following definition will generate tests for the +index+, +show+, +new+,
36
+ # +edit+, +create+, +update+ and +destroy+ actions, in both +html+ and +xml+ formats:
37
+ #
38
+ # should_be_restful do |resource|
39
+ # resource.parent = :user
40
+ #
41
+ # resource.create.params = { :title => "first post", :body => 'blah blah blah'}
42
+ # resource.update.params = { :title => "changed" }
43
+ # end
44
+ #
45
+ # This generates about 40 tests, all of the format:
46
+ # "on GET to :show should assign @user."
47
+ # "on GET to :show should not set the flash."
48
+ # "on GET to :show should render 'show' template."
49
+ # "on GET to :show should respond with success."
50
+ # "on GET to :show as xml should assign @user."
51
+ # "on GET to :show as xml should have ContentType set to 'application/xml'."
52
+ # "on GET to :show as xml should respond with success."
53
+ # "on GET to :show as xml should return <user/> as the root element."
54
+ # The +resource+ parameter passed into the block is a ResourceOptions object, and
55
+ # is used to configure the tests for the details of your resources.
56
+ #
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
+
60
+ resource = ResourceOptions.new
61
+ blk.call(resource)
62
+ resource.normalize!(self)
63
+
64
+ resource.formats.each do |format|
65
+ resource.actions.each do |action|
66
+ if self.respond_to? :"make_#{action}_#{format}_tests"
67
+ self.send(:"make_#{action}_#{format}_tests", resource)
68
+ else
69
+ should "test #{action} #{format}" do
70
+ flunk "Test for #{action} as #{format} not implemented"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
26
77
  # :section: Test macros
27
78
  # Macro that creates a test asserting that the flash contains the given value.
28
79
  # val can be a String, a Regex, or nil (indicating that the flash should not be set)
@@ -49,6 +100,24 @@ module ThoughtBot # :nodoc:
49
100
  def should_not_set_the_flash
50
101
  should_set_the_flash_to nil
51
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
52
121
 
53
122
  # Macro that creates a test asserting that the controller assigned to
54
123
  # each of the named instance variable(s).
@@ -77,7 +146,7 @@ module ThoughtBot # :nodoc:
77
146
  instantiate_variables_from_assigns do
78
147
  expected_value = eval(opts[:equals], self.send(:binding), __FILE__, __LINE__)
79
148
  assert_equal expected_value, assigned_value,
80
- "Instance variable @#{name} expected to be #{expected_value}" +
149
+ "Instance variable @#{name} expected to be #{expected_value}" +
81
150
  " but was #{assigned_value}"
82
151
  end
83
152
  end
@@ -113,6 +182,8 @@ module ThoughtBot # :nodoc:
113
182
  # Example:
114
183
  #
115
184
  # should_respond_with_content_type 'application/rss+xml'
185
+ # should_respond_with_content_type :rss
186
+ # should_respond_with_content_type /rss/
116
187
  def should_respond_with_content_type(content_type)
117
188
  should "respond with content type of #{content_type}" do
118
189
  content_type = Mime::EXTENSION_LOOKUP[content_type.to_s].to_s if content_type.is_a? Symbol
@@ -158,13 +229,13 @@ module ThoughtBot # :nodoc:
158
229
  if expected_layout
159
230
  should "render with #{expected_layout} layout" do
160
231
  response_layout = @response.layout.blank? ? "" : @response.layout.split('/').last
161
- assert_equal expected_layout,
162
- response_layout,
232
+ assert_equal expected_layout,
233
+ response_layout,
163
234
  "Expected to render with layout #{expected_layout} but was rendered with #{response_layout}"
164
235
  end
165
236
  else
166
237
  should "render without layout" do
167
- assert_nil @response.layout,
238
+ assert_nil @response.layout,
168
239
  "Expected no layout, but was rendered using #{@response.layout}"
169
240
  end
170
241
  end
@@ -197,7 +268,7 @@ module ThoughtBot # :nodoc:
197
268
  assert_select "form", true, "The template doesn't contain a <form> element"
198
269
  end
199
270
  end
200
-
271
+
201
272
  # Macro that creates a routing test. It tries to use the given HTTP
202
273
  # +method+ on the given +path+, and asserts that it routes to the
203
274
  # given +options+.
@@ -209,13 +280,16 @@ module ThoughtBot # :nodoc:
209
280
  #
210
281
  # Examples:
211
282
  #
212
- # should_route :get, '/posts', :action => :index
213
- # should_route :post, '/posts', :controller => :posts, :action => :create
214
- # should_route :get, '/posts/1', :action => :show, :id => 1
215
- # should_route :put, '/posts/1', :action => :update, :id => "1"
216
- # should_route :delete, '/posts/1', :action => :destroy, :id => 1
217
- # should_route :get, '/posts/new', :action => :new
218
- #
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
+ #
219
293
  def should_route(method, path, options)
220
294
  unless options[:controller]
221
295
  options[:controller] = self.name.gsub(/ControllerTest$/, '').tableize
@@ -1,10 +1,234 @@
1
1
  module ThoughtBot # :nodoc:
2
2
  module Shoulda # :nodoc:
3
3
  module Controller
4
+ # Formats tested by #should_be_restful. Defaults to [:html, :xml]
4
5
  VALID_FORMATS = Dir.glob(File.join(File.dirname(__FILE__), 'formats', '*.rb')).map { |f| File.basename(f, '.rb') }.map(&:to_sym) # :doc:
5
6
  VALID_FORMATS.each {|f| require "shoulda/controller/formats/#{f}"}
6
7
 
8
+ # Actions tested by #should_be_restful
7
9
  VALID_ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy] # :doc:
10
+
11
+ # A ResourceOptions object is passed into should_be_restful in order to configure the tests for your controller.
12
+ #
13
+ # Example:
14
+ # class UsersControllerTest < Test::Unit::TestCase
15
+ # fixtures :all
16
+ #
17
+ # def setup
18
+ # ...normal setup code...
19
+ # @user = User.find(:first)
20
+ # end
21
+ #
22
+ # should_be_restful do |resource|
23
+ # resource.identifier = :id
24
+ # resource.klass = User
25
+ # resource.object = :user
26
+ # resource.parent = []
27
+ # resource.actions = [:index, :show, :new, :edit, :update, :create, :destroy]
28
+ # resource.formats = [:html, :xml]
29
+ #
30
+ # resource.create.params = { :name => "bob", :email => 'bob@bob.com', :age => 13}
31
+ # resource.update.params = { :name => "sue" }
32
+ #
33
+ # resource.create.redirect = "user_url(@user)"
34
+ # resource.update.redirect = "user_url(@user)"
35
+ # resource.destroy.redirect = "users_url"
36
+ #
37
+ # resource.create.flash = /created/i
38
+ # resource.update.flash = /updated/i
39
+ # resource.destroy.flash = /removed/i
40
+ # end
41
+ # end
42
+ #
43
+ # Whenever possible, the resource attributes will be set to sensible defaults.
44
+ #
45
+ class ResourceOptions
46
+ # Configuration options for the create, update, destroy actions under should_be_restful
47
+ class ActionOptions
48
+ # String evaled to get the target of the redirection.
49
+ # All of the instance variables set by the controller will be available to the
50
+ # evaled code.
51
+ #
52
+ # Example:
53
+ # resource.create.redirect = "user_url(@user.company, @user)"
54
+ #
55
+ # Defaults to a generated url based on the name of the controller, the action, and the resource.parents list.
56
+ attr_accessor :redirect
57
+
58
+ # String or Regexp describing a value expected in the flash. Will match against any flash key.
59
+ #
60
+ # Defaults:
61
+ # destroy:: /removed/
62
+ # create:: /created/
63
+ # update:: /updated/
64
+ attr_accessor :flash
65
+
66
+ # Hash describing the params that should be sent in with this action.
67
+ attr_accessor :params
68
+ end
69
+
70
+ # Configuration options for the denied actions under should_be_restful
71
+ #
72
+ # Example:
73
+ # context "The public" do
74
+ # setup do
75
+ # @request.session[:logged_in] = false
76
+ # end
77
+ #
78
+ # should_be_restful do |resource|
79
+ # resource.parent = :user
80
+ #
81
+ # resource.denied.actions = [:index, :show, :edit, :new, :create, :update, :destroy]
82
+ # resource.denied.flash = /get outta here/i
83
+ # resource.denied.redirect = 'new_session_url'
84
+ # end
85
+ # end
86
+ #
87
+ class DeniedOptions
88
+ # String evaled to get the target of the redirection.
89
+ # All of the instance variables set by the controller will be available to the
90
+ # evaled code.
91
+ #
92
+ # Example:
93
+ # resource.create.redirect = "user_url(@user.company, @user)"
94
+ attr_accessor :redirect
95
+
96
+ # String or Regexp describing a value expected in the flash. Will match against any flash key.
97
+ #
98
+ # Example:
99
+ # resource.create.flash = /created/
100
+ attr_accessor :flash
101
+
102
+ # Actions that should be denied (only used by resource.denied). <i>Note that these actions will
103
+ # only be tested if they are also listed in +resource.actions+</i>
104
+ # The special value of :all will deny all of the REST actions.
105
+ attr_accessor :actions
106
+ end
107
+
108
+ # Name of key in params that references the primary key.
109
+ # Will almost always be :id (default), unless you are using a plugin or have patched rails.
110
+ attr_accessor :identifier
111
+
112
+ # Name of the ActiveRecord class this resource is responsible for. Automatically determined from
113
+ # test class if not explicitly set. UserTest => "User"
114
+ attr_accessor :klass
115
+
116
+ # Name of the instantiated ActiveRecord object that should be used by some of the tests.
117
+ # Defaults to the underscored name of the AR class. CompanyManager => :company_manager
118
+ attr_accessor :object
119
+
120
+ # Name of the parent AR objects. Can be set as parent= or parents=, and can take either
121
+ # the name of the parent resource (if there's only one), or an array of names (if there's
122
+ # more than one).
123
+ #
124
+ # Example:
125
+ # # in the routes...
126
+ # map.resources :companies do
127
+ # map.resources :people do
128
+ # map.resources :limbs
129
+ # end
130
+ # end
131
+ #
132
+ # # in the tests...
133
+ # class PeopleControllerTest < Test::Unit::TestCase
134
+ # should_be_restful do |resource|
135
+ # resource.parent = :companies
136
+ # end
137
+ # end
138
+ #
139
+ # class LimbsControllerTest < Test::Unit::TestCase
140
+ # should_be_restful do |resource|
141
+ # resource.parents = [:companies, :people]
142
+ # end
143
+ # end
144
+ attr_accessor :parent
145
+ alias parents parent
146
+ alias parents= parent=
147
+
148
+ # Actions that should be tested. Must be a subset of VALID_ACTIONS (default).
149
+ # Tests for each actionw will only be generated if the action is listed here.
150
+ # The special value of :all will test all of the REST actions.
151
+ #
152
+ # Example (for a read-only controller):
153
+ # resource.actions = [:show, :index]
154
+ attr_accessor :actions
155
+
156
+ # Formats that should be tested. Must be a subset of VALID_FORMATS (default).
157
+ # Each action will be tested against the formats listed here. The special value
158
+ # of :all will test all of the supported formats.
159
+ #
160
+ # Example:
161
+ # resource.actions = [:html, :xml]
162
+ attr_accessor :formats
163
+
164
+ # ActionOptions object specifying options for the create action.
165
+ attr_accessor :create
166
+
167
+ # ActionOptions object specifying options for the update action.
168
+ attr_accessor :update
169
+
170
+ # ActionOptions object specifying options for the desrtoy action.
171
+ attr_accessor :destroy
172
+
173
+ # DeniedOptions object specifying which actions should return deny a request, and what should happen in that case.
174
+ attr_accessor :denied
175
+
176
+ def initialize # :nodoc:
177
+ @create = ActionOptions.new
178
+ @update = ActionOptions.new
179
+ @destroy = ActionOptions.new
180
+ @denied = DeniedOptions.new
181
+
182
+ @create.flash ||= /created/i
183
+ @update.flash ||= /updated/i
184
+ @destroy.flash ||= /removed/i
185
+ @denied.flash ||= /denied/i
186
+
187
+ @create.params ||= {}
188
+ @update.params ||= {}
189
+
190
+ @actions = VALID_ACTIONS
191
+ @formats = VALID_FORMATS
192
+ @denied.actions = []
193
+ end
194
+
195
+ def normalize!(target) # :nodoc:
196
+ @denied.actions = VALID_ACTIONS if @denied.actions == :all
197
+ @actions = VALID_ACTIONS if @actions == :all
198
+ @formats = VALID_FORMATS if @formats == :all
199
+
200
+ @denied.actions = @denied.actions.map(&:to_sym)
201
+ @actions = @actions.map(&:to_sym)
202
+ @formats = @formats.map(&:to_sym)
203
+
204
+ ensure_valid_members(@actions, VALID_ACTIONS, 'actions')
205
+ ensure_valid_members(@denied.actions, VALID_ACTIONS, 'denied.actions')
206
+ ensure_valid_members(@formats, VALID_FORMATS, 'formats')
207
+
208
+ @identifier ||= :id
209
+ @klass ||= target.name.gsub(/ControllerTest$/, '').singularize.constantize
210
+ @object ||= @klass.name.tableize.singularize
211
+ @parent ||= []
212
+ @parent = [@parent] unless @parent.is_a? Array
213
+
214
+ collection_helper = [@parent, @object.to_s.pluralize, 'url'].flatten.join('_')
215
+ collection_args = @parent.map {|n| "@#{object}.#{n}"}.join(', ')
216
+ @destroy.redirect ||= "#{collection_helper}(#{collection_args})"
217
+
218
+ member_helper = [@parent, @object, 'url'].flatten.join('_')
219
+ member_args = [@parent.map {|n| "@#{object}.#{n}"}, "@#{object}"].flatten.join(', ')
220
+ @create.redirect ||= "#{member_helper}(#{member_args})"
221
+ @update.redirect ||= "#{member_helper}(#{member_args})"
222
+ @denied.redirect ||= "new_session_url"
223
+ end
224
+
225
+ private
226
+
227
+ def ensure_valid_members(ary, valid_members, name) # :nodoc:
228
+ invalid = ary - valid_members
229
+ raise ArgumentError, "Unsupported #{name}: #{invalid.inspect}" unless invalid.empty?
230
+ end
231
+ end
8
232
  end
9
233
  end
10
234
  end
@@ -12,10 +12,7 @@ module ThoughtBot # :nodoc:
12
12
  # Example:
13
13
  #
14
14
  # context "Creating a post"
15
- # setup do
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 do
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
@@ -3,6 +3,7 @@ require 'shoulda/proc_extensions'
3
3
  require 'shoulda/assertions'
4
4
  require 'shoulda/macros'
5
5
  require 'shoulda/helpers'
6
+ require 'shoulda/rails' if defined? RAILS_ROOT
6
7
 
7
8
  module Test # :nodoc: all
8
9
  module Unit
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'shoulda/rails'
@@ -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
@@ -33,11 +33,32 @@ class PostsControllerTest < Test::Unit::TestCase
33
33
  should_route :get, '/users/5/posts/new', :action => :new, :user_id => 5
34
34
  should_route :put, '/users/5/posts/1', :action => :update, :id => 1, :user_id => 5
35
35
 
36
+ context "The public" do
37
+ setup do
38
+ @request.session[:logged_in] = false
39
+ end
40
+
41
+ should_be_restful do |resource|
42
+ resource.parent = :user
43
+
44
+ resource.denied.actions = [:index, :show, :edit, :new, :create, :update, :destroy]
45
+ resource.denied.flash = /what/i
46
+ resource.denied.redirect = '"/"'
47
+ end
48
+ end
49
+
36
50
  context "Logged in" do
37
51
  setup do
38
52
  @request.session[:logged_in] = true
39
53
  end
40
54
 
55
+ should_be_restful do |resource|
56
+ resource.parent = :user
57
+
58
+ resource.create.params = { :title => "first post", :body => 'blah blah blah'}
59
+ resource.update.params = { :title => "changed" }
60
+ end
61
+
41
62
  context "viewing posts for a user" do
42
63
  setup do
43
64
  get :index, :user_id => users(:first)
@@ -13,31 +13,26 @@ class UsersControllerTest < Test::Unit::TestCase
13
13
  @response = ActionController::TestResponse.new
14
14
  @user = User.find(:first)
15
15
  end
16
+
17
+ should_filter_params :ssn
16
18
 
17
- context "on GET to #index" do
18
- setup { get :index }
19
+ should_be_restful do |resource|
20
+ resource.identifier = :id
21
+ resource.klass = User
22
+ resource.object = :user
23
+ resource.parent = []
24
+ resource.actions = [:index, :show, :new, :edit, :update, :create, :destroy]
25
+ resource.formats = [:html, :xml]
19
26
 
20
- should_respond_with :success
21
- should_render_with_layout 'users'
22
- should_render_template :index
23
- should_assign_to :users
24
- end
25
-
26
- context "on GET to #index.xml" do
27
- setup { get :index, :format => 'xml' }
28
-
29
- should_respond_with :success
30
- should_respond_with_xml_for
31
- should_assign_to :users
32
- end
33
-
34
- context "on GET to #show" do
35
- setup { get :show, :id => @user }
27
+ resource.create.params = { :name => "bob", :email => 'bob@bob.com', :age => 13, :ssn => "123456789"}
28
+ resource.update.params = { :name => "sue" }
36
29
 
37
- should_respond_with :success
38
- should_render_with_layout 'users'
39
- should_render_template :show
40
- should_assign_to :user
30
+ resource.create.redirect = "user_url(@user)"
31
+ resource.update.redirect = "user_url(@user)"
32
+ resource.destroy.redirect = "users_url"
33
+
34
+ resource.create.flash = /created/i
35
+ resource.update.flash = /updated/i
36
+ resource.destroy.flash = /removed/i
41
37
  end
42
-
43
38
  end
@@ -1,4 +1,7 @@
1
1
  class UsersController < ApplicationController
2
+
3
+ filter_parameter_logging :ssn
4
+
2
5
  # GET /users
3
6
  # GET /users.xml
4
7
  def index
@@ -0,0 +1 @@
1
+ <html><%= yield %></html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thoughtbot-shoulda
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tammer Saleh
@@ -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