dhs 1.0.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 (301) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/rubocop.yml +27 -0
  3. data/.github/workflows/test.yml +27 -0
  4. data/.gitignore +39 -0
  5. data/.rubocop.yml +186 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE +674 -0
  9. data/README.md +2807 -0
  10. data/Rakefile +26 -0
  11. data/dhs.gemspec +44 -0
  12. data/docs/accessing-data.png +0 -0
  13. data/lib/dhs.rb +67 -0
  14. data/lib/dhs/collection.rb +84 -0
  15. data/lib/dhs/complex.rb +158 -0
  16. data/lib/dhs/concerns/autoload_records.rb +57 -0
  17. data/lib/dhs/concerns/collection/handle_nested.rb +43 -0
  18. data/lib/dhs/concerns/collection/internal_collection.rb +74 -0
  19. data/lib/dhs/concerns/configuration.rb +20 -0
  20. data/lib/dhs/concerns/data/becomes.rb +18 -0
  21. data/lib/dhs/concerns/data/equality.rb +14 -0
  22. data/lib/dhs/concerns/data/extend.rb +87 -0
  23. data/lib/dhs/concerns/data/json.rb +14 -0
  24. data/lib/dhs/concerns/data/to_hash.rb +14 -0
  25. data/lib/dhs/concerns/inspect.rb +70 -0
  26. data/lib/dhs/concerns/is_href.rb +15 -0
  27. data/lib/dhs/concerns/item/destroy.rb +38 -0
  28. data/lib/dhs/concerns/item/endpoint_lookup.rb +27 -0
  29. data/lib/dhs/concerns/item/save.rb +55 -0
  30. data/lib/dhs/concerns/item/update.rb +50 -0
  31. data/lib/dhs/concerns/item/validation.rb +61 -0
  32. data/lib/dhs/concerns/o_auth.rb +25 -0
  33. data/lib/dhs/concerns/option_blocks.rb +26 -0
  34. data/lib/dhs/concerns/proxy/accessors.rb +132 -0
  35. data/lib/dhs/concerns/proxy/create.rb +45 -0
  36. data/lib/dhs/concerns/proxy/link.rb +25 -0
  37. data/lib/dhs/concerns/proxy/problems.rb +27 -0
  38. data/lib/dhs/concerns/record/attribute_assignment.rb +25 -0
  39. data/lib/dhs/concerns/record/batch.rb +40 -0
  40. data/lib/dhs/concerns/record/chainable.rb +465 -0
  41. data/lib/dhs/concerns/record/configuration.rb +103 -0
  42. data/lib/dhs/concerns/record/create.rb +24 -0
  43. data/lib/dhs/concerns/record/custom_setters.rb +22 -0
  44. data/lib/dhs/concerns/record/destroy.rb +18 -0
  45. data/lib/dhs/concerns/record/endpoints.rb +108 -0
  46. data/lib/dhs/concerns/record/equality.rb +14 -0
  47. data/lib/dhs/concerns/record/find.rb +86 -0
  48. data/lib/dhs/concerns/record/find_by.rb +38 -0
  49. data/lib/dhs/concerns/record/first.rb +20 -0
  50. data/lib/dhs/concerns/record/href_for.rb +19 -0
  51. data/lib/dhs/concerns/record/last.rb +27 -0
  52. data/lib/dhs/concerns/record/mapping.rb +25 -0
  53. data/lib/dhs/concerns/record/merge.rb +26 -0
  54. data/lib/dhs/concerns/record/model.rb +23 -0
  55. data/lib/dhs/concerns/record/pagination.rb +49 -0
  56. data/lib/dhs/concerns/record/provider.rb +23 -0
  57. data/lib/dhs/concerns/record/relations.rb +26 -0
  58. data/lib/dhs/concerns/record/request.rb +581 -0
  59. data/lib/dhs/concerns/record/scope.rb +25 -0
  60. data/lib/dhs/concerns/record/tracing.rb +24 -0
  61. data/lib/dhs/concerns/record/update.rb +17 -0
  62. data/lib/dhs/config.rb +24 -0
  63. data/lib/dhs/data.rb +180 -0
  64. data/lib/dhs/endpoint.rb +12 -0
  65. data/lib/dhs/interceptors/auto_oauth/interceptor.rb +33 -0
  66. data/lib/dhs/interceptors/auto_oauth/thread_registry.rb +18 -0
  67. data/lib/dhs/interceptors/extended_rollbar/handler.rb +40 -0
  68. data/lib/dhs/interceptors/extended_rollbar/interceptor.rb +20 -0
  69. data/lib/dhs/interceptors/extended_rollbar/thread_registry.rb +19 -0
  70. data/lib/dhs/interceptors/request_cycle_cache/interceptor.rb +41 -0
  71. data/lib/dhs/interceptors/request_cycle_cache/thread_registry.rb +18 -0
  72. data/lib/dhs/item.rb +59 -0
  73. data/lib/dhs/pagination/base.rb +90 -0
  74. data/lib/dhs/pagination/link.rb +21 -0
  75. data/lib/dhs/pagination/offset.rb +22 -0
  76. data/lib/dhs/pagination/page.rb +18 -0
  77. data/lib/dhs/pagination/start.rb +22 -0
  78. data/lib/dhs/pagination/total_pages.rb +9 -0
  79. data/lib/dhs/problems/base.rb +113 -0
  80. data/lib/dhs/problems/errors.rb +69 -0
  81. data/lib/dhs/problems/nested/base.rb +54 -0
  82. data/lib/dhs/problems/nested/errors.rb +16 -0
  83. data/lib/dhs/problems/nested/warnings.rb +15 -0
  84. data/lib/dhs/problems/warnings.rb +24 -0
  85. data/lib/dhs/proxy.rb +69 -0
  86. data/lib/dhs/railtie.rb +34 -0
  87. data/lib/dhs/record.rb +112 -0
  88. data/lib/dhs/rspec.rb +10 -0
  89. data/lib/dhs/test/stubbable_records.rb +34 -0
  90. data/lib/dhs/unprocessable.rb +6 -0
  91. data/lib/dhs/version.rb +5 -0
  92. data/script/ci/build.sh +18 -0
  93. data/spec/auto_oauth_spec.rb +163 -0
  94. data/spec/autoloading_spec.rb +45 -0
  95. data/spec/collection/accessors_spec.rb +31 -0
  96. data/spec/collection/collection_items_spec.rb +44 -0
  97. data/spec/collection/configurable_spec.rb +43 -0
  98. data/spec/collection/delegate_spec.rb +21 -0
  99. data/spec/collection/enumerable_spec.rb +27 -0
  100. data/spec/collection/href_spec.rb +17 -0
  101. data/spec/collection/meta_data_spec.rb +58 -0
  102. data/spec/collection/respond_to_spec.rb +20 -0
  103. data/spec/collection/to_a_spec.rb +34 -0
  104. data/spec/collection/to_ary_spec.rb +40 -0
  105. data/spec/collection/without_object_items_spec.rb +27 -0
  106. data/spec/complex/reduce_spec.rb +202 -0
  107. data/spec/concerns/record/request_spec.rb +78 -0
  108. data/spec/data/collection_spec.rb +56 -0
  109. data/spec/data/equality_spec.rb +23 -0
  110. data/spec/data/inspect_spec.rb +88 -0
  111. data/spec/data/is_item_or_collection_spec.rb +40 -0
  112. data/spec/data/item_spec.rb +106 -0
  113. data/spec/data/merge_spec.rb +27 -0
  114. data/spec/data/parent_spec.rb +39 -0
  115. data/spec/data/raw_spec.rb +48 -0
  116. data/spec/data/respond_to_spec.rb +26 -0
  117. data/spec/data/root_spec.rb +25 -0
  118. data/spec/data/select_spec.rb +27 -0
  119. data/spec/data/to_ary_spec.rb +28 -0
  120. data/spec/data/to_json_spec.rb +68 -0
  121. data/spec/dummy/Rakefile +8 -0
  122. data/spec/dummy/app/assets/images/.keep +0 -0
  123. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  124. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  125. data/spec/dummy/app/controllers/application_controller.rb +26 -0
  126. data/spec/dummy/app/controllers/automatic_authentication_controller.rb +29 -0
  127. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  128. data/spec/dummy/app/controllers/error_handling_with_chains_controller.rb +36 -0
  129. data/spec/dummy/app/controllers/extended_rollbar_controller.rb +10 -0
  130. data/spec/dummy/app/controllers/option_blocks_controller.rb +15 -0
  131. data/spec/dummy/app/controllers/request_cycle_cache_controller.rb +27 -0
  132. data/spec/dummy/app/helpers/application_helper.rb +4 -0
  133. data/spec/dummy/app/mailers/.keep +0 -0
  134. data/spec/dummy/app/models/.keep +0 -0
  135. data/spec/dummy/app/models/concerns/.keep +0 -0
  136. data/spec/dummy/app/models/concerns/dummy_customer/some_concern.rb +9 -0
  137. data/spec/dummy/app/models/dummy_customer.rb +7 -0
  138. data/spec/dummy/app/models/dummy_record.rb +6 -0
  139. data/spec/dummy/app/models/dummy_record_with_auto_oauth_provider.rb +6 -0
  140. data/spec/dummy/app/models/dummy_record_with_multiple_oauth_providers1.rb +7 -0
  141. data/spec/dummy/app/models/dummy_record_with_multiple_oauth_providers2.rb +7 -0
  142. data/spec/dummy/app/models/dummy_record_with_multiple_providers_per_endpoint.rb +6 -0
  143. data/spec/dummy/app/models/dummy_record_with_oauth.rb +7 -0
  144. data/spec/dummy/app/models/dummy_user.rb +6 -0
  145. data/spec/dummy/app/models/providers/customer_system.rb +7 -0
  146. data/spec/dummy/app/models/providers/internal_services.rb +7 -0
  147. data/spec/dummy/app/views/error_handling_with_chains/error.html.erb +1 -0
  148. data/spec/dummy/app/views/error_handling_with_chains/show.html.erb +3 -0
  149. data/spec/dummy/app/views/form_for.html.erb +5 -0
  150. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  151. data/spec/dummy/bin/bundle +5 -0
  152. data/spec/dummy/bin/rails +6 -0
  153. data/spec/dummy/bin/rake +6 -0
  154. data/spec/dummy/config.ru +6 -0
  155. data/spec/dummy/config/application.rb +16 -0
  156. data/spec/dummy/config/boot.rb +7 -0
  157. data/spec/dummy/config/environment.rb +7 -0
  158. data/spec/dummy/config/environments/development.rb +36 -0
  159. data/spec/dummy/config/environments/production.rb +77 -0
  160. data/spec/dummy/config/environments/test.rb +40 -0
  161. data/spec/dummy/config/initializers/assets.rb +10 -0
  162. data/spec/dummy/config/initializers/backtrace_silencers.rb +9 -0
  163. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  164. data/spec/dummy/config/initializers/dhs.rb +5 -0
  165. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  166. data/spec/dummy/config/initializers/inflections.rb +18 -0
  167. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  168. data/spec/dummy/config/initializers/rollbar.rb +9 -0
  169. data/spec/dummy/config/initializers/session_store.rb +5 -0
  170. data/spec/dummy/config/initializers/wrap_parameters.rb +11 -0
  171. data/spec/dummy/config/locales/en.yml +23 -0
  172. data/spec/dummy/config/routes.rb +27 -0
  173. data/spec/dummy/config/secrets.yml +22 -0
  174. data/spec/dummy/lib/assets/.keep +0 -0
  175. data/spec/dummy/public/404.html +67 -0
  176. data/spec/dummy/public/422.html +67 -0
  177. data/spec/dummy/public/500.html +66 -0
  178. data/spec/dummy/public/favicon.ico +0 -0
  179. data/spec/endpoint/for_url_spec.rb +27 -0
  180. data/spec/extended_rollbar_spec.rb +67 -0
  181. data/spec/item/access_errors_spec.rb +31 -0
  182. data/spec/item/accessors_spec.rb +21 -0
  183. data/spec/item/add_error_spec.rb +21 -0
  184. data/spec/item/becomes_spec.rb +38 -0
  185. data/spec/item/blacklisted_keywords_spec.rb +28 -0
  186. data/spec/item/delegate_spec.rb +32 -0
  187. data/spec/item/destroy_spec.rb +113 -0
  188. data/spec/item/dig_spec.rb +29 -0
  189. data/spec/item/error_codes_spec.rb +55 -0
  190. data/spec/item/errors_spec.rb +324 -0
  191. data/spec/item/fetch_spec.rb +39 -0
  192. data/spec/item/getter_spec.rb +24 -0
  193. data/spec/item/internal_data_structure_spec.rb +37 -0
  194. data/spec/item/map_spec.rb +46 -0
  195. data/spec/item/nested_errors_spec.rb +27 -0
  196. data/spec/item/partial_update_spec.rb +168 -0
  197. data/spec/item/respond_to_spec.rb +31 -0
  198. data/spec/item/save_spec.rb +115 -0
  199. data/spec/item/setter_spec.rb +44 -0
  200. data/spec/item/translate_errors_spec.rb +257 -0
  201. data/spec/item/update_spec.rb +161 -0
  202. data/spec/item/validation_spec.rb +131 -0
  203. data/spec/item/warning_codes_spec.rb +55 -0
  204. data/spec/item/warnings_spec.rb +51 -0
  205. data/spec/option_blocks/ensure_reset_between_requests_spec.rb +23 -0
  206. data/spec/option_blocks/main_spec.rb +54 -0
  207. data/spec/pagination/link/current_page_spec.rb +19 -0
  208. data/spec/pagination/link/pages_left_spec.rb +36 -0
  209. data/spec/pagination/link/parallel_spec.rb +19 -0
  210. data/spec/pagination/link/total_spec.rb +45 -0
  211. data/spec/pagination/offset/pages_left_spec.rb +26 -0
  212. data/spec/pagination/parameters_spec.rb +59 -0
  213. data/spec/pagination/total_pages_spec.rb +51 -0
  214. data/spec/proxy/create_sub_resource_spec.rb +182 -0
  215. data/spec/proxy/load_spec.rb +75 -0
  216. data/spec/proxy/record_identification_spec.rb +35 -0
  217. data/spec/rails_helper.rb +13 -0
  218. data/spec/record/all_spec.rb +133 -0
  219. data/spec/record/attribute_assignment_spec.rb +28 -0
  220. data/spec/record/build_spec.rb +26 -0
  221. data/spec/record/cast_nested_data_spec.rb +80 -0
  222. data/spec/record/compact_spec.rb +93 -0
  223. data/spec/record/create_spec.rb +160 -0
  224. data/spec/record/creation_failed_spec.rb +55 -0
  225. data/spec/record/custom_setters_spec.rb +42 -0
  226. data/spec/record/definitions_spec.rb +29 -0
  227. data/spec/record/destroy_spec.rb +38 -0
  228. data/spec/record/dig_configuration_spec.rb +75 -0
  229. data/spec/record/dup_spec.rb +20 -0
  230. data/spec/record/endpoint_inheritance_spec.rb +65 -0
  231. data/spec/record/endpoint_options_spec.rb +51 -0
  232. data/spec/record/endpoint_priorities_spec.rb +24 -0
  233. data/spec/record/endpoints_spec.rb +96 -0
  234. data/spec/record/equality_spec.rb +27 -0
  235. data/spec/record/error_handling_integration_spec.rb +25 -0
  236. data/spec/record/error_handling_spec.rb +40 -0
  237. data/spec/record/expanded_spec.rb +69 -0
  238. data/spec/record/fetch_spec.rb +40 -0
  239. data/spec/record/find_by_chains_spec.rb +21 -0
  240. data/spec/record/find_by_spec.rb +76 -0
  241. data/spec/record/find_each_spec.rb +57 -0
  242. data/spec/record/find_in_batches_spec.rb +122 -0
  243. data/spec/record/find_in_parallel_spec.rb +67 -0
  244. data/spec/record/find_spec.rb +103 -0
  245. data/spec/record/first_spec.rb +39 -0
  246. data/spec/record/force_merge_spec.rb +55 -0
  247. data/spec/record/handle_includes_errors_spec.rb +33 -0
  248. data/spec/record/has_many_spec.rb +118 -0
  249. data/spec/record/has_one_spec.rb +114 -0
  250. data/spec/record/href_for_spec.rb +24 -0
  251. data/spec/record/ignore_errors_spec.rb +137 -0
  252. data/spec/record/immutable_chains_spec.rb +22 -0
  253. data/spec/record/includes_after_expansion_spec.rb +70 -0
  254. data/spec/record/includes_expanded_spec.rb +37 -0
  255. data/spec/record/includes_first_page_spec.rb +738 -0
  256. data/spec/record/includes_missing_spec.rb +57 -0
  257. data/spec/record/includes_spec.rb +690 -0
  258. data/spec/record/includes_warning_spec.rb +46 -0
  259. data/spec/record/item_key_spec.rb +81 -0
  260. data/spec/record/items_created_key_configuration_spec.rb +37 -0
  261. data/spec/record/last_spec.rb +64 -0
  262. data/spec/record/loading_twice_spec.rb +19 -0
  263. data/spec/record/mapping_spec.rb +103 -0
  264. data/spec/record/model_name_spec.rb +17 -0
  265. data/spec/record/new_spec.rb +106 -0
  266. data/spec/record/options_getter_spec.rb +25 -0
  267. data/spec/record/options_spec.rb +164 -0
  268. data/spec/record/paginatable_collection_spec.rb +360 -0
  269. data/spec/record/pagination_chain_spec.rb +101 -0
  270. data/spec/record/pagination_links_spec.rb +72 -0
  271. data/spec/record/pagination_spec.rb +71 -0
  272. data/spec/record/persisted_spec.rb +52 -0
  273. data/spec/record/provider_spec.rb +40 -0
  274. data/spec/record/references_spec.rb +95 -0
  275. data/spec/record/relation_caching_spec.rb +120 -0
  276. data/spec/record/reload_by_id_spec.rb +43 -0
  277. data/spec/record/reload_spec.rb +64 -0
  278. data/spec/record/request_spec.rb +90 -0
  279. data/spec/record/save_spec.rb +40 -0
  280. data/spec/record/scope_chains_spec.rb +39 -0
  281. data/spec/record/select_spec.rb +17 -0
  282. data/spec/record/to_ary_spec.rb +65 -0
  283. data/spec/record/to_hash_spec.rb +22 -0
  284. data/spec/record/to_json_spec.rb +22 -0
  285. data/spec/record/tracing_spec.rb +149 -0
  286. data/spec/record/update_spec.rb +61 -0
  287. data/spec/record/where_chains_spec.rb +57 -0
  288. data/spec/record/where_spec.rb +62 -0
  289. data/spec/record/where_values_hash_spec.rb +32 -0
  290. data/spec/request_cycle_cache_spec.rb +106 -0
  291. data/spec/require_dhs_spec.rb +9 -0
  292. data/spec/spec_helper.rb +6 -0
  293. data/spec/stubs/all_spec.rb +69 -0
  294. data/spec/support/fixtures/json/feedback.json +11 -0
  295. data/spec/support/fixtures/json/feedbacks.json +174 -0
  296. data/spec/support/fixtures/json/localina_content_ad.json +23 -0
  297. data/spec/support/load_json.rb +5 -0
  298. data/spec/support/request_cycle_cache.rb +10 -0
  299. data/spec/support/reset.rb +67 -0
  300. data/spec/views/form_for_spec.rb +20 -0
  301. metadata +783 -0
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Record::Request do
6
+ subject do
7
+ Class.new do
8
+ include DHS::Record::Configuration
9
+ include DHS::Record::Request
10
+ end
11
+ end
12
+
13
+ describe 'prepare_options_for_include_all_request' do
14
+ it 'calls correct prepare method for nil' do
15
+ expect(subject).to receive(:prepare_option_for_include_all_request!)
16
+ .with(nil).and_return('ignore')
17
+ expect(subject.send(:prepare_options_for_include_all_request!, nil)).to be_nil
18
+ end
19
+
20
+ it 'calls correct prepare method for a Hash' do
21
+ expect(subject).to receive(:prepare_option_for_include_all_request!)
22
+ .with(abc: 'def').and_return('ignore')
23
+ expect(subject.send(:prepare_options_for_include_all_request!, abc: 'def')).to eq(abc: 'def')
24
+ end
25
+
26
+ it 'calls correct prepare method for a Hash (collection)' do
27
+ expect(subject).to receive(:prepare_option_for_include_all_request!)
28
+ .with(abc: 'def').and_return('ignore')
29
+ expect(subject).to receive(:prepare_option_for_include_all_request!)
30
+ .with(hij: 'kel').and_return('ignore')
31
+ expect(subject.send(:prepare_options_for_include_all_request!, [{ abc: 'def' }, { hij: 'kel' }]))
32
+ .to eq([{ abc: 'def' }, { hij: 'kel' }])
33
+ end
34
+ end
35
+
36
+ describe 'prepare_option_for_incldue_all_request' do
37
+ it 'removes all limit and offset parameters' do
38
+ option = { url: 'http://localhost:3000/test/resource?abc=def&limit=1&offset=3&test=2' }
39
+ expect(subject.send(:prepare_option_for_include_all_request!, option))
40
+ .to eq(option)
41
+ expect(option).to eq(url: 'http://localhost:3000/test/resource',
42
+ params: { limit: 100, abc: 'def', test: '2' })
43
+ end
44
+
45
+ it 'do nothing without url' do
46
+ option = { param: { abc: 'def' } }
47
+ expect(subject.send(:prepare_option_for_include_all_request!, option))
48
+ .to eq(option)
49
+ expect(option).to eq(param: { abc: 'def' })
50
+ end
51
+
52
+ it 'raises an exception when url invalid' do
53
+ option = { param: { abc: 'def' }, url: 'http://ab de.com/resource' }
54
+ expect { subject.send(:prepare_option_for_include_all_request!, option) }
55
+ .to raise_exception(URI::InvalidURIError)
56
+ expect(option).to eq(param: { abc: 'def' }, url: 'http://ab de.com/resource')
57
+ end
58
+
59
+ it 'keeps current params over url params' do
60
+ option = { url: 'http://localhost:3000/test/resource?abc=def&limit=1&offset=3&test=2',
61
+ params: { abc: '123' } }
62
+ expect(subject.send(:prepare_option_for_include_all_request!, option))
63
+ .to eq(option)
64
+ expect(option).to eq(url: 'http://localhost:3000/test/resource',
65
+ params: { limit: 100, abc: '123', test: '2' })
66
+ end
67
+
68
+ it 'removes including and referening options' do
69
+ option = { url: 'http://localhost:3000/test/resource',
70
+ including: 'all',
71
+ referencing: 'nothing' }
72
+ expect(subject.send(:prepare_option_for_include_all_request!, option))
73
+ .to eq(option)
74
+ expect(option).to eq(url: 'http://localhost:3000/test/resource',
75
+ params: { limit: 100 })
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ let(:json) do
7
+ load_json(:feedbacks)
8
+ end
9
+
10
+ let(:data) do
11
+ DHS::Data.new(json, nil, Record)
12
+ end
13
+
14
+ before do
15
+ class Record < DHS::Record
16
+ endpoint '{+datastore}/v2/data'
17
+ end
18
+ end
19
+
20
+ context 'empty collection' do
21
+ let(:collection) do
22
+ DHS::Data.new({ items: [] }, nil, Record)
23
+ end
24
+
25
+ it 'provides correct count and length' do
26
+ expect(collection.count).to eq 0
27
+ expect(collection.length).to eq 0
28
+ end
29
+
30
+ it 'returns an empty array or map' do
31
+ expect(collection.map { |x| }).to eq []
32
+ end
33
+ end
34
+
35
+ context 'collections' do
36
+ it 'forwards calls to the collection' do
37
+ expect(data.count).to be_kind_of Integer
38
+ expect(data[0]).to be_kind_of Record
39
+ expect(data.sample).to be_kind_of Record
40
+ end
41
+
42
+ it 'provides a total method to get the number of total records' do
43
+ expect(data.total).to be_kind_of Integer
44
+ end
45
+ end
46
+
47
+ context 'collections from arrays' do
48
+ let(:data) do
49
+ DHS::Data.new([1, 2, 3, 4])
50
+ end
51
+
52
+ it 'uses collection as proxy for arrays' do
53
+ expect(data._proxy).to be_kind_of DHS::Collection
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ context 'equality' do
7
+ before do
8
+ class Record < DHS::Record
9
+ endpoint 'http://depay.fi/records'
10
+ end
11
+ end
12
+
13
+ let(:raw) do
14
+ { name: 'Steve' }
15
+ end
16
+
17
+ it 'is equal when two data objects share the same raw data' do
18
+ expect(
19
+ DHS::Data.new(raw, nil, Record)
20
+ ).to eq DHS::Data.new(raw, nil, Record)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ context 'inspect' do
7
+ def expect_inspect_to_look_like(data, string)
8
+ expect(data.inspect).to eq string.gsub(/ +/, '').strip
9
+ end
10
+
11
+ before do
12
+ class Record < DHS::Record
13
+ endpoint 'http://depay.fi/records'
14
+ endpoint 'http://depay.fi/records/{id}'
15
+ end
16
+ end
17
+
18
+ let(:raw) do
19
+ { pets: [
20
+ {
21
+ name: 'Steve',
22
+ kind: {
23
+ animal: {
24
+ type: 'Monkey'
25
+ }
26
+ }
27
+ }
28
+ ] }
29
+ end
30
+
31
+ let(:record) do
32
+ stub_request(:get, 'http://depay.fi/records/1').to_return(body: raw.to_json)
33
+ Record.find(1)
34
+ end
35
+
36
+ let(:data) do
37
+ DHS::Data.new(raw, nil, Record).pets.first
38
+ end
39
+
40
+ it 'prints inspected data on multiple lines' do
41
+ expect_inspect_to_look_like data, %{
42
+ Data of Record #{data.object_id}
43
+ > pets > 0
44
+ :name => \"Steve\"
45
+ :kind => {:animal=>{:type=>\"Monkey\"}}
46
+ }
47
+ end
48
+
49
+ context 'breadcrumb' do
50
+ let(:data) { record.pets.first.kind.animal }
51
+
52
+ it 'prints the breadcrumb that shows you the current location within the main record' do
53
+ expect_inspect_to_look_like data, %{
54
+ Data of Record #{data.object_id}
55
+ > pets > 0 > kind > animal
56
+ :type => \"Monkey\"
57
+ }
58
+ end
59
+ end
60
+
61
+ context 'href as id' do
62
+ let(:href) { 'http://datastore/places/1' }
63
+ let(:raw) { { href: href, items: [{ name: 'Steve' }] } }
64
+ let(:data) { record.first }
65
+
66
+ it 'prints href as object id' do
67
+ expect_inspect_to_look_like data, %{
68
+ Record #{href}
69
+ :name => \"Steve\"
70
+ }
71
+ end
72
+ end
73
+
74
+ context 'id attribute as id' do
75
+ let(:id) { 1 }
76
+ let(:raw) { { id: id, name: 'Steve' } }
77
+ let(:data) { record }
78
+
79
+ it 'prints id attribute as object id' do
80
+ expect_inspect_to_look_like data, %{
81
+ Record #{id}
82
+ :id => 1
83
+ :name => \"Steve\"
84
+ }
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ before do
7
+ class Record < DHS::Record
8
+ endpoint 'http://depay.fi/records'
9
+ end
10
+ end
11
+
12
+ let(:item) do
13
+ {
14
+ customer: {
15
+ addresses: [
16
+ {
17
+ first_line: 'Bachstr. 6'
18
+ }
19
+ ]
20
+ }
21
+ }
22
+ end
23
+
24
+ let(:data) do
25
+ DHS::Data.new(
26
+ {
27
+ href: 'http://depay.fi/records',
28
+ items: [item]
29
+ }, nil, Record
30
+ )
31
+ end
32
+
33
+ it 'provides the information which type of proxy data ist' do
34
+ expect(data.collection?).to eq true
35
+ expect(data.first.item?).to eq true
36
+ expect(data.first.customer.item?).to eq true
37
+ expect(data.first.customer.addresses.collection?).to eq true
38
+ expect(data.first.customer.addresses.first.item?).to eq true
39
+ end
40
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ before do
7
+ class Record < DHS::Record
8
+ endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
9
+ endpoint '{+datastore}/v2/feedbacks'
10
+ end
11
+ end
12
+
13
+ let(:json) do
14
+ load_json(:feedbacks)
15
+ end
16
+
17
+ let(:data) do
18
+ DHS::Data.new(json, nil, Record)
19
+ end
20
+
21
+ let(:item) do
22
+ data[0]
23
+ end
24
+
25
+ context 'item' do
26
+ it 'makes data accessible' do
27
+ expect(item.href).to be_kind_of String
28
+ expect(item.recommended).to be_kind_of TrueClass
29
+ expect(item.average_rating).to be_kind_of Float
30
+ end
31
+
32
+ it 'returns nil if no data is present' do
33
+ expect(item.something).to eq nil
34
+ end
35
+
36
+ it 'returns TimeWithZone if string can be parsed as date_time' do
37
+ expect(item.created_date).to be_kind_of ActiveSupport::TimeWithZone
38
+ end
39
+
40
+ it 'returns date if string can be parsed as date' do
41
+ expect(item.valid_from).to be_kind_of Date
42
+ end
43
+ end
44
+
45
+ context 'different date time formats' do
46
+ context 'with numbered time zone' do
47
+ let(:item) do
48
+ item = data[0]
49
+ item._raw[:created_date] = '2016-07-09T13:45:00+02:00'
50
+ item
51
+ end
52
+
53
+ it 'returns TimeWithZone if string can be parsed as date_time' do
54
+ expect(item.created_date).to be_kind_of ActiveSupport::TimeWithZone
55
+ end
56
+
57
+ it 'has UTC time zone' do
58
+ expect(item.created_date.zone).to eq('UTC')
59
+ end
60
+
61
+ it 'has the right time' do
62
+ expect(item.created_date.hour).to eq(11)
63
+ end
64
+ end
65
+
66
+ context 'with lettered time zone' do
67
+ let(:item) do
68
+ item = data[0]
69
+ item._raw[:created_date] = '2016-07-09T13:45:00Z'
70
+ item
71
+ end
72
+
73
+ it 'returns TimeWithZone if string can be parsed as date_time' do
74
+ expect(item.created_date).to be_kind_of ActiveSupport::TimeWithZone
75
+ end
76
+
77
+ it 'has UTC time zone' do
78
+ expect(item.created_date.zone).to eq('UTC')
79
+ end
80
+
81
+ it 'has the right time' do
82
+ expect(item.created_date.hour).to eq(13)
83
+ end
84
+ end
85
+
86
+ context 'without seconds' do
87
+ let(:item) do
88
+ item = data[0]
89
+ item._raw[:created_date] = '2016-07-09T13:45Z'
90
+ item
91
+ end
92
+
93
+ it 'returns TimeWithZone if string can be parsed as date_time' do
94
+ expect(item.created_date).to be_kind_of ActiveSupport::TimeWithZone
95
+ end
96
+
97
+ it 'has UTC time zone' do
98
+ expect(item.created_date.zone).to eq('UTC')
99
+ end
100
+
101
+ it 'has the right time' do
102
+ expect(item.created_date.hour).to eq(13)
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ before do
7
+ class Record < DHS::Record
8
+ endpoint '{+datastore}/v2/{campaign_id}/feedbacks'
9
+ endpoint '{+datastore}/v2/feedbacks'
10
+ end
11
+ end
12
+
13
+ let(:data) do
14
+ DHS::Data.new({ href: 'http://www.depay.fi/v2/stuff' }, nil, Record)
15
+ end
16
+
17
+ let(:loaded_data) do
18
+ DHS::Data.new({ href: 'http://www.depay.fi/v2/stuff', id: '123123123' }, nil, Record)
19
+ end
20
+
21
+ context 'merging' do
22
+ it 'merges data' do
23
+ data.merge_raw!(loaded_data)
24
+ expect(data.id).to eq loaded_data.id
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe DHS::Data do
6
+ before do
7
+ class Record < DHS::Record
8
+ endpoint 'http://depay.fi/records'
9
+ end
10
+ end
11
+
12
+ let(:item) do
13
+ {
14
+ customer: {
15
+ address: {
16
+ first_line: 'Bachstr. 6'
17
+ }
18
+ }
19
+ }
20
+ end
21
+
22
+ let(:data) do
23
+ DHS::Data.new(
24
+ {
25
+ href: 'http://depay.fi/records',
26
+ items: [item]
27
+ }, nil, Record
28
+ )
29
+ end
30
+
31
+ it 'possible to navigate the parent' do
32
+ expect(
33
+ data.first.customer.address.parent
34
+ ).to eq data.first.customer
35
+ expect(
36
+ data.first.customer.address.parent.parent
37
+ ).to eq data.first
38
+ end
39
+ end