fizzy-api 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/fizzy/api/endpoints/calculate_outcome.rb +32 -0
- data/lib/fizzy/api/endpoints/endpoint.rb +26 -0
- data/lib/fizzy/api/endpoints/render_graph.rb +37 -0
- data/lib/fizzy/api/endpoints/render_graph_synchronous.rb +38 -0
- data/lib/fizzy/api/endpoints/render_overview.rb +17 -0
- data/lib/fizzy/api/endpoints.rb +12 -0
- data/lib/fizzy/api/errors/method_not_allowed_error.rb +8 -0
- data/lib/fizzy/api/errors.rb +1 -0
- data/lib/fizzy/api/version.rb +1 -1
- data/lib/fizzy/api.rb +1 -4
- data/spec/fizzy/api/endpoints/calculate_outcome_spec.rb +56 -0
- data/spec/fizzy/api/endpoints/render_graph_spec.rb +91 -0
- data/spec/fizzy/api/endpoints/render_graph_synchronous_spec.rb +96 -0
- data/spec/fizzy/api/endpoints/render_overview_spec.rb +43 -0
- data/spec/shared_examples_for_endpoints.rb +18 -0
- metadata +19 -11
- data/lib/fizzy/api/calculate_outcome.rb +0 -37
- data/lib/fizzy/api/render_graph.rb +0 -48
- data/lib/fizzy/api/render_overview.rb +0 -26
- data/spec/fizzy/api/calculate_outcome_spec.rb +0 -51
- data/spec/fizzy/api/render_graph_spec.rb +0 -86
- data/spec/fizzy/api/render_overview_spec.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fc3193e43fa75dbb7385d9a42288b292028eb12
|
4
|
+
data.tar.gz: e1ef0ba2c2829a753fa69b8ee9ee5c9e612c9d71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 375e483780dfbc2574db63c3a66f4112cd3f10256514450c591f02696ae27c89305804b520fb6a721691165c9c318cb4cb70976b02e168910216382eb20f66a2
|
7
|
+
data.tar.gz: 06d7b0af3f48be07aab2b4203c25a4c274feba63d442c60006be9af97fe57b04662baf522275dcf070dcdf79436825c4a9ea6b53a6bea205616222d6246164be
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
class CalculateOutcome < Endpoint
|
5
|
+
string :dossier_id
|
6
|
+
string :protocol_subscription_id
|
7
|
+
|
8
|
+
def execute
|
9
|
+
response = Api.basic_auth_session.post("/dossier/#{dossier_id}"\
|
10
|
+
"/protocol_subscriptions/#{protocol_subscription_id}"\
|
11
|
+
'/calculate')
|
12
|
+
process_response(response)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def invalid_response(response)
|
18
|
+
case response.code
|
19
|
+
when 202
|
20
|
+
raise(Errors::OutcomeNotAvailableError,
|
21
|
+
select_measurement_text(response.body, 'The results are currently being calculated.'))
|
22
|
+
when 404
|
23
|
+
raise Errors::GraphNotFoundError, select_measurement_text(response.body,
|
24
|
+
'Participant not found, or graph not supported.')
|
25
|
+
else
|
26
|
+
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
class Endpoint < ActiveInteraction::Base
|
5
|
+
protected
|
6
|
+
|
7
|
+
def process_response(response)
|
8
|
+
case response.code
|
9
|
+
when 200
|
10
|
+
response
|
11
|
+
else
|
12
|
+
invalid_response(response)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def invalid_response(response)
|
17
|
+
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
18
|
+
end
|
19
|
+
|
20
|
+
def select_measurement_text(response, default_message)
|
21
|
+
response.body || default_message
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
class RenderGraph < Endpoint
|
5
|
+
string :dossier_id
|
6
|
+
string :protocol_subscription_id
|
7
|
+
string :path
|
8
|
+
hash :options, default: {}
|
9
|
+
|
10
|
+
def execute
|
11
|
+
response = Api.basic_auth_session.get("/dossier/#{dossier_id}"\
|
12
|
+
"/protocol_subscriptions/#{protocol_subscription_id}" \
|
13
|
+
"/render/#{path}", options)
|
14
|
+
process_response(response)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def invalid_response(response)
|
20
|
+
case response.code
|
21
|
+
when 202
|
22
|
+
raise Errors::OutcomeNotAvailableError, select_measurement_text(response,
|
23
|
+
'The results have not yet been calculated.')
|
24
|
+
when 204
|
25
|
+
raise Errors::TooFewMeasurementsError, select_measurement_text(response,
|
26
|
+
'Not enough measurements available.')
|
27
|
+
when 404
|
28
|
+
raise Errors::GraphNotFoundError, select_measurement_text(response,
|
29
|
+
'Graph not found.')
|
30
|
+
else
|
31
|
+
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
class RenderGraphSynchronous < Endpoint
|
5
|
+
string :dossier_id
|
6
|
+
string :protocol_subscription_id
|
7
|
+
string :path
|
8
|
+
hash :options, default: {}
|
9
|
+
|
10
|
+
def execute
|
11
|
+
response = Api.basic_auth_session.get("/dossier/#{dossier_id}"\
|
12
|
+
"/protocol_subscriptions/#{protocol_subscription_id}" \
|
13
|
+
"/render_sync/#{path}", options)
|
14
|
+
process_response(response)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def invalid_response(response)
|
20
|
+
case response.code
|
21
|
+
when 204
|
22
|
+
raise Errors::TooFewMeasurementsError, select_measurement_text(response,
|
23
|
+
'Not enough measurements available.')
|
24
|
+
when 404
|
25
|
+
raise Errors::GraphNotFoundError, select_measurement_text(response,
|
26
|
+
'Graph not found.')
|
27
|
+
when 405
|
28
|
+
raise Errors::MethodNotAllowedError, select_measurement_text(response,
|
29
|
+
'Current image path not eligible for'\
|
30
|
+
' synchronous rendering')
|
31
|
+
else
|
32
|
+
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
class RenderOverview < Endpoint
|
5
|
+
string :dossier_id
|
6
|
+
string :protocol_subscription_id
|
7
|
+
|
8
|
+
def execute
|
9
|
+
response = Api.basic_auth_session.get("/dossier/#{dossier_id}"\
|
10
|
+
"/protocol_subscriptions/#{protocol_subscription_id}" \
|
11
|
+
'/render.json')
|
12
|
+
process_response(response)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'fizzy/api/endpoints/endpoint'
|
2
|
+
require 'fizzy/api/endpoints/calculate_outcome'
|
3
|
+
require 'fizzy/api/endpoints/render_graph'
|
4
|
+
require 'fizzy/api/endpoints/render_graph_synchronous'
|
5
|
+
require 'fizzy/api/endpoints/render_overview'
|
6
|
+
|
7
|
+
module Fizzy
|
8
|
+
module Api
|
9
|
+
module Endpoints
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/fizzy/api/errors.rb
CHANGED
data/lib/fizzy/api/version.rb
CHANGED
data/lib/fizzy/api.rb
CHANGED
@@ -3,10 +3,7 @@ require 'fizzy/api/version'
|
|
3
3
|
require 'fizzy/api/sessions'
|
4
4
|
require 'fizzy/api/models'
|
5
5
|
require 'fizzy/api/errors'
|
6
|
-
|
7
|
-
require 'fizzy/api/calculate_outcome'
|
8
|
-
require 'fizzy/api/render_graph'
|
9
|
-
require 'fizzy/api/render_overview'
|
6
|
+
require 'fizzy/api/endpoints'
|
10
7
|
|
11
8
|
module Fizzy
|
12
9
|
module Api
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shared_examples_for_endpoints'
|
3
|
+
module Fizzy
|
4
|
+
module Api
|
5
|
+
module Endpoints
|
6
|
+
describe CalculateOutcome do
|
7
|
+
let(:dossier_id) { '123' }
|
8
|
+
let(:protocol_subscription_id) { 'abc' }
|
9
|
+
let(:response) { httparty_response('') }
|
10
|
+
let(:session) { FactoryGirl.build :basic_auth_session }
|
11
|
+
|
12
|
+
it_behaves_like 'an endpoint'
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
16
|
+
allow(session).to receive(:post).and_return nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should call the correct url' do
|
20
|
+
expect(session).to receive(:post)
|
21
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/calculate")
|
22
|
+
.and_return(response)
|
23
|
+
|
24
|
+
described_class.run! dossier_id: dossier_id,
|
25
|
+
protocol_subscription_id: protocol_subscription_id
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'error handling' do
|
29
|
+
it 'should notice a 404' do
|
30
|
+
allow(response).to receive(:code).and_return 404
|
31
|
+
expect(session).to receive(:post)
|
32
|
+
.with('/dossier/fake/protocol_subscriptions/fake/calculate')
|
33
|
+
.and_return(response)
|
34
|
+
outcome = lambda do
|
35
|
+
described_class.run! dossier_id: 'fake',
|
36
|
+
protocol_subscription_id: 'fake'
|
37
|
+
end
|
38
|
+
expect { outcome.call }.to raise_error(Errors::GraphNotFoundError)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should fail a 500 with an UnexpectedStatusError' do
|
42
|
+
allow(response).to receive(:code).and_return 500
|
43
|
+
expect(session).to receive(:post)
|
44
|
+
.with('/dossier/fake/protocol_subscriptions/fake/calculate')
|
45
|
+
.and_return(response)
|
46
|
+
outcome = lambda do
|
47
|
+
described_class.run! dossier_id: 'fake',
|
48
|
+
protocol_subscription_id: 'fake'
|
49
|
+
end
|
50
|
+
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shared_examples_for_endpoints'
|
3
|
+
module Fizzy
|
4
|
+
module Api
|
5
|
+
module Endpoints
|
6
|
+
describe RenderGraph do
|
7
|
+
let(:dossier_id) { '123' }
|
8
|
+
let(:protocol_subscription_id) { 'abc' }
|
9
|
+
let(:path) { 'welbevinden.svg' }
|
10
|
+
let(:options) { {} }
|
11
|
+
let(:response) { httparty_response('<svg>') }
|
12
|
+
let(:session) { FactoryGirl.build :basic_auth_session }
|
13
|
+
|
14
|
+
it_behaves_like 'an endpoint'
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should call the correct url' do
|
21
|
+
expect(session).to receive(:get)
|
22
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
23
|
+
.and_return(response)
|
24
|
+
outcome = described_class.run! dossier_id: dossier_id,
|
25
|
+
protocol_subscription_id: protocol_subscription_id,
|
26
|
+
path: path,
|
27
|
+
options: options
|
28
|
+
expect(outcome).to eq '<svg>'
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'error handling' do
|
32
|
+
it 'should notice a 202' do
|
33
|
+
allow(response).to receive(:code).and_return 202
|
34
|
+
expect(session).to receive(:get)
|
35
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
36
|
+
.and_return(response)
|
37
|
+
outcome = lambda do
|
38
|
+
described_class.run! dossier_id: dossier_id,
|
39
|
+
protocol_subscription_id: protocol_subscription_id,
|
40
|
+
path: path,
|
41
|
+
options: options
|
42
|
+
end
|
43
|
+
expect { outcome.call }.to raise_error(Errors::OutcomeNotAvailableError)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should notice a 204' do
|
47
|
+
allow(response).to receive(:code).and_return 204
|
48
|
+
expect(session).to receive(:get)
|
49
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
50
|
+
.and_return(response)
|
51
|
+
outcome = lambda do
|
52
|
+
described_class.run! dossier_id: dossier_id,
|
53
|
+
protocol_subscription_id: protocol_subscription_id,
|
54
|
+
path: path,
|
55
|
+
options: options
|
56
|
+
end
|
57
|
+
expect { outcome.call }.to raise_error(Errors::TooFewMeasurementsError)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should notice a 404' do
|
61
|
+
allow(response).to receive(:code).and_return 404
|
62
|
+
expect(session).to receive(:get)
|
63
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
64
|
+
.and_return(response)
|
65
|
+
outcome = lambda do
|
66
|
+
described_class.run! dossier_id: dossier_id,
|
67
|
+
protocol_subscription_id: protocol_subscription_id,
|
68
|
+
path: path,
|
69
|
+
options: options
|
70
|
+
end
|
71
|
+
expect { outcome.call }.to raise_error(Errors::GraphNotFoundError)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should fail a 500 with an UnexpectedStatusError' do
|
75
|
+
allow(response).to receive(:code).and_return 500
|
76
|
+
expect(session).to receive(:get)
|
77
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
78
|
+
.and_return(response)
|
79
|
+
outcome = lambda do
|
80
|
+
described_class.run! dossier_id: dossier_id,
|
81
|
+
protocol_subscription_id: protocol_subscription_id,
|
82
|
+
path: path,
|
83
|
+
options: options
|
84
|
+
end
|
85
|
+
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shared_examples_for_endpoints'
|
3
|
+
module Fizzy
|
4
|
+
module Api
|
5
|
+
module Endpoints
|
6
|
+
describe RenderGraphSynchronous do
|
7
|
+
let(:dossier_id) { '123' }
|
8
|
+
let(:protocol_subscription_id) { 'abc' }
|
9
|
+
let(:path) { 'welbevinden.svg' }
|
10
|
+
let(:options) { {} }
|
11
|
+
let(:response) { httparty_response('<svg>') }
|
12
|
+
let(:session) { FactoryGirl.build :basic_auth_session }
|
13
|
+
|
14
|
+
it_behaves_like 'an endpoint'
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should call the correct url' do
|
21
|
+
expect(session).to receive(:get)
|
22
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render_sync/#{path}",
|
23
|
+
options)
|
24
|
+
.and_return(response)
|
25
|
+
outcome = described_class.run! dossier_id: dossier_id,
|
26
|
+
protocol_subscription_id: protocol_subscription_id,
|
27
|
+
path: path,
|
28
|
+
options: options
|
29
|
+
expect(outcome).to eq '<svg>'
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'error handling' do
|
33
|
+
it 'should notice a 204' do
|
34
|
+
allow(response).to receive(:code).and_return 204
|
35
|
+
expect(session).to receive(:get)
|
36
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render_sync/#{path}",
|
37
|
+
options)
|
38
|
+
.and_return(response)
|
39
|
+
outcome = lambda do
|
40
|
+
described_class.run! dossier_id: dossier_id,
|
41
|
+
protocol_subscription_id: protocol_subscription_id,
|
42
|
+
path: path,
|
43
|
+
options: options
|
44
|
+
end
|
45
|
+
expect { outcome.call }.to raise_error(Errors::TooFewMeasurementsError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should notice a 404' do
|
49
|
+
allow(response).to receive(:code).and_return 404
|
50
|
+
expect(session).to receive(:get)
|
51
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render_sync/#{path}",
|
52
|
+
options)
|
53
|
+
.and_return(response)
|
54
|
+
outcome = lambda do
|
55
|
+
described_class.run! dossier_id: dossier_id,
|
56
|
+
protocol_subscription_id: protocol_subscription_id,
|
57
|
+
path: path,
|
58
|
+
options: options
|
59
|
+
end
|
60
|
+
expect { outcome.call }.to raise_error(Errors::GraphNotFoundError)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should notice a 405' do
|
64
|
+
allow(response).to receive(:code).and_return 405
|
65
|
+
expect(session).to receive(:get)
|
66
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render_sync/#{path}",
|
67
|
+
options)
|
68
|
+
.and_return(response)
|
69
|
+
outcome = lambda do
|
70
|
+
described_class.run! dossier_id: dossier_id,
|
71
|
+
protocol_subscription_id: protocol_subscription_id,
|
72
|
+
path: path,
|
73
|
+
options: options
|
74
|
+
end
|
75
|
+
expect { outcome.call }.to raise_error(Errors::MethodNotAllowedError)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should fail a 500 with an UnexpectedStatusError' do
|
79
|
+
allow(response).to receive(:code).and_return 500
|
80
|
+
expect(session).to receive(:get)
|
81
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render_sync/#{path}",
|
82
|
+
options)
|
83
|
+
.and_return(response)
|
84
|
+
outcome = lambda do
|
85
|
+
described_class.run! dossier_id: dossier_id,
|
86
|
+
protocol_subscription_id: protocol_subscription_id,
|
87
|
+
path: path,
|
88
|
+
options: options
|
89
|
+
end
|
90
|
+
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shared_examples_for_endpoints'
|
3
|
+
module Fizzy
|
4
|
+
module Api
|
5
|
+
module Endpoints
|
6
|
+
describe RenderOverview do
|
7
|
+
let(:dossier_id) { '123' }
|
8
|
+
let(:protocol_subscription_id) { 'abc' }
|
9
|
+
let(:response) { httparty_response('{}') }
|
10
|
+
let(:session) { FactoryGirl.build :basic_auth_session }
|
11
|
+
|
12
|
+
it_behaves_like 'an endpoint'
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should call the correct url' do
|
19
|
+
expect(session).to receive(:get)
|
20
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render.json")
|
21
|
+
.and_return(response)
|
22
|
+
outcome = described_class.run! dossier_id: dossier_id,
|
23
|
+
protocol_subscription_id: protocol_subscription_id
|
24
|
+
expect(outcome).to eq '{}'
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'error handling' do
|
28
|
+
it 'should fail a 500 with an UnexpectedStatusError' do
|
29
|
+
allow(response).to receive(:code).and_return 500
|
30
|
+
expect(session).to receive(:get)
|
31
|
+
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render.json")
|
32
|
+
.and_return(response)
|
33
|
+
outcome = lambda do
|
34
|
+
described_class.run! dossier_id: dossier_id,
|
35
|
+
protocol_subscription_id: protocol_subscription_id
|
36
|
+
end
|
37
|
+
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fizzy
|
2
|
+
module Api
|
3
|
+
module Endpoints
|
4
|
+
shared_examples_for 'an endpoint' do
|
5
|
+
it 'should define a process response method' do
|
6
|
+
expect(subject.methods).to include(:process_response)
|
7
|
+
end
|
8
|
+
it 'should define an invalid response method' do
|
9
|
+
methods = subject.private_methods + subject.methods
|
10
|
+
expect(methods).to include(:invalid_response)
|
11
|
+
end
|
12
|
+
it 'should define a select_measurement_text method' do
|
13
|
+
expect(subject.methods).to include(:select_measurement_text)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fizzy-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frank Blaauw
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-05-
|
12
|
+
date: 2016-05-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -127,25 +127,31 @@ files:
|
|
127
127
|
- fizzy_api.gemspec
|
128
128
|
- lib/fizzy-api.rb
|
129
129
|
- lib/fizzy/api.rb
|
130
|
-
- lib/fizzy/api/
|
130
|
+
- lib/fizzy/api/endpoints.rb
|
131
|
+
- lib/fizzy/api/endpoints/calculate_outcome.rb
|
132
|
+
- lib/fizzy/api/endpoints/endpoint.rb
|
133
|
+
- lib/fizzy/api/endpoints/render_graph.rb
|
134
|
+
- lib/fizzy/api/endpoints/render_graph_synchronous.rb
|
135
|
+
- lib/fizzy/api/endpoints/render_overview.rb
|
131
136
|
- lib/fizzy/api/errors.rb
|
132
137
|
- lib/fizzy/api/errors/graph_not_found_error.rb
|
138
|
+
- lib/fizzy/api/errors/method_not_allowed_error.rb
|
133
139
|
- lib/fizzy/api/errors/outcome_not_available_error.rb
|
134
140
|
- lib/fizzy/api/errors/too_few_measurements_error.rb
|
135
141
|
- lib/fizzy/api/errors/unexpected_status_error.rb
|
136
142
|
- lib/fizzy/api/models.rb
|
137
|
-
- lib/fizzy/api/render_graph.rb
|
138
|
-
- lib/fizzy/api/render_overview.rb
|
139
143
|
- lib/fizzy/api/sessions.rb
|
140
144
|
- lib/fizzy/api/sessions/basic_auth_session.rb
|
141
145
|
- lib/fizzy/api/version.rb
|
142
146
|
- rubocop-todo.yml
|
143
147
|
- spec/factories/basic_auth_session.rb
|
144
|
-
- spec/fizzy/api/calculate_outcome_spec.rb
|
145
|
-
- spec/fizzy/api/render_graph_spec.rb
|
146
|
-
- spec/fizzy/api/
|
148
|
+
- spec/fizzy/api/endpoints/calculate_outcome_spec.rb
|
149
|
+
- spec/fizzy/api/endpoints/render_graph_spec.rb
|
150
|
+
- spec/fizzy/api/endpoints/render_graph_synchronous_spec.rb
|
151
|
+
- spec/fizzy/api/endpoints/render_overview_spec.rb
|
147
152
|
- spec/fizzy/api/sessions/basic_auth_session_spec.rb
|
148
153
|
- spec/fizzy/api/sessions_spec.rb
|
154
|
+
- spec/shared_examples_for_endpoints.rb
|
149
155
|
- spec/spec_helper.rb
|
150
156
|
- spec/support/httparty_helpers.rb
|
151
157
|
homepage: http://github.com/roqua/fizzy_api
|
@@ -174,10 +180,12 @@ specification_version: 4
|
|
174
180
|
summary: API wrapper gem around Fizzy's Graph API
|
175
181
|
test_files:
|
176
182
|
- spec/factories/basic_auth_session.rb
|
177
|
-
- spec/fizzy/api/calculate_outcome_spec.rb
|
178
|
-
- spec/fizzy/api/render_graph_spec.rb
|
179
|
-
- spec/fizzy/api/
|
183
|
+
- spec/fizzy/api/endpoints/calculate_outcome_spec.rb
|
184
|
+
- spec/fizzy/api/endpoints/render_graph_spec.rb
|
185
|
+
- spec/fizzy/api/endpoints/render_graph_synchronous_spec.rb
|
186
|
+
- spec/fizzy/api/endpoints/render_overview_spec.rb
|
180
187
|
- spec/fizzy/api/sessions/basic_auth_session_spec.rb
|
181
188
|
- spec/fizzy/api/sessions_spec.rb
|
189
|
+
- spec/shared_examples_for_endpoints.rb
|
182
190
|
- spec/spec_helper.rb
|
183
191
|
- spec/support/httparty_helpers.rb
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Fizzy
|
2
|
-
module Api
|
3
|
-
class CalculateOutcome < ActiveInteraction::Base
|
4
|
-
string :dossier_id
|
5
|
-
string :protocol_subscription_id
|
6
|
-
|
7
|
-
def execute
|
8
|
-
response = Api.basic_auth_session.post("/dossier/#{dossier_id}"\
|
9
|
-
"/protocol_subscriptions/#{protocol_subscription_id}"\
|
10
|
-
'/calculate')
|
11
|
-
process_response(response)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def process_response(response)
|
17
|
-
case response.code
|
18
|
-
when 200
|
19
|
-
response
|
20
|
-
else
|
21
|
-
invalid_response(response)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def invalid_response(response)
|
26
|
-
case response.code
|
27
|
-
when 202
|
28
|
-
raise Errors::OutcomeNotAvailableError, response.body || 'The results are currently being calculated.'
|
29
|
-
when 404
|
30
|
-
raise Errors::GraphNotFoundError, response.body || 'Participant not found, or graph not supported.'
|
31
|
-
else
|
32
|
-
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Fizzy
|
2
|
-
module Api
|
3
|
-
class RenderGraph < ActiveInteraction::Base
|
4
|
-
string :dossier_id
|
5
|
-
string :protocol_subscription_id
|
6
|
-
string :path
|
7
|
-
hash :options, default: {}
|
8
|
-
|
9
|
-
def execute
|
10
|
-
response = Api.basic_auth_session.get("/dossier/#{dossier_id}"\
|
11
|
-
"/protocol_subscriptions/#{protocol_subscription_id}" \
|
12
|
-
"/render/#{path}", options)
|
13
|
-
process_response(response)
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def process_response(response)
|
19
|
-
case response.code
|
20
|
-
when 200
|
21
|
-
response
|
22
|
-
else
|
23
|
-
invalid_response(response)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def invalid_response(response)
|
28
|
-
case response.code
|
29
|
-
when 202
|
30
|
-
raise Errors::OutcomeNotAvailableError, select_measurement_text(response,
|
31
|
-
'The results have not yet been calculated.')
|
32
|
-
when 204
|
33
|
-
raise Errors::TooFewMeasurementsError, select_measurement_text(response,
|
34
|
-
'Not enough measurements available.')
|
35
|
-
when 404
|
36
|
-
raise Errors::GraphNotFoundError, select_measurement_text(response,
|
37
|
-
'Graph not found.')
|
38
|
-
else
|
39
|
-
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def select_measurement_text(response, default_message)
|
44
|
-
response.body || default_message
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Fizzy
|
2
|
-
module Api
|
3
|
-
class RenderOverview < ActiveInteraction::Base
|
4
|
-
string :dossier_id
|
5
|
-
string :protocol_subscription_id
|
6
|
-
|
7
|
-
def execute
|
8
|
-
response = Api.basic_auth_session.get("/dossier/#{dossier_id}"\
|
9
|
-
"/protocol_subscriptions/#{protocol_subscription_id}" \
|
10
|
-
'/render.json')
|
11
|
-
process_response(response)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def process_response(response)
|
17
|
-
case response.code
|
18
|
-
when 200
|
19
|
-
response
|
20
|
-
else
|
21
|
-
raise Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module Fizzy
|
3
|
-
module Api
|
4
|
-
describe CalculateOutcome do
|
5
|
-
let(:dossier_id) { '123' }
|
6
|
-
let(:protocol_subscription_id) { 'abc' }
|
7
|
-
let(:response) { httparty_response('') }
|
8
|
-
let(:session) { FactoryGirl.build :basic_auth_session }
|
9
|
-
|
10
|
-
before do
|
11
|
-
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
12
|
-
allow(session).to receive(:post).and_return nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should call the correct url' do
|
16
|
-
expect(session).to receive(:post)
|
17
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/calculate")
|
18
|
-
.and_return(response)
|
19
|
-
|
20
|
-
described_class.run! dossier_id: dossier_id,
|
21
|
-
protocol_subscription_id: protocol_subscription_id
|
22
|
-
end
|
23
|
-
|
24
|
-
describe 'error handling' do
|
25
|
-
it 'should notice a 404' do
|
26
|
-
allow(response).to receive(:code).and_return 404
|
27
|
-
expect(session).to receive(:post)
|
28
|
-
.with('/dossier/fake/protocol_subscriptions/fake/calculate')
|
29
|
-
.and_return(response)
|
30
|
-
outcome = lambda do
|
31
|
-
described_class.run! dossier_id: 'fake',
|
32
|
-
protocol_subscription_id: 'fake'
|
33
|
-
end
|
34
|
-
expect { outcome.call }.to raise_error(Errors::GraphNotFoundError)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should fail a 500 with an UnexpectedStatusError' do
|
38
|
-
allow(response).to receive(:code).and_return 500
|
39
|
-
expect(session).to receive(:post)
|
40
|
-
.with('/dossier/fake/protocol_subscriptions/fake/calculate')
|
41
|
-
.and_return(response)
|
42
|
-
outcome = lambda do
|
43
|
-
described_class.run! dossier_id: 'fake',
|
44
|
-
protocol_subscription_id: 'fake'
|
45
|
-
end
|
46
|
-
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module Fizzy
|
3
|
-
module Api
|
4
|
-
describe RenderGraph do
|
5
|
-
let(:dossier_id) { '123' }
|
6
|
-
let(:protocol_subscription_id) { 'abc' }
|
7
|
-
let(:path) { 'welbevinden.svg' }
|
8
|
-
let(:options) { {} }
|
9
|
-
let(:response) { httparty_response('<svg>') }
|
10
|
-
let(:session) { FactoryGirl.build :basic_auth_session }
|
11
|
-
|
12
|
-
before do
|
13
|
-
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should call the correct url' do
|
17
|
-
expect(session).to receive(:get)
|
18
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
19
|
-
.and_return(response)
|
20
|
-
outcome = described_class.run! dossier_id: dossier_id,
|
21
|
-
protocol_subscription_id: protocol_subscription_id,
|
22
|
-
path: path,
|
23
|
-
options: options
|
24
|
-
expect(outcome).to eq '<svg>'
|
25
|
-
end
|
26
|
-
|
27
|
-
describe 'error handling' do
|
28
|
-
it 'should notice a 202' do
|
29
|
-
allow(response).to receive(:code).and_return 202
|
30
|
-
expect(session).to receive(:get)
|
31
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
32
|
-
.and_return(response)
|
33
|
-
outcome = lambda do
|
34
|
-
described_class.run! dossier_id: dossier_id,
|
35
|
-
protocol_subscription_id: protocol_subscription_id,
|
36
|
-
path: path,
|
37
|
-
options: options
|
38
|
-
end
|
39
|
-
expect { outcome.call }.to raise_error(Errors::OutcomeNotAvailableError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should notice a 204' do
|
43
|
-
allow(response).to receive(:code).and_return 204
|
44
|
-
expect(session).to receive(:get)
|
45
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
46
|
-
.and_return(response)
|
47
|
-
outcome = lambda do
|
48
|
-
described_class.run! dossier_id: dossier_id,
|
49
|
-
protocol_subscription_id: protocol_subscription_id,
|
50
|
-
path: path,
|
51
|
-
options: options
|
52
|
-
end
|
53
|
-
expect { outcome.call }.to raise_error(Errors::TooFewMeasurementsError)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should notice a 404' do
|
57
|
-
allow(response).to receive(:code).and_return 404
|
58
|
-
expect(session).to receive(:get)
|
59
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
60
|
-
.and_return(response)
|
61
|
-
outcome = lambda do
|
62
|
-
described_class.run! dossier_id: dossier_id,
|
63
|
-
protocol_subscription_id: protocol_subscription_id,
|
64
|
-
path: path,
|
65
|
-
options: options
|
66
|
-
end
|
67
|
-
expect { outcome.call }.to raise_error(Errors::GraphNotFoundError)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'should fail a 500 with an UnexpectedStatusError' do
|
71
|
-
allow(response).to receive(:code).and_return 500
|
72
|
-
expect(session).to receive(:get)
|
73
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render/#{path}", options)
|
74
|
-
.and_return(response)
|
75
|
-
outcome = lambda do
|
76
|
-
described_class.run! dossier_id: dossier_id,
|
77
|
-
protocol_subscription_id: protocol_subscription_id,
|
78
|
-
path: path,
|
79
|
-
options: options
|
80
|
-
end
|
81
|
-
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module Fizzy
|
3
|
-
module Api
|
4
|
-
describe RenderOverview do
|
5
|
-
let(:dossier_id) { '123' }
|
6
|
-
let(:protocol_subscription_id) { 'abc' }
|
7
|
-
let(:response) { httparty_response('{}') }
|
8
|
-
let(:session) { FactoryGirl.build :basic_auth_session }
|
9
|
-
|
10
|
-
before do
|
11
|
-
allow(Sessions::BasicAuthSession).to receive(:new).and_return session
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should call the correct url' do
|
15
|
-
expect(session).to receive(:get)
|
16
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render.json")
|
17
|
-
.and_return(response)
|
18
|
-
outcome = described_class.run! dossier_id: dossier_id,
|
19
|
-
protocol_subscription_id: protocol_subscription_id
|
20
|
-
expect(outcome).to eq '{}'
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'error handling' do
|
24
|
-
it 'should fail a 500 with an UnexpectedStatusError' do
|
25
|
-
allow(response).to receive(:code).and_return 500
|
26
|
-
expect(session).to receive(:get)
|
27
|
-
.with("/dossier/#{dossier_id}/protocol_subscriptions/#{protocol_subscription_id}/render.json")
|
28
|
-
.and_return(response)
|
29
|
-
outcome = lambda do
|
30
|
-
described_class.run! dossier_id: dossier_id,
|
31
|
-
protocol_subscription_id: protocol_subscription_id
|
32
|
-
end
|
33
|
-
expect { outcome.call }.to raise_error(Errors::UnexpectedStatusError)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|