heracles-wrapper 0.0.1 → 0.0.2

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.
@@ -1,10 +1,18 @@
1
+ require 'json'
1
2
  module Heracles
2
3
  module Wrapper
4
+ DefaultErrorObject = Hash
3
5
  class RequestFailure < RuntimeError
4
- attr_reader :code, :messages, :response
6
+ attr_reader :code, :errors, :response
5
7
  def initialize(response)
6
8
  @code = response.respond_to?(:code) ? response.code : 500
7
- @messages = response.respond_to?(:body) ? response.body : ''
9
+ begin
10
+ @errors = response.respond_to?(:body) ?
11
+ JSON.parse(response.body).fetch('errors',{}) :
12
+ {}
13
+ rescue JSON::ParserError
14
+ @errors = {"response" => "Not JSON format; See response.body"}
15
+ end
8
16
  @response = response
9
17
  super("code: #{@code}")
10
18
  end
@@ -31,10 +31,12 @@ class Heracles::Wrapper::Request::CreateJob
31
31
  def as_json
32
32
  {
33
33
  :api_key => config.api_key,
34
- :workflow_name => workflow_name,
35
- :parameters => parameters
34
+ :job => {
35
+ :workflow_name => workflow_name,
36
+ :parameters => parameters
37
+ }
36
38
  }.tap {|hash|
37
- hash[:parent_job_id] = parent_job_id if parent_job_id
39
+ hash[:job][:parent_job_id] = parent_job_id if parent_job_id
38
40
  }
39
41
  end
40
42
 
@@ -9,14 +9,14 @@ module Heracles
9
9
  attr_reader(
10
10
  :job_id,
11
11
  :location,
12
- :messages,
12
+ :errors,
13
13
  :code
14
14
  )
15
15
  def initialize(http_response)
16
16
  super(http_response)
17
17
  @json = JSON.parse(http_response.body)
18
- @job_id = @json.fetch('job_id').to_i
19
- @messages = @json.fetch('messages',[]).to_a
18
+ @job_id = @json.fetch('job').fetch('id').to_i
19
+ @errors = @json.fetch('errors',{})
20
20
  @location = http_response.headers.fetch(:location)
21
21
  @code = http_response.code
22
22
  end
@@ -6,7 +6,7 @@ module Heracles::Wrapper
6
6
  RESPONSE_JOB_ID = 1234.freeze
7
7
  RESPONSE_CODE = 201.freeze
8
8
 
9
- def with_heracles_service_failure_stub(service_name, messages = [])
9
+ def with_heracles_service_failure_stub(service_name, errors = [])
10
10
  wrap_service_with_proxy(service_name) do
11
11
  Heracles::Wrapper.send(
12
12
  "#{service_name}_service=",
@@ -18,7 +18,7 @@ module Heracles::Wrapper
18
18
  :parameters => options.fetch(:parameters, {})
19
19
  ).tap { |obj|
20
20
  def obj.call
21
- raise Heracles::Wrapper::RequestFailure.new(messages)
21
+ raise Heracles::Wrapper::RequestFailure.new(errors)
22
22
  end
23
23
  }
24
24
  }
@@ -37,7 +37,7 @@ module Heracles::Wrapper
37
37
  "/jobs/#{response[:job_id]}"
38
38
  )
39
39
  response[:code] ||= RESPONSE_CODE
40
- response[:messages] ||= []
40
+ response[:errors] ||= []
41
41
 
42
42
  Heracles::Wrapper.send(
43
43
  "#{service_name}_service=",
@@ -1,5 +1,5 @@
1
1
  module Heracles
2
2
  module Wrapper
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -8,11 +8,20 @@ describe Heracles::Wrapper::RequestFailure do
8
8
  OpenStruct.new(:code => expected_code, :body => expected_body)
9
9
  }
10
10
  let(:expected_code) { 123 }
11
- let(:expected_body) { 'Hello' }
12
- it('has #code') { subject.code.must_equal expected_code }
13
- it('has #messages') { subject.messages.must_equal expected_body }
14
- it('has #response') { subject.response.must_equal response }
15
- it('has #to_s') { subject.to_s.must_equal "code: #{expected_code}" }
11
+ describe 'without errors' do
12
+ let(:expected_body) { "{\"hello\":\"world\"}" }
13
+ it('has #code') { subject.code.must_equal expected_code }
14
+ it('has #errors') { subject.errors.must_equal({}) }
15
+ it('has #response') { subject.response.must_equal response }
16
+ it('has #to_s') { subject.to_s.must_equal "code: #{expected_code}" }
17
+ end
18
+ describe 'with errors' do
19
+ let(:expected_body) { "{\"errors\": {\"world\": 1}}" }
20
+ it('has #code') { subject.code.must_equal expected_code }
21
+ it('has #errors') { subject.errors.fetch('world').must_equal 1 }
22
+ it('has #response') { subject.response.must_equal response }
23
+ it('has #to_s') { subject.to_s.must_equal "code: #{expected_code}" }
24
+ end
16
25
  end
17
26
  describe 'poorly formed response as per a timeout' do
18
27
  subject { Heracles::Wrapper::RequestFailure.new(response) }
@@ -20,8 +29,8 @@ describe Heracles::Wrapper::RequestFailure do
20
29
  let(:expected_code) { 500 }
21
30
  let(:expected_body) { '' }
22
31
  it('has #code') { subject.code.must_equal expected_code }
23
- it('has #messages') { subject.messages.must_equal expected_body }
32
+ it('has #errors') { subject.errors.must_equal({}) }
24
33
  it('has #response') { subject.response.must_equal response }
25
34
  it('has #to_s') { subject.to_s.must_equal "code: #{expected_code}" }
26
35
  end
27
- end
36
+ end
@@ -41,7 +41,7 @@ describe 'Heracles::Wrapper::Request::CreateJob' do
41
41
  stub_request(:post, subject.url.to_s).
42
42
  to_return(
43
43
  {
44
- :body => %({"job_id" : "#{expected_job_id}"}),
44
+ :body => %({"job" : { "id" : "#{expected_job_id}" } }),
45
45
  :status => 201,
46
46
  :headers => {
47
47
  :content_type => 'application/json',
@@ -58,14 +58,21 @@ describe 'Heracles::Wrapper::Request::CreateJob' do
58
58
  stub_request(:post, subject.url.to_s).to_timeout
59
59
  lambda {
60
60
  subject.call
61
- }.must_raise Heracles::Wrapper::RequestFailure
61
+ }.must_raise(Heracles::Wrapper::RequestFailure)
62
62
  end
63
63
 
64
64
  it 'handles redirection' do
65
65
  stub_request(:post, subject.url.to_s).to_return(:status => 302)
66
66
  lambda {
67
67
  subject.call
68
- }.must_raise Heracles::Wrapper::RequestFailure
68
+ }.must_raise(Heracles::Wrapper::RequestFailure)
69
+ end
70
+
71
+ it 'handles server error' do
72
+ stub_request(:post, subject.url.to_s).to_return(:status => 500)
73
+ lambda {
74
+ subject.call
75
+ }.must_raise(Heracles::Wrapper::RequestFailure)
69
76
  end
70
77
 
71
78
  it 'handles 404' do
@@ -116,8 +123,10 @@ describe 'Heracles::Wrapper::Request::CreateJob' do
116
123
  subject.as_json.must_equal(
117
124
  {
118
125
  :api_key => expected_api_key,
119
- :workflow_name => expected_workflow_name,
120
- :parameters => {}
126
+ :job => {
127
+ :workflow_name => expected_workflow_name,
128
+ :parameters => {}
129
+ }
121
130
  }
122
131
  )
123
132
  end
@@ -129,9 +138,11 @@ describe 'Heracles::Wrapper::Request::CreateJob' do
129
138
  subject.as_json.must_equal(
130
139
  {
131
140
  :api_key => expected_api_key,
132
- :workflow_name => expected_workflow_name,
133
- :parent_job_id => expected_parent_job_id,
134
- :parameters => {}
141
+ :job => {
142
+ :workflow_name => expected_workflow_name,
143
+ :parent_job_id => expected_parent_job_id,
144
+ :parameters => {}
145
+ }
135
146
  }
136
147
  )
137
148
  end
@@ -153,8 +164,10 @@ describe 'Heracles::Wrapper::Request::CreateJob' do
153
164
  subject.as_json.must_equal(
154
165
  {
155
166
  :api_key => expected_api_key,
156
- :workflow_name => expected_workflow_name,
157
- :parameters => options[:parameters]
167
+ :job => {
168
+ :workflow_name => expected_workflow_name,
169
+ :parameters => options[:parameters]
170
+ }
158
171
  }
159
172
  )
160
173
  end
@@ -5,45 +5,72 @@ require File.expand_path('../../../lib/heracles-wrapper/config', __FILE__)
5
5
  require 'minitest/autorun'
6
6
  require 'webmock/minitest'
7
7
  require 'ostruct'
8
+ require 'json'
8
9
 
9
10
  describe 'Heracles::Wrapper::RequestSuccess' do
10
11
  subject { Heracles::Wrapper::RequestSuccess.new(http_response) }
11
12
  let(:expected_job_id) { 1234 }
12
- let(:expected_messages) { ['one message'] }
13
+ let(:expected_errors) { %({"name" : "one message"}) }
13
14
  let(:expected_code) { 201 }
14
15
  let(:expected_location) { 'http://somewhere.over/the/rainbown' }
15
- let(:http_response) {
16
- OpenStruct.new(
17
- :body => %(
18
- {
19
- "job_id": #{expected_job_id},
20
- "messages": #{expected_messages.inspect}
21
- }
22
- ),
23
- :headers => { :location => expected_location },
24
- :code => expected_code
25
- ).tap { |obj|
26
- def obj.foo_bar; 'Baz'; end
16
+ describe 'without errors' do
17
+ let(:http_response) {
18
+ OpenStruct.new(
19
+ :body => %(
20
+ {
21
+ "job": {
22
+ "id": #{expected_job_id}
23
+ }
24
+ }
25
+ ),
26
+ :headers => { :location => expected_location },
27
+ :code => expected_code
28
+ ).tap { |obj|
29
+ def obj.foo_bar; 'Baz'; end
30
+ }
27
31
  }
28
- }
32
+ it 'has #errors' do
33
+ subject.errors.must_equal({})
34
+ end
29
35
 
30
- it 'has #code' do
31
- subject.code.must_equal expected_code
32
- end
33
36
 
34
- it 'has #job_id' do
35
- subject.job_id.must_equal expected_job_id
36
37
  end
38
+ describe 'with errors' do
39
+ let(:http_response) {
40
+ OpenStruct.new(
41
+ :body => %(
42
+ {
43
+ "job": {
44
+ "id": #{expected_job_id}
45
+ },
46
+ "errors": #{expected_errors}
47
+ }
48
+ ),
49
+ :headers => { :location => expected_location },
50
+ :code => expected_code
51
+ ).tap { |obj|
52
+ def obj.foo_bar; 'Baz'; end
53
+ }
54
+ }
37
55
 
38
- it 'has #location' do
39
- subject.location.must_equal expected_location
40
- end
56
+ it 'has #code' do
57
+ subject.code.must_equal expected_code
58
+ end
41
59
 
42
- it 'has #messages' do
43
- subject.messages.must_equal expected_messages
44
- end
60
+ it 'has #job_id' do
61
+ subject.job_id.must_equal expected_job_id
62
+ end
63
+
64
+ it 'has #location' do
65
+ subject.location.must_equal expected_location
66
+ end
67
+
68
+ it 'has #errors' do
69
+ subject.errors.must_equal JSON.parse(expected_errors)
70
+ end
45
71
 
46
- it 'delegates everything else to the http_response' do
47
- subject.foo_bar.must_equal 'Baz'
72
+ it 'delegates everything else to the http_response' do
73
+ subject.foo_bar.must_equal 'Baz'
74
+ end
48
75
  end
49
76
  end
@@ -43,7 +43,7 @@ describe Heracles::Wrapper::TestHelper do
43
43
  :create_job, input_parameters
44
44
  ).call
45
45
  @response.job_id.must_be_kind_of Fixnum
46
- @response.messages.must_be_kind_of Array
46
+ @response.errors.must_be_kind_of Array
47
47
  @response.code.must_be_kind_of Fixnum
48
48
  @response.location.must_be_kind_of String
49
49
  end
@@ -73,7 +73,7 @@ describe Heracles::Wrapper::TestHelper do
73
73
  ).
74
74
  to_return(
75
75
  {
76
- :body => %({"job_id" : "#{expected_job_id}"}),
76
+ :body => %({"job" : {"id" : "#{expected_job_id}"}}),
77
77
  :status => expected_code,
78
78
  :headers => {
79
79
  :content_type => 'application/json',
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heracles-wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-08 00:00:00.000000000 Z
12
+ date: 2012-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -193,7 +193,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
193
193
  version: '0'
194
194
  segments:
195
195
  - 0
196
- hash: -936023584342832564
196
+ hash: 3196260337063136150
197
197
  required_rubygems_version: !ruby/object:Gem::Requirement
198
198
  none: false
199
199
  requirements:
@@ -202,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
202
  version: '0'
203
203
  segments:
204
204
  - 0
205
- hash: -936023584342832564
205
+ hash: 3196260337063136150
206
206
  requirements: []
207
207
  rubyforge_project:
208
208
  rubygems_version: 1.8.24