cardiac 0.2.0.pre8 → 0.2.0.pre9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cardiac/model/declarations.rb +4 -2
  3. data/lib/cardiac/railtie.rb +10 -0
  4. data/lib/cardiac/resource/builder.rb +4 -0
  5. data/lib/cardiac/util.rb +3 -2
  6. data/lib/cardiac/version.rb +1 -1
  7. data/spec/rails-3.2/Gemfile.lock +11 -11
  8. data/spec/rails-3.2/app_root/app/models/dummy.rb +7 -0
  9. data/spec/rails-3.2/app_root/log/test.log +11165 -0
  10. data/spec/rails-4.2/Gemfile +9 -0
  11. data/spec/rails-4.2/Gemfile.lock +157 -0
  12. data/spec/{rails-4.0 → rails-4.2}/Rakefile +0 -0
  13. data/spec/{rails-4.0 → rails-4.2}/app_root/app/assets/javascripts/application.js +0 -0
  14. data/spec/{rails-4.0 → rails-4.2}/app_root/app/assets/stylesheets/application.css +0 -0
  15. data/spec/{rails-4.0 → rails-4.2}/app_root/app/controllers/application_controller.rb +0 -0
  16. data/spec/{rails-4.0 → rails-4.2}/app_root/app/helpers/application_helper.rb +0 -0
  17. data/spec/rails-4.2/app_root/app/models/dummy.rb +7 -0
  18. data/spec/{rails-4.0 → rails-4.2}/app_root/app/views/layouts/application.html.erb +0 -0
  19. data/spec/{rails-4.0 → rails-4.2}/app_root/config/application.rb +0 -0
  20. data/spec/{rails-4.0 → rails-4.2}/app_root/config/boot.rb +0 -0
  21. data/spec/{rails-4.0 → rails-4.2}/app_root/config/database.yml +0 -0
  22. data/spec/{rails-4.0 → rails-4.2}/app_root/config/environment.rb +0 -0
  23. data/spec/{rails-4.0 → rails-4.2}/app_root/config/environments/development.rb +0 -0
  24. data/spec/{rails-4.0 → rails-4.2}/app_root/config/environments/production.rb +1 -1
  25. data/spec/{rails-4.0 → rails-4.2}/app_root/config/environments/test.rb +1 -1
  26. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/backtrace_silencers.rb +0 -0
  27. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/inflections.rb +0 -0
  28. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/mime_types.rb +0 -0
  29. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/secret_token.rb +0 -0
  30. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/session_store.rb +0 -0
  31. data/spec/{rails-4.0 → rails-4.2}/app_root/config/initializers/wrap_parameters.rb +0 -0
  32. data/spec/{rails-4.0 → rails-4.2}/app_root/config/locales/en.yml +0 -0
  33. data/spec/{rails-4.0 → rails-4.2}/app_root/config/routes.rb +0 -0
  34. data/spec/{rails-4.0 → rails-4.2}/app_root/db/test.sqlite3 +0 -0
  35. data/spec/{rails-4.0 → rails-4.2}/app_root/log/development.log +0 -0
  36. data/spec/{rails-4.0 → rails-4.2}/app_root/log/test.log +11097 -0
  37. data/spec/{rails-4.0 → rails-4.2}/app_root/public/404.html +0 -0
  38. data/spec/{rails-4.0 → rails-4.2}/app_root/public/422.html +0 -0
  39. data/spec/{rails-4.0 → rails-4.2}/app_root/public/500.html +0 -0
  40. data/spec/{rails-4.0 → rails-4.2}/app_root/public/favicon.ico +0 -0
  41. data/spec/{rails-4.0 → rails-4.2}/app_root/script/rails +0 -0
  42. data/spec/{rails-4.0 → rails-4.2}/spec/spec_helper.rb +0 -0
  43. data/spec/shared/cardiac/model/base_spec.rb +3 -360
  44. data/spec/shared/cardiac/model/declarations_spec.rb +74 -0
  45. data/spec/shared/cardiac/model/persistence_spec.rb +179 -0
  46. data/spec/shared/cardiac/model/querying_spec.rb +144 -0
  47. metadata +76 -66
  48. data/spec/rails-4.0/Gemfile +0 -9
  49. data/spec/rails-4.0/Gemfile.lock +0 -132
File without changes
File without changes
@@ -4,41 +4,10 @@ describe Cardiac::Model::Base do
4
4
 
5
5
  include_context 'Client responses'
6
6
 
7
- let! :klass do
8
- Class.new(Cardiac::Model::Base).class_eval do
9
- self.base_resource = 'http://localhost/dummy'
10
-
11
- attribute :id, type: Integer
12
- attribute :name, type: String
13
-
14
- def self.name; 'Dummy' end
15
-
16
- self
17
- end
18
- end
19
-
7
+ let!(:klass) { Dummy }
8
+
20
9
  subject { klass }
21
-
22
- describe '#base_resource' do
23
- subject { super().base_resource }
24
- it { is_expected.to be_a(::Cardiac::Resource) }
25
- end
26
-
27
- describe '#base_resource' do
28
- subject { super().base_resource }
29
- describe '#to_url' do
30
- subject { super().to_url }
31
- it { is_expected.to eq('http://localhost/dummy') }
32
- end
33
- end
34
-
35
- it { is_expected.to respond_to(:find_instances) }
36
- it { is_expected.to respond_to(:create_instance) }
37
- it { is_expected.to respond_to(:identify) }
38
- it { is_expected.not_to respond_to(:find_instance) }
39
- it { is_expected.not_to respond_to(:update_instance) }
40
- it { is_expected.not_to respond_to(:delete_instance) }
41
-
10
+
42
11
  shared_examples 'new records' do
43
12
  it { is_expected.not_to be_persisted }
44
13
  it { is_expected.to be_new_record }
@@ -64,145 +33,6 @@ describe Cardiac::Model::Base do
64
33
  end
65
34
  end
66
35
 
67
- shared_examples 'administering records' do
68
- describe '#id' do
69
- subject { super().id }
70
- it { is_expected.to eq(1) }
71
- end
72
-
73
- describe '#to_key' do
74
- subject { super().to_key }
75
- it { is_expected.to eq([1]) }
76
- end
77
-
78
- describe '#name' do
79
- subject { super().name }
80
- it { is_expected.to eq('Jane Doe') }
81
- end
82
-
83
- describe '#remote_attributes' do
84
- subject { super().remote_attributes }
85
- it { is_expected.to eq('id' => 1, 'name' => 'John Doe') }
86
- end
87
-
88
- describe '#changed' do
89
- subject { super().changed }
90
- it { is_expected.to be_empty }
91
- end
92
- end
93
-
94
- shared_examples 'read-only models prohibit modification' do
95
- before(:each) { klass.readonly = true }
96
- after(:each) { klass.readonly = false }
97
- it('raises an error') { expect{ subject }.to raise_error }
98
- end
99
-
100
- shared_examples 'finding all instances' do
101
-
102
- # Require that the class itself receives the operation call.
103
- before(:each) { expect(klass).to receive(:find_instances).and_call_original }
104
-
105
- describe 'when an Array is returned' do
106
- let(:mock_index_success) { mock_response_klass.new("[ #{mock_success.body} ]", mock_success.code, mock_success.headers) }
107
-
108
- # Mock the REST execution, using the :mock_success stubbed out response...
109
- include_context 'Client execution', :get, :index_success
110
-
111
- describe '#first' do
112
- subject { super().first }
113
- it { is_expected.to be_persisted }
114
- end
115
-
116
- describe '#first' do
117
- subject { super().first }
118
- it { is_expected.not_to be_new_record }
119
- end
120
-
121
- describe '#first' do
122
- subject { super().first }
123
- describe '#id' do
124
- subject { super().id }
125
- it { is_expected.to eq(1) }
126
- end
127
- end
128
-
129
- describe '#first' do
130
- subject { super().first }
131
- describe '#to_key' do
132
- subject { super().to_key }
133
- it { is_expected.to eq([1]) }
134
- end
135
- end
136
-
137
- describe '#first' do
138
- subject { super().first }
139
- describe '#to_param' do
140
- subject { super().to_param }
141
- it { is_expected.to eq('1') }
142
- end
143
- end
144
-
145
- describe '#first' do
146
- subject { super().first }
147
- describe '#name' do
148
- subject { super().name }
149
- it { is_expected.to eq('John Doe') }
150
- end
151
- end
152
-
153
- describe '#first' do
154
- subject { super().first }
155
- describe '#remote_attributes' do
156
- subject { super().remote_attributes }
157
- it { is_expected.to be_empty }
158
- end
159
- end
160
-
161
- describe '#first' do
162
- subject { super().first }
163
- describe '#changed' do
164
- subject { super().changed }
165
- it { is_expected.to be_empty }
166
- end
167
- end
168
- end
169
-
170
- describe 'when an Array is not returned' do
171
-
172
- # Mock the REST execution, using the :mock_success stubbed out response...
173
- include_context 'Client execution', :get, :success
174
-
175
- it 'should raise an exception' do
176
- expect { subject.first }.to raise_error
177
- end
178
- end
179
- end
180
-
181
- describe '#identify' do
182
- subject { klass.identify(1) }
183
-
184
- it { is_expected.not_to respond_to(:find_instances) }
185
- it { is_expected.not_to respond_to(:create_instance) }
186
- it { is_expected.not_to respond_to(:identify) }
187
- it { is_expected.to respond_to(:find_instance) }
188
- it { is_expected.to respond_to(:update_instance) }
189
- it { is_expected.to respond_to(:delete_instance) }
190
- end
191
-
192
- describe '#with_resource()' do
193
- subject { klass.with_resource{|x| x.get } }
194
-
195
- # Mock the REST execution, using the :mock_success stubbed out response...
196
- include_context 'Client execution', :get, :success
197
-
198
- it { is_expected.to be_a(Hash) }
199
-
200
- describe "['segment']" do
201
- subject { super()['segment'] }
202
- it { is_expected.to eq({'id'=>1, 'name'=>'John Doe'}) }
203
- end
204
- end
205
-
206
36
  describe '#new' do
207
37
  subject { klass.new }
208
38
 
@@ -257,191 +87,4 @@ describe Cardiac::Model::Base do
257
87
  end
258
88
  end
259
89
 
260
- describe '#create' do
261
- subject { klass.create }
262
-
263
- context do
264
- # Mock the REST execution, using the :mock_success stubbed out response...
265
- include_context 'Client execution', :post, :success
266
-
267
- it { is_expected.to be_persisted }
268
- it { is_expected.not_to be_destroyed }
269
- it { is_expected.not_to be_new_record }
270
-
271
- describe '#id' do
272
- subject { super().id }
273
- it { is_expected.to eq(1) }
274
- end
275
-
276
- describe '#to_key' do
277
- subject { super().to_key }
278
- it { is_expected.to eq([1]) }
279
- end
280
-
281
- describe '#to_param' do
282
- subject { super().to_param }
283
- it { is_expected.to eq('1') }
284
- end
285
-
286
- describe '#name' do
287
- subject { super().name }
288
- it { is_expected.to be_nil }
289
- end # remote attributes ignored by default on creation.
290
-
291
- describe '#remote_attributes' do
292
- subject { super().remote_attributes }
293
- it { is_expected.not_to be_empty }
294
- end
295
-
296
- describe '#changed' do
297
- subject { super().changed }
298
- it { is_expected.to be_empty }
299
- end
300
-
301
- it 'should store the remote attributes' do
302
- expect(subject.remote_attributes['id']).to eq(1)
303
- expect(subject.remote_attributes[:name]).to eq('John Doe')
304
- end
305
- end
306
-
307
- it_behaves_like 'read-only models prohibit modification'
308
- end
309
-
310
- describe '#find(id)' do
311
- subject { klass.find(1) }
312
-
313
- # Mock the REST execution, using the :mock_success stubbed out response...
314
- include_context 'Client execution', :get, :success
315
-
316
- it { is_expected.to be_persisted }
317
- it { is_expected.not_to be_new_record }
318
-
319
- describe '#id' do
320
- subject { super().id }
321
- it { is_expected.to eq(1) }
322
- end
323
-
324
- describe '#to_key' do
325
- subject { super().to_key }
326
- it { is_expected.to eq([1]) }
327
- end
328
-
329
- describe '#to_param' do
330
- subject { super().to_param }
331
- it { is_expected.to eq('1') }
332
- end
333
-
334
- describe '#name' do
335
- subject { super().name }
336
- it { is_expected.to eq('John Doe') }
337
- end
338
-
339
- describe '#remote_attributes' do
340
- subject { super().remote_attributes }
341
- it { is_expected.to be_empty }
342
- end
343
-
344
- describe '#changed' do
345
- subject { super().changed }
346
- it { is_expected.to be_empty }
347
- end
348
- end
349
-
350
- describe '#find(:all)' do
351
- include_examples 'finding all instances' do
352
- subject { klass.find(:all) }
353
- end
354
- end
355
-
356
- describe '#all' do
357
- include_examples 'finding all instances' do
358
- subject { klass.all }
359
- end
360
- end
361
-
362
- describe '#reload' do
363
- subject { klass.send(:instantiate, id: 1, name: 'Johnny Doe').tap{|r| r.name = 'Jane Doe' }.reload }
364
-
365
- # Mock the REST execution, using the :mock_success stubbed out response...
366
- include_context 'Client execution', :get, :success
367
-
368
- it { is_expected.to be_persisted }
369
- it { is_expected.not_to be_destroyed }
370
- it { is_expected.not_to be_new_record }
371
-
372
- describe '#id' do
373
- subject { super().id }
374
- it { is_expected.to eq(1) }
375
- end
376
-
377
- describe '#to_key' do
378
- subject { super().to_key }
379
- it { is_expected.to eq([1]) }
380
- end
381
-
382
- describe '#to_param' do
383
- subject { super().to_param }
384
- it { is_expected.to eq('1') }
385
- end
386
-
387
- describe '#name' do
388
- subject { super().name }
389
- it { is_expected.to eq('John Doe') }
390
- end
391
-
392
- describe '#remote_attributes' do
393
- subject { super().remote_attributes }
394
- it { is_expected.to be_empty }
395
- end
396
-
397
- describe '#changed' do
398
- subject { super().changed }
399
- it { is_expected.to be_empty }
400
- end
401
- end
402
-
403
- describe '#update' do
404
- subject { klass.send(:instantiate, id: 1, name: 'John Doe').tap{|r| r.update(name: 'Jane Doe') } }
405
-
406
- context do
407
- # Mock the REST execution, using the :mock_success stubbed out response...
408
- include_context 'Client execution', :put, :success
409
- include_context 'administering records'
410
-
411
- it { is_expected.to be_persisted }
412
- it { is_expected.not_to be_destroyed }
413
- it { is_expected.not_to be_new_record }
414
- it { is_expected.not_to be_name_changed }
415
-
416
- describe '#to_param' do
417
- subject { super().to_param }
418
- it { is_expected.to eq('1') }
419
- end
420
- end
421
-
422
- it_behaves_like 'read-only models prohibit modification'
423
- end
424
-
425
- describe '#delete' do
426
- subject { klass.send(:instantiate, id: 1, name: 'Jane Doe').tap(&:destroy) }
427
-
428
- context do
429
- # Mock the REST execution, using the :mock_success stubbed out response...
430
- include_context 'Client execution', :delete, :success
431
- include_context 'administering records'
432
-
433
- it { is_expected.to be_destroyed }
434
- it { is_expected.not_to be_new_record }
435
- it { is_expected.not_to be_name_changed }
436
- it { is_expected.not_to be_name_changed }
437
-
438
- describe '#to_param' do
439
- subject { super().to_param }
440
- it { is_expected.to be_nil }
441
- end
442
- end
443
-
444
- it_behaves_like 'read-only models prohibit modification'
445
- end
446
-
447
90
  end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cardiac::Model::Base do
4
+
5
+ include_context 'Client responses'
6
+
7
+ let!(:klass) { Dummy }
8
+
9
+ subject { klass }
10
+
11
+ describe '#base_resource' do
12
+ subject { super().base_resource }
13
+
14
+ it { is_expected.to be_a(::Cardiac::Resource) }
15
+
16
+ describe '#to_url' do
17
+ subject { super().to_url }
18
+ it { is_expected.to eq('http://localhost/dummy') }
19
+ end
20
+ end
21
+
22
+ it { is_expected.to respond_to(:find_instances) }
23
+ it { is_expected.to respond_to(:create_instance) }
24
+ it { is_expected.to respond_to(:identify) }
25
+ it { is_expected.not_to respond_to(:find_instance) }
26
+ it { is_expected.not_to respond_to(:update_instance) }
27
+ it { is_expected.not_to respond_to(:delete_instance) }
28
+
29
+ describe '#identify' do
30
+ let(:id_or_model) { 1 }
31
+
32
+ subject { klass.identify(id_or_model) }
33
+
34
+ it { is_expected.not_to respond_to(:find_instances) }
35
+ it { is_expected.not_to respond_to(:create_instance) }
36
+ it { is_expected.not_to respond_to(:identify) }
37
+ it { is_expected.to respond_to(:find_instance) }
38
+ it { is_expected.to respond_to(:update_instance) }
39
+ it { is_expected.to respond_to(:delete_instance) }
40
+
41
+ it 'CGI escapes strings' do
42
+ bad_path = 'bad/string&?'
43
+ good_path = CGI.escape(bad_path)
44
+
45
+ expect(CGI).to receive(:escape).once.and_call_original
46
+
47
+ expect(klass.identify(bad_path).to_url).to eq('http://localhost/dummy/'+good_path)
48
+ end
49
+
50
+ it 'CGI escapes arrays' do
51
+ bad_path = ['bad&','string&?']
52
+ good_path = [CGI.escape('bad&'), CGI.escape('string&?')]
53
+
54
+ expect(CGI).to receive(:escape).twice.and_call_original
55
+
56
+ expect(klass.identify(bad_path).to_url).to eq('http://localhost/dummy/'+good_path.to_param)
57
+ end
58
+ end
59
+
60
+ describe '#with_resource()' do
61
+ subject { klass.with_resource{|x| x.get } }
62
+
63
+ # Mock the REST execution, using the :mock_success stubbed out response...
64
+ include_context 'Client execution', :get, :success
65
+
66
+ it { is_expected.to be_a(Hash) }
67
+
68
+ describe "['segment']" do
69
+ subject { super()['segment'] }
70
+ it { is_expected.to eq({'id'=>1, 'name'=>'John Doe'}) }
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cardiac::Model::Base do
4
+
5
+ include_context 'Client responses'
6
+
7
+ let!(:klass) { Dummy }
8
+
9
+ subject { klass }
10
+
11
+ shared_examples 'administering records' do
12
+ describe '#id' do
13
+ subject { super().id }
14
+ it { is_expected.to eq(1) }
15
+ end
16
+
17
+ describe '#to_key' do
18
+ subject { super().to_key }
19
+ it { is_expected.to eq([1]) }
20
+ end
21
+
22
+ describe '#name' do
23
+ subject { super().name }
24
+ it { is_expected.to eq('Jane Doe') }
25
+ end
26
+
27
+ describe '#remote_attributes' do
28
+ subject { super().remote_attributes }
29
+ it { is_expected.to eq('id' => 1, 'name' => 'John Doe') }
30
+ end
31
+
32
+ describe '#changed' do
33
+ subject { super().changed }
34
+ it { is_expected.to be_empty }
35
+ end
36
+ end
37
+
38
+ shared_examples 'read-only models prohibit modification' do
39
+ before(:each) { klass.readonly = true }
40
+ after(:each) { klass.readonly = false }
41
+ it('raises an error') { expect{ subject }.to raise_error }
42
+ end
43
+
44
+ describe '#create' do
45
+ subject { klass.create }
46
+
47
+ context do
48
+ # Mock the REST execution, using the :mock_success stubbed out response...
49
+ include_context 'Client execution', :post, :success
50
+
51
+ it { is_expected.to be_persisted }
52
+ it { is_expected.not_to be_destroyed }
53
+ it { is_expected.not_to be_new_record }
54
+
55
+ describe '#id' do
56
+ subject { super().id }
57
+ it { is_expected.to eq(1) }
58
+ end
59
+
60
+ describe '#to_key' do
61
+ subject { super().to_key }
62
+ it { is_expected.to eq([1]) }
63
+ end
64
+
65
+ describe '#to_param' do
66
+ subject { super().to_param }
67
+ it { is_expected.to eq('1') }
68
+ end
69
+
70
+ describe '#name' do
71
+ subject { super().name }
72
+ it { is_expected.to be_nil }
73
+ end # remote attributes ignored by default on creation.
74
+
75
+ describe '#remote_attributes' do
76
+ subject { super().remote_attributes }
77
+ it { is_expected.not_to be_empty }
78
+ end
79
+
80
+ describe '#changed' do
81
+ subject { super().changed }
82
+ it { is_expected.to be_empty }
83
+ end
84
+
85
+ it 'should store the remote attributes' do
86
+ expect(subject.remote_attributes['id']).to eq(1)
87
+ expect(subject.remote_attributes[:name]).to eq('John Doe')
88
+ end
89
+ end
90
+
91
+ it_behaves_like 'read-only models prohibit modification'
92
+ end
93
+
94
+ describe '#reload' do
95
+ subject { klass.send(:instantiate, id: 1, name: 'Johnny Doe').tap{|r| r.name = 'Jane Doe' }.reload }
96
+
97
+ # Mock the REST execution, using the :mock_success stubbed out response...
98
+ include_context 'Client execution', :get, :success
99
+
100
+ it { is_expected.to be_persisted }
101
+ it { is_expected.not_to be_destroyed }
102
+ it { is_expected.not_to be_new_record }
103
+
104
+ describe '#id' do
105
+ subject { super().id }
106
+ it { is_expected.to eq(1) }
107
+ end
108
+
109
+ describe '#to_key' do
110
+ subject { super().to_key }
111
+ it { is_expected.to eq([1]) }
112
+ end
113
+
114
+ describe '#to_param' do
115
+ subject { super().to_param }
116
+ it { is_expected.to eq('1') }
117
+ end
118
+
119
+ describe '#name' do
120
+ subject { super().name }
121
+ it { is_expected.to eq('John Doe') }
122
+ end
123
+
124
+ describe '#remote_attributes' do
125
+ subject { super().remote_attributes }
126
+ it { is_expected.to be_empty }
127
+ end
128
+
129
+ describe '#changed' do
130
+ subject { super().changed }
131
+ it { is_expected.to be_empty }
132
+ end
133
+ end
134
+
135
+ describe '#update' do
136
+ subject { klass.send(:instantiate, id: 1, name: 'John Doe').tap{|r| r.update(name: 'Jane Doe') } }
137
+
138
+ context do
139
+ # Mock the REST execution, using the :mock_success stubbed out response...
140
+ include_context 'Client execution', :put, :success
141
+ include_context 'administering records'
142
+
143
+ it { is_expected.to be_persisted }
144
+ it { is_expected.not_to be_destroyed }
145
+ it { is_expected.not_to be_new_record }
146
+ it { is_expected.not_to be_name_changed }
147
+
148
+ describe '#to_param' do
149
+ subject { super().to_param }
150
+ it { is_expected.to eq('1') }
151
+ end
152
+ end
153
+
154
+ it_behaves_like 'read-only models prohibit modification'
155
+ end
156
+
157
+ describe '#delete' do
158
+ subject { klass.send(:instantiate, id: 1, name: 'Jane Doe').tap(&:destroy) }
159
+
160
+ context do
161
+ # Mock the REST execution, using the :mock_success stubbed out response...
162
+ include_context 'Client execution', :delete, :success
163
+ include_context 'administering records'
164
+
165
+ it { is_expected.to be_destroyed }
166
+ it { is_expected.not_to be_new_record }
167
+ it { is_expected.not_to be_name_changed }
168
+ it { is_expected.not_to be_name_changed }
169
+
170
+ describe '#to_param' do
171
+ subject { super().to_param }
172
+ it { is_expected.to be_nil }
173
+ end
174
+ end
175
+
176
+ it_behaves_like 'read-only models prohibit modification'
177
+ end
178
+
179
+ end