api_resource 0.4.3 → 0.5.0
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/VERSION +1 -1
- data/api_resource.gemspec +4 -74
- data/coverage/assets/0.5.3/app.js +88 -0
- data/coverage/assets/0.5.3/fancybox/blank.gif +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_close.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_loading.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_nav_left.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_nav_right.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_left.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_main.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_over.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancy_title_right.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox-x.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox-y.png +0 -0
- data/coverage/assets/0.5.3/fancybox/fancybox.png +0 -0
- data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/coverage/assets/0.5.3/favicon_green.png +0 -0
- data/coverage/assets/0.5.3/favicon_red.png +0 -0
- data/coverage/assets/0.5.3/favicon_yellow.png +0 -0
- data/coverage/assets/0.5.3/highlight.css +129 -0
- data/coverage/assets/0.5.3/highlight.pack.js +1 -0
- data/coverage/assets/0.5.3/jquery-1.6.2.min.js +18 -0
- data/coverage/assets/0.5.3/jquery.dataTables.min.js +152 -0
- data/coverage/assets/0.5.3/jquery.timeago.js +141 -0
- data/coverage/assets/0.5.3/jquery.url.js +174 -0
- data/coverage/assets/0.5.3/loading.gif +0 -0
- data/coverage/assets/0.5.3/magnify.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/coverage/assets/0.5.3/stylesheet.css +383 -0
- data/coverage/index.html +3573 -0
- data/lib/api_resource/associations/abstract_scope.rb +191 -0
- data/lib/api_resource/associations/association_scope.rb +47 -0
- data/lib/api_resource/associations/belongs_to_remote_object_proxy.rb +5 -6
- data/lib/api_resource/associations/has_many_remote_object_proxy.rb +5 -8
- data/lib/api_resource/associations/has_one_remote_object_proxy.rb +12 -13
- data/lib/api_resource/associations/multi_object_proxy.rb +65 -39
- data/lib/api_resource/associations/resource_scope.rb +6 -17
- data/lib/api_resource/associations/scope.rb +23 -121
- data/lib/api_resource/associations/single_object_proxy.rb +41 -50
- data/lib/api_resource/associations.rb +32 -11
- data/lib/api_resource/attributes.rb +108 -69
- data/lib/api_resource/base.rb +114 -106
- data/lib/api_resource/local.rb +1 -1
- data/lib/api_resource/model_errors.rb +9 -6
- data/lib/api_resource/scopes.rb +53 -16
- data/lib/api_resource.rb +3 -1
- data/spec/lib/api_resource_spec.rb +3 -7
- data/spec/lib/associations/association_scope_spec.rb +19 -0
- data/spec/lib/associations_spec.rb +251 -162
- data/spec/lib/attributes_spec.rb +33 -15
- data/spec/lib/base_spec.rb +302 -64
- data/spec/lib/callbacks_spec.rb +4 -2
- data/spec/lib/local_spec.rb +5 -1
- data/spec/spec_helper.rb +2 -3
- data/spec/support/mocks/association_mocks.rb +9 -1
- data/spec/support/requests/association_requests.rb +5 -5
- data/spec/support/requests/test_resource_requests.rb +16 -4
- data/spec/tmp/api_resource_test_db.sqlite +0 -0
- metadata +68 -22
- data/.document +0 -5
- data/.rspec +0 -5
- data/.travis.yml +0 -4
- data/lib/api_resource/associations/association_proxy.rb +0 -121
- data/lib/api_resource/associations/dynamic_resource_scope.rb +0 -23
- data/lib/api_resource/associations/generic_scope.rb +0 -68
- data/lib/api_resource/associations/multi_argument_resource_scope.rb +0 -15
- data/lib/api_resource/associations/relation_scope.rb +0 -25
data/spec/lib/base_spec.rb
CHANGED
|
@@ -5,12 +5,112 @@ include ApiResource
|
|
|
5
5
|
|
|
6
6
|
describe "Base" do
|
|
7
7
|
|
|
8
|
+
before(:all) do
|
|
9
|
+
TestResource.reload_resource_definition
|
|
10
|
+
end
|
|
11
|
+
|
|
8
12
|
after(:all) do
|
|
9
|
-
TestResource.
|
|
13
|
+
TestResource.reload_resource_definition
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context ".new_element_path" do
|
|
17
|
+
|
|
18
|
+
before(:all) do
|
|
19
|
+
|
|
20
|
+
PrefixResource = Class.new(ApiResource::Base) do
|
|
21
|
+
self.prefix = "/path/to/project"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
DynamicPrefixResource = Class.new(ApiResource::Base) do
|
|
25
|
+
self.prefix = "/path/to/nested/:id/"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
it "should return a full path if there are no nested ids" do
|
|
32
|
+
PrefixResource.new_element_path.should eql(
|
|
33
|
+
"/path/to/project/prefix_resources/new.json"
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return a non-nested path if there are nested ids" do
|
|
38
|
+
DynamicPrefixResource.new_element_path.should eql(
|
|
39
|
+
"/dynamic_prefix_resources/new.json"
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
10
43
|
end
|
|
44
|
+
|
|
45
|
+
context "Comparison" do
|
|
46
|
+
|
|
47
|
+
context "&group_by" do
|
|
48
|
+
|
|
49
|
+
it "should allow grouping by resources with the same id" do
|
|
50
|
+
|
|
51
|
+
test_resource_1 = TestResource.new
|
|
52
|
+
test_resource_1.stubs(:id => 1)
|
|
53
|
+
|
|
54
|
+
test_resource_2 = TestResource.new
|
|
55
|
+
test_resource_2.stubs(:id => 1)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
ParentResource = Struct.new(:resource, :name)
|
|
59
|
+
|
|
60
|
+
data = [
|
|
61
|
+
ParentResource.new(test_resource_1, "Dan"),
|
|
62
|
+
ParentResource.new(test_resource_2, "Brian")
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
data.group_by(&:resource).keys.length.should be 1
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
11
73
|
|
|
12
74
|
describe "Loading data from a hash" do
|
|
13
75
|
|
|
76
|
+
|
|
77
|
+
context ".instantiate_record" do
|
|
78
|
+
|
|
79
|
+
it "should set boolean values" do
|
|
80
|
+
|
|
81
|
+
tr = TestResource.instantiate_record(:is_active => true)
|
|
82
|
+
tr.is_active.should eql(true)
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should set boolean values" do
|
|
87
|
+
|
|
88
|
+
tr = TestResource.instantiate_record(:is_active => false)
|
|
89
|
+
tr.is_active.should eql(false)
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context ".instantiate_collection" do
|
|
96
|
+
|
|
97
|
+
it "should set boolean values" do
|
|
98
|
+
|
|
99
|
+
data = [
|
|
100
|
+
{"id"=>96229, "name"=>"Mathew", "age"=>31544, "is_active"=>true},
|
|
101
|
+
{"id"=>82117, "name"=>"Rick", "age"=>14333, "is_active"=>true},
|
|
102
|
+
{"id"=>92922, "name"=>"Jimmie", "age"=>89153, "is_active"=>true},
|
|
103
|
+
{"id"=>67548, "name"=>"Forest", "age"=>35062, "is_active"=>true},
|
|
104
|
+
{"id"=>6993, "name"=>"Georgette", "age"=>84223, "is_active"=>true}
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
tr = TestResource.instantiate_collection(data)
|
|
108
|
+
tr.first.is_active.should eql(true)
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
|
|
14
114
|
context "Associations" do
|
|
15
115
|
before(:all) do
|
|
16
116
|
TestResource.has_many :has_many_objects
|
|
@@ -39,9 +139,14 @@ describe "Base" do
|
|
|
39
139
|
end
|
|
40
140
|
|
|
41
141
|
it "should properly load the data from the provided array or hash" do
|
|
42
|
-
tst = TestResource.new({
|
|
142
|
+
tst = TestResource.new({
|
|
143
|
+
:has_many_objects => [{:service_uri => '/path'}]
|
|
144
|
+
})
|
|
43
145
|
tst.has_many_objects.remote_path.should eql('/path')
|
|
44
|
-
|
|
146
|
+
|
|
147
|
+
tst = TestResource.new({
|
|
148
|
+
:has_many_objects => {:service_uri => '/path'}
|
|
149
|
+
})
|
|
45
150
|
tst.has_many_objects.remote_path.should eql('/path')
|
|
46
151
|
end
|
|
47
152
|
|
|
@@ -55,7 +160,8 @@ describe "Base" do
|
|
|
55
160
|
tst.has_one_object.should be_a(Associations::SingleObjectProxy)
|
|
56
161
|
end
|
|
57
162
|
|
|
58
|
-
it "should throw an error if a belongs_to or
|
|
163
|
+
it "should throw an error if a belongs_to or
|
|
164
|
+
has_many association is not a hash or nil" do
|
|
59
165
|
lambda {
|
|
60
166
|
TestResource.new(:belongs_to_object => [])
|
|
61
167
|
}.should raise_error
|
|
@@ -65,7 +171,11 @@ describe "Base" do
|
|
|
65
171
|
end
|
|
66
172
|
|
|
67
173
|
it "should properly load data from the provided hash" do
|
|
68
|
-
tst = TestResource.new(
|
|
174
|
+
tst = TestResource.new(
|
|
175
|
+
:has_one_object => {
|
|
176
|
+
:service_uri => "/path"
|
|
177
|
+
}
|
|
178
|
+
)
|
|
69
179
|
tst.has_one_object.remote_path.should eql('/path')
|
|
70
180
|
end
|
|
71
181
|
|
|
@@ -128,7 +238,7 @@ describe "Base" do
|
|
|
128
238
|
describe "Serialization" do
|
|
129
239
|
|
|
130
240
|
before(:all) do
|
|
131
|
-
TestResource.
|
|
241
|
+
TestResource.reload_resource_definition
|
|
132
242
|
TestResource.has_many :has_many_objects
|
|
133
243
|
TestResource.define_attributes :attr1, :attr2
|
|
134
244
|
TestResource.include_root_in_json = true
|
|
@@ -155,15 +265,28 @@ describe "Base" do
|
|
|
155
265
|
hash["test_resource"].should_not be_nil
|
|
156
266
|
end
|
|
157
267
|
|
|
158
|
-
it "should not include associations by default if
|
|
159
|
-
|
|
268
|
+
it "should not include associations by default if
|
|
269
|
+
they have not changed" do
|
|
270
|
+
tst = TestResource.new({
|
|
271
|
+
:attr1 => "attr1",
|
|
272
|
+
:attr2 => "attr2",
|
|
273
|
+
:has_many_objects => []
|
|
274
|
+
})
|
|
160
275
|
hash = JSON.parse(tst.to_json)
|
|
161
276
|
hash["has_many_objects"].should be_nil
|
|
162
277
|
end
|
|
163
278
|
|
|
164
279
|
it "should include associations passed given in the include_associations array" do
|
|
165
|
-
tst = TestResource.new({
|
|
166
|
-
|
|
280
|
+
tst = TestResource.new({
|
|
281
|
+
:attr1 => "attr1",
|
|
282
|
+
:attr2 => "attr2",
|
|
283
|
+
:has_many_objects => []
|
|
284
|
+
})
|
|
285
|
+
hash = JSON.parse(
|
|
286
|
+
tst.to_json(
|
|
287
|
+
:include_associations => [:has_many_objects]
|
|
288
|
+
)
|
|
289
|
+
)
|
|
167
290
|
hash["has_many_objects"].should_not be_nil
|
|
168
291
|
end
|
|
169
292
|
|
|
@@ -174,8 +297,19 @@ describe "Base" do
|
|
|
174
297
|
hash["has_many_objects"].should_not be_nil
|
|
175
298
|
end
|
|
176
299
|
|
|
177
|
-
it "should not include unknown attributes unless they
|
|
178
|
-
|
|
300
|
+
it "should not include unknown attributes unless they
|
|
301
|
+
are passed in via the include_extras array" do
|
|
302
|
+
|
|
303
|
+
TestResource.class_eval do
|
|
304
|
+
define_protected_attributes(:attr3)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
tst = TestResource.instantiate_record({
|
|
308
|
+
:attr1 => "attr1",
|
|
309
|
+
:attr2 => "attr2",
|
|
310
|
+
:attr3 => "attr3"
|
|
311
|
+
})
|
|
312
|
+
|
|
179
313
|
hash = JSON.parse(tst.to_json)
|
|
180
314
|
hash["attr3"].should be_nil
|
|
181
315
|
hash = JSON.parse(tst.to_json(:include_extras => [:attr3]))
|
|
@@ -183,7 +317,11 @@ describe "Base" do
|
|
|
183
317
|
end
|
|
184
318
|
|
|
185
319
|
it "should ignore fields set under the except option" do
|
|
186
|
-
tst = TestResource.
|
|
320
|
+
tst = TestResource.instantiate_record({
|
|
321
|
+
:attr1 => "attr1",
|
|
322
|
+
:attr2 => "attr2",
|
|
323
|
+
:attr3 => "attr3"
|
|
324
|
+
})
|
|
187
325
|
hash = JSON.parse(tst.to_json(:except => [:attr1]))
|
|
188
326
|
hash["attr1"].should be_nil
|
|
189
327
|
end
|
|
@@ -193,16 +331,32 @@ describe "Base" do
|
|
|
193
331
|
TestResource.has_many(:has_many_objects)
|
|
194
332
|
end
|
|
195
333
|
after(:all) do
|
|
196
|
-
TestResource.
|
|
334
|
+
TestResource.reload_resource_definition
|
|
197
335
|
end
|
|
198
336
|
|
|
199
337
|
it "should include the id of nested objects in the serialization" do
|
|
200
|
-
tst = TestResource.new({
|
|
201
|
-
|
|
202
|
-
|
|
338
|
+
tst = TestResource.new({
|
|
339
|
+
:attr1 => "attr1",
|
|
340
|
+
:attr2 => "attr2",
|
|
341
|
+
:has_many_objects => [
|
|
342
|
+
{:name => "123", :id => "1"}
|
|
343
|
+
]
|
|
344
|
+
})
|
|
345
|
+
tst.has_many_objects.first.id
|
|
346
|
+
hash = JSON.parse(
|
|
347
|
+
tst.to_json(:include_associations => [:has_many_objects])
|
|
348
|
+
)
|
|
349
|
+
hash["has_many_objects"].first["id"].should_not be_nil
|
|
203
350
|
end
|
|
351
|
+
|
|
204
352
|
it "should include the id of nested objects in the serialization" do
|
|
205
|
-
tst = TestResource.new({
|
|
353
|
+
tst = TestResource.new({
|
|
354
|
+
:attr1 => "attr1",
|
|
355
|
+
:attr2 => "attr2",
|
|
356
|
+
:has_many_objects => [
|
|
357
|
+
{:name => "123"}
|
|
358
|
+
]
|
|
359
|
+
})
|
|
206
360
|
hash = JSON.parse(tst.to_json(:include_associations => [:has_many_objects]))
|
|
207
361
|
hash["has_many_objects"].first.keys.should_not include "id"
|
|
208
362
|
end
|
|
@@ -218,7 +372,9 @@ describe "Base" do
|
|
|
218
372
|
end
|
|
219
373
|
|
|
220
374
|
it "should properly serialize associations if they are included" do
|
|
221
|
-
tst = TestResource.new({
|
|
375
|
+
tst = TestResource.new({
|
|
376
|
+
:has_many_objects => []
|
|
377
|
+
})
|
|
222
378
|
hash = Hash.from_xml(tst.to_xml(:include_associations => [:has_many_objects]))
|
|
223
379
|
hash["test_resource"]["has_many_objects"].should eql([])
|
|
224
380
|
end
|
|
@@ -229,7 +385,7 @@ describe "Base" do
|
|
|
229
385
|
describe "Finding Data" do
|
|
230
386
|
|
|
231
387
|
before(:all) do
|
|
232
|
-
TestResource.
|
|
388
|
+
TestResource.reload_resource_definition
|
|
233
389
|
end
|
|
234
390
|
|
|
235
391
|
it "should be able to find all" do
|
|
@@ -262,7 +418,7 @@ describe "Base" do
|
|
|
262
418
|
|
|
263
419
|
before(:all) do
|
|
264
420
|
TestResource.include_root_in_json = true
|
|
265
|
-
TestResource.
|
|
421
|
+
TestResource.reload_resource_definition
|
|
266
422
|
end
|
|
267
423
|
|
|
268
424
|
context "Creating new records" do
|
|
@@ -271,11 +427,6 @@ describe "Base" do
|
|
|
271
427
|
TestResource.has_many :has_many_objects
|
|
272
428
|
end
|
|
273
429
|
|
|
274
|
-
it "should be able to post new data via the create method" do
|
|
275
|
-
tr = TestResource.create({:name => "Ethan", :age => 20})
|
|
276
|
-
tr.id.should_not be_blank
|
|
277
|
-
end
|
|
278
|
-
|
|
279
430
|
it "should be able to post new data via the save method" do
|
|
280
431
|
tr = TestResource.build({:name => "Ethan", :age => 20})
|
|
281
432
|
tr.save.should be_true
|
|
@@ -367,7 +518,7 @@ describe "Base" do
|
|
|
367
518
|
|
|
368
519
|
context "Updating old records" do
|
|
369
520
|
before(:all) do
|
|
370
|
-
TestResource.
|
|
521
|
+
TestResource.reload_resource_definition
|
|
371
522
|
TestResource.has_many :has_many_objects
|
|
372
523
|
RestClient::Payload.stubs(:has_file? => false)
|
|
373
524
|
end
|
|
@@ -380,11 +531,17 @@ describe "Base" do
|
|
|
380
531
|
|
|
381
532
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
382
533
|
"/test_resources/1.json",
|
|
383
|
-
|
|
534
|
+
JSON.unparse({
|
|
535
|
+
:test_resource => {
|
|
536
|
+
:name => "Ethan",
|
|
537
|
+
:age => 6
|
|
538
|
+
}
|
|
539
|
+
}),
|
|
384
540
|
TestResource.headers
|
|
385
541
|
)
|
|
386
542
|
|
|
387
|
-
tr = TestResource.new(:
|
|
543
|
+
tr = TestResource.new(:name => "Ethan")
|
|
544
|
+
tr.stubs(:id => 1)
|
|
388
545
|
tr.should_not be_new
|
|
389
546
|
|
|
390
547
|
# Thus we know we are calling update
|
|
@@ -396,11 +553,18 @@ describe "Base" do
|
|
|
396
553
|
it "should include changed associations without specification" do
|
|
397
554
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
398
555
|
"/test_resources/1.json",
|
|
399
|
-
|
|
556
|
+
JSON.unparse({
|
|
557
|
+
:test_resource => {
|
|
558
|
+
:name => "Ethan",
|
|
559
|
+
:has_many_objects => [{}]
|
|
560
|
+
}
|
|
561
|
+
}),
|
|
400
562
|
TestResource.headers
|
|
401
563
|
)
|
|
402
564
|
|
|
403
|
-
tr = TestResource.new(:
|
|
565
|
+
tr = TestResource.new(:name => "Ethan")
|
|
566
|
+
tr.stubs(:id => 1)
|
|
567
|
+
|
|
404
568
|
tr.has_many_objects = [HasManyObject.new]
|
|
405
569
|
tr.save
|
|
406
570
|
end
|
|
@@ -409,11 +573,17 @@ describe "Base" do
|
|
|
409
573
|
it "should include unchanged associations if they are specified" do
|
|
410
574
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
411
575
|
"/test_resources/1.json",
|
|
412
|
-
|
|
576
|
+
JSON.unparse({
|
|
577
|
+
:test_resource => {
|
|
578
|
+
:name => "Ethan",
|
|
579
|
+
:has_many_objects => []
|
|
580
|
+
}
|
|
581
|
+
}),
|
|
413
582
|
TestResource.headers
|
|
414
583
|
)
|
|
415
584
|
|
|
416
|
-
tr = TestResource.new(:
|
|
585
|
+
tr = TestResource.new(:name => "Ethan")
|
|
586
|
+
tr.stubs(:id => 1)
|
|
417
587
|
tr.save(:has_many_objects)
|
|
418
588
|
end
|
|
419
589
|
|
|
@@ -425,18 +595,32 @@ describe "Base" do
|
|
|
425
595
|
|
|
426
596
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
427
597
|
"/test_resources/1.json",
|
|
428
|
-
|
|
598
|
+
JSON.unparse({
|
|
599
|
+
:test_resource => {
|
|
600
|
+
:name => "Ethan",
|
|
601
|
+
:has_one_object => {
|
|
602
|
+
:size => "large"
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}),
|
|
429
606
|
TestResource.headers
|
|
430
607
|
).in_sequence(correct_order)
|
|
431
608
|
|
|
432
|
-
tr = TestResource.new(:
|
|
609
|
+
tr = TestResource.new(:name => "Ethan")
|
|
610
|
+
tr.stubs(:id => 1)
|
|
433
611
|
tr.has_one_object = HasOneObject.new(:size => "large", :color => nil)
|
|
434
612
|
tr.save(:include_associations => [:has_one_object])
|
|
435
613
|
|
|
436
614
|
|
|
437
615
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
438
616
|
"/test_resources/1.json",
|
|
439
|
-
|
|
617
|
+
JSON.unparse({
|
|
618
|
+
:test_resource => {
|
|
619
|
+
:has_one_object => {
|
|
620
|
+
:size => nil
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}),
|
|
440
624
|
TestResource.headers
|
|
441
625
|
).in_sequence(correct_order)
|
|
442
626
|
|
|
@@ -452,11 +636,19 @@ describe "Base" do
|
|
|
452
636
|
|
|
453
637
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
454
638
|
"/test_resources/1.json",
|
|
455
|
-
|
|
639
|
+
JSON.unparse({
|
|
640
|
+
:test_resource => {
|
|
641
|
+
:name => "Ethan",
|
|
642
|
+
:has_one_object => {
|
|
643
|
+
:size => "large"
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
}),
|
|
456
647
|
TestResource.headers
|
|
457
648
|
).in_sequence(correct_order)
|
|
458
649
|
|
|
459
|
-
tr = TestResource.new(:
|
|
650
|
+
tr = TestResource.new(:name => "Ethan")
|
|
651
|
+
tr.stubs(:id => 1)
|
|
460
652
|
tr.has_one_object = HasOneObject.new(:size => "large", :color => nil)
|
|
461
653
|
tr.save(:include_associations => [:has_one_object])
|
|
462
654
|
|
|
@@ -473,26 +665,41 @@ describe "Base" do
|
|
|
473
665
|
|
|
474
666
|
|
|
475
667
|
it "should include all attributes if include_all_attributes_on_update is true" do
|
|
668
|
+
|
|
476
669
|
ApiResource::Connection.any_instance.expects(:put).with(
|
|
477
670
|
"/test_resources/1.json",
|
|
478
671
|
"{\"test_resource\":{\"name\":\"Ethan\",\"age\":null,\"is_active\":null,\"bday\":null,\"roles\":[]}}",
|
|
479
672
|
TestResource.headers
|
|
480
673
|
)
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
674
|
+
begin
|
|
675
|
+
TestResource.include_all_attributes_on_update = true
|
|
676
|
+
tr = TestResource.new(:name => "Ethan")
|
|
677
|
+
tr.stubs(:id => 1)
|
|
678
|
+
tr.save
|
|
679
|
+
ensure
|
|
680
|
+
TestResource.include_all_attributes_on_update = false
|
|
681
|
+
end
|
|
486
682
|
end
|
|
487
683
|
|
|
488
684
|
it "should provide an update_attributes method to set attrs and save" do
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
)
|
|
685
|
+
|
|
686
|
+
correct_order = sequence("ordering")
|
|
687
|
+
|
|
688
|
+
# initial save
|
|
689
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
690
|
+
.in_sequence(correct_order)
|
|
691
|
+
|
|
692
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
693
|
+
.with(
|
|
694
|
+
"/test_resources/1.json",
|
|
695
|
+
{:test_resource => {:name => "Dan"}}.to_json,
|
|
696
|
+
TestResource.headers
|
|
697
|
+
).in_sequence(correct_order)
|
|
698
|
+
|
|
699
|
+
tr = TestResource.new(:name => "Ethan")
|
|
700
|
+
tr.stubs(:id => 1)
|
|
701
|
+
tr.save
|
|
494
702
|
|
|
495
|
-
tr = TestResource.new(:id => 1, :name => "Ethan")
|
|
496
703
|
tr.update_attributes(:name => "Dan")
|
|
497
704
|
end
|
|
498
705
|
|
|
@@ -500,28 +707,50 @@ describe "Base" do
|
|
|
500
707
|
it "should include nil attributes when updating if they have
|
|
501
708
|
changed by default" do
|
|
502
709
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
710
|
+
correct_order = sequence("ordering")
|
|
711
|
+
|
|
712
|
+
# initial save
|
|
713
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
714
|
+
.in_sequence(correct_order)
|
|
715
|
+
|
|
716
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
717
|
+
.with(
|
|
718
|
+
"/test_resources/1.json",
|
|
719
|
+
{:test_resource => {:is_active => nil}}.to_json,
|
|
720
|
+
TestResource.headers
|
|
721
|
+
)
|
|
722
|
+
.in_sequence(correct_order)
|
|
508
723
|
|
|
509
724
|
tr = TestResource.new(
|
|
510
|
-
:
|
|
725
|
+
:name => "Ethan", :is_active => false
|
|
511
726
|
)
|
|
727
|
+
tr.stubs(:id => 1)
|
|
728
|
+
tr.save
|
|
729
|
+
|
|
512
730
|
tr.update_attributes(:is_active => nil)
|
|
513
731
|
end
|
|
514
732
|
|
|
515
733
|
it "should include attributes that have changed to false by default" do
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
734
|
+
correct_order = sequence("ordering")
|
|
735
|
+
|
|
736
|
+
# initial save
|
|
737
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
738
|
+
.in_sequence(correct_order)
|
|
739
|
+
|
|
740
|
+
# update
|
|
741
|
+
ApiResource::Connection.any_instance.expects(:put)
|
|
742
|
+
.with(
|
|
743
|
+
"/test_resources/1.json",
|
|
744
|
+
{:test_resource => {:is_active => false}}.to_json,
|
|
745
|
+
TestResource.headers
|
|
746
|
+
).in_sequence(correct_order)
|
|
521
747
|
|
|
522
748
|
tr = TestResource.new(
|
|
523
|
-
:
|
|
749
|
+
:name => "Ethan", :is_active => true
|
|
524
750
|
)
|
|
751
|
+
tr.stubs(:id => 1)
|
|
752
|
+
tr.save
|
|
753
|
+
|
|
525
754
|
tr.update_attributes(:is_active => false)
|
|
526
755
|
|
|
527
756
|
end
|
|
@@ -536,7 +765,9 @@ describe "Base" do
|
|
|
536
765
|
end
|
|
537
766
|
|
|
538
767
|
it "should be able to destroy itself as an instance" do
|
|
539
|
-
tr = TestResource.new(:
|
|
768
|
+
tr = TestResource.new(:name => "Ethan")
|
|
769
|
+
tr.stubs(:id => 1)
|
|
770
|
+
|
|
540
771
|
tr.destroy.should be_true
|
|
541
772
|
end
|
|
542
773
|
end
|
|
@@ -544,8 +775,11 @@ describe "Base" do
|
|
|
544
775
|
describe "Random methods" do
|
|
545
776
|
|
|
546
777
|
it "should know if it is persisted" do
|
|
547
|
-
tr = TestResource.new(:
|
|
778
|
+
tr = TestResource.new(:name => "Ethan")
|
|
779
|
+
tr.stubs(:id => 1)
|
|
780
|
+
|
|
548
781
|
tr.persisted?.should be_true
|
|
782
|
+
|
|
549
783
|
tr = TestResource.new(:name => "Ethan")
|
|
550
784
|
tr.persisted?.should be_false
|
|
551
785
|
end
|
|
@@ -609,6 +843,9 @@ describe "Base" do
|
|
|
609
843
|
begin
|
|
610
844
|
initial = ApiResource::Base.ttl
|
|
611
845
|
ApiResource::Base.ttl = 1
|
|
846
|
+
if defined?(Rails)
|
|
847
|
+
Object.send(:remove_const, :Rails)
|
|
848
|
+
end
|
|
612
849
|
example.run
|
|
613
850
|
ensure
|
|
614
851
|
ApiResource::Base.ttl = initial
|
|
@@ -640,13 +877,14 @@ describe "Base" do
|
|
|
640
877
|
|
|
641
878
|
it "should load the resouce definition when respond_to? is called" do
|
|
642
879
|
# remove our attribute that denotes that the definition was loaded
|
|
643
|
-
TestResource.send(:remove_instance_variable, :@
|
|
880
|
+
TestResource.send(:remove_instance_variable, :@resource_definition)
|
|
644
881
|
TestResource.expects(:set_class_attributes_upon_load)
|
|
645
882
|
TestResource.respond_to?(:test)
|
|
646
883
|
end
|
|
647
884
|
|
|
648
885
|
it "should not load the resource definition when respond_to? is called
|
|
649
886
|
if the definition has already been loaded" do
|
|
887
|
+
TestResource.send(:respond_to?, :some_method)
|
|
650
888
|
TestResource.expects(:set_class_attributes_upon_load).never
|
|
651
889
|
TestResource.send(:respond_to?, :some_method)
|
|
652
890
|
end
|
data/spec/lib/callbacks_spec.rb
CHANGED
|
@@ -49,7 +49,8 @@ describe "Should put callbacks around save, create, update, and destroy by defau
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
it "should fire save and update callbacks when updating a record" do
|
|
52
|
-
tr = TestResource.new(:
|
|
52
|
+
tr = TestResource.new(:name => "Ethan", :age => 20)
|
|
53
|
+
tr.stubs(:id => 1)
|
|
53
54
|
tr.name = "Test"
|
|
54
55
|
tr.age = 21
|
|
55
56
|
tr.save.should be_true
|
|
@@ -59,7 +60,8 @@ describe "Should put callbacks around save, create, update, and destroy by defau
|
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
it "should only fire destroy callbacks when destroying a record" do
|
|
62
|
-
tr = TestResource.new(:
|
|
63
|
+
tr = TestResource.new(:name => "Ethan", :age => 20)
|
|
64
|
+
tr.stubs(:id => 1)
|
|
63
65
|
tr.destroy.should be_true
|
|
64
66
|
tr.d_val.should eql(2)
|
|
65
67
|
tr.s_val.should be_nil
|
data/spec/lib/local_spec.rb
CHANGED
|
@@ -12,7 +12,11 @@ describe "Local" do
|
|
|
12
12
|
end
|
|
13
13
|
mtr = MyTestResource.new
|
|
14
14
|
# should still have scopes
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
MyTestResource.expects(:clear_attributes).never
|
|
17
|
+
MyTestResource.expects(:clear_related_objects).never
|
|
18
|
+
|
|
19
|
+
MyTestResource.reload_resource_definition
|
|
16
20
|
mtr.scopes.should_not be_blank
|
|
17
21
|
|
|
18
22
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -35,12 +35,11 @@ Spork.prefork do
|
|
|
35
35
|
ApiResource.format = :json
|
|
36
36
|
ApiResource.load_mocks_and_factories
|
|
37
37
|
|
|
38
|
-
ApiResource.logger.level = Log4r::
|
|
38
|
+
ApiResource.logger.level = Log4r::DEBUG
|
|
39
39
|
|
|
40
40
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
|
|
44
43
|
RSpec.configure do |config|
|
|
45
44
|
config.mock_with :mocha
|
|
46
45
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
@@ -21,7 +21,15 @@ Mocks.define do
|
|
|
21
21
|
get((0..4).to_a.collect{HashDealer.roll(:test_association_resource)}, :params => {})
|
|
22
22
|
get((0..4).to_a.collect{HashDealer.roll(:active_test_association_resource)}, :params => {:active => true})
|
|
23
23
|
get((0..4).to_a.collect{HashDealer.roll(:active_test_association_resource)}, :params => {:active => false})
|
|
24
|
-
get(
|
|
24
|
+
get(
|
|
25
|
+
(0..4).to_a.collect{
|
|
26
|
+
HashDealer.roll(:active_birthday_test_association_resource)
|
|
27
|
+
},
|
|
28
|
+
:params => {
|
|
29
|
+
:active => true,
|
|
30
|
+
:birthday => {:date => Date.today}
|
|
31
|
+
}.matcher
|
|
32
|
+
)
|
|
25
33
|
end
|
|
26
34
|
|
|
27
35
|
endpoint("/has_one_objects/new") do
|