restful_resource 1.6.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d5e2aea53f19955e18f69aaad8665f69e6eddb1
4
- data.tar.gz: e5fba7439a0a7c12965aac6b9ea6491e527da288
3
+ metadata.gz: 2e1eacf50c2ea555b6163b0d5a788f1460dc26f4
4
+ data.tar.gz: c04d86771984bd9ccd61e67bfa38cdc49c9d2fd8
5
5
  SHA512:
6
- metadata.gz: 2562be29a322e337f2b3c616aa3cb04aa6be45de3964a1229bd7cdde896091dcb5bc06be485812588fa1bcedec3a716578a74b6636133e9331ad156e10c115e6
7
- data.tar.gz: 7e2252c2a662db143f7d3517a683bde0da89a093de2fd86d316e4a4e2abe0acedb0163078f6633ae014537ede07328a0e685df457ffad5f14f9f21a758a8dda3
6
+ metadata.gz: 450a24de450adc7b8c27d3ff5f91c2c9c9a3cc04d61a4ac5bdd2eae71df2dcec28bfcd359091231e841f9911726fbca8c2b15d45c9b5752a11173a6867f824ce
7
+ data.tar.gz: e79f1804f0469e64d5f2c78ed0394179fea08ae869fabc4109af62d8e762472956041f76da9d547be3da9b7703217765597f9f8b412228efa2b3cb472b21479c
data/README.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  Provides an ActiveResource like interface to JSON API's
4
4
 
5
+ ## Caching
6
+
7
+ Caching using [faraday-http-cache](https://github.com/plataformatec/faraday-http-cache)
8
+
9
+ Enabled by passing an initialsed cache object (eg Rails.cache)
10
+
11
+ ```
12
+ RestfulResource::Base.configure(
13
+ base_url: "http://my.api.com/",
14
+ cache_store: Rails.cache
15
+ )
16
+ ```
17
+
18
+ ### Bypassing the cache
19
+
20
+ To make requests that bypass the local HTTP cache use the `no_cache: true` option eg:
21
+
22
+ ```
23
+ Object.find(1, no_cache: true)
24
+ ```
25
+
26
+
5
27
  ## Metrics
6
28
 
7
29
  ### HTTP Metrics
@@ -23,42 +23,50 @@ module RestfulResource
23
23
  end
24
24
 
25
25
  def self.find(id, params={})
26
- response = http.get(member_url(id, params))
26
+ params_without_headers, headers = extract_headers!(params)
27
+
28
+ response = http.get(member_url(id, params_without_headers), headers: headers)
27
29
  self.new(parse_json(response.body))
28
30
  end
29
31
 
30
32
  def self.where(params={})
31
- url = collection_url(params)
32
- response = http.get(url)
33
+ params_without_headers, headers = extract_headers!(params)
34
+
35
+ url = collection_url(params_without_headers)
36
+ response = http.get(url, headers: headers)
33
37
  self.paginate_response(response)
34
38
  end
35
39
 
36
40
  def self.get(params = {})
37
- response = http.get(collection_url(params))
41
+ params_without_headers, headers = extract_headers!(params)
42
+
43
+ response = http.get(collection_url(params_without_headers), headers: headers)
38
44
  self.new(parse_json(response.body))
39
45
  end
40
46
 
41
47
  def self.delete(id, **params)
42
- response = http.delete(member_url(id, params))
48
+ headers = params.delete(:headers) || {}
49
+
50
+ response = http.delete(member_url(id, params), headers: headers)
43
51
  RestfulResource::OpenObject.new(parse_json(response.body))
44
52
  end
45
53
 
46
- def self.put(id, data: {}, **params)
54
+ def self.put(id, data: {}, headers: {}, **params)
47
55
  url = member_url(id, params)
48
- response = http.put(url, data: data)
56
+ response = http.put(url, data: data, headers: headers)
49
57
  self.new(parse_json(response.body))
50
58
  end
51
59
 
52
- def self.post(data: {}, **params)
60
+ def self.post(data: {}, headers: {}, **params)
53
61
  url = collection_url(params)
54
62
 
55
- response = http.post(url, data: data)
63
+ response = http.post(url, data: data, headers: headers)
56
64
 
57
65
  self.new(parse_json(response.body))
58
66
  end
59
67
 
60
- def self.all
61
- self.where
68
+ def self.all(params = {})
69
+ self.where(params)
62
70
  end
63
71
 
64
72
  def self.action(action_name)
@@ -104,6 +112,15 @@ module RestfulResource
104
112
  end
105
113
 
106
114
  private
115
+
116
+ def self.extract_headers!(params = {})
117
+ headers = params.delete(:headers) || {}
118
+
119
+ headers.merge!(cache_control: 'no-cache') if params.delete(:no_cache)
120
+
121
+ [params, headers]
122
+ end
123
+
107
124
  def self.merge_url_paths(uri, *paths)
108
125
  uri.merge(paths.compact.join('/')).to_s
109
126
  end
@@ -83,20 +83,20 @@ module RestfulResource
83
83
  end
84
84
  end
85
85
 
86
- def get(url, accept: 'application/json')
87
- http_request(Request.new(:get, url, accept: accept))
86
+ def get(url, headers: {})
87
+ http_request(Request.new(:get, url, headers: headers))
88
88
  end
89
89
 
90
- def delete(url, accept: 'application/json')
91
- http_request(Request.new(:delete, url, accept: accept))
90
+ def delete(url, headers: {})
91
+ http_request(Request.new(:delete, url, headers: headers))
92
92
  end
93
93
 
94
- def put(url, data: {}, accept: 'application/json')
95
- http_request(Request.new(:put, url, body: data, accept: accept))
94
+ def put(url, data: {}, headers: {})
95
+ http_request(Request.new(:put, url, body: data, headers: headers))
96
96
  end
97
97
 
98
- def post(url, data: {}, accept: 'application/json')
99
- http_request(Request.new(:post, url, body: data, accept: accept))
98
+ def post(url, data: {}, headers: {})
99
+ http_request(Request.new(:post, url, body: data, headers: headers))
100
100
  end
101
101
 
102
102
  private
@@ -141,9 +141,7 @@ module RestfulResource
141
141
  req.body = request.body unless request.body.nil?
142
142
  req.url request.url
143
143
 
144
- if request.accept
145
- req.headers['Accept'] = request.accept
146
- end
144
+ req.headers = req.headers.merge(request.headers)
147
145
  end
148
146
  Response.new(body: response.body, headers: response.headers, status: response.status)
149
147
  rescue Faraday::ConnectionFailed
@@ -42,7 +42,7 @@ module RestfulResource
42
42
  # Subscribes to events from Faraday::HttpCache
43
43
  ActiveSupport::Notifications.subscribe cache_instrument_name do |*args|
44
44
  event = ActiveSupport::Notifications::Event.new(*args)
45
- cache_status = event.payload[:cache_status]
45
+ cache_status = event.payload.fetch(:cache_status, nil)
46
46
 
47
47
  # Outputs log lines like:
48
48
  # count#quotes_site.research_site_api.cache_hit=1
@@ -55,6 +55,9 @@ module RestfulResource
55
55
  metric_class.count cache_notifier_namespace(metric: 'cache_miss'), 1
56
56
  metric_class.count cache_notifier_namespace(metric: 'cache_miss', event: event), 1
57
57
  when :unacceptable
58
+ metric_class.count cache_notifier_namespace(metric: 'cache_not_cacheable'), 1
59
+ metric_class.count cache_notifier_namespace(metric: 'cache_not_cacheable', event: event), 1
60
+ when :bypass
58
61
  metric_class.count cache_notifier_namespace(metric: 'cache_bypass'), 1
59
62
  metric_class.count cache_notifier_namespace(metric: 'cache_bypass', event: event), 1
60
63
  end
@@ -62,13 +65,13 @@ module RestfulResource
62
65
  end
63
66
 
64
67
  def validate_metric_class!
65
- metric_methods = [:count, :sample, :measure]
68
+ metric_methods = %i(count sample measure)
66
69
  if metric_methods.any? {|m| !metric_class.respond_to?(m) }
67
70
  raise ArgumentError.new "Metric class '#{metric_class}' does not respond to #{metric_methods.join ','}"
68
71
  end
69
72
  end
70
73
 
71
- def cache_notifier_namespace(event: nil, metric:)
74
+ def cache_notifier_namespace(metric:, event: nil)
72
75
  [app_name, api_name, base_request_path(event), metric].compact.join('.')
73
76
  end
74
77
 
@@ -1,9 +1,9 @@
1
1
  module RestfulResource
2
2
  module RailsValidations
3
3
  module ClassMethods
4
- def put(id, data: {}, **params)
4
+ def put(id, data: {}, headers: {}, **params)
5
5
  begin
6
- super(id, data: data, **params)
6
+ super(id, data: data, headers: {}, **params)
7
7
  rescue HttpClient::UnprocessableEntity => e
8
8
  errors = parse_json(e.response.body)
9
9
  result = nil
@@ -17,9 +17,9 @@ module RestfulResource
17
17
  end
18
18
  end
19
19
 
20
- def post(data: {}, **params)
20
+ def post(data: {}, headers: {}, **params)
21
21
  with_validations(data: data) do
22
- super(data: data, **params)
22
+ super(data: data, headers: {}, **params)
23
23
  end
24
24
  end
25
25
 
@@ -8,10 +8,10 @@ module RestfulResource
8
8
  module Redirections
9
9
  def self.included(base)
10
10
  base.instance_eval do
11
- def post(data: {}, delay: 1.0, max_attempts: 10, **params)
11
+ def post(data: {}, delay: 1.0, max_attempts: 10, headers: {}, **params)
12
12
  url = collection_url(params)
13
13
 
14
- response = self.accept_redirected_result(response: http.post(url, data: data), delay: delay, max_attempts: max_attempts)
14
+ response = self.accept_redirected_result(response: http.post(url, data: data, headers: headers), delay: delay, max_attempts: max_attempts)
15
15
 
16
16
  self.new(parse_json(response.body))
17
17
  end
@@ -24,12 +24,12 @@ module RestfulResource
24
24
  resource_location = response.headers[:location]
25
25
 
26
26
  RestfulResource::Redirections.wait(delay)
27
- new_response = http.get(resource_location)
27
+ new_response = http.get(resource_location, headers: {})
28
28
 
29
29
  while (new_response.status == 202) && (attempts < max_attempts)
30
30
  attempts += 1
31
31
  RestfulResource::Redirections.wait(delay)
32
- new_response = http.get(resource_location)
32
+ new_response = http.get(resource_location, headers: {})
33
33
  end
34
34
 
35
35
  if attempts == max_attempts
@@ -1,9 +1,31 @@
1
1
  module RestfulResource
2
2
  class Request
3
- attr_reader :body, :method, :url, :accept
3
+ attr_reader :body, :method, :url
4
4
 
5
- def initialize(method, url, accept: 'application/json', body: nil)
6
- @method, @url, @accept, @body = method, url, accept, body
5
+ def initialize(method, url, headers: {}, body: nil)
6
+ @method, @url, @headers, @body = method, url, headers, body
7
+ end
8
+
9
+ def headers
10
+ default_headers.merge(format_headers)
11
+ end
12
+
13
+ private
14
+
15
+ # Formats all keys in Word-Word format
16
+ def format_headers
17
+ @headers.stringify_keys.inject({}) do |h, key_with_value|
18
+ h[format_key key_with_value.first] = key_with_value.last
19
+ h
20
+ end
21
+ end
22
+
23
+ def format_key(key)
24
+ key.humanize.split(' ').map(&:humanize).join('-')
25
+ end
26
+
27
+ def default_headers
28
+ { 'Accept' => 'application/json' }
7
29
  end
8
30
  end
9
31
  end
@@ -1,3 +1,3 @@
1
1
  module RestfulResource
2
- VERSION = '1.6.0'
2
+ VERSION = '2.0.1'
3
3
  end
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rspec", "~> 3.1"
25
+ spec.add_development_dependency "rspec-its"
25
26
 
26
27
  spec.add_dependency "faraday"
27
28
  spec.add_dependency "faraday_middleware"
@@ -1,7 +1,7 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- describe RestfulResource::Base do
4
- before :each do
3
+ RSpec.describe RestfulResource::Base do
4
+ before do
5
5
  @mock_http = double("mock_http")
6
6
  allow(RestfulResource::Base).to receive(:http).and_return(@mock_http)
7
7
  RestfulResource::Base.configure(base_url: 'http://api.carwow.co.uk/')
@@ -49,6 +49,22 @@ describe RestfulResource::Base do
49
49
 
50
50
  object = Model.find('Golf Cabriolet?test', make_slug: 'Land Rover?x=0.123', group_id: 'xxx yyy?l=7')
51
51
  end
52
+
53
+ it 'accepts custom headers' do
54
+ expect_get("http://api.carwow.co.uk/makes/12",
55
+ RestfulResource::Response.new,
56
+ headers: { cache_control: 'no-cache' })
57
+
58
+ Make.find(12, headers: { cache_control: 'no-cache' })
59
+ end
60
+
61
+ it 'accepts no_cache option' do
62
+ expect_get("http://api.carwow.co.uk/makes/12",
63
+ RestfulResource::Response.new,
64
+ headers: { cache_control: 'no-cache' })
65
+
66
+ Make.find(12, no_cache: true)
67
+ end
52
68
  end
53
69
 
54
70
  describe "#where" do
@@ -74,6 +90,22 @@ describe RestfulResource::Base do
74
90
  expect(models.previous_page).to be_nil
75
91
  expect(models.next_page).to eq 2
76
92
  end
93
+
94
+ it 'accepts custom headers' do
95
+ expect_get("http://api.carwow.co.uk/groups/15/makes/Volkswagen/models?on_sale=true",
96
+ RestfulResource::Response.new,
97
+ headers: { cache_control: 'no-cache' })
98
+
99
+ Model.where(make_slug: 'Volkswagen', on_sale: true, group_id: 15, headers: { cache_control: 'no-cache' })
100
+ end
101
+
102
+ it 'accepts no_cache option' do
103
+ expect_get("http://api.carwow.co.uk/groups/15/makes/Volkswagen/models?on_sale=true",
104
+ RestfulResource::Response.new,
105
+ headers: { cache_control: 'no-cache' })
106
+
107
+ Model.where(make_slug: 'Volkswagen', on_sale: true, group_id: 15, no_cache: true)
108
+ end
77
109
  end
78
110
 
79
111
  describe "#all" do
@@ -86,6 +118,22 @@ describe RestfulResource::Base do
86
118
  expect(makes.length).to eq 2
87
119
  expect(makes.first.name).to eq 'Volkswagen'
88
120
  end
121
+
122
+ it 'accepts custom headers' do
123
+ expect_get("http://api.carwow.co.uk/makes",
124
+ RestfulResource::Response.new,
125
+ headers: { cache_control: 'no-cache' })
126
+
127
+ Make.all(headers: { cache_control: 'no-cache' })
128
+ end
129
+
130
+ it 'accepts no_cache option' do
131
+ expect_get("http://api.carwow.co.uk/makes",
132
+ RestfulResource::Response.new,
133
+ headers: { cache_control: 'no-cache' })
134
+
135
+ Make.all(no_cache: true)
136
+ end
89
137
  end
90
138
 
91
139
  describe "#base_url" do
@@ -130,6 +178,22 @@ describe RestfulResource::Base do
130
178
 
131
179
  expect(object.average_score).to eq 4.3
132
180
  end
181
+
182
+ it 'accepts custom headers' do
183
+ expect_get("http://api.carwow.co.uk/makes/average_score",
184
+ RestfulResource::Response.new,
185
+ headers: { cache_control: 'no-cache' })
186
+
187
+ Make.action(:average_score).get(headers: { cache_control: 'no-cache' })
188
+ end
189
+
190
+ it 'accepts no_cache option' do
191
+ expect_get("http://api.carwow.co.uk/makes/average_score",
192
+ RestfulResource::Response.new,
193
+ headers: { cache_control: 'no-cache' })
194
+
195
+ Make.action(:average_score).get(no_cache: true)
196
+ end
133
197
  end
134
198
 
135
199
  describe "#put" do
@@ -172,6 +236,14 @@ describe RestfulResource::Base do
172
236
 
173
237
  expect(object.name).to eq 'Audi'
174
238
  end
239
+
240
+ it 'accepts custom headers' do
241
+ expect_put("http://api.carwow.co.uk/makes/1",
242
+ RestfulResource::Response.new,
243
+ headers: { accept: 'application/json' })
244
+
245
+ Make.put(1, data: {}, headers: { accept: 'application/json' })
246
+ end
175
247
  end
176
248
 
177
249
  describe "#post" do
@@ -186,6 +258,14 @@ describe RestfulResource::Base do
186
258
  expect(object.name).to eq 'Audi'
187
259
  expect(object.num_of_cars).to eq 3
188
260
  end
261
+
262
+ it 'accepts custom headers' do
263
+ expect_post("http://api.carwow.co.uk/makes",
264
+ RestfulResource::Response.new,
265
+ headers: { accept: 'application/json' })
266
+
267
+ Make.post(data: {}, headers: { accept: 'application/json' })
268
+ end
189
269
  end
190
270
 
191
271
  describe "#delete" do
@@ -197,6 +277,14 @@ describe RestfulResource::Base do
197
277
 
198
278
  expect(object.deleted).to be_truthy
199
279
  end
280
+
281
+ it 'accepts custom headers' do
282
+ expect_delete("http://api.carwow.co.uk/makes/1",
283
+ RestfulResource::Response.new,
284
+ headers: { accept: 'application/json' })
285
+
286
+ Make.delete(1, headers: { accept: 'application/json' })
287
+ end
200
288
  end
201
289
 
202
290
  describe ".as_json" do
@@ -1,6 +1,6 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- describe RestfulResource::HttpClient do
3
+ RSpec.describe RestfulResource::HttpClient do
4
4
  def faraday_connection
5
5
  Faraday.new do |builder|
6
6
  builder.request :url_encoded
@@ -143,12 +143,23 @@ describe RestfulResource::HttpClient do
143
143
 
144
144
  it 'should execute authenticated get' do
145
145
  connection = faraday_connection do |stubs|
146
- stubs.get('http://httpbin.org/basic-auth/user/passwd', { "Authorization"=>"Basic dXNlcjpwYXNzd2Q=" }) { |env| [200, {}, nil] }
146
+ stubs.get('http://httpbin.org/basic-auth/user/passwd') { |env| [200, {}, nil] }
147
147
  end
148
148
 
149
- response = http_client(connection).get('http://httpbin.org/basic-auth/user/passwd')
149
+ response = http_client(connection).get('http://httpbin.org/basic-auth/user/passwd', headers: {"Authorization"=>"Basic dXNlcjpwYXNzd2Q="})
150
150
 
151
151
  expect(response.status).to eq 200
152
152
  end
153
153
  end
154
+
155
+ describe 'Headers' do
156
+ it 'uses custom headers' do
157
+ connection = faraday_connection do |stubs|
158
+ stubs.get('http://httpbin.org/get', { 'Cache-Control' => 'no-cache' }) { |env| [200, {}, nil] }
159
+ end
160
+
161
+ response = http_client(connection).get('http://httpbin.org/get', headers: { cache_control: 'no-cache' })
162
+ expect(response.status).to eq 200
163
+ end
164
+ end
154
165
  end
@@ -1,6 +1,6 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- describe RestfulResource::RailsValidations do
3
+ RSpec.describe RestfulResource::RailsValidations do
4
4
  before :each do
5
5
  @mock_http = double("mock_http")
6
6
  RestfulResource::Base.configure(base_url: "http://api.carwow.co.uk/")
@@ -26,7 +26,7 @@ describe RestfulResource::RailsValidations do
26
26
  end
27
27
 
28
28
  context "#put with errors" do
29
- before :each do
29
+ before do
30
30
  data = {name: 'Leonardo'}
31
31
  @error = 'Cannot use Ninja Turtles names'
32
32
  expected_response = RestfulResource::Response.new(body: {errors: [@error]}.to_json)
@@ -1,7 +1,7 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
- describe RestfulResource::Redirections do
4
- before :each do
3
+ RSpec.describe RestfulResource::Redirections do
4
+ before do
5
5
  @mock_http = double("mock_http")
6
6
  allow(RestfulResource::Base).to receive(:http).and_return(@mock_http)
7
7
  RestfulResource::Base.configure(base_url: 'http://api.carwow.co.uk/')
@@ -24,7 +24,7 @@ describe RestfulResource::Redirections do
24
24
  context 'with a redirect to resource location' do
25
25
  let(:redirect_target) { 'http://api.carwow.co.uk/model_with_redirections/123' }
26
26
 
27
- before(:each) do
27
+ before do
28
28
  allow(RestfulResource::Redirections).to receive(:wait)
29
29
  expected_redirect_response = RestfulResource::Response.new(body: 'You are being redirected', status: 303, headers: { location: redirect_target})
30
30
  expect_post("http://api.carwow.co.uk/model_with_redirections", expected_redirect_response, data: data)
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RestfulResource::Request do
4
+ let(:method) { 'get' }
5
+ let(:url) { 'https://www.carwow.co.uk/api/v2/models' }
6
+
7
+ describe '.headers' do
8
+ context 'given no headers' do
9
+ subject { described_class.new(method, url).headers }
10
+
11
+ its(['Accept']) { is_expected.to eq 'application/json' }
12
+ end
13
+
14
+ context 'given an explicit accept header' do
15
+ subject { described_class.new(method, url, headers: { accept: 'application/xml' }).headers }
16
+
17
+ its(['Accept']) { is_expected.to eq 'application/xml' }
18
+ end
19
+
20
+ context 'given symbolized header' do
21
+ subject { described_class.new(method, url, headers: { authorization: 'Bearer: xyz' }).headers }
22
+
23
+ its(['Authorization']) { is_expected.to eq 'Bearer: xyz' }
24
+ its(['Accept']) { is_expected.to eq 'application/json' }
25
+ end
26
+
27
+ context 'given multi word symbolized header' do
28
+ subject { described_class.new(method, url, headers: { cache_control: 'no-cache' }).headers }
29
+
30
+ its(['Cache-Control']) { is_expected.to eq 'no-cache' }
31
+ its(['Accept']) { is_expected.to eq 'application/json' }
32
+ end
33
+
34
+ context 'given string header' do
35
+ subject { described_class.new(method, url, headers: { 'authorization' => 'Bearer: xyz' }).headers }
36
+
37
+ its(['Authorization']) { is_expected.to eq 'Bearer: xyz' }
38
+ its(['Accept']) { is_expected.to eq 'application/json' }
39
+ end
40
+
41
+ context 'given multi word string header' do
42
+ subject { described_class.new(method, url, headers: { 'cache control' => 'no-cache' }).headers }
43
+
44
+ its(['Cache-Control']) { is_expected.to eq 'no-cache' }
45
+ its(['Accept']) { is_expected.to eq 'application/json' }
46
+ end
47
+ end
48
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rspec'
2
+ require 'rspec/its'
2
3
  require_relative '../lib/restful_resource'
3
4
  require_relative 'fixtures'
4
5
 
@@ -8,39 +9,39 @@ RSpec.configure do |config|
8
9
  end
9
10
 
10
11
 
11
- def expect_get(url, response)
12
- expect(@mock_http).to receive(:get).with(url).and_return(response)
12
+ def expect_get(url, response, headers: {})
13
+ expect(@mock_http).to receive(:get).with(url, headers: headers).and_return(response)
13
14
  end
14
15
 
15
- def expect_delete(url, response)
16
- expect(@mock_http).to receive(:delete).with(url).and_return(response)
16
+ def expect_delete(url, response, headers: {})
17
+ expect(@mock_http).to receive(:delete).with(url, headers: headers).and_return(response)
17
18
  end
18
19
 
19
- def expect_put(url, response, data: {})
20
- expect(@mock_http).to receive(:put).with(url, data: data).and_return(response)
20
+ def expect_put(url, response, data: {}, headers: {})
21
+ expect(@mock_http).to receive(:put).with(url, data: data, headers: headers).and_return(response)
21
22
  end
22
23
 
23
- def expect_post(url, response, data: {})
24
- expect(@mock_http).to receive(:post).with(url, data: data).and_return(response)
24
+ def expect_post(url, response, data: {}, headers: {})
25
+ expect(@mock_http).to receive(:post).with(url, data: data, headers: headers).and_return(response)
25
26
  end
26
27
 
27
28
  def expect_get_with_unprocessable_entity(url, response)
28
29
  request = RestfulResource::Request.new(:get, url)
29
30
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
30
31
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
31
- expect(@mock_http).to receive(:get).with(url).and_raise(exception)
32
+ expect(@mock_http).to receive(:get).with(url, headers: {}).and_raise(exception)
32
33
  end
33
34
 
34
35
  def expect_put_with_unprocessable_entity(url, response, data: {})
35
36
  request = RestfulResource::Request.new(:put, url, body: data)
36
37
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
37
38
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
38
- expect(@mock_http).to receive(:put).with(url, data: data).and_raise(exception)
39
+ expect(@mock_http).to receive(:put).with(url, data: data, headers: {}).and_raise(exception)
39
40
  end
40
41
 
41
42
  def expect_post_with_unprocessable_entity(url, response, data: {})
42
43
  request = RestfulResource::Request.new(:put, url, body: data)
43
44
  rest_client_response = OpenStruct.new({body: response.body, headers: response.headers, code: response.status})
44
45
  exception = RestfulResource::HttpClient::UnprocessableEntity.new(request, rest_client_response)
45
- expect(@mock_http).to receive(:post).with(url, data: data).and_raise(exception)
46
+ expect(@mock_http).to receive(:post).with(url, data: data, headers: {}).and_raise(exception)
46
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Santoro
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-08-02 00:00:00.000000000 Z
12
+ date: 2017-10-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '3.1'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec-its
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: faraday
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -208,6 +222,7 @@ files:
208
222
  - spec/restful_resource/open_object_spec.rb
209
223
  - spec/restful_resource/rails_validations_spec.rb
210
224
  - spec/restful_resource/redirections_spec.rb
225
+ - spec/restful_resource/request_spec.rb
211
226
  - spec/spec_helper.rb
212
227
  homepage: http://www.github.com/carwow/restful_resource
213
228
  licenses:
@@ -244,4 +259,5 @@ test_files:
244
259
  - spec/restful_resource/open_object_spec.rb
245
260
  - spec/restful_resource/rails_validations_spec.rb
246
261
  - spec/restful_resource/redirections_spec.rb
262
+ - spec/restful_resource/request_spec.rb
247
263
  - spec/spec_helper.rb