trust 0.8.3 → 1.4.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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -1
  3. data/lib/trust.rb +9 -0
  4. data/lib/trust/authorization.rb +83 -36
  5. data/lib/trust/controller.rb +32 -8
  6. data/lib/trust/controller/properties.rb +12 -0
  7. data/lib/trust/controller/resource.rb +79 -11
  8. data/lib/trust/permissions.rb +177 -24
  9. data/lib/trust/version.rb +1 -1
  10. data/test/dummy/app/controllers/accounts_controller.rb +2 -2
  11. data/test/dummy/app/controllers/clients_controller.rb +1 -1
  12. data/test/dummy/app/controllers/mongo_accounts_controller.rb +5 -4
  13. data/test/dummy/app/controllers/mongo_clients_controller.rb +1 -1
  14. data/test/dummy/app/controllers/users_controller.rb +1 -5
  15. data/test/dummy/app/models/account.rb +1 -1
  16. data/test/dummy/app/models/client.rb +1 -1
  17. data/test/dummy/app/models/permissions.rb +18 -11
  18. data/test/dummy/app/models/user.rb +1 -1
  19. data/test/dummy/app/views/accounts/edit.html.erb +1 -1
  20. data/test/dummy/app/views/accounts/show.html.erb +1 -1
  21. data/test/dummy/app/views/mongo_accounts/_form.html.erb +1 -1
  22. data/test/dummy/app/views/mongo_accounts/edit.html.erb +2 -2
  23. data/test/dummy/app/views/mongo_accounts/index.html.erb +3 -3
  24. data/test/dummy/app/views/mongo_accounts/show.html.erb +2 -2
  25. data/test/dummy/bin/bundle +3 -0
  26. data/test/dummy/bin/rails +4 -0
  27. data/test/dummy/bin/rake +4 -0
  28. data/test/dummy/bin/setup +29 -0
  29. data/test/dummy/config/application.rb +3 -34
  30. data/test/dummy/config/boot.rb +4 -9
  31. data/test/dummy/config/environment.rb +3 -3
  32. data/test/dummy/config/environments/development.rb +22 -18
  33. data/test/dummy/config/environments/production.rb +46 -34
  34. data/test/dummy/config/environments/test.rb +19 -14
  35. data/test/dummy/config/initializers/assets.rb +11 -0
  36. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  37. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  38. data/test/dummy/config/initializers/inflections.rb +6 -5
  39. data/test/dummy/config/initializers/mime_types.rb +0 -1
  40. data/test/dummy/config/initializers/session_store.rb +1 -6
  41. data/test/dummy/config/initializers/wrap_parameters.rb +6 -6
  42. data/test/dummy/config/locales/en.yml +20 -2
  43. data/test/dummy/config/mongoid.yml +16 -18
  44. data/test/dummy/config/routes.rb +3 -3
  45. data/test/dummy/config/secrets.yml +22 -0
  46. data/test/dummy/db/test.sqlite3 +0 -0
  47. data/test/dummy/log/development.log +30 -0
  48. data/test/dummy/log/test.log +6382 -0
  49. data/test/dummy/test/functional/accounts_controller_test.rb +2 -2
  50. data/test/dummy/test/functional/mongo_accounts_controller_test.rb +8 -8
  51. data/test/dummy/test/functional/mongo_clients_controller_test.rb +1 -1
  52. data/test/dummy/test/unit/permissions_test.rb +1 -1
  53. data/test/dummy/tmp/cache/assets/test/sprockets/0e74e8595d4c5c03160356ab9bf6f67c +0 -0
  54. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  55. data/test/dummy/tmp/cache/assets/test/sprockets/189460d2a0f63f35d55c384e0beb9cc4 +0 -0
  56. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  57. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  58. data/test/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  59. data/test/dummy/tmp/cache/assets/test/sprockets/4050a4e5062ab95c9f32e9b6940821ea +0 -0
  60. data/test/dummy/tmp/cache/assets/test/sprockets/5f1a0d05e77ca8b9a1fc2a47e17a8174 +0 -0
  61. data/test/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  62. data/test/dummy/tmp/cache/assets/test/sprockets/75f67b2244ba6a4914d71df068f5fda9 +0 -0
  63. data/test/dummy/tmp/cache/assets/test/sprockets/7ed0985e7e627ac5280078ee9c7078fe +0 -0
  64. data/test/dummy/tmp/cache/assets/test/sprockets/86d19eda31629412e6817570ffde9a93 +0 -0
  65. data/test/dummy/tmp/cache/assets/test/sprockets/87b209c0c9da28094a8d5581a21262c6 +0 -0
  66. data/test/dummy/tmp/cache/assets/test/sprockets/954318d0d3412eec67db5c2508ae5169 +0 -0
  67. data/test/dummy/tmp/cache/assets/test/sprockets/95c1a034126598a432130d7fc227c189 +0 -0
  68. data/test/dummy/tmp/cache/assets/test/sprockets/b55283b385e5692ecf1b59332bbc5a11 +0 -0
  69. data/test/dummy/tmp/cache/assets/test/sprockets/b678ce3482f77c68a19e697960645cb6 +0 -0
  70. data/test/dummy/tmp/cache/assets/test/sprockets/ca9d9c205bcfa05de1ddd180f8ecc168 +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/d36f675d4251ea3868635d299f3bb166 +0 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/f56253b5f374fff1a33fbbc9881c9124 +0 -0
  75. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  76. data/test/dummy/tmp/cache/assets/test/sprockets/fe1f20fb032685e2e1fcad23f0ad6601 +0 -0
  77. data/test/test_helper.rb +6 -2
  78. data/test/trust_test.rb +4 -0
  79. data/test/unit/trust/authorization_test.rb +165 -71
  80. data/test/unit/trust/controller/properties_test.rb +15 -0
  81. data/test/unit/trust/controller/resource_test.rb +29 -9
  82. data/test/unit/trust/controller_test.rb +53 -40
  83. data/test/unit/trust/permissions_test.rb +196 -69
  84. metadata +93 -28
@@ -63,7 +63,7 @@ class AccountsControllerTest < ActionController::TestCase
63
63
 
64
64
  should "update account" do
65
65
  put :update, client_id: @client, id: @account, account: { name: @account.name }
66
- assert_redirected_to client_account_path(assigns(:account))
66
+ assert_redirected_to client_account_path(@client, assigns(:account))
67
67
  end
68
68
 
69
69
  should "destroy account" do
@@ -106,7 +106,7 @@ class AccountsControllerTest < ActionController::TestCase
106
106
  context 'but having ownership' do
107
107
  should 'allow updates' do
108
108
  put :update, client_id: @client, id: @account, account: { name: @account.name }
109
- assert_redirected_to client_account_path(assigns(:account))
109
+ assert_redirected_to client_account_path(@client, assigns(:account))
110
110
  end
111
111
  end
112
112
  context 'having no ownership' do
@@ -48,30 +48,30 @@ class MongoAccountsControllerTest < ActionController::TestCase
48
48
  post :create, mongo_client_id: @client, mongo_account: { name: @account.name }
49
49
  end
50
50
 
51
- assert_redirected_to mongo_client_mongo_account_path(@client,assigns(:mongo_account))
51
+ assert_redirected_to mongo_account_path(assigns(:mongo_account))
52
52
  end
53
53
 
54
54
  should "show account" do
55
- get :show, mongo_client_id: @client.id, id: @account.id
55
+ get :show, id: @account.id
56
56
  assert_response :success
57
57
  end
58
58
 
59
59
  should "get edit" do
60
- get :edit, mongo_client_id: @client, id: @account
60
+ get :edit, id: @account
61
61
  assert_response :success
62
62
  end
63
63
 
64
64
  should "update account" do
65
- put :update, mongo_client_id: @client, id: @account, mongo_account: { name: @account.name }
66
- assert_redirected_to mongo_client_mongo_account_path(assigns(:mongo_account))
65
+ put :update, id: @account, mongo_account: { name: @account.name }
66
+ assert_redirected_to mongo_account_path(assigns(:mongo_account))
67
67
  end
68
68
 
69
69
  should "destroy account" do
70
70
  assert_difference('MongoAccount.count', -1) do
71
- delete :destroy, mongo_client_id: @client, id: @account
71
+ delete :destroy, id: @account
72
72
  end
73
73
 
74
- assert_redirected_to mongo_client_mongo_accounts_path
74
+ assert_redirected_to mongo_client_mongo_accounts_path(@client.id)
75
75
  end
76
76
  end
77
77
 
@@ -106,7 +106,7 @@ class MongoAccountsControllerTest < ActionController::TestCase
106
106
  context 'but having ownership' do
107
107
  should 'allow updates' do
108
108
  put :update, mongo_client_id: @client, id: @account, mongo_account: { name: @account.name }
109
- assert_redirected_to mongo_client_mongo_account_path(assigns(:mongo_account))
109
+ assert_redirected_to mongo_account_path(assigns(:mongo_account))
110
110
  end
111
111
  end
112
112
  context 'having no ownership' do
@@ -26,8 +26,8 @@ require 'test_helper'
26
26
 
27
27
  class MongoClientsControllerTest < ActionController::TestCase
28
28
  setup do
29
- @client = MongoClient.create #clients(:one)
30
29
  login_as(:system_admin)
30
+ @client = MongoClient.create #clients(:one)
31
31
  end
32
32
 
33
33
  test "should get index" do
@@ -27,7 +27,7 @@ require 'test_helper'
27
27
  class PermissionsTest < ActiveSupport::TestCase
28
28
  setup do
29
29
  def login_as(role)
30
- Trust::Authorization.user = @user = User.find_or_create_by_name(role)
30
+ Trust::Authorization.user = @user = User.find_or_create_by(name: role)
31
31
  end
32
32
  end
33
33
  context 'Client' do
@@ -26,9 +26,13 @@
26
26
  ENV["RAILS_ENV"] = "test"
27
27
 
28
28
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
29
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
29
30
  require "rails/test_help"
31
+ require 'mocha/mini_test'
30
32
 
31
- Rails.backtrace_cleaner.remove_silencers!
33
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
34
+ # to be shown.
35
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
32
36
 
33
37
  # Load support files
34
38
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -40,6 +44,6 @@ end
40
44
 
41
45
  class ActionController::TestCase
42
46
  def login_as(role = :guest)
43
- User.current = @controller.send(:current_user=, User.find_or_create_by_name(role.to_s))
47
+ User.current = @controller.send(:current_user=, User.find_or_create_by(name: role.to_s))
44
48
  end
45
49
  end
@@ -28,4 +28,8 @@ class TrustTest < ActiveSupport::TestCase
28
28
  test "truth" do
29
29
  assert_kind_of Module, Trust
30
30
  end
31
+
32
+ should 'return the appropriate rails generation' do
33
+ assert 6 > Trust.rails_generation
34
+ end
31
35
  end
@@ -24,103 +24,197 @@
24
24
 
25
25
  require 'test_helper'
26
26
 
27
+ class TestBase < ActiveRecord::Base
28
+ end
29
+ class TestDescendant < TestBase
30
+ end
31
+ class TestParentLess < ActiveRecord::Base
32
+ end
33
+
34
+ class Permissions::TestBase < Trust::Permissions
35
+ end
36
+
27
37
  class Trust::AuthorizationTest < ActiveSupport::TestCase
28
- context 'user' do
29
- should 'be set in thread' do
30
- Trust::Authorization.user = 1
31
- assert_equal 1, Thread.current["current_user"]
32
- end
33
- should 'be retrieved from thread' do
34
- Thread.current["current_user"] = 2
35
- assert_equal 2, Trust::Authorization.user
38
+
39
+ class Resource < Trust::Controller::Resource
40
+ def initialize
36
41
  end
42
+ attr_accessor :params_handler
43
+ def parent; :parent; end
44
+ def instance; :instance; end
45
+ def klass; TestBase; end
37
46
  end
38
-
39
- context 'authorizing_class' do
40
- setup do
41
- class ::TestBase < ActiveRecord::Base
47
+
48
+ context 'class method' do
49
+ context 'access_denied!' do
50
+ should 'raise exception' do
51
+ auth = Trust::Authorization.new(:index, TestBase)
52
+ assert_raises Trust::AccessDenied do
53
+ auth.access_denied!
54
+ end
42
55
  end
43
- class ::TestDescendant < TestBase
56
+ end
57
+ context 'delegation' do
58
+ setup do
59
+ @obj = stub('authorization')
60
+ Trust::Authorization.expects(:new).with(:action, :object_or_class, [:hello]).returns(@obj)
44
61
  end
45
- def authorizing_class(klass)
46
- Trust::Authorization.send(:authorizing_class, klass)
62
+ should 'include authorized?' do
63
+ @obj.expects(:authorized?).returns(:good)
64
+ assert_equal :good, Trust::Authorization.authorized?(:action, :object_or_class, [:hello])
65
+ end
66
+ should 'include authorize!' do
67
+ @obj.expects(:authorize!).returns(:good)
68
+ assert_equal :good, Trust::Authorization.authorize!(:action, :object_or_class, [:hello])
47
69
  end
48
70
  end
49
- should 'return associated Authorization class if it exists' do
50
- class ::Permissions::TestBase < Trust::Permissions
71
+ context 'user' do
72
+ should 'be set in thread' do
73
+ Trust::Authorization.user = 1
74
+ assert_equal 1, Thread.current["current_user"]
75
+ end
76
+ should 'be retrieved from thread' do
77
+ Thread.current["current_user"] = 2
78
+ assert_equal 2, Trust::Authorization.user
51
79
  end
52
- assert_equal ::Permissions::TestBase, authorizing_class(::TestBase)
53
80
  end
54
- should 'return Authorization::Default if no assocated Authorization class' do
55
- assert_equal ::Permissions::Default, authorizing_class(::TestDescendant)
81
+ end
82
+
83
+ context 'initializtion' do
84
+ setup do
85
+ @parent = stub('parent')
86
+ @user = stub('user')
87
+ @resource = Resource.new
56
88
  end
57
- should 'return parent Authorization if specified and none exist for the class' do
58
- class ::Permissions::TestBase < Trust::Permissions
59
- end
60
- assert_equal ::Permissions::TestBase, authorizing_class(::TestDescendant)
89
+ should 'be done properly when no resource is given' do
90
+ @auth = Trust::Authorization.new('index', TestDescendant, parent: @parent, by: @user)
91
+ assert_equal :index, @auth.action
92
+ assert_equal TestDescendant, @auth.klass
93
+ assert_nil @auth.object
94
+ assert_equal @parent, @auth.parent
95
+ assert_equal @user, @auth.actor
61
96
  end
97
+ should 'be done properly when resource is given' do
98
+ Trust::Authorization.user = 1
99
+ @auth = Trust::Authorization.new('show', @resource, by: @user)
100
+ assert_equal :show, @auth.action
101
+ assert_equal TestBase, @auth.klass
102
+ assert_equal :instance, @auth.object
103
+ assert_equal :parent, @auth.parent
104
+ assert_equal @user, @auth.actor
105
+ @auth = Trust::Authorization.new('show', @resource)
106
+ assert_equal 1, @auth.actor
107
+ end
62
108
  end
63
109
 
64
- context 'authorize?' do
110
+ context 'behaviour' do
65
111
  setup do
66
- class Validator
112
+ @user = stub('user', role_symbols: [:admin])
113
+ @resource = Resource.new
114
+ @auth = Trust::Authorization.new('show', @resource, by: @user)
115
+ end
116
+ context 'authorize!' do
117
+ should 'set params_handler on resource' do
118
+ ph = {require: :klass, permit: [:name, :address]}
119
+ @auth.resource.expects(:params_handler=).with(ph)
120
+ @auth.expects(:permissions).returns(ph)
121
+ @auth.authorize!
67
122
  end
68
- class TestAuthorizing # overrides authorizing_class
69
- def initialize(user, action, klass, object, parent)
70
- Validator.values user, action, klass, object, parent
123
+ should 'raise exception unless authorized' do
124
+ @auth.expects(:permissions).returns(false)
125
+ assert_raises Trust::AccessDenied do
126
+ @auth.authorize!
71
127
  end
72
128
  end
73
- TestAuthorizing.any_instance.stubs(:authorized?).returns(true)
74
- Trust::Authorization.expects(:authorizing_class).with(String).returns(TestAuthorizing)
75
- end
76
- should 'instanciate authorizing class and set correct parameters for object' do
77
- Trust::Authorization.expects(:user).returns(:user)
78
- Validator.expects(:values).with(:user, :action, String, 'object_or_class', :parent)
79
- assert Trust::Authorization.authorized?('action', 'object_or_class', :parent)
80
129
  end
81
- should 'instanciate authorizing class and set correct parameters for class' do
82
- Trust::Authorization.expects(:user).returns(:user)
83
- Validator.expects(:values).with(:user, :action, String, nil, :parent)
84
- assert Trust::Authorization.authorized?('action', String, :parent)
130
+ context 'authorized?' do
131
+ should 'return the permissions as a boolean value' do
132
+ @auth.expects(:permissions).returns(false)
133
+ assert_equal false, @auth.authorized?
134
+ @auth.expects(:permissions).returns(nil)
135
+ assert_equal false, @auth.authorized?
136
+ @auth.expects(:permissions).returns({})
137
+ assert_equal true, @auth.authorized?
138
+ end
85
139
  end
86
- should 'allow actor to override user with actor' do
87
- Validator.expects(:values).with('TheActor', :action, String, nil, :parent)
88
- assert Trust::Authorization.authorized?('action', String, :parent, :by => 'TheActor')
89
- Trust::Authorization.expects(:authorizing_class).with(String).returns(TestAuthorizing)
90
- Validator.expects(:values).with('TheActor', :action, String, nil, nil)
91
- assert Trust::Authorization.authorized?('action', String, :by => 'TheActor')
140
+ context 'instance_loaded' do
141
+ should 'set instance on authorizing class' do
142
+ @auth.authorization.expects(:subject=).with(:cool)
143
+ @auth.instance_loaded :cool
144
+ end
92
145
  end
93
- should 'support option for :parent' do
94
- Trust::Authorization.expects(:user).returns(:user)
95
- Validator.expects(:values).with(:user, :action, String, nil, 'parent')
96
- assert Trust::Authorization.authorized?('action', String, :parent => 'parent')
146
+ context 'preload' do
147
+ should 'require resource to be accessible when instantiated' do
148
+ @auth.instance_variable_set :@resource, nil
149
+ assert_raises Trust::Authorization::ResourceNotLoaded do
150
+ @auth.preload
151
+ end
152
+ end
153
+ should 'delegate to permission if resource is set' do
154
+ @auth.authorization.expects(:preload).returns(:good)
155
+ @resource.expects(:params_handler=).with(:good)
156
+ @auth.preload
157
+ end
97
158
  end
98
- should 'support option alias for :parent, namely :for' do
99
- Trust::Authorization.expects(:user).returns(:user)
100
- Validator.expects(:values).with(:user, :action, String, nil, 'parent')
101
- assert Trust::Authorization.authorized?('action', String, :for => 'parent')
159
+ context 'permissions' do
160
+ should 'return the values from the authorizing class' do
161
+ @authorization = stub('authorizing_class')
162
+ @auth.instance_variable_set(:@authorization,@authorization)
163
+ @authorization.expects(:authorized?).returns(false)
164
+ assert !@auth.permissions
165
+ @authorization.expects(:authorized?).returns({})
166
+ assert ({}), @auth.permissions
167
+ end
102
168
  end
103
169
  end
104
-
105
- context 'authorize!' do
106
- should 'call access_denied! unless authorized?' do
107
- Trust::Authorization.expects(:access_denied!).once
108
- Trust::Authorization.expects(:authorized?).with(1, 2, 3, {}).returns(false)
109
- Trust::Authorization.authorize!(1,2,3)
110
- end
111
- should 'call access_denied! if authorized?' do
112
- Trust::Authorization.expects(:access_denied!).never
113
- Trust::Authorization.expects(:authorized?).with(1, 2, 3, {}).returns(true)
114
- Trust::Authorization.authorize!(1,2,3)
115
- end
116
- end
117
170
 
118
- context 'access_denied!' do
119
- should 'raise exception' do
120
- assert_raises Trust::AccessDenied do
121
- Trust::Authorization.access_denied!
171
+ context 'authorizing_class' do
172
+ setup do
173
+ def authorizing_class(klass)
174
+ Trust::Authorization.new(:index, klass).send(:authorizing_class)
122
175
  end
123
176
  end
177
+ should 'return associated Authorization class if it exists' do
178
+ assert_equal ::Permissions::TestBase, authorizing_class(::TestBase)
179
+ end
180
+ should 'return Authorization::Default if no assocated Authorization class' do
181
+ assert_equal ::Permissions::Default, authorizing_class(::TestParentLess)
182
+ end
183
+ should 'return parent Authorization if specified and none exist for the class' do
184
+ assert_equal ::Permissions::TestBase, authorizing_class(::TestDescendant)
185
+ end
186
+ should 'support customized base classes' do
187
+ class ::TheBaseClass
188
+ end
189
+ class ::TheBaseDescendant < ::TheBaseClass
190
+ end
191
+ class ::Permissions::TheBaseClass < Trust::Permissions
192
+ end
193
+ assert_equal ::Permissions::TheBaseClass, authorizing_class(::TheBaseDescendant)
194
+ end
124
195
  end
125
196
 
197
+
198
+
199
+ # context 'authorize!' do
200
+ # setup do
201
+ # @resource = Resource.new
202
+ # end
203
+ # should 'call access_denied! unless permissions given' do
204
+ # Trust::Authorization.expects(:access_denied!).twice
205
+ # Trust::Authorization.expects(:check_permissions).with(:index, :instance, :parent, {}).returns(false)
206
+ # Trust::Authorization.authorize!(:index, @resource)
207
+ # @resource.expects(:instance).returns nil
208
+ # Trust::Authorization.expects(:check_permissions).with(:index, :klass, :parent, {}).returns(false)
209
+ # Trust::Authorization.authorize!(:index, @resource)
210
+ # assert_equal false, @resource.params_handler
211
+ # end
212
+ # should 'call access_denied! if authorized?' do
213
+ # Trust::Authorization.expects(:access_denied!).never
214
+ # Trust::Authorization.expects(:check_permissions).with(:show, :instance, :parent, {}).returns({})
215
+ # Trust::Authorization.authorize!(:show, @resource)
216
+ # assert_equal ({}), @resource.params_handler
217
+ # end
218
+ # end
219
+
126
220
  end
@@ -97,6 +97,21 @@ class Trust::Controller::PropertiesTest < ActiveSupport::TestCase
97
97
  assert_equal [:show, :edit, :update, :destroy], @properties.member_actions
98
98
  assert_equal [:index], @properties.collection_actions
99
99
  end
100
+ should 'discover new_action?' do
101
+ assert @properties.new_action?( :new)
102
+ assert @properties.new_action?( 'new')
103
+ assert !@properties.new_action?( :show)
104
+ end
105
+ should 'discover collection_action?' do
106
+ assert @properties.collection_action?( :index)
107
+ assert @properties.collection_action?( 'index')
108
+ assert !@properties.collection_action?( :show)
109
+ end
110
+ should 'discover member_action?' do
111
+ assert @properties.member_action?( :show)
112
+ assert @properties.member_action?( 'show')
113
+ assert !@properties.member_action?( :index)
114
+ end
100
115
  end
101
116
 
102
117
  context 'belongs_to' do