lhc 12.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 (195) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +37 -0
  3. data/.rubocop.localch.yml +325 -0
  4. data/.rubocop.yml +61 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +13 -0
  7. data/Gemfile.activesupport4 +4 -0
  8. data/Gemfile.activesupport5 +4 -0
  9. data/Gemfile.activesupport6 +4 -0
  10. data/LICENSE +674 -0
  11. data/README.md +984 -0
  12. data/Rakefile +25 -0
  13. data/cider-ci.yml +6 -0
  14. data/cider-ci/bin/bundle +51 -0
  15. data/cider-ci/bin/ruby_install +8 -0
  16. data/cider-ci/bin/ruby_version +25 -0
  17. data/cider-ci/jobs/rspec-activesupport-4.yml +28 -0
  18. data/cider-ci/jobs/rspec-activesupport-5.yml +27 -0
  19. data/cider-ci/jobs/rspec-activesupport-6.yml +28 -0
  20. data/cider-ci/jobs/rubocop.yml +18 -0
  21. data/cider-ci/task_components/bundle.yml +22 -0
  22. data/cider-ci/task_components/rspec.yml +36 -0
  23. data/cider-ci/task_components/rubocop.yml +29 -0
  24. data/cider-ci/task_components/ruby.yml +15 -0
  25. data/friday.yml +3 -0
  26. data/lhc.gemspec +39 -0
  27. data/lib/core_ext/hash/deep_transform_values.rb +48 -0
  28. data/lib/lhc.rb +136 -0
  29. data/lib/lhc/concerns/lhc/basic_methods_concern.rb +42 -0
  30. data/lib/lhc/concerns/lhc/configuration_concern.rb +20 -0
  31. data/lib/lhc/concerns/lhc/fix_invalid_encoding_concern.rb +42 -0
  32. data/lib/lhc/concerns/lhc/formats_concern.rb +25 -0
  33. data/lib/lhc/concerns/lhc/request/user_agent_concern.rb +25 -0
  34. data/lib/lhc/config.rb +47 -0
  35. data/lib/lhc/endpoint.rb +119 -0
  36. data/lib/lhc/error.rb +80 -0
  37. data/lib/lhc/errors/client_error.rb +73 -0
  38. data/lib/lhc/errors/parser_error.rb +4 -0
  39. data/lib/lhc/errors/server_error.rb +28 -0
  40. data/lib/lhc/errors/timeout.rb +4 -0
  41. data/lib/lhc/errors/unknown_error.rb +4 -0
  42. data/lib/lhc/format.rb +18 -0
  43. data/lib/lhc/formats.rb +8 -0
  44. data/lib/lhc/formats/form.rb +45 -0
  45. data/lib/lhc/formats/json.rb +55 -0
  46. data/lib/lhc/formats/multipart.rb +45 -0
  47. data/lib/lhc/formats/plain.rb +42 -0
  48. data/lib/lhc/interceptor.rb +32 -0
  49. data/lib/lhc/interceptors.rb +26 -0
  50. data/lib/lhc/interceptors/auth.rb +98 -0
  51. data/lib/lhc/interceptors/caching.rb +127 -0
  52. data/lib/lhc/interceptors/default_timeout.rb +16 -0
  53. data/lib/lhc/interceptors/logging.rb +37 -0
  54. data/lib/lhc/interceptors/monitoring.rb +63 -0
  55. data/lib/lhc/interceptors/prometheus.rb +51 -0
  56. data/lib/lhc/interceptors/retry.rb +41 -0
  57. data/lib/lhc/interceptors/rollbar.rb +36 -0
  58. data/lib/lhc/interceptors/throttle.rb +81 -0
  59. data/lib/lhc/interceptors/zipkin.rb +110 -0
  60. data/lib/lhc/railtie.rb +10 -0
  61. data/lib/lhc/request.rb +157 -0
  62. data/lib/lhc/response.rb +60 -0
  63. data/lib/lhc/response/data.rb +28 -0
  64. data/lib/lhc/response/data/base.rb +22 -0
  65. data/lib/lhc/response/data/collection.rb +16 -0
  66. data/lib/lhc/response/data/item.rb +29 -0
  67. data/lib/lhc/rspec.rb +12 -0
  68. data/lib/lhc/test/cache_helper.rb +3 -0
  69. data/lib/lhc/version.rb +5 -0
  70. data/script/ci/build.sh +19 -0
  71. data/spec/basic_methods/delete_spec.rb +34 -0
  72. data/spec/basic_methods/get_spec.rb +49 -0
  73. data/spec/basic_methods/post_spec.rb +42 -0
  74. data/spec/basic_methods/put_spec.rb +48 -0
  75. data/spec/basic_methods/request_spec.rb +19 -0
  76. data/spec/basic_methods/request_without_rails_spec.rb +29 -0
  77. data/spec/config/endpoints_spec.rb +63 -0
  78. data/spec/config/placeholders_spec.rb +32 -0
  79. data/spec/core_ext/hash/deep_transform_values_spec.rb +24 -0
  80. data/spec/dummy/README.rdoc +28 -0
  81. data/spec/dummy/Rakefile +8 -0
  82. data/spec/dummy/app/assets/config/manifest.js +3 -0
  83. data/spec/dummy/app/assets/images/.keep +0 -0
  84. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  85. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  86. data/spec/dummy/app/controllers/application_controller.rb +7 -0
  87. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  88. data/spec/dummy/app/helpers/application_helper.rb +4 -0
  89. data/spec/dummy/app/mailers/.keep +0 -0
  90. data/spec/dummy/app/models/.keep +0 -0
  91. data/spec/dummy/app/models/concerns/.keep +0 -0
  92. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  93. data/spec/dummy/bin/bundle +5 -0
  94. data/spec/dummy/bin/rails +6 -0
  95. data/spec/dummy/bin/rake +6 -0
  96. data/spec/dummy/config.ru +6 -0
  97. data/spec/dummy/config/application.rb +16 -0
  98. data/spec/dummy/config/boot.rb +7 -0
  99. data/spec/dummy/config/environment.rb +7 -0
  100. data/spec/dummy/config/environments/development.rb +36 -0
  101. data/spec/dummy/config/environments/production.rb +77 -0
  102. data/spec/dummy/config/environments/test.rb +41 -0
  103. data/spec/dummy/config/initializers/assets.rb +10 -0
  104. data/spec/dummy/config/initializers/backtrace_silencers.rb +9 -0
  105. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  106. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  107. data/spec/dummy/config/initializers/inflections.rb +18 -0
  108. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  109. data/spec/dummy/config/initializers/session_store.rb +5 -0
  110. data/spec/dummy/config/initializers/wrap_parameters.rb +11 -0
  111. data/spec/dummy/config/locales/en.yml +23 -0
  112. data/spec/dummy/config/routes.rb +58 -0
  113. data/spec/dummy/config/secrets.yml +22 -0
  114. data/spec/dummy/lib/assets/.keep +0 -0
  115. data/spec/dummy/log/.keep +0 -0
  116. data/spec/dummy/public/404.html +67 -0
  117. data/spec/dummy/public/422.html +67 -0
  118. data/spec/dummy/public/500.html +66 -0
  119. data/spec/dummy/public/favicon.ico +0 -0
  120. data/spec/endpoint/compile_spec.rb +35 -0
  121. data/spec/endpoint/match_spec.rb +41 -0
  122. data/spec/endpoint/placeholders_spec.rb +30 -0
  123. data/spec/endpoint/remove_interpolated_params_spec.rb +17 -0
  124. data/spec/endpoint/values_as_params_spec.rb +31 -0
  125. data/spec/error/dup_spec.rb +12 -0
  126. data/spec/error/find_spec.rb +57 -0
  127. data/spec/error/response_spec.rb +17 -0
  128. data/spec/error/timeout_spec.rb +14 -0
  129. data/spec/error/to_s_spec.rb +80 -0
  130. data/spec/formats/form_spec.rb +27 -0
  131. data/spec/formats/json_spec.rb +66 -0
  132. data/spec/formats/multipart_spec.rb +26 -0
  133. data/spec/formats/plain_spec.rb +29 -0
  134. data/spec/interceptors/after_request_spec.rb +20 -0
  135. data/spec/interceptors/after_response_spec.rb +39 -0
  136. data/spec/interceptors/auth/basic_auth_spec.rb +17 -0
  137. data/spec/interceptors/auth/bearer_spec.rb +19 -0
  138. data/spec/interceptors/auth/reauthentication_configuration_spec.rb +61 -0
  139. data/spec/interceptors/auth/reauthentication_spec.rb +44 -0
  140. data/spec/interceptors/before_request_spec.rb +21 -0
  141. data/spec/interceptors/before_response_spec.rb +20 -0
  142. data/spec/interceptors/caching/hydra_spec.rb +26 -0
  143. data/spec/interceptors/caching/main_spec.rb +73 -0
  144. data/spec/interceptors/caching/methods_spec.rb +42 -0
  145. data/spec/interceptors/caching/options_spec.rb +89 -0
  146. data/spec/interceptors/caching/parameters_spec.rb +24 -0
  147. data/spec/interceptors/caching/response_status_spec.rb +29 -0
  148. data/spec/interceptors/caching/to_cache_spec.rb +16 -0
  149. data/spec/interceptors/default_interceptors_spec.rb +15 -0
  150. data/spec/interceptors/default_timeout/main_spec.rb +34 -0
  151. data/spec/interceptors/define_spec.rb +29 -0
  152. data/spec/interceptors/dup_spec.rb +19 -0
  153. data/spec/interceptors/logging/main_spec.rb +37 -0
  154. data/spec/interceptors/monitoring/main_spec.rb +97 -0
  155. data/spec/interceptors/prometheus_spec.rb +54 -0
  156. data/spec/interceptors/response_competition_spec.rb +41 -0
  157. data/spec/interceptors/retry/main_spec.rb +73 -0
  158. data/spec/interceptors/return_response_spec.rb +38 -0
  159. data/spec/interceptors/rollbar/invalid_encoding_spec.rb +43 -0
  160. data/spec/interceptors/rollbar/main_spec.rb +57 -0
  161. data/spec/interceptors/throttle/main_spec.rb +106 -0
  162. data/spec/interceptors/throttle/reset_track_spec.rb +53 -0
  163. data/spec/interceptors/zipkin/distributed_tracing_spec.rb +135 -0
  164. data/spec/rails_helper.rb +6 -0
  165. data/spec/request/body_spec.rb +39 -0
  166. data/spec/request/encoding_spec.rb +37 -0
  167. data/spec/request/error_handling_spec.rb +88 -0
  168. data/spec/request/headers_spec.rb +12 -0
  169. data/spec/request/ignore_errors_spec.rb +73 -0
  170. data/spec/request/option_dup_spec.rb +13 -0
  171. data/spec/request/parallel_requests_spec.rb +59 -0
  172. data/spec/request/params_encoding_spec.rb +26 -0
  173. data/spec/request/request_without_rails_spec.rb +15 -0
  174. data/spec/request/url_patterns_spec.rb +54 -0
  175. data/spec/request/user_agent_spec.rb +26 -0
  176. data/spec/request/user_agent_without_rails_spec.rb +27 -0
  177. data/spec/response/body_spec.rb +16 -0
  178. data/spec/response/code_spec.rb +16 -0
  179. data/spec/response/data_accessor_spec.rb +29 -0
  180. data/spec/response/data_spec.rb +61 -0
  181. data/spec/response/effective_url_spec.rb +16 -0
  182. data/spec/response/headers_spec.rb +18 -0
  183. data/spec/response/options_spec.rb +18 -0
  184. data/spec/response/success_spec.rb +13 -0
  185. data/spec/response/time_spec.rb +21 -0
  186. data/spec/spec_helper.rb +8 -0
  187. data/spec/support/fixtures/json/feedback.json +11 -0
  188. data/spec/support/fixtures/json/feedbacks.json +164 -0
  189. data/spec/support/fixtures/json/localina_content_ad.json +23 -0
  190. data/spec/support/load_json.rb +5 -0
  191. data/spec/support/reset_config.rb +7 -0
  192. data/spec/support/zipkin_mock.rb +113 -0
  193. data/spec/timeouts/no_signal_spec.rb +13 -0
  194. data/spec/timeouts/timings_spec.rb +55 -0
  195. metadata +534 -0
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'active_support/core_ext/object/deep_dup'
5
+ require 'lhc/concerns/lhc/request/user_agent_concern'
6
+
7
+ # The request is doing an http-request using typhoeus.
8
+ # It provides functionalities to access and alter request data
9
+ # and it communicates with interceptors.
10
+ class LHC::Request
11
+ include UserAgentConcern
12
+
13
+ TYPHOEUS_OPTIONS ||= [:params, :method, :body, :headers, :follow_location, :params_encoding]
14
+
15
+ attr_accessor :response, :options, :raw, :format, :error_handler, :errors_ignored, :source
16
+
17
+ def initialize(options, self_executing = true)
18
+ self.errors_ignored = (options.fetch(:ignore, []) || []).to_a.compact
19
+ self.source = options&.dig(:source)
20
+ self.options = format!(options.deep_dup || {})
21
+ self.error_handler = options.delete :rescue
22
+ use_configured_endpoint!
23
+ generate_url_from_template!
24
+ self.interceptors = LHC::Interceptors.new(self)
25
+ interceptors.intercept(:before_raw_request)
26
+ self.raw = create_request
27
+ interceptors.intercept(:before_request)
28
+ run! if self_executing && !response
29
+ end
30
+
31
+ def url
32
+ raw.base_url || options[:url]
33
+ end
34
+
35
+ def method
36
+ (raw.options[:method] || options[:method] || :get).to_sym
37
+ end
38
+
39
+ def headers
40
+ raw.options.fetch(:headers, nil) || raw.options[:headers] = {}
41
+ end
42
+
43
+ def params
44
+ raw.options.fetch(:params, nil) || raw.options[:params] = {}
45
+ end
46
+
47
+ def error_ignored?
48
+ ignore_error?
49
+ end
50
+
51
+ def run!
52
+ raw.run
53
+ end
54
+
55
+ private
56
+
57
+ attr_accessor :interceptors
58
+
59
+ def format!(options)
60
+ self.format = options.delete(:format) || LHC::Formats::JSON.new
61
+ format.format_options(options)
62
+ end
63
+
64
+ def optionally_encoded_url(options)
65
+ return options[:url] unless options.fetch(:url_encoding, true)
66
+ encode_url(options[:url])
67
+ end
68
+
69
+ def create_request
70
+ request = Typhoeus::Request.new(
71
+ optionally_encoded_url(options),
72
+ translate_body(typhoeusize(options))
73
+ )
74
+ request.on_headers do
75
+ interceptors.intercept(:after_request)
76
+ interceptors.intercept(:before_response)
77
+ end
78
+ request.on_complete { |response| on_complete(response) }
79
+ request
80
+ end
81
+
82
+ def translate_body(options)
83
+ return options if options.fetch(:body, nil).blank?
84
+ options[:body] = format.to_body(options[:body])
85
+ options
86
+ end
87
+
88
+ def encode_url(url)
89
+ return url if url.nil?
90
+ URI.escape(url)
91
+ end
92
+
93
+ def typhoeusize(options)
94
+ options = options.deep_dup
95
+ easy = Ethon::Easy.new
96
+ options.delete(:url)
97
+ options.each do |key, _v|
98
+ next if TYPHOEUS_OPTIONS.include? key
99
+ method = "#{key}="
100
+ options.delete key unless easy.respond_to?(method)
101
+ end
102
+ options
103
+ end
104
+
105
+ # Get configured endpoint and use it for doing the request.
106
+ # Explicit request options are overriding configured options.
107
+ def use_configured_endpoint!
108
+ endpoint = LHC.config.endpoints[options[:url]]
109
+ return unless endpoint
110
+ # explicit options override endpoint options
111
+ new_options = endpoint.options.deep_merge(options)
112
+ # set new options
113
+ self.options = new_options
114
+ options[:url] = endpoint.url
115
+ end
116
+
117
+ # Generates URL from a URL template
118
+ def generate_url_from_template!
119
+ endpoint = LHC::Endpoint.new(options[:url])
120
+ params =
121
+ if format && options[:body].present? && options[:body].respond_to?(:as_json) && options[:body].as_json.is_a?(Hash)
122
+ options[:body].as_json.merge(options[:params] || {}).deep_symbolize_keys
123
+ else
124
+ options[:params]
125
+ end
126
+ options[:url] = endpoint.compile(params)
127
+ endpoint.remove_interpolated_params!(options[:params])
128
+ end
129
+
130
+ def on_complete(response)
131
+ self.response = LHC::Response.new(response, self)
132
+ interceptors.intercept(:after_response)
133
+ handle_error(self.response) unless self.response.success?
134
+ end
135
+
136
+ def handle_error(response)
137
+ return if ignore_error?
138
+ throw_error(response) unless error_handler
139
+ response.body_replacement = error_handler.call(response)
140
+ end
141
+
142
+ def ignore_error?
143
+ @ignore_error ||= begin
144
+ errors_ignored.detect do |ignored_error|
145
+ error <= ignored_error
146
+ end.present?
147
+ end
148
+ end
149
+
150
+ def error
151
+ @error ||= LHC::Error.find(response)
152
+ end
153
+
154
+ def throw_error(response)
155
+ raise error.new(error, response)
156
+ end
157
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module'
4
+
5
+ # The response contains the raw response (typhoeus)
6
+ # and provides functionality to access response data.
7
+ class LHC::Response
8
+ autoload :Data, 'lhc/response/data'
9
+
10
+ attr_accessor :request, :body_replacement
11
+ attr_reader :from_cache
12
+
13
+ delegate :effective_url, :code, :headers, :options, :mock, :success?, to: :raw
14
+ delegate :error_ignored?, to: :request
15
+ alias from_cache? from_cache
16
+
17
+ # A response is initalized with the underlying raw response (typhoeus in our case)
18
+ # and the associated request.
19
+ def initialize(raw, request, from_cache: false)
20
+ self.request = request
21
+ self.raw = raw
22
+ @from_cache = from_cache
23
+ end
24
+
25
+ def data
26
+ @data ||= body.present? ? LHC::Response::Data.new(self) : nil
27
+ end
28
+
29
+ def [](key)
30
+ data[key]
31
+ end
32
+
33
+ def body
34
+ body_replacement || raw.body.presence
35
+ end
36
+
37
+ # Provides response time in seconds
38
+ def time
39
+ raw.time || 0
40
+ end
41
+
42
+ # Provides response time in milliseconds
43
+ def time_ms
44
+ time * 1000
45
+ end
46
+
47
+ def timeout?
48
+ raw.timed_out?
49
+ end
50
+
51
+ def format
52
+ return LHC::Formats::JSON.new if request.nil?
53
+ request.format
54
+ end
55
+
56
+ private
57
+
58
+ attr_accessor :raw
59
+
60
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class LHC::Response::Data
4
+ autoload :Base, 'lhc/response/data/base'
5
+ autoload :Item, 'lhc/response/data/item'
6
+ autoload :Collection, 'lhc/response/data/collection'
7
+
8
+ include LHC::Response::Data::Base
9
+
10
+ def initialize(response, data: nil)
11
+ @response = response
12
+ @data = data
13
+
14
+ if as_json.is_a?(Hash)
15
+ @base = LHC::Response::Data::Item.new(response, data: data)
16
+ elsif as_json.is_a?(Array)
17
+ @base = LHC::Response::Data::Collection.new(response, data: data)
18
+ end
19
+ end
20
+
21
+ def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper
22
+ @base.send(method, *args, &block)
23
+ end
24
+
25
+ def respond_to_missing?(method_name, include_private = false)
26
+ @base.respond_to?(method_name, include_private) || super
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Response data is data provided through the response body
4
+ # but made accssible in the ruby world
5
+ module LHC::Response::Data::Base
6
+ def as_json
7
+ @json ||= (@data || response.format.as_json(response.body))
8
+ end
9
+
10
+ def as_open_struct
11
+ @open_struct ||=
12
+ if @data
13
+ JSON.parse(@data.to_json, object_class: OpenStruct)
14
+ else
15
+ response.format.as_open_struct(response.body)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :response
22
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class LHC::Response::Data::Collection < Array
4
+ include LHC::Response::Data::Base
5
+
6
+ def initialize(response, data: nil)
7
+ @response = response
8
+ @data = data
9
+
10
+ super(
11
+ as_json.map do |i|
12
+ LHC::Response::Data.new(response, data: i)
13
+ end
14
+ )
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class LHC::Response::Data::Item < OpenStruct
4
+ include LHC::Response::Data::Base
5
+
6
+ def initialize(response, data: nil)
7
+ @response = response
8
+ @data = data
9
+
10
+ set_dynamic_accessor_methods
11
+
12
+ super(as_json)
13
+ end
14
+
15
+ def [](key)
16
+ @hash ||= as_json.with_indifferent_access
17
+ @hash[key]
18
+ end
19
+
20
+ private
21
+
22
+ def set_dynamic_accessor_methods
23
+ as_json.keys.each do |key|
24
+ define_singleton_method key do |*args|
25
+ as_open_struct.send key, *args
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lhc'
4
+
5
+ RSpec.configure do |config|
6
+ LHC::Caching.cache = ActiveSupport::Cache::MemoryStore.new
7
+
8
+ config.before(:each) do
9
+ LHC::Caching.cache.clear
10
+ LHC::Throttle.track = nil
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ warn("[WARNING] require 'lhc/test/cache_helper.rb' is not needed any more! Just require 'lhc/rspec' in your spec helper instead.")
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LHC
4
+ VERSION ||= '12.0.0'
5
+ end
@@ -0,0 +1,19 @@
1
+ #!/bin/bash -e
2
+
3
+ # custom vars
4
+ # RUBY = ruby-1.9.3-p125
5
+ # GEMSET = location-app-${GitHub pull request id|branch name}
6
+ # standard vars
7
+
8
+ if [ -z "$SKIP_RVM" ]; then
9
+ [[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"
10
+ RUBY=${RUBY:-ruby-2.1.2}
11
+ GEMSET=${GEMSET:-LHC}
12
+ rvm use ${RUBY}@${GEMSET} --create
13
+ gem install bundler --no-rdoc --no-ri
14
+ fi
15
+
16
+ bundle install --local --quiet || bundle install --quiet
17
+ RAILS_ENV=test bundle exec rspec
18
+ bundle exec rspec non_rails_spec
19
+ rvm --force gemset delete ${RUBY}@${GEMSET}
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe LHC do
6
+ context 'delete' do
7
+ let(:feedback) do
8
+ {
9
+ recommended: true,
10
+ source_id: 'aaa',
11
+ content_ad_id: '1z-5r1fkaj'
12
+ }
13
+ end
14
+
15
+ before(:each) do
16
+ stub_request(:delete, "http://datastore/v2/feedbacks/12121")
17
+ .to_return(status: 200, body: feedback.to_json, headers: { 'Content-Encoding' => 'UTF-8' })
18
+ end
19
+
20
+ it 'does a delete request when providing a complete url' do
21
+ LHC.delete('http://datastore/v2/feedbacks/12121')
22
+ end
23
+
24
+ it 'makes response data available in a rails way' do
25
+ response = LHC.delete('http://datastore/v2/feedbacks/12121')
26
+ expect(response.data.recommended).to eq true
27
+ end
28
+
29
+ it 'provides response headers' do
30
+ response = LHC.delete('http://datastore/v2/feedbacks/12121')
31
+ expect(response.headers).to be_present
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe LHC do
6
+ context 'get' do
7
+ before(:each) do
8
+ stub_request(:get, 'http://datastore/v2/feedbacks?has_reviews=true')
9
+ .to_return(status: 200, body: { total: 99 }.to_json, headers: { 'Content-Encoding' => 'UTF-8' })
10
+ end
11
+
12
+ let(:parameters) do
13
+ { has_reviews: true }
14
+ end
15
+
16
+ it 'does a get request when providing a complete url' do
17
+ LHC.get('http://datastore/v2/feedbacks', params: parameters)
18
+ end
19
+
20
+ it 'does a get request when providing the name of a configured endpoint' do
21
+ url = 'http://{+datastore}/v2/feedbacks'
22
+ options = { params: { datastore: 'datastore' } }
23
+ LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
24
+ LHC.get(:feedbacks, params: parameters)
25
+ end
26
+
27
+ it 'makes response data available in a rails way' do
28
+ response = LHC.get('http://datastore/v2/feedbacks', params: parameters)
29
+ expect(response.data.total).to eq 99
30
+ end
31
+
32
+ it 'provides response headers' do
33
+ response = LHC.get('http://datastore/v2/feedbacks', params: parameters)
34
+ expect(response.headers).to be_present
35
+ end
36
+ end
37
+
38
+ context 'get json' do
39
+ before(:each) do
40
+ stub_request(:get, 'http://datastore/v2/feedbacks').with(headers: { 'Content-Type' => 'application/json; charset=utf-8' })
41
+ .to_return(body: { some: 'json' }.to_json)
42
+ end
43
+
44
+ it 'requests json and parses response body' do
45
+ data = LHC.json.get('http://datastore/v2/feedbacks').data
46
+ expect(data.some).to eq 'json'
47
+ end
48
+ end
49
+ end