resource_full 0.7.6

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 (35) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +100 -0
  3. data/Rakefile +19 -0
  4. data/lib/resource_full/base.rb +140 -0
  5. data/lib/resource_full/controllers/resources.rb +16 -0
  6. data/lib/resource_full/controllers/resources_controller.rb +26 -0
  7. data/lib/resource_full/controllers/routes_controller.rb +16 -0
  8. data/lib/resource_full/core_extensions/api.rb +26 -0
  9. data/lib/resource_full/core_extensions/exception.rb +25 -0
  10. data/lib/resource_full/core_extensions/from_json.rb +13 -0
  11. data/lib/resource_full/core_extensions/module.rb +13 -0
  12. data/lib/resource_full/dispatch.rb +196 -0
  13. data/lib/resource_full/models/resourced_route.rb +84 -0
  14. data/lib/resource_full/query.rb +337 -0
  15. data/lib/resource_full/render/html.rb +74 -0
  16. data/lib/resource_full/render/json.rb +107 -0
  17. data/lib/resource_full/render/xml.rb +106 -0
  18. data/lib/resource_full/render.rb +63 -0
  19. data/lib/resource_full/retrieve.rb +87 -0
  20. data/lib/resource_full/version.rb +9 -0
  21. data/lib/resource_full.rb +31 -0
  22. data/spec/resource_full/base_spec.rb +88 -0
  23. data/spec/resource_full/controllers/resources_spec.rb +30 -0
  24. data/spec/resource_full/dispatch_spec.rb +274 -0
  25. data/spec/resource_full/models/resourced_route_spec.rb +62 -0
  26. data/spec/resource_full/query/parameter_spec.rb +61 -0
  27. data/spec/resource_full/query_spec.rb +462 -0
  28. data/spec/resource_full/render/html_spec.rb +4 -0
  29. data/spec/resource_full/render/json_spec.rb +258 -0
  30. data/spec/resource_full/render/xml_spec.rb +378 -0
  31. data/spec/resource_full/render_spec.rb +5 -0
  32. data/spec/resource_full/retrieve_spec.rb +184 -0
  33. data/spec/spec.opts +4 -0
  34. data/spec/spec_helper.rb +134 -0
  35. metadata +156 -0
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ # TODO Most of this functionality is covered by more functional tests elsewhere,
4
+ # but it would be nice to have better unit-level coverage for specific breakages.
5
+ module ResourceFull
6
+ module Query
7
+ describe CustomParameter do
8
+ it "renders itself as XML" do
9
+ xml = CustomParameter.new(:name, ResourceFullMockUsersController,
10
+ :fuzzy => true,
11
+ :columns => [:full_name, :username, :email]
12
+ ).to_xml
13
+
14
+ Hash.from_xml(xml)["parameter"]["fuzzy"].should be_true
15
+ Hash.from_xml(xml)["parameter"]["name"].should == "name"
16
+ end
17
+
18
+ describe "inferring the correct table" do
19
+
20
+ it "simply uses the given table if one is specified" do
21
+ CustomParameter.new(:foo, ResourceFullMockUsersController, :table => "users").table.should == "users"
22
+ end
23
+
24
+ it "uses the table for the given resource if no :from option is specified" do
25
+ CustomParameter.new(:foo, ResourceFullMockUsersController).table.should == "resource_full_mock_users"
26
+ end
27
+
28
+ it "looks up the table name for the given association if it is direct" do
29
+ CustomParameter.new(:foo, ResourceFullMockUsersController, :from => :resource_full_mock_addresses).table.should == "resource_full_mock_addresses"
30
+ end
31
+
32
+ it "looks up the table name for the given assocation if it is specified in a hash" do
33
+ CustomParameter.new(:foo, ResourceFullMockAddressesController, :from => { :resource_full_mock_user => :resource_full_mock_employer }).table.should == "resource_full_mock_employers"
34
+ end
35
+ end
36
+
37
+ describe "subclass" do
38
+ before(:each) do
39
+ # HACKTAG: Fixing leaking of behavior from a different test
40
+ ResourceFullSubMocksController.instance_variable_set("@model_class", nil)
41
+ end
42
+
43
+ it "returns a copy of itself with its table unchanged if the subclass does not use a different table" do
44
+ parameter = ResourceFull::Query::CustomParameter.new(:name, ResourceFullMocksController)
45
+ parameter.subclass(ResourceFullSubMocksController).table.should == "mock"
46
+ end
47
+
48
+ it "returns a copy of itself with its table altered if the subclass uses a different table" do
49
+ ResourceFullSubMocksController.exposes :resource_full_mock_user
50
+ parameter = ResourceFull::Query::CustomParameter.new(:name, ResourceFullMocksController)
51
+ parameter.subclass(ResourceFullSubMocksController).table.should == "resource_full_mock_users"
52
+ end
53
+
54
+ it "returns a copy of itself with its table unchanged if it was originally built with a custom table" do
55
+ parameter = ResourceFull::Query::CustomParameter.new(:name, ResourceFullMocksController, :table => "widgets")
56
+ parameter.subclass(ResourceFullSubMocksController).table.should == "widgets"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,462 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "ResourceFull::Query", :type => :controller do
4
+ controller_name "resource_full_mock_users"
5
+
6
+ before :all do
7
+ ResourceFullMockUser.delete_all
8
+ @users = [
9
+ ResourceFullMockUser.create!(:resource_full_mock_employer_id => 1, :income => 70_000, :first_name => "guybrush"),
10
+ ResourceFullMockUser.create!(:resource_full_mock_employer_id => 1, :income => 30_000, :first_name => "toothbrush"),
11
+ ResourceFullMockUser.create!(:resource_full_mock_employer_id => 2, :income => 70_000, :first_name => "guthrie"),
12
+ ]
13
+ @guybrush, @toothbrush, @guthrie = @users
14
+ end
15
+ attr_reader :users
16
+
17
+ before :each do
18
+ ResourceFullMockUsersController.queryable_params = nil
19
+ end
20
+
21
+ it "isn't queryable on any parameters by default" do
22
+ controller.class.queryable_params.should be_empty
23
+ end
24
+
25
+ it "allows you to specify queryable parameters" do
26
+ controller.class.queryable_with :resource_full_mock_employer_id, :income
27
+ controller.class.queryable_params.collect(&:name).should include(:resource_full_mock_employer_id, :income)
28
+ end
29
+
30
+ it "retrieves objects based on a queried condition" do
31
+ controller.class.queryable_with :resource_full_mock_employer_id
32
+ get :index, :resource_full_mock_employer_id => 1
33
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
34
+ assigns(:resource_full_mock_users).should_not include(users[2])
35
+ end
36
+
37
+ it "retrieves no objects if the queried condition is not matched" do
38
+ controller.class.queryable_with :resource_full_mock_employer_id
39
+ get :index, :resource_full_mock_employer_id => 3
40
+ assigns(:resource_full_mock_users).should be_empty
41
+ end
42
+
43
+ it "queries on the intersection of multiple conditions" do
44
+ controller.class.queryable_with :resource_full_mock_employer_id, :income
45
+ get :index, :resource_full_mock_employer_id => 1, :income => 70_000
46
+ assigns(:resource_full_mock_users).should == [ users[0] ]
47
+ end
48
+
49
+ it "queries multiple values in a comma-separated list" do
50
+ controller.class.queryable_with :resource_full_mock_employer_id, :income
51
+ get :index, :resource_full_mock_employer_id => "1,2"
52
+ assigns(:resource_full_mock_users).should include(*users)
53
+ end
54
+
55
+ it "queries multiple values in standard request parameter list format" do
56
+ controller.class.queryable_with :resource_full_mock_employer_id, :income
57
+ get :index, :resource_full_mock_employer_id => [ '1', '2' ]
58
+ assigns(:resource_full_mock_users).should include(*users)
59
+ end
60
+
61
+ it "retrieves objects given pluralized forms of queryable parameters" do
62
+ controller.class.queryable_with :resource_full_mock_employer_id
63
+ get :index, :resource_full_mock_employer_ids => "1,2"
64
+ assigns(:resource_full_mock_users).should include(*users)
65
+ end
66
+
67
+ it "uses LIKE clauses to query if the fuzzy option is specified" do
68
+ controller.class.queryable_with :first_name, :fuzzy => true
69
+ get :index, :first_name => "gu"
70
+ assigns(:resource_full_mock_users).should include(users[0], users[2])
71
+ assigns(:resource_full_mock_users).should_not include(users[1])
72
+ end
73
+
74
+ it "allows a queryable parameter to map to a different column" do
75
+ controller.class.queryable_with :address, :column => :resource_full_mock_employer_id
76
+ get :index, :address => 1
77
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
78
+ assigns(:resource_full_mock_users).should_not include(users[2])
79
+ end
80
+
81
+ it "appends to rather than replaces queryable values" do
82
+ controller.class.queryable_with :resource_full_mock_employer_id
83
+ controller.class.queryable_with :income
84
+
85
+ get :index, :resource_full_mock_employer_id => 1, :income => 70_000
86
+ assigns(:resource_full_mock_users).should include(users[0])
87
+ assigns(:resource_full_mock_users).should_not include(users[1], users[2])
88
+ end
89
+
90
+ it "counts all objects if there are no parameters" do
91
+ controller.class.queryable_with :resource_full_mock_employer_id
92
+ get :count, :format => 'xml'
93
+ Hash.from_xml(response.body)['count'].to_i.should == 3
94
+ end
95
+
96
+ it "counts the requested objects if there are paramters" do
97
+ controller.class.queryable_with :resource_full_mock_employer_id
98
+ get :count, :resource_full_mock_employer_id => 1, :format => 'xml'
99
+ Hash.from_xml(response.body)['count'].to_i.should == 2
100
+ end
101
+
102
+ it "counts no objects if there are none with the requested parameters" do
103
+ controller.class.queryable_with :resource_full_mock_employer_id
104
+ get :count, :resource_full_mock_employer_id => 15, :format => 'xml'
105
+ Hash.from_xml(response.body)['count'].to_i.should == 0
106
+ end
107
+
108
+ it "negates a single queried value" do
109
+ ResourceFullMockUsersController.queryable_with :not_resource_full_mock_employer_id, :negated => true, :column => :resource_full_mock_employer_id
110
+
111
+ get :index, :not_resource_full_mock_employer_id => 2
112
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
113
+ assigns(:resource_full_mock_users).should_not include(users[2])
114
+ end
115
+
116
+ it "negates multiple queried values" do
117
+ ResourceFullMockUsersController.queryable_with :not_resource_full_mock_employer_id, :negated => true, :column => :resource_full_mock_employer_id
118
+
119
+ get :index, :not_resource_full_mock_employer_id => [1, 2]
120
+ assigns(:resource_full_mock_users).should be_empty
121
+ end
122
+
123
+ it "negates a fuzzy string value" do
124
+ ResourceFullMockUsersController.queryable_with :not_first_name, :negated => true, :column => :first_name, :fuzzy => true
125
+
126
+ get :index, :not_first_name => "brush"
127
+ assigns(:resource_full_mock_users).should include(@guthrie)
128
+ assigns(:resource_full_mock_users).should_not include(@guybrush, @toothbrush)
129
+ end
130
+
131
+ it "negates a queried value with a column defined by a proc" do
132
+ ResourceFullMockUsersController.queryable_with :not_resource_full_mock_employer_id, :negated => true, :column => lambda {|id| :resource_full_mock_employer_id}
133
+
134
+ get :index, :not_resource_full_mock_employer_id => 2
135
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
136
+ assigns(:resource_full_mock_users).should_not include(users[2])
137
+ end
138
+
139
+ it "negates a queried value and returns all records for which the value is null" do
140
+ ResourceFullMockUsersController.queryable_with :not_resource_full_mock_employer_id, :negated => true, :column => :resource_full_mock_employer_id
141
+ null_user = ResourceFullMockUser.create!
142
+
143
+ get :index, :not_resource_full_mock_employer_id => [1, 2]
144
+ assigns(:resource_full_mock_users).should == [ null_user ]
145
+ end
146
+
147
+ it "allows you to specify a default value, which it uses if there is no explicit value given for that parameter" do
148
+ ResourceFullMockUsersController.queryable_with :first_name, :default => "guybrush"
149
+
150
+ get :index
151
+ assigns(:resource_full_mock_users).should == [ @guybrush ]
152
+ end
153
+
154
+ it "allows you to override the default value if an explicit value is specified" do
155
+ ResourceFullMockUsersController.queryable_with :first_name, :default => "guybrush"
156
+
157
+ get :index, :first_name => "toothbrush"
158
+ assigns(:resource_full_mock_users).should == [ @toothbrush ]
159
+ end
160
+
161
+ describe "with multiple columns" do
162
+ controller_name "resource_full_mock_users"
163
+
164
+ before :all do
165
+ ResourceFullMockUser.delete_all
166
+ @users = [
167
+ ResourceFullMockUser.create!(:first_name => "guybrush", :last_name => "threepwood"),
168
+ ResourceFullMockUser.create!(:first_name => "herman", :last_name => "guybrush"),
169
+ ResourceFullMockUser.create!(:first_name => "ghost_pirate", :last_name => "le_chuck")
170
+ ]
171
+ end
172
+ attr_reader :users
173
+
174
+ before :each do
175
+ ResourceFullMockUsersController.queryable_params = nil
176
+ end
177
+
178
+ it "allows a queryable parameter to map to multiple columns" do
179
+ controller.class.queryable_with :name, :columns => [:first_name, :last_name]
180
+ get :index, :name => "guybrush"
181
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
182
+ assigns(:resource_full_mock_users).should_not include(users[2])
183
+ end
184
+
185
+ it "queries fuzzy values across multiple columns" do
186
+ controller.class.queryable_with :name, :columns => [:first_name, :last_name], :fuzzy => true
187
+ get :index, :name => "gu"
188
+ assigns(:resource_full_mock_users).should include(users[0], users[1])
189
+ assigns(:resource_full_mock_users).should_not include(users[2])
190
+ end
191
+ end
192
+
193
+ describe "with joins" do
194
+ controller_name "resource_full_mock_addresses"
195
+
196
+ before :each do
197
+ ResourceFullMockUser.delete_all
198
+ ResourceFullMockAddress.delete_all
199
+
200
+ @user = ResourceFullMockUser.create! :email => "gthreepwood@melee.gov"
201
+ @valid_addresses = [
202
+ @user.resource_full_mock_addresses.create!,
203
+ @user.resource_full_mock_addresses.create!
204
+ ]
205
+
206
+ invalid_user = ResourceFullMockUser.create! :email => "blah@blah.com"
207
+ @invalid_address = invalid_user.resource_full_mock_addresses.create!
208
+
209
+ ResourceFullMockUsersController.resource_identifier = :id
210
+ ResourceFullMockAddressesController.clear_queryable_params!
211
+ end
212
+ attr_reader :user, :valid_addresses, :invalid_address
213
+
214
+ it "filters addresses by the appropriate column and join if a :from relationship is defined" do
215
+ ResourceFullMockAddressesController.queryable_with :email, :from => :resource_full_mock_user
216
+
217
+ get :index, :resource_full_mock_user_id => 'foo', :email => user.email
218
+ assigns(:resource_full_mock_addresses).should include(*valid_addresses)
219
+ assigns(:resource_full_mock_addresses).should_not include(invalid_address)
220
+ end
221
+
222
+ it "filters addresses by the User resource identifier if a :from is specified along with :resource_identifier" do
223
+ ResourceFullMockUsersController.resource_identifier = :email
224
+ ResourceFullMockAddressesController.queryable_with :resource_full_mock_user_id, :from => :resource_full_mock_user, :resource_identifier => true
225
+
226
+ get :index, :resource_full_mock_user_id => user.email
227
+ assigns(:resource_full_mock_addresses).should include(*valid_addresses)
228
+ assigns(:resource_full_mock_addresses).should_not include(invalid_address)
229
+ end
230
+
231
+ it "filters addresses by the User resource identifier if a :from is specified along with :resource_identifier and the resource identifer is a Proc" do
232
+ ResourceFullMockUsersController.identified_by :email, :unless => :id_numeric
233
+ ResourceFullMockAddressesController.queryable_with :resource_full_mock_user_id, :from => :resource_full_mock_user, :resource_identifier => true
234
+
235
+ get :index, :resource_full_mock_user_id => user.id
236
+ assigns(:resource_full_mock_addresses).should include(*valid_addresses)
237
+ assigns(:resource_full_mock_addresses).should_not include(invalid_address)
238
+ end
239
+
240
+ it "filters addresses by the Employer resource by specifying a table name and ensuring that the intermediate User resource is included in the query" do
241
+ employer = ResourceFullMockEmployer.create! :name => "Melee Island Dept. of Piracy"
242
+ @user.update_attributes :resource_full_mock_employer => employer
243
+ ResourceFullMockEmployer.create! :name => "Kingdom of Phatt Island"
244
+
245
+ ResourceFullMockAddressesController.queryable_with :resource_full_mock_employer_name,
246
+ :from => { :resource_full_mock_user => :resource_full_mock_employer },
247
+ :table => 'resource_full_mock_employers',
248
+ :column => :name,
249
+ :fuzzy => true
250
+
251
+ get :index, :resource_full_mock_employer_name => "Melee"
252
+ assigns(:resource_full_mock_addresses).should include(*valid_addresses)
253
+ assigns(:resource_full_mock_addresses).should_not include(invalid_address)
254
+ end
255
+
256
+ # TODO This is perhaps not the best place for this test.
257
+ it "filters addresses by the User resource identifer if a controller is said to nest within another controller" do
258
+ ResourceFullMockUsersController.resource_identifier = :email
259
+ ResourceFullMockAddressesController.nests_within(:resource_full_mock_user)
260
+
261
+ get :index, :resource_full_mock_user_id => user.email
262
+ assigns(:resource_full_mock_addresses).should include(*valid_addresses)
263
+ assigns(:resource_full_mock_addresses).should_not include(invalid_address)
264
+ end
265
+ end
266
+
267
+ describe "with subclasses" do
268
+ controller_name "resource_full_sub_mocks"
269
+ before :each do
270
+ ResourceFullMocksController.queryable_params = nil
271
+ ResourceFullSubMocksController.queryable_params = nil
272
+ end
273
+
274
+ it "allows subclasses to add to the list of queryable parameters" do
275
+ ResourceFullMocksController.queryable_with :foo
276
+ ResourceFullSubMocksController.queryable_with :bar
277
+ ResourceFullSubMocksController.should be_queryable_with(:foo, :bar)
278
+ end
279
+
280
+ it "doesn't alter the queryable parameters of a superclass when a subclass" do
281
+ ResourceFullMocksController.queryable_with :foo
282
+ ResourceFullSubMocksController.queryable_with :bar
283
+ ResourceFullMocksController.should_not be_queryable_with(:bar)
284
+ end
285
+
286
+ it "uses the model and table name of the subclass rather than the superclass when querying" do
287
+ ResourceFullMocksController.queryable_with :first_name
288
+ ResourceFullSubMocksController.exposes :resource_full_mock_users
289
+ ResourceFullMockUser.create! :first_name => "guybrush"
290
+ ResourceFullMock.expects(:find).never
291
+ get :index, :format => 'xml', :first_name => 'guybrush'
292
+ response.body.should have_tag("resource-full-mock-user") { with_tag("first-name", "guybrush") }
293
+ end
294
+ end
295
+
296
+ describe "with named scope" do
297
+ controller_name "resource_full_mock_users"
298
+
299
+ it "filters parameter values using the given named scope method if no parameters are given" do
300
+ ResourceFullMockUsersController.queryable_with :born_today, :scope => :born_today
301
+ ResourceFullMockUser.named_scope :born_today, :conditions => { :birthdate => Date.today }
302
+
303
+ real_user = ResourceFullMockUser.create! :birthdate => Date.today
304
+ noise_user = ResourceFullMockUser.create! :birthdate => Date.yesterday
305
+
306
+ get :index, :format => 'xml', :born_today => true
307
+
308
+ assigns(:resource_full_mock_users).should == [ real_user ]
309
+ end
310
+
311
+ it "filters parameter values using the given named scope proc if no parameters are given" do
312
+ ResourceFullMockUsersController.queryable_with :born_today, :scope => lambda { {:conditions => { :birthdate => Date.today } } }
313
+
314
+ real_user = ResourceFullMockUser.create! :birthdate => Date.today
315
+ noise_user = ResourceFullMockUser.create! :birthdate => Date.yesterday
316
+
317
+ get :index, :format => 'xml', :born_today => true
318
+
319
+ assigns(:resource_full_mock_users).should == [ real_user ]
320
+ end
321
+
322
+ it "filters parameter values using the given named scope hash if no parameters are given" do
323
+ ResourceFullMockUsersController.queryable_with :born_today, :scope => { :conditions => { :birthdate => Date.today } }
324
+
325
+ real_user = ResourceFullMockUser.create! :birthdate => Date.today
326
+ noise_user = ResourceFullMockUser.create! :birthdate => Date.yesterday
327
+
328
+ get :index, :format => 'xml', :born_today => true
329
+
330
+ assigns(:resource_full_mock_users).should == [ real_user ]
331
+ end
332
+
333
+ it "filters parameter values using the given named scope method if a parameter is given" do
334
+ ResourceFullMockUser.named_scope :named, lambda { |name| { :conditions => { :first_name => name } } }
335
+ ResourceFullMockUsersController.queryable_with :named, :scope => :named
336
+
337
+ real_user = ResourceFullMockUser.create! :first_name => "Guybrush"
338
+ noise_user = ResourceFullMockUser.create! :first_name => "Toothbrush"
339
+
340
+ get :index, :format => 'xml', :named => "Guybrush"
341
+
342
+ assigns(:resource_full_mock_users).should == ResourceFullMockUser.named("Guybrush")
343
+ end
344
+
345
+ it "filters parameter values fuzzily using the given named scope method if a parameter is given and fuzzy is specified" do
346
+ ResourceFullMockUser.named_scope :named, lambda { |name| { :conditions => { :first_name => name } } }
347
+ ResourceFullMockUsersController.queryable_with :named, :scope => :named, :fuzzy => true
348
+
349
+ real_user = ResourceFullMockUser.create! :first_name => "Guybrush"
350
+ noise_user = ResourceFullMockUser.create! :first_name => "Toothbrush"
351
+
352
+ get :index, :format => 'xml', :named => "brush"
353
+
354
+ assigns(:resource_full_mock_users).should == ResourceFullMockUser.named("%brush%")
355
+ end
356
+
357
+ it "filters parameter values using multiple named scopes by chaining them together" do
358
+ ResourceFullMockUsersController.queryable_with :born_today, :scope => :born_today
359
+ ResourceFullMockUsersController.queryable_with :named_guybrush, :scope => :named_guybrush
360
+
361
+ ResourceFullMockUser.named_scope :born_today, :conditions => { :birthdate => Date.today }
362
+ ResourceFullMockUser.named_scope :named_guybrush, :conditions => { :first_name => "Guybrush" }
363
+
364
+ real_user = ResourceFullMockUser.create! :birthdate => Date.today, :first_name => "Guybrush"
365
+ yesterday_user = ResourceFullMockUser.create! :birthdate => Date.yesterday, :first_name => "Guybrush"
366
+ toothbrush_user = ResourceFullMockUser.create! :birthdate => Date.today, :first_name => "Toothbrush"
367
+
368
+ get :index, :format => 'xml', :born_today => true, :named_guybrush => true
369
+
370
+ assigns(:resource_full_mock_users).should == ResourceFullMockUser.born_today.named_guybrush
371
+ end
372
+
373
+ # I know this works experimentally but have yet to write the test.
374
+ it "combines named scope filters with standard queryable_with parameter filters"
375
+ end
376
+
377
+ describe "with nils" do
378
+ controller_name "resource_full_mock_users"
379
+
380
+ before :each do
381
+ ResourceFullMockUser.delete_all
382
+ end
383
+
384
+ it "finds records when an allow_nil queryable parameter is blank" do
385
+ ResourceFullMockUsersController.queryable_with :resource_full_mock_employer_id, :allow_nil => true
386
+ real_user = ResourceFullMockUser.create! :first_name => "brian", :resource_full_mock_employer_id => nil
387
+ noise_user = ResourceFullMockUser.create! :first_name => "brian", :resource_full_mock_employer_id => 13
388
+
389
+ get :index, :resource_full_mock_employer_id => nil
390
+ assigns(:resource_full_mock_users).should == [ real_user ]
391
+ end
392
+
393
+ it "finds records when an allow_nil queryable parameter contains a value" do
394
+ ResourceFullMockUsersController.queryable_with :resource_full_mock_employer_id, :allow_nil => true
395
+ real_user = ResourceFullMockUser.create! :first_name => "brian", :resource_full_mock_employer_id => 13
396
+ nil_user = ResourceFullMockUser.create! :first_name => "brian", :resource_full_mock_employer_id => nil
397
+ wrong_user = ResourceFullMockUser.create! :first_name => "brian", :resource_full_mock_employer_id => 16
398
+
399
+ get :index, :resource_full_mock_employer_id => 13
400
+ assigns(:resource_full_mock_users).should == [ real_user ]
401
+ end
402
+ end
403
+
404
+ describe "with sorting" do
405
+ controller_name "resource_full_mock_users"
406
+
407
+ before :each do
408
+ ResourceFullMockUsersController.queryable_with_order
409
+ ResourceFullMockUser.delete_all
410
+
411
+ initech = ResourceFullMockEmployer.create! :name => "Initech", :email => "whatsbestforthecompany@initech.com"
412
+ tworks = ResourceFullMockEmployer.create! :name => "ThoughtWorks", :email => "info@thoughtworks.com"
413
+
414
+ eve = ResourceFullMockUser.create! :first_name => "Eve", :resource_full_mock_employer => initech, :email => "eve@initech.com"
415
+ alice = ResourceFullMockUser.create! :first_name => "Alice", :resource_full_mock_employer => initech, :email => "alice@initech.com"
416
+ bob = ResourceFullMockUser.create! :first_name => "Bob", :resource_full_mock_employer => tworks, :email => "bob@thoughtworks.com"
417
+
418
+ @ordered_list = [ alice, bob, eve ]
419
+ @company_ordered_list = [ bob, eve, alice ]
420
+ end
421
+
422
+ it "should be sortable by the given parameter, in ascending order by default" do
423
+ get :index, :order_by => "first_name"
424
+ assigns(:resource_full_mock_users).should == @ordered_list
425
+ end
426
+
427
+ it "should be sortable by the given parameter in descending order" do
428
+ get :index, :order_by => "first_name", :order_direction => "desc"
429
+ assigns(:resource_full_mock_users).should == @ordered_list.reverse
430
+ end
431
+
432
+ it "should not blow up if no order by key is given" do
433
+ lambda do
434
+ get :index
435
+ end.should_not raise_error(ActiveRecord::StatementInvalid)
436
+ end
437
+
438
+ it "should sort the column with the same table as the resource if no explicit table name is given" do
439
+ ResourceFullMockUsersController.queryable_with :foo, :scope => { :include => :resource_full_mock_employer }, :default => true
440
+ lambda do
441
+ get :index, :order_by => "email"
442
+ end.should_not raise_error(ActiveRecord::StatementInvalid)
443
+ assigns(:resource_full_mock_users).should == @ordered_list
444
+ end
445
+
446
+ it "should sort the column with the table name corresponding to the given table name" do
447
+ ResourceFullMockUsersController.queryable_with :foo, :scope => { :include => :resource_full_mock_employer }, :default => true
448
+ ResourceFullMockUsersController.orderable_by :email, :from => :resource_full_mock_employer
449
+
450
+ get :index, :order_by => "email"
451
+ assigns(:resource_full_mock_users).first.email.should == "bob@thoughtworks.com"
452
+ end
453
+
454
+ it "should be sortable by the given parameter using the given column" do
455
+ ResourceFullMockUsersController.orderable_by :employer_email, :from => :resource_full_mock_employer, :column => 'email'
456
+
457
+ get :index, :order_by => "employer_email"
458
+ assigns(:resource_full_mock_users).first.email.should == "bob@thoughtworks.com"
459
+ end
460
+ end
461
+
462
+ end
@@ -0,0 +1,4 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "ResourceFull::Render::HTML", :type => :controller do
4
+ end