json-crud-api 0.0.5 → 0.0.7

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.
@@ -0,0 +1,331 @@
1
+ require "spec_helper"
2
+
3
+ describe JsonCrudApi::AuthClient do
4
+ before(:each) do
5
+ class CrudTest
6
+ attr_accessor :test_settings, :test_params, :payload
7
+ include JsonCrudApi::Crud
8
+
9
+ def settings
10
+ @test_settings
11
+ end
12
+
13
+ def params
14
+ @test_params
15
+ end
16
+ end
17
+
18
+ @test = CrudTest.new
19
+ end
20
+
21
+ describe '#crud_api' do
22
+ it 'should enable get_all if configured' do
23
+ expect(@test).to receive(:get).with('/test')
24
+
25
+ expect(@test).not_to receive(:get)
26
+ expect(@test).not_to receive(:post)
27
+ expect(@test).not_to receive(:put)
28
+ expect(@test).not_to receive(:delete)
29
+
30
+ @test.crud_api('/test',:one, [:disable_write,:disable_get])
31
+ end
32
+
33
+ it 'should enable get if configured' do
34
+ expect(@test).to receive(:get).with('/test/:id')
35
+
36
+ expect(@test).not_to receive(:get).with('/test')
37
+ expect(@test).not_to receive(:post)
38
+ expect(@test).not_to receive(:put)
39
+ expect(@test).not_to receive(:delete)
40
+
41
+ @test.crud_api('/test',:one, [:disable_write,:disable_get_all])
42
+ end
43
+
44
+ it 'should enable post if configured' do
45
+ expect(@test).to receive(:post).with('/test')
46
+
47
+ expect(@test).not_to receive(:get)
48
+ expect(@test).not_to receive(:post)
49
+ expect(@test).not_to receive(:put)
50
+ expect(@test).not_to receive(:delete)
51
+
52
+ @test.crud_api('/test',:one, [:disable_put,:disable_delete,:disable_read])
53
+ end
54
+
55
+ it 'should enable put if configured' do
56
+ expect(@test).to receive(:put).with('/test/:id')
57
+
58
+ expect(@test).not_to receive(:get)
59
+ expect(@test).not_to receive(:post)
60
+ expect(@test).not_to receive(:delete)
61
+
62
+ @test.crud_api('/test',:one, [:disable_post,:disable_delete,:disable_read])
63
+ end
64
+
65
+ it 'should enable delete if configured' do
66
+ expect(@test).to receive(:delete).with('/test/:id')
67
+
68
+ expect(@test).not_to receive(:get)
69
+ expect(@test).not_to receive(:post)
70
+ expect(@test).not_to receive(:put)
71
+
72
+ @test.crud_api('/test',:one, [:disable_post,:disable_put,:disable_read])
73
+ end
74
+
75
+ end
76
+
77
+ describe '#crud_get_all' do
78
+
79
+ before do
80
+ @service = double('service')
81
+ @presenter = double('presenter')
82
+
83
+ @test.test_settings = OpenStruct.new({
84
+ :services=>OpenStruct.new,
85
+ :presenters=>OpenStruct.new
86
+ })
87
+ end
88
+
89
+ it 'should call get_all on service, render on the presenter, and return JSON' do
90
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
91
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
92
+
93
+ expect(@service).to receive(:user_authorized_for?).with(:get_all).and_return(true)
94
+ expect(@service).to receive(:get_all).and_return([])
95
+
96
+ expect(@presenter).to receive(:render).with([], :get_all).and_return({ :test_output => 1})
97
+
98
+ expect(@test.send(:crud_get_all,'thekey')).to eq '{"test_output":1}'
99
+ end
100
+
101
+ it 'should fail_unauthorized if not authorized for get_all' do
102
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
103
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
104
+
105
+ expect(@service).to receive(:user_authorized_for?).with(:get_all).and_return(false)
106
+
107
+ expect(@test).to receive(:fail_unauthorized)
108
+
109
+ expect(@service).not_to receive(:get_all)
110
+ expect(@presenter).not_to receive(:render)
111
+
112
+ @test.send(:crud_get_all,'thekey')
113
+ end
114
+
115
+ it 'should fail_not_found if service returned nil' do
116
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
117
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
118
+
119
+ expect(@service).to receive(:user_authorized_for?).with(:get_all).and_return(true)
120
+ expect(@service).to receive(:get_all).and_return(nil)
121
+
122
+ expect(@test).to receive(:fail_not_found)
123
+
124
+ expect(@service).not_to receive(:get_all)
125
+ expect(@presenter).not_to receive(:render)
126
+
127
+ @test.send(:crud_get_all,'thekey')
128
+ end
129
+ end
130
+
131
+ describe '#crud_get' do
132
+ before do
133
+ @service = double('service')
134
+ @presenter = double('presenter')
135
+
136
+ @test.test_settings = OpenStruct.new({
137
+ :services=>OpenStruct.new,
138
+ :presenters=>OpenStruct.new
139
+ })
140
+ @test.test_params = { "id" => 234 }
141
+ end
142
+
143
+ it 'should call get on service, render on the presenter, and return JSON' do
144
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
145
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
146
+
147
+ expect(@service).to receive(:user_authorized_for?).with(:get).and_return(true)
148
+ expect(@service).to receive(:get).with(234).and_return([])
149
+
150
+ expect(@presenter).to receive(:render).with([], :get).and_return({ :test_output => 56})
151
+
152
+ expect(@test.send(:crud_get,'thekey')).to eq '{"test_output":56}'
153
+ end
154
+
155
+ it 'should fail_unauthorized if not authorized for get' do
156
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
157
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
158
+
159
+ expect(@service).to receive(:user_authorized_for?).with(:get).and_return(false)
160
+
161
+ expect(@test).to receive(:fail_unauthorized)
162
+
163
+ expect(@service).not_to receive(:get)
164
+ expect(@presenter).not_to receive(:render)
165
+
166
+ @test.send(:crud_get,'thekey')
167
+ end
168
+
169
+ it 'should fail_not_found if service returned nil' do
170
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
171
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
172
+
173
+ expect(@service).to receive(:user_authorized_for?).with(:get).and_return(true)
174
+ expect(@service).to receive(:get).with(234).and_return(nil)
175
+
176
+ expect(@test).to receive(:fail_not_found)
177
+
178
+ expect(@service).not_to receive(:get)
179
+ expect(@presenter).not_to receive(:render)
180
+
181
+ @test.send(:crud_get,'thekey')
182
+ end
183
+ end
184
+
185
+ describe '#crud_post' do
186
+ before do
187
+ @service = double('service')
188
+ @presenter = double('presenter')
189
+
190
+ @test.test_settings = OpenStruct.new({
191
+ :services=>OpenStruct.new,
192
+ :presenters=>OpenStruct.new
193
+ })
194
+ @test.payload = { :test_payload_int => 12313 }
195
+ end
196
+
197
+ it 'should call create on service, parse on the presenter, render on the presenter, and return JSON' do
198
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
199
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
200
+
201
+ expect(@service).to receive(:user_authorized_for?).with(:create).and_return(true)
202
+ expect(@service).to receive(:create).with({ :test_output => 12398}).and_return({ :test_output => 77234})
203
+
204
+ expect(@presenter).to receive(:parse).with(@test.payload, :post).and_return({ :test_output => 12398})
205
+ expect(@presenter).to receive(:render).with({ :test_output => 77234}, :post).and_return({ :test_output => 12313})
206
+
207
+ expect(@test.send(:crud_post,'thekey')).to eq '{"test_output":12313}'
208
+ end
209
+
210
+ it 'should fail_unauthorized if not authorized for create' do
211
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
212
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
213
+
214
+ expect(@service).to receive(:user_authorized_for?).with(:create).and_return(false)
215
+
216
+ expect(@test).to receive(:fail_unauthorized)
217
+
218
+ expect(@service).not_to receive(:create)
219
+ expect(@presenter).not_to receive(:render)
220
+
221
+ @test.send(:crud_post,'thekey')
222
+ end
223
+ end
224
+
225
+ describe '#crud_put' do
226
+ before do
227
+ @service = double('service')
228
+ @presenter = double('presenter')
229
+
230
+ @test.test_settings = OpenStruct.new({
231
+ :services=>OpenStruct.new,
232
+ :presenters=>OpenStruct.new
233
+ })
234
+ @test.test_params = { "id" => 7345 }
235
+ @test.payload = { :test_payload_int => 12313 }
236
+ end
237
+
238
+ it 'should call update on service, get on the service, parse on the presenter, render on the presenter, and return JSON' do
239
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
240
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
241
+
242
+ expect(@service).to receive(:user_authorized_for?).with(:update).and_return(true)
243
+ expect(@service).to receive(:update).with(7345, { :test_output => 12398}).and_return(true)
244
+ expect(@service).to receive(:get).with(7345).and_return({ :test_output => 77234})
245
+
246
+ expect(@presenter).to receive(:parse).with(@test.payload, :put).and_return({ :test_output => 12398})
247
+ expect(@presenter).to receive(:render).with({ :test_output => 77234}, :put).and_return({ :test_output => 12313})
248
+
249
+ expect(@test.send(:crud_put,'thekey')).to eq '{"test_output":12313}'
250
+ end
251
+
252
+ it 'should fail_not_found if service update returned false' do
253
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
254
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
255
+
256
+ expect(@service).to receive(:user_authorized_for?).with(:update).and_return(true)
257
+ expect(@service).to receive(:update).with(7345, { :test_output => 12398}).and_return(false)
258
+
259
+ expect(@test).to receive(:fail_not_found)
260
+
261
+ expect(@presenter).to receive(:parse).with(@test.payload, :put).and_return({ :test_output => 12398})
262
+ expect(@presenter).not_to receive(:render)
263
+
264
+ @test.send(:crud_put,'thekey')
265
+ end
266
+
267
+ it 'should fail_unauthorized if not authorized for update' do
268
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
269
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
270
+
271
+ expect(@service).to receive(:user_authorized_for?).with(:update).and_return(false)
272
+
273
+ expect(@test).to receive(:fail_unauthorized)
274
+
275
+ expect(@service).not_to receive(:update)
276
+ expect(@service).not_to receive(:get)
277
+ expect(@presenter).not_to receive(:render)
278
+
279
+ @test.send(:crud_put,'thekey')
280
+ end
281
+ end
282
+
283
+ describe '#crud_delete' do
284
+ before do
285
+ @service = double('service')
286
+ @presenter = double('presenter')
287
+
288
+ @test.test_settings = OpenStruct.new({
289
+ :services=>OpenStruct.new,
290
+ :presenters=>OpenStruct.new
291
+ })
292
+ @test.test_params = { "id" => 234 }
293
+ end
294
+
295
+ it 'should call delete on service and return 204' do
296
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
297
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
298
+
299
+ expect(@service).to receive(:user_authorized_for?).with(:delete).and_return(true)
300
+ expect(@service).to receive(:delete).with(234).and_return(true)
301
+
302
+ expect(@test.send(:crud_delete,'thekey')).to eq 204
303
+ end
304
+
305
+ it 'should fail_unauthorized if not authorized for delete' do
306
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
307
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
308
+
309
+ expect(@service).to receive(:user_authorized_for?).with(:delete).and_return(false)
310
+
311
+ expect(@test).to receive(:fail_unauthorized)
312
+
313
+ expect(@service).not_to receive(:delete)
314
+
315
+ @test.send(:crud_delete,'thekey')
316
+ end
317
+
318
+ it 'should fail_not_found if service delete returned false' do
319
+ expect(@test.test_settings.services).to receive(:[]).with('thekey').and_return(@service)
320
+ expect(@test.test_settings.presenters).to receive(:[]).with('thekey').and_return(@presenter)
321
+
322
+ expect(@service).to receive(:user_authorized_for?).with(:delete).and_return(true)
323
+ expect(@service).to receive(:delete).with(234).and_return(false)
324
+
325
+ expect(@test).to receive(:fail_not_found)
326
+
327
+ @test.send(:crud_delete,'thekey')
328
+ end
329
+
330
+ end
331
+ end
@@ -0,0 +1,120 @@
1
+ require "spec_helper"
2
+
3
+ describe JsonCrudApi::JsonErrors do
4
+
5
+ before do
6
+ class TestClass
7
+ include JsonCrudApi::JsonErrors
8
+
9
+ attr_accessor :errors
10
+
11
+ def env
12
+ @test_env
13
+ end
14
+ end
15
+
16
+ @test = TestClass.new
17
+ end
18
+
19
+ describe '#clear_errors' do
20
+ it 'should set @errors to []' do
21
+
22
+ @test.errors = 9123878123
23
+ @test.clear_errors
24
+
25
+ expect(@test.errors).to eq []
26
+ end
27
+ end
28
+
29
+ describe '#add_error' do
30
+ it 'should initialise @errors if not set' do
31
+ @test.errors = nil
32
+ @test.add_error(1,2)
33
+
34
+ expect(@test.errors).not_to be nil
35
+ end
36
+
37
+ it 'should add an error with correct structure' do
38
+ @test.add_error(1,2)
39
+
40
+ expect(@test.errors).to eq([{ :code =>1, :message =>2}])
41
+ end
42
+
43
+ it 'should add an error with a reference if specified' do
44
+ @test.add_error(1,2,3)
45
+
46
+ expect(@test.errors).to eq([{ :code =>1, :message =>2 ,:reference =>3}])
47
+ end
48
+
49
+ it 'should add multiple errors' do
50
+ @test.add_error(1,2,3)
51
+ @test.add_error(4,5,6)
52
+
53
+ expect(@test.errors).to eq([
54
+ { :code =>1, :message =>2 ,:reference =>3},
55
+ { :code =>4, :message =>5 ,:reference =>6}
56
+ ])
57
+ end
58
+ end
59
+
60
+ describe '#fail_with_error' do
61
+ it 'should call add_error and fail_with_errors correctly' do
62
+ expect(@test).to receive(:add_error).with(2,3,4)
63
+ expect(@test).to receive(:fail_with_errors).with(422)
64
+
65
+ @test.fail_with_error(422,2,3,4)
66
+ end
67
+
68
+ it 'should respect existing errors' do
69
+ @test.add_error(1,2,3)
70
+
71
+ expect(@test).to receive(:fail_with_errors).with(422)
72
+
73
+ @test.fail_with_error(422,2,3,4)
74
+
75
+ expect(@test.errors).to eq([
76
+ { :code =>1, :message =>2 ,:reference =>3},
77
+ { :code =>2, :message =>3 ,:reference =>4}
78
+ ])
79
+ end
80
+ end
81
+
82
+ describe '#fail_with_errors' do
83
+ it 'should call halt with correct status and JSON' do
84
+ @test.errors = { :one =>1, :two =>2 }
85
+
86
+ expect(@test).to receive(:halt).with(504, '{"success":false,"errors":{"one":1,"two":2}}')
87
+
88
+ @test.fail_with_errors(504)
89
+ end
90
+
91
+ it 'should call halt with default 422 status and JSON' do
92
+ @test.errors = { :one =>1, :two =>2 }
93
+
94
+ expect(@test).to receive(:halt).with(422, '{"success":false,"errors":{"one":1,"two":2}}')
95
+
96
+ @test.fail_with_errors
97
+ end
98
+ end
99
+
100
+ describe '#fail_not_found' do
101
+ it 'should call fail_not_found with 404 and message' do
102
+ expect(@test).to receive(:fail_with_error).with(404, 'NOT_FOUND','The resource cannot be found.')
103
+ @test.fail_not_found
104
+ end
105
+ end
106
+
107
+ describe '#fail_unauthorized' do
108
+ it 'should call fail_not_found with 404 and message' do
109
+ expect(@test).to receive(:fail_with_error).with(401, 'UNAUTHORIZED','Authorization is required to perform this operation on the resource.')
110
+ @test.fail_unauthorized
111
+ end
112
+ end
113
+
114
+ describe '#fail_forbidden' do
115
+ it 'should call fail_not_found with 404 and message' do
116
+ expect(@test).to receive(:fail_with_error).with(403, 'FORBIDDEN','The user is not allowed to perform this operation on the resource.')
117
+ @test.fail_forbidden
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+
3
+ describe JsonCrudApi::JsonPayload do
4
+
5
+ before do
6
+ class TestClass
7
+ attr_accessor :request, :payload
8
+
9
+ include JsonCrudApi::JsonPayload
10
+ end
11
+ @test = TestClass.new
12
+ end
13
+
14
+ describe '#process_json_payload' do
15
+ it 'should call rewind on request.body' do
16
+
17
+ @test.request = OpenStruct.new({
18
+ :body => OpenStruct.new({
19
+ :read => OpenStruct.new({:length => 0})
20
+ })
21
+ })
22
+ expect(@test.request.body).to receive(:rewind)
23
+
24
+ @test.process_json_payload
25
+ end
26
+
27
+ it 'should call read and return with set payload nil if body length is less than 2' do
28
+ @test.request = OpenStruct.new({
29
+ :body => OpenStruct.new
30
+ })
31
+ expect(@test.request.body).to receive(:rewind)
32
+ expect(@test.request.body).to receive(:read).and_return('')
33
+
34
+ @test.process_json_payload
35
+
36
+ expect(@test.payload).to be_nil
37
+ end
38
+
39
+ it 'should parse the body json into @payload, symbolizing names' do
40
+ @test.request = OpenStruct.new({
41
+ :body => OpenStruct.new
42
+ })
43
+ expect(@test.request.body).to receive(:rewind)
44
+ expect(@test.request.body).to receive(:read).and_return('{"one":1,"two":2}')
45
+
46
+ @test.process_json_payload
47
+
48
+ expect(@test.payload).to eq({ :one=>1, :two =>2})
49
+ end
50
+
51
+ it 'should set @payload nil and call fail_with_error is JSON parse fails' do
52
+ @test.request = OpenStruct.new({
53
+ :body => OpenStruct.new
54
+ })
55
+ expect(@test.request.body).to receive(:rewind)
56
+ expect(@test.request.body).to receive(:read).and_return('fw4oihwafosaf8')
57
+
58
+ expect(@test).to receive(:fail_with_error).with(422, 'JSON_PARSE_ERROR', 'The JSON payload cannot be parsed')
59
+
60
+ @test.process_json_payload
61
+
62
+ expect(@test.payload).to be_nil
63
+ end
64
+ end
65
+ end