lhs 0.3.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.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +38 -0
  3. data/Gemfile +11 -0
  4. data/README.md +67 -0
  5. data/Rakefile +26 -0
  6. data/docs/collections.md +28 -0
  7. data/docs/data.md +39 -0
  8. data/docs/examples/claim_no_include.json +16 -0
  9. data/docs/examples/claim_with_include.json +47 -0
  10. data/docs/items.md +55 -0
  11. data/docs/service.jpg +0 -0
  12. data/docs/service.pdf +649 -3
  13. data/docs/services.md +191 -0
  14. data/lhs.gemspec +31 -0
  15. data/lib/lhs.rb +6 -0
  16. data/lib/lhs/collection.rb +78 -0
  17. data/lib/lhs/concerns/data/json.rb +12 -0
  18. data/lib/lhs/concerns/item/destroy.rb +15 -0
  19. data/lib/lhs/concerns/item/save.rb +29 -0
  20. data/lib/lhs/concerns/item/update.rb +24 -0
  21. data/lib/lhs/concerns/service/all.rb +24 -0
  22. data/lib/lhs/concerns/service/batch.rb +37 -0
  23. data/lib/lhs/concerns/service/build.rb +17 -0
  24. data/lib/lhs/concerns/service/create.rb +26 -0
  25. data/lib/lhs/concerns/service/endpoints.rb +82 -0
  26. data/lib/lhs/concerns/service/find.rb +36 -0
  27. data/lib/lhs/concerns/service/find_by.rb +35 -0
  28. data/lib/lhs/concerns/service/first.rb +19 -0
  29. data/lib/lhs/concerns/service/includes.rb +21 -0
  30. data/lib/lhs/concerns/service/mapping.rb +23 -0
  31. data/lib/lhs/concerns/service/model.rb +16 -0
  32. data/lib/lhs/concerns/service/request.rb +96 -0
  33. data/lib/lhs/concerns/service/where.rb +16 -0
  34. data/lib/lhs/data.rb +103 -0
  35. data/lib/lhs/errors.rb +86 -0
  36. data/lib/lhs/item.rb +83 -0
  37. data/lib/lhs/proxy.rb +26 -0
  38. data/lib/lhs/service.rb +20 -0
  39. data/lib/lhs/version.rb +3 -0
  40. data/script/ci/build.sh +19 -0
  41. data/spec/collection/meta_data_spec.rb +54 -0
  42. data/spec/collection/respond_to_spec.rb +19 -0
  43. data/spec/collection/without_object_items_spec.rb +26 -0
  44. data/spec/data/collection_spec.rb +36 -0
  45. data/spec/data/item_spec.rb +44 -0
  46. data/spec/data/merge_spec.rb +32 -0
  47. data/spec/data/raw_spec.rb +39 -0
  48. data/spec/data/respond_to_spec.rb +26 -0
  49. data/spec/data/root_spec.rb +25 -0
  50. data/spec/data/to_json_spec.rb +39 -0
  51. data/spec/dummy/README.rdoc +28 -0
  52. data/spec/dummy/Rakefile +6 -0
  53. data/spec/dummy/app/assets/images/.keep +0 -0
  54. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  55. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  56. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  57. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  58. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  59. data/spec/dummy/app/mailers/.keep +0 -0
  60. data/spec/dummy/app/models/.keep +0 -0
  61. data/spec/dummy/app/models/concerns/.keep +0 -0
  62. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  63. data/spec/dummy/bin/bundle +3 -0
  64. data/spec/dummy/bin/rails +4 -0
  65. data/spec/dummy/bin/rake +4 -0
  66. data/spec/dummy/config.ru +4 -0
  67. data/spec/dummy/config/application.rb +14 -0
  68. data/spec/dummy/config/boot.rb +5 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +34 -0
  71. data/spec/dummy/config/environments/production.rb +75 -0
  72. data/spec/dummy/config/environments/test.rb +39 -0
  73. data/spec/dummy/config/initializers/assets.rb +8 -0
  74. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  75. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  76. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  77. data/spec/dummy/config/initializers/inflections.rb +16 -0
  78. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  79. data/spec/dummy/config/initializers/session_store.rb +3 -0
  80. data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
  81. data/spec/dummy/config/locales/en.yml +23 -0
  82. data/spec/dummy/config/routes.rb +56 -0
  83. data/spec/dummy/config/secrets.yml +22 -0
  84. data/spec/dummy/lib/assets/.keep +0 -0
  85. data/spec/dummy/public/404.html +67 -0
  86. data/spec/dummy/public/422.html +67 -0
  87. data/spec/dummy/public/500.html +66 -0
  88. data/spec/dummy/public/favicon.ico +0 -0
  89. data/spec/item/destroy_spec.rb +39 -0
  90. data/spec/item/getter_spec.rb +24 -0
  91. data/spec/item/respond_to_spec.rb +29 -0
  92. data/spec/item/save_errors_spec.rb +48 -0
  93. data/spec/item/save_spec.rb +58 -0
  94. data/spec/item/setter_spec.rb +38 -0
  95. data/spec/item/update_spec.rb +56 -0
  96. data/spec/proxy/load_spec.rb +47 -0
  97. data/spec/rails_helper.rb +9 -0
  98. data/spec/service/all_spec.rb +31 -0
  99. data/spec/service/build_spec.rb +25 -0
  100. data/spec/service/create_spec.rb +81 -0
  101. data/spec/service/creation_failed_spec.rb +54 -0
  102. data/spec/service/endpoint_misconfiguration_spec.rb +26 -0
  103. data/spec/service/endpoint_options_spec.rb +23 -0
  104. data/spec/service/endpoints_spec.rb +57 -0
  105. data/spec/service/find_by_spec.rb +49 -0
  106. data/spec/service/find_each_spec.rb +47 -0
  107. data/spec/service/find_in_batches_spec.rb +68 -0
  108. data/spec/service/find_spec.rb +71 -0
  109. data/spec/service/first_spec.rb +39 -0
  110. data/spec/service/includes_spec.rb +61 -0
  111. data/spec/service/mapping_spec.rb +72 -0
  112. data/spec/service/model_name_spec.rb +17 -0
  113. data/spec/service/request_spec.rb +22 -0
  114. data/spec/service/where_spec.rb +33 -0
  115. data/spec/spec_helper.rb +4 -0
  116. data/spec/support/cleanup_configuration.rb +17 -0
  117. data/spec/support/cleanup_services.rb +20 -0
  118. data/spec/support/fixtures/json/feedback.json +11 -0
  119. data/spec/support/fixtures/json/feedbacks.json +174 -0
  120. data/spec/support/fixtures/json/localina_content_ad.json +23 -0
  121. data/spec/support/load_json.rb +3 -0
  122. metadata +346 -0
@@ -0,0 +1,26 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ context 'misconfiguration of endpoints' do
6
+
7
+ it 'fails trying to add clashing endpoints' do
8
+ expect(
9
+ ->{
10
+ class SomeService < LHS::Service
11
+ endpoint ':datastore/v2/feedbacks'
12
+ endpoint ':datastore/v2/reviews'
13
+ end
14
+ }
15
+ ).to raise_error('Clashing endpoints.')
16
+ expect(
17
+ ->{
18
+ class SomeService < LHS::Service
19
+ endpoint ':datastore/v2/:campaign_id/feedbacks'
20
+ endpoint ':datastore/v2/:campaign_id/reviews'
21
+ end
22
+ }
23
+ ).to raise_error('Clashing endpoints.')
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ context 'set options for an endpoint' do
6
+
7
+ before(:each) do
8
+ class SomeService < LHS::Service
9
+ endpoint 'backend/v2/feedbacks', cache_expires_in: 1.day, retry: 2, cache: true
10
+ end
11
+ end
12
+
13
+ it 'stores endpoints with options' do
14
+ expect(SomeService.instance.endpoints[0].options).to eq(cache_expires_in: 86400, retry: 2, cache: true)
15
+ end
16
+
17
+ it 'uses the options that are configured for an endpoint' do
18
+ expect(LHC).to receive(:request).with(cache_expires_in: 1.day, retry: 2, cache: true, url: 'backend/v2/feedbacks/1').and_call_original
19
+ stub_request(:get, "http://backend/v2/feedbacks/1").to_return(status: 200)
20
+ SomeService.find(1)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ context 'endpoints' do
6
+
7
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
8
+
9
+ before(:each) do
10
+ LHC.config.placeholder(:datastore, datastore)
11
+ class SomeService < LHS::Service
12
+ endpoint ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
13
+ endpoint ':datastore/:campaign_id/feedbacks'
14
+ endpoint ':datastore/feedbacks'
15
+ end
16
+ end
17
+
18
+ it 'stores the endpoints of the service' do
19
+ expect(SomeService.instance.endpoints.count).to eq 3
20
+ expect(SomeService.instance.endpoints[0].url).to eq ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
21
+ expect(SomeService.instance.endpoints[1].url).to eq ':datastore/:campaign_id/feedbacks'
22
+ expect(SomeService.instance.endpoints[2].url).to eq ':datastore/feedbacks'
23
+ end
24
+
25
+ it 'finds the endpoint by the one with the most route param hits' do
26
+ expect(
27
+ SomeService.instance.find_endpoint(campaign_id: '12345').url
28
+ ).to eq ':datastore/:campaign_id/feedbacks'
29
+ expect(
30
+ SomeService.instance.find_endpoint(campaign_id: '12345', entry_id: '123').url
31
+ ).to eq ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
32
+ end
33
+
34
+ it 'finds the base endpoint (endpoint with least amount of route params)' do
35
+ expect(
36
+ SomeService.instance.find_endpoint.url
37
+ ).to eq ':datastore/feedbacks'
38
+ end
39
+
40
+ context 'unsorted endpoints' do
41
+
42
+ before(:each) do
43
+ class AnotherService < LHS::Service
44
+ endpoint ':datastore/feedbacks'
45
+ endpoint ':datastore/:campaign_id/feedbacks'
46
+ endpoint ':datastore/entries/:entry_id/content-ads/:campaign_id/feedbacks'
47
+ end
48
+ end
49
+
50
+ it 'sorts endpoints before trying to find the best endpoint' do
51
+ stub_request(:get, "#{datastore}/entries/123/content-ads/123/feedbacks").to_return(status: 200)
52
+ AnotherService.where(campaign_id: 123, entry_id: 123)
53
+ end
54
+
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,49 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
5
+
6
+ before(:each) do
7
+ LHC.config.placeholder(:datastore, datastore)
8
+ class SomeService < LHS::Service
9
+ endpoint ':datastore/content-ads/:campaign_id/feedbacks'
10
+ endpoint ':datastore/feedbacks'
11
+ end
12
+ end
13
+
14
+ context 'find_by' do
15
+ it 'finds a single record' do
16
+ stub_request(:get, "#{datastore}/feedbacks/z12f-3asm3ngals?limit=1")
17
+ .to_return(status: 200, body: load_json(:feedback))
18
+ expect(
19
+ SomeService.find_by(id: 'z12f-3asm3ngals').source_id
20
+ ).to be_kind_of String
21
+ end
22
+
23
+ it 'returns nil if no record was found' do
24
+ stub_request(:get, "#{datastore}/feedbacks/something-inexistent?limit=1")
25
+ .to_return(status: 404)
26
+ expect(
27
+ SomeService.find_by(id: 'something-inexistent')
28
+ ).to eq nil
29
+ end
30
+
31
+ it 'return first item by parameters' do
32
+ json = load_json(:feedbacks)
33
+ stub_request(:get, "#{datastore}/feedbacks?has_reviews=true&limit=1")
34
+ .to_return(status: 200, body: json)
35
+ expect(
36
+ SomeService.find_by(has_reviews: true).id
37
+ ).to eq json['items'].first['id']
38
+ end
39
+ end
40
+
41
+ context 'find_by!' do
42
+ it 'raises if nothing was found with parameters' do
43
+ stub_request(:get, "#{datastore}/feedbacks?has_reviews=true&limit=1")
44
+ .to_return(status: 200, body: { items: [] }.to_json)
45
+ expect { SomeService.find_by!(has_reviews: true) }
46
+ .to raise_error LHC::NotFound
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Collection do
4
+
5
+ let(:total) { 443 }
6
+
7
+ let(:limit) { 100 }
8
+
9
+ def api_response(ids, offset)
10
+ records = ids.map{|i| {id: i}}
11
+ {
12
+ items: records,
13
+ total: total,
14
+ limit: limit,
15
+ offset: offset
16
+ }.to_json
17
+ end
18
+
19
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
20
+
21
+ before(:each) do
22
+ LHC.config.placeholder('datastore', datastore)
23
+ class SomeService < LHS::Service
24
+ endpoint ':datastore/:campaign_id/feedbacks'
25
+ endpoint ':datastore/feedbacks'
26
+ end
27
+ end
28
+
29
+ context 'find_each' do
30
+
31
+ it 'processes each record by fetching records in batches' do
32
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=1").to_return(status: 200, body: api_response((1..100).to_a, 1))
33
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=101").to_return(status: 200, body: api_response((101..200).to_a, 101))
34
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=201").to_return(status: 200, body: api_response((201..300).to_a, 201))
35
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=301").to_return(status: 200, body: api_response((301..400).to_a, 301))
36
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=401").to_return(status: 200, body: api_response((401..total).to_a, 401))
37
+ count = 0
38
+ SomeService.find_each do |record|
39
+ count += 1
40
+ expect(record.id).to eq(count)
41
+ expect(record).to be_kind_of LHS::Data
42
+ expect(record._proxy).to be_kind_of LHS::Item
43
+ end
44
+ expect(count).to eq total
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,68 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Collection do
4
+
5
+ let(:total) { 443 }
6
+
7
+ let(:limit) { 100 }
8
+
9
+ def api_response(ids, offset)
10
+ records = ids.map{|i| {id: i}}
11
+ {
12
+ items: records,
13
+ total: total,
14
+ limit: limit,
15
+ offset: offset
16
+ }.to_json
17
+ end
18
+
19
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
20
+
21
+ before(:each) do
22
+ LHC.config.placeholder('datastore', datastore)
23
+ class SomeService < LHS::Service
24
+ endpoint ':datastore/:campaign_id/feedbacks'
25
+ endpoint ':datastore/feedbacks'
26
+ end
27
+ end
28
+
29
+ context 'find_batches' do
30
+
31
+ it 'processes records in batches' do
32
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=1").to_return(status: 200, body: api_response((1..100).to_a, 1))
33
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=101").to_return(status: 200, body: api_response((101..200).to_a, 101))
34
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=201").to_return(status: 200, body: api_response((201..300).to_a, 201))
35
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=301").to_return(status: 200, body: api_response((301..400).to_a, 301))
36
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=401").to_return(status: 200, body: api_response((401..total).to_a, 401))
37
+ count = 0
38
+ SomeService.find_in_batches do |records|
39
+ count += records.count
40
+ expect(records).to be_kind_of LHS::Data
41
+ expect(records._proxy).to be_kind_of LHS::Collection
42
+ end
43
+ expect(count).to eq total
44
+ end
45
+
46
+ it 'adapts to backend max limit' do
47
+ stub_request(:get, "#{datastore}/feedbacks?limit=230&offset=1").to_return(status: 200, body: api_response((1..100).to_a, 1))
48
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=101").to_return(status: 200, body: api_response((101..200).to_a, 101))
49
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=201").to_return(status: 200, body: api_response((201..300).to_a, 201))
50
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=301").to_return(status: 200, body: api_response((301..400).to_a, 301))
51
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=401").to_return(status: 200, body: api_response((401..total).to_a, 401))
52
+ count = 0
53
+ SomeService.find_in_batches(batch_size: 230) do |records|
54
+ count += records.count
55
+ expect(records).to be_kind_of LHS::Data
56
+ expect(records._proxy).to be_kind_of LHS::Collection
57
+ end
58
+ expect(count).to eq total
59
+ end
60
+
61
+ it 'forwards offset' do
62
+ stub_request(:get, "#{datastore}/feedbacks?limit=100&offset=401").to_return(status: 200, body: api_response((401..total).to_a, 401))
63
+ SomeService.find_in_batches(start: 401) do |records|
64
+ expect(records.count).to eq(total-400)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,71 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
6
+
7
+ before(:each) do
8
+ LHC.config.placeholder(:datastore, datastore)
9
+ class SomeService < LHS::Service
10
+ endpoint ':datastore/content-ads/:campaign_id/feedbacks'
11
+ endpoint ':datastore/feedbacks'
12
+ end
13
+ end
14
+
15
+ context 'find' do
16
+
17
+ it 'finds a single unique record' do
18
+ stub_request(:get, "#{datastore}/feedbacks/z12f-3asm3ngals").
19
+ to_return(status: 200, body: load_json(:feedback))
20
+ record = SomeService.find('z12f-3asm3ngals')
21
+ expect(record.source_id).to be_kind_of String
22
+ end
23
+
24
+ it 'raises if nothing was found' do
25
+ stub_request(:get, "#{datastore}/feedbacks/not-existing").
26
+ to_return(status: 404)
27
+ expect { SomeService.find('not-existing') }.to raise_error LHC::NotFound
28
+ end
29
+
30
+ it 'finds unique item by providing parameters' do
31
+ stub_request(:get, "#{datastore}/content-ads/123/feedbacks/123")
32
+ .to_return(body: "{}")
33
+ data = SomeService.find(campaign_id: '123', id: '123')
34
+ expect(data._proxy).to be_kind_of LHS::Item
35
+ end
36
+
37
+ it 'returns item in case of backend returning collection' do
38
+ data = JSON.parse(load_json(:feedbacks))
39
+ data['items'] = [data['items'].first]
40
+ stub_request(:get, "#{datastore}/content-ads/123/feedbacks/123")
41
+ .to_return(body: data.to_json)
42
+ data = SomeService.find(campaign_id: '123', id: '123')
43
+ expect(data._proxy).to be_kind_of LHS::Item
44
+ end
45
+
46
+ it 'fails when multiple items where found by parameters' do
47
+ stub_request(:get, "#{datastore}/content-ads/123/feedbacks/123")
48
+ .to_return(body: load_json(:feedbacks))
49
+ expect(->{
50
+ SomeService.find(campaign_id: '123', id: '123')
51
+ }).to raise_error LHC::NotFound
52
+ end
53
+
54
+ it 'fails when no item as found by parameters' do
55
+ data = JSON.parse(load_json(:feedbacks))
56
+ data['items'] = []
57
+ stub_request(:get, "#{datastore}/content-ads/123/feedbacks/123")
58
+ .to_return(body: data.to_json)
59
+ expect(->{
60
+ SomeService.find(campaign_id: '123', id: '123')
61
+ }).to raise_error LHC::NotFound
62
+ end
63
+
64
+ it 'raises if nothing was found with parameters' do
65
+ stub_request(:get, "#{datastore}/content-ads/123/feedbacks/123")
66
+ .to_return(status: 404)
67
+ expect { SomeService.find(campaign_id: '123', id: '123') }.to raise_error LHC::NotFound
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
6
+
7
+ before(:each) do
8
+ LHC.config.placeholder(:datastore, datastore)
9
+ class SomeService < LHS::Service
10
+ endpoint ':datastore/content-ads/:campaign_id/feedbacks'
11
+ endpoint ':datastore/feedbacks'
12
+ end
13
+ end
14
+
15
+ context 'first' do
16
+
17
+ it 'finds a single record' do
18
+ stub_request(:get, "#{datastore}/feedbacks?limit=1")
19
+ .to_return(status: 200, body: load_json(:feedback))
20
+
21
+ SomeService.first.source_id
22
+ end
23
+
24
+ it 'returns nil if no record was found' do
25
+ stub_request(:get, "#{datastore}/feedbacks?limit=1")
26
+ .to_return(status: 404)
27
+ expect(SomeService.first).to be_nil
28
+ end
29
+ end
30
+
31
+ context 'first!' do
32
+
33
+ it 'raises if nothing was found with parameters' do
34
+ stub_request(:get, "#{datastore}/feedbacks?limit=1")
35
+ .to_return(status: 404)
36
+ expect { SomeService.first! }.to raise_error LHC::NotFound
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ require 'rails_helper'
2
+
3
+ describe LHS::Service do
4
+
5
+ let(:datastore) { 'http://datastore-stg.lb-service.sunrise.intra.local.ch/v2' }
6
+ before(:each) { LHC.config.placeholder('datastore', datastore) }
7
+
8
+ context 'includes' do
9
+
10
+ before(:each) do
11
+ class Feedback < LHS::Service
12
+ endpoint ':datastore/feedbacks'
13
+ end
14
+
15
+ stub_request(:get, "#{datastore}/content-ads/51dfc5690cf271c375c5a12d")
16
+ .to_return(status: 200, body: {
17
+ "href" => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d",
18
+ "entry" => {
19
+ "href" => "#{datastore}/local-entries/lakj35asdflkj1203va"
20
+ }
21
+ }.to_json)
22
+
23
+ stub_request(:get, "#{datastore}/local-entries/lakj35asdflkj1203va")
24
+ .to_return(status: 200, body: {
25
+ "name" => 'Casa Ferlin'
26
+ }.to_json)
27
+ end
28
+
29
+ it 'includes linked resources while fetching multiple resources from one service' do
30
+
31
+ stub_request(:get, "#{datastore}/feedbacks?has_reviews=true")
32
+ .to_return(status: 200, body: {
33
+ items:[
34
+ {
35
+ "href" => "#{datastore}/feedbacks/-Sc4_pYNpqfsudzhtivfkA",
36
+ "campaign" => {
37
+ "href" => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d"
38
+ }
39
+ }
40
+ ]
41
+ }.to_json)
42
+
43
+ feedbacks = Feedback.includes(campaign: :entry).where(has_reviews: true)
44
+ expect(feedbacks.first.campaign.entry.name).to eq 'Casa Ferlin'
45
+ end
46
+
47
+ it 'includes linked resources while fetching a single resource from one service' do
48
+
49
+ stub_request(:get, "#{datastore}/feedbacks/123")
50
+ .to_return(status: 200, body: {
51
+ "href" => "#{datastore}/feedbacks/-Sc4_pYNpqfsudzhtivfkA",
52
+ "campaign" => {
53
+ "href" => "#{datastore}/content-ads/51dfc5690cf271c375c5a12d"
54
+ }
55
+ }.to_json)
56
+
57
+ feedbacks = Feedback.includes(campaign: :entry).find(123)
58
+ expect(feedbacks.campaign.entry.name).to eq 'Casa Ferlin'
59
+ end
60
+ end
61
+ end