rester 0.3.2 → 0.3.3

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: 79a956ec7341aeae0c4895abc0684e5263768db7
4
- data.tar.gz: d6df4b2046cf53633904e640fc9fd6f73ac54946
3
+ metadata.gz: feecdb5b8bdfda29d9df2683370a79eb805365ef
4
+ data.tar.gz: e56faba40a47774b17e4db017ec4b7b2fb09213a
5
5
  SHA512:
6
- metadata.gz: a7fb0534dc29e1212502043018e4168f1a0e85bfda35c5566ce737e7d06d3c5a77d37fc371d1e671d689c162730bb779a9feeea365060a4699f3f4c06103b771
7
- data.tar.gz: 2cd61c0e13f38878324282d630c0945aca0465d1690a8a20db723204e085611342c66c480ee38a0de7d0708691a7d1cbf69de90c9a89ec81b8a2ba5d9ee6a304
6
+ metadata.gz: 32e24fa563229bcad341c0b06668c67e93fd96196124bcc74e23a1b9d4222765a82d95179d97ad7b9a7430a9c78af85660c66620c433b49ae55ad21220b61aeb
7
+ data.tar.gz: 57982fbf4923f471ddaf64387d4de8b4ede4c1f12f8654ca3dbdc963fa6490cb0998e19fe173099c4cde289bb6c381a9635c7e36f6df04eda300157af1e6ff0f
@@ -66,7 +66,7 @@ module Rester
66
66
  end
67
67
 
68
68
  # Verify body, if there is one
69
- unless (request = action['request'] || {}) == params
69
+ unless (request = Utils.stringify_vals(action['request'] || {})) == params
70
70
  fail Errors::StubError,
71
71
  "#{verb} #{path} with context '#{context}' params don't match stub. Expected: #{request} Got: #{params}"
72
72
  end
@@ -82,7 +82,7 @@ module Rester
82
82
  # Useful for testing without having to set the context.
83
83
  def _find_context_by_params(path, verb, params)
84
84
  (stub[path][verb].find { |_, action|
85
- (action['request'] || {}) == params
85
+ (Utils.stringify_vals(action['request'] || {})) == params
86
86
  } || []).first
87
87
  end
88
88
  end # StubAdapter
data/lib/rester/errors.rb CHANGED
@@ -4,8 +4,8 @@ module Rester
4
4
  ##
5
5
  # Throws an error instead of raising it, which is more performant. Must
6
6
  # be caught by an appropriate error handling wrapper.
7
- def throw_error!(klass, message=nil)
8
- error = message ? klass.new(message) : klass.new
7
+ def throw_error!(error, message = nil)
8
+ error = error.new(message) if error.is_a?(Class)
9
9
  throw :error, error
10
10
  end
11
11
  end # Class Methods
@@ -23,22 +23,36 @@ module Rester
23
23
  class HttpError < Error; end
24
24
 
25
25
  ##
26
- # Request Errors
26
+ # 400 Errors
27
+ class RequestError < HttpError
28
+ attr_reader :error
27
29
 
28
- # 400 Error
29
- class RequestError < HttpError; end
30
- class ValidationError < RequestError; end
30
+ def initialize(error, message = nil)
31
+ @error = error
32
+ super(message)
33
+ end
34
+ end
35
+
36
+ class ValidationError < RequestError
37
+ def initialize(message = nil)
38
+ super('validation', message)
39
+ end
40
+ end
31
41
 
42
+ ##
32
43
  # 401 Error
33
- class AuthenticationError < RequestError; end
44
+ class AuthenticationError < HttpError; end
34
45
 
46
+ ##
35
47
  # 403 Error
36
- class ForbiddenError < RequestError; end
48
+ class ForbiddenError < HttpError; end
37
49
 
50
+ ##
38
51
  # 404 Not Found
39
- class NotFoundError < RequestError; end
52
+ class NotFoundError < HttpError; end
40
53
 
54
+ ##
41
55
  # 500 ServerError
42
- class ServerError < RequestError; end
56
+ class ServerError < HttpError; end
43
57
  end # Errors
44
58
  end # Rester
@@ -24,10 +24,11 @@ module Rester
24
24
  code = _error_to_http_code(error)
25
25
 
26
26
  unless [401, 403, 404].include?(code)
27
- body_h = {
28
- message: error.message,
29
- error: _error_name(error)
30
- }
27
+ body_h = { error: _error_name(error) }
28
+
29
+ if error.message && error.message != error.class.name
30
+ body_h.merge!(message: error.message)
31
+ end
31
32
 
32
33
  if code == 500
33
34
  body_h[:backtrace] = error.backtrace
@@ -40,14 +41,14 @@ module Rester
40
41
 
41
42
  def _error_to_http_code(error)
42
43
  case error
43
- when Errors::NotFoundError
44
- 404
45
- when Errors::ForbiddenError
46
- 403
47
- when Errors::AuthenticationError
48
- 401
49
44
  when Errors::RequestError
50
45
  400
46
+ when Errors::AuthenticationError
47
+ 401
48
+ when Errors::ForbiddenError
49
+ 403
50
+ when Errors::NotFoundError
51
+ 404
51
52
  when Errors::ServerError
52
53
  500
53
54
  else
@@ -55,8 +56,16 @@ module Rester
55
56
  end
56
57
  end
57
58
 
58
- def _error_name(exception)
59
- Utils.underscore(exception.class.name.split('::').last.sub('Error', ''))
59
+ ##
60
+ # Takes an exception and returns an appropriate name to return to the
61
+ # client.
62
+ def _error_name(error)
63
+ case error
64
+ when Errors::RequestError
65
+ error.error
66
+ else
67
+ Utils.underscore(error.class.name.split('::').last.sub('Error', ''))
68
+ end
60
69
  end
61
70
  end # ErrorHandling
62
71
  end # Middleware
data/lib/rester/rspec.rb CHANGED
@@ -29,35 +29,56 @@ RSpec.configure do |config|
29
29
  #
30
30
  # would produce:
31
31
  #
32
- # request_args = ['With some context', 'GET', '/v1/tests']
33
- #
34
- request_args = ex.example_group.parent_groups.map { |a|
32
+ # context, verb, path = ['With some context', 'GET', '/v1/tests']
33
+ context, verb, path = ex.example_group.parent_groups.map { |a|
35
34
  a.description unless a.metadata[:description] == a.described_class.to_s
36
35
  }.compact
37
36
 
38
- context = request_args[0]
39
- verb = request_args[1]
40
- path = request_args[2]
41
-
42
37
  begin
43
- params = @rester_stub[path][verb][context]['request']
44
- response = @rester_stub[path][verb][context]['response']
38
+ stub_params = @rester_stub[path][verb][context]['request']
39
+ raw_stub_response = @rester_stub[path][verb][context]['response']
45
40
  rescue NoMethodError
46
41
  fail Rester::Errors::StubError,
47
- "Could not find path: #{path.inspect} verb: #{verb.inspect} context: #{context.inspect} in #{@rester_stub_filepath}"
42
+ "Could not find path: #{path.inspect} verb: #{verb.inspect} context: "\
43
+ "#{context.inspect} in #{@rester_stub_filepath}"
48
44
  end
49
45
 
50
- ex.example_group.let(:subject) {
51
- @rester_adapter.request(verb.downcase.to_sym, path, params)
46
+ ##
47
+ # Raw response from the service.
48
+ # [HTTP CODE, JSON String]
49
+ ex.example_group.let(:raw_service_response) {
50
+ @rester_adapter.request(verb.downcase.to_sym, path, stub_params)
51
+ }
52
+
53
+ ##
54
+ # Parsed service response
55
+ ex.example_group.let(:service_response) {
56
+ JSON.parse(raw_service_response.last, symbolize_names: true)
52
57
  }
53
58
 
59
+ ##
60
+ # HTTP status code returned by service.
61
+ ex.example_group.let(:service_response_code) { raw_service_response.first }
62
+
63
+ ##
64
+ # Expected response body specified in by the stub.
54
65
  ex.example_group.let(:stub_response) {
55
- [response['code'], response['body'].to_json]
66
+ JSON.parse((raw_stub_response['body'] || {}).to_json,
67
+ symbolize_names: true)
56
68
  }
69
+
70
+ ##
71
+ # HTTP status code expected by the stub.
72
+ ex.example_group.let(:stub_response_code) { raw_stub_response['code'] }
73
+
74
+ ##
75
+ # Set the subject to be the service response (parsed ruby hash of the
76
+ # returned data).
77
+ ex.example_group.let(:subject) { service_response }
57
78
  end
58
79
 
59
80
  config.after :each, rester: // do |ex|
60
- expect(subject).to eq stub_response
81
+ expect(service_response_code).to eq stub_response_code
61
82
  end
62
83
 
63
84
  ##
@@ -76,7 +97,7 @@ RSpec.configure do |config|
76
97
 
77
98
  missing_contexts.each { |missing_context, _|
78
99
  context_group = _find_or_create_child(verb_group, missing_context)
79
- context_group.it { is_expected.to eq stub_response }
100
+ context_group.it { is_expected.to include stub_response }
80
101
  }
81
102
  }
82
103
  }
@@ -96,8 +96,8 @@ module Rester
96
96
  self.class.method_params[method_name.to_sym]
97
97
  end
98
98
 
99
- def error!(message=nil)
100
- Errors.throw_error!(Errors::RequestError, message)
99
+ def error!(error, message = nil)
100
+ Errors.throw_error!(Errors::RequestError.new(error, message))
101
101
  end
102
102
 
103
103
  private
data/lib/rester/utils.rb CHANGED
@@ -46,6 +46,18 @@ module Rester
46
46
  hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
47
47
  end
48
48
 
49
+ def stringify_vals(hash={})
50
+ hash.inject({}) { |memo,(k,v)|
51
+ case v
52
+ when Hash
53
+ memo[k] = stringify_vals(v)
54
+ else
55
+ memo[k] = v.to_s
56
+ end
57
+ memo
58
+ }
59
+ end
60
+
49
61
  def classify(str)
50
62
  str.to_s.split("_").map(&:capitalize).join
51
63
  end
@@ -1,3 +1,3 @@
1
1
  module Rester
2
- VERSION = '0.3.2'
2
+ VERSION = '0.3.3'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rester
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Honer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-11-12 00:00:00.000000000 Z
12
+ date: 2015-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack