fizzy-api 0.0.1.1 → 0.0.2

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: 90de7d20a479ae2b27a1720d061c96e19f15b8dc
4
- data.tar.gz: b068124f3d3fa7f99a0003234c5a2dc12de1a055
3
+ metadata.gz: 624a2b9c0580b0d25778de852143f3fee0a68f37
4
+ data.tar.gz: ce9858bd4eb8eab70e8ea20989e0709a146a744d
5
5
  SHA512:
6
- metadata.gz: a60fb12c6b2b578d6530f749d049220edcddc67d3013627c4f6fbde487d8e1e79d34eb1f60335d1cd40b5e26a730d72f9289b85807bd664567d5e13ee4e07117
7
- data.tar.gz: 2d4825db4e28e7499571b98fe6b4883c31da03baddaa34d88a3d58ec5bb9682485c44e516a8080d76245d9226b8267bbbd6efd49d72cfa032fe7ecd473e824b4
6
+ metadata.gz: 1fa66d4c86515d7f2d5206031497354abfc1c5a58b448c63ef7f3d2837150cf5902dbeb43116fe0c16338c08cc27f26442d66069bef3de75d1e68dc9e9fa7cc1
7
+ data.tar.gz: fe8271087a9a8b3b1204230141792c1dd8a1e9be9e873415051aa41614fad06e6ec1d0af27d2a26d7d475c4ffb94989bbbb97bf2a0abd3b95eaf992de3a9364c
data/.gitignore ADDED
@@ -0,0 +1,128 @@
1
+ *.orig
2
+ *.bak
3
+ *.patch
4
+ *.csv
5
+ *~
6
+ .ruby-version
7
+ .rvmrc
8
+ .ruby*
9
+ .autotest
10
+ .bundle
11
+ .bundle/*
12
+ .DS_Store
13
+ .env
14
+ .idea
15
+ .loadpath
16
+ .powrc
17
+ .powenv
18
+ .project
19
+ .rspec
20
+ .sass-cache
21
+ .settings/*
22
+ .tmp_*
23
+ Guardfile.local
24
+ .~lock.*
25
+ app/assets/javascripts/i18n/*
26
+ aspec
27
+ config/database.yml
28
+ config/mongoid.yml
29
+ coverage
30
+ db/hl7-backup
31
+ db/questionnaires
32
+ db/seeds/*.example
33
+ doc/*/*.aux
34
+ doc/*/.*
35
+ doc/*/materiaal/*.psd
36
+ log/*.log
37
+ log/*.db
38
+ log/*.pid
39
+ nbproject
40
+ public/assets
41
+ scratch_directory
42
+ TAGS
43
+ tmp/**
44
+ script/switch_to_overrides
45
+ # Rails
46
+ .bundle
47
+ db/*.sqlite3
48
+ db/*.sqlite3-journal
49
+ *.log
50
+ tmp
51
+ tmp/**/*
52
+
53
+ # Documentation
54
+ doc/api
55
+ doc/app
56
+ .yardoc
57
+ .yardopts
58
+ coverage
59
+
60
+ # Public Uploads
61
+ public/system/*
62
+ public/themes/*
63
+
64
+ # Public Cache
65
+ public/javascripts/cache
66
+ public/stylesheets/cache
67
+ public/refinery/*
68
+
69
+ # Vendor Cache
70
+ vendor/cache
71
+ vendor/bundle
72
+ vendor/extensions/**/vendor/
73
+ vendor/extensions/**/bundle/
74
+
75
+ # Acts as Indexed
76
+ index/**/*
77
+
78
+ # Refinery Specific
79
+ *.tmproj
80
+ *.autobackupbyrefinery.*
81
+ refinerycms-*.gem
82
+
83
+ # Mac
84
+ .DS_Store
85
+
86
+ # Windows
87
+ Thumbs.db
88
+
89
+ # NetBeans
90
+ nbproject
91
+
92
+ # Eclipse
93
+ .project
94
+
95
+ # Redcar
96
+ .redcar
97
+
98
+ # Rubinius
99
+ *.rbc
100
+
101
+ # Vim
102
+ *.swp
103
+ *.swo
104
+
105
+ # RubyMine
106
+ .idea
107
+
108
+ # E-texteditor
109
+ .eprj
110
+
111
+ # Backup
112
+ *~
113
+
114
+ # Capybara Bug
115
+ capybara-*html
116
+
117
+ # sass
118
+ .sass-cache
119
+ .sass-cache/*
120
+
121
+ #rvm
122
+ .rvmrc
123
+ .rvmrc.*
124
+
125
+ # vendor/extensions dummy applications.
126
+ vendor/extensions/**/spec/dummy
127
+
128
+ *.gem
data/.rubocop.yml ADDED
@@ -0,0 +1,39 @@
1
+ inherit_from: rubocop-todo.yml
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'fizzy_api.gemspec'
6
+ - 'tmp/**/*'
7
+ - 'vendor/**/*'
8
+ - 'bin/*'
9
+
10
+ # Use UTF-8 as the source file encoding.
11
+ Encoding:
12
+ Enabled: false
13
+
14
+ # Limit lines to 80 characters.
15
+ LineLength:
16
+ Max: 120
17
+
18
+ # Avoid methods longer than 10 lines of code
19
+ MethodLength:
20
+ CountComments: false # count full line comments?
21
+ Max: 20
22
+
23
+ ################################################################## DISABLED COPS
24
+
25
+ # These cops are disabled because we think they are a Bad Idea. If you add one
26
+ # here, make sure to add a comment describing what the cop does, and why this
27
+ # is a bad idea.
28
+
29
+ # Forces the argument names of the block given to #reduce to be `a, e`. Only
30
+ # applies on single-line blocks, but why would we want to force people to use
31
+ # less descriptive names?
32
+ Documentation:
33
+ Enabled: false
34
+
35
+ # Gems typically have one file named the-gem-name.rb which can be autorequired by bundler
36
+ Style/FileName:
37
+ Exclude:
38
+ - lib/fizzy-api.rb
39
+
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+ gem 'httparty', '~> 0.12.0'
5
+ gem 'active_interaction', '~> 1.3.0'
6
+
7
+ group :test do
8
+ gem 'factory_girl_rails'
9
+ gem 'rspec'
10
+ gem 'rubocop'
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,115 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fizzy-api (0.0.1.1)
5
+ active_interaction (~> 1.3)
6
+ httparty (~> 0.12)
7
+ virtus (~> 1.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionpack (4.1.8)
13
+ actionview (= 4.1.8)
14
+ activesupport (= 4.1.8)
15
+ rack (~> 1.5.2)
16
+ rack-test (~> 0.6.2)
17
+ actionview (4.1.8)
18
+ activesupport (= 4.1.8)
19
+ builder (~> 3.1)
20
+ erubis (~> 2.7.0)
21
+ active_interaction (1.3.0)
22
+ activemodel (>= 3.2, < 5)
23
+ activemodel (4.1.8)
24
+ activesupport (= 4.1.8)
25
+ builder (~> 3.1)
26
+ activesupport (4.1.8)
27
+ i18n (~> 0.6, >= 0.6.9)
28
+ json (~> 1.7, >= 1.7.7)
29
+ minitest (~> 5.1)
30
+ thread_safe (~> 0.1)
31
+ tzinfo (~> 1.1)
32
+ ast (2.0.0)
33
+ astrolabe (1.3.0)
34
+ parser (>= 2.2.0.pre.3, < 3.0)
35
+ axiom-types (0.1.1)
36
+ descendants_tracker (~> 0.0.4)
37
+ ice_nine (~> 0.11.0)
38
+ thread_safe (~> 0.3, >= 0.3.1)
39
+ builder (3.2.2)
40
+ coercible (1.0.0)
41
+ descendants_tracker (~> 0.0.1)
42
+ descendants_tracker (0.0.4)
43
+ thread_safe (~> 0.3, >= 0.3.1)
44
+ diff-lcs (1.2.5)
45
+ equalizer (0.0.9)
46
+ erubis (2.7.0)
47
+ factory_girl (4.5.0)
48
+ activesupport (>= 3.0.0)
49
+ factory_girl_rails (4.5.0)
50
+ factory_girl (~> 4.5.0)
51
+ railties (>= 3.0.0)
52
+ httparty (0.12.0)
53
+ json (~> 1.8)
54
+ multi_xml (>= 0.5.2)
55
+ i18n (0.6.11)
56
+ ice_nine (0.11.1)
57
+ json (1.8.1)
58
+ minitest (5.4.3)
59
+ multi_xml (0.5.5)
60
+ parser (2.2.0.pre.8)
61
+ ast (>= 1.1, < 3.0)
62
+ slop (~> 3.4, >= 3.4.5)
63
+ powerpack (0.0.9)
64
+ rack (1.5.2)
65
+ rack-test (0.6.2)
66
+ rack (>= 1.0)
67
+ railties (4.1.8)
68
+ actionpack (= 4.1.8)
69
+ activesupport (= 4.1.8)
70
+ rake (>= 0.8.7)
71
+ thor (>= 0.18.1, < 2.0)
72
+ rainbow (2.0.0)
73
+ rake (10.4.0)
74
+ rspec (3.1.0)
75
+ rspec-core (~> 3.1.0)
76
+ rspec-expectations (~> 3.1.0)
77
+ rspec-mocks (~> 3.1.0)
78
+ rspec-core (3.1.7)
79
+ rspec-support (~> 3.1.0)
80
+ rspec-expectations (3.1.2)
81
+ diff-lcs (>= 1.2.0, < 2.0)
82
+ rspec-support (~> 3.1.0)
83
+ rspec-mocks (3.1.3)
84
+ rspec-support (~> 3.1.0)
85
+ rspec-support (3.1.2)
86
+ rubocop (0.27.1)
87
+ astrolabe (~> 1.3)
88
+ parser (>= 2.2.0.pre.7, < 3.0)
89
+ powerpack (~> 0.0.6)
90
+ rainbow (>= 1.99.1, < 3.0)
91
+ ruby-progressbar (~> 1.4)
92
+ ruby-progressbar (1.7.0)
93
+ slop (3.6.0)
94
+ thor (0.19.1)
95
+ thread_safe (0.3.4)
96
+ tzinfo (1.2.2)
97
+ thread_safe (~> 0.1)
98
+ virtus (1.0.3)
99
+ axiom-types (~> 0.1)
100
+ coercible (~> 1.0)
101
+ descendants_tracker (~> 0.0, >= 0.0.3)
102
+ equalizer (~> 0.0, >= 0.0.9)
103
+
104
+ PLATFORMS
105
+ ruby
106
+
107
+ DEPENDENCIES
108
+ active_interaction (~> 1.3.0)
109
+ bundler (~> 1.7)
110
+ factory_girl_rails
111
+ fizzy-api!
112
+ httparty (~> 0.12.0)
113
+ rake (~> 10.4)
114
+ rspec
115
+ rubocop
data/README.md ADDED
@@ -0,0 +1,10 @@
1
+ fizzy_api
2
+ =========
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/fizzy-api.svg)](http://badge.fury.io/rb/fizzy-api) [![Circle CI](https://circleci.com/gh/roqua/fizzy_api.svg?style=svg)](https://circleci.com/gh/roqua/fizzy_api)
5
+
6
+ Set the following ENV variables:
7
+
8
+ ENV['FIZZY_URL'] = 'http://fizzy.nl'
9
+ ENV['FIZZY_BASICAUTH_ID'] = 'basic_auth_id set in fizzy'
10
+ ENV['FIZZY_BASICAUTH_SECRET'] = 'secret set for fizzy clients'
data/Rakefile ADDED
File without changes
data/circle.yml ADDED
@@ -0,0 +1,12 @@
1
+ machine:
2
+ timezone:
3
+ Europe/Amsterdam
4
+ ruby:
5
+ version: 2.1.5
6
+ test:
7
+ override:
8
+ - bundle exec rspec spec:
9
+ environment:
10
+ RAILS_ENV: test
11
+ RACK_ENV: test
12
+ - bundle exec rubocop
data/fizzy_api.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('../lib/fizzy/api/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'fizzy-api'
6
+ gem.version = Fizzy::Api::VERSION
7
+ gem.summary = "%q{API wrapper gem around Fizzy's Graph API}"
8
+ gem.description = '%q{Provides authenticated access to fizzy utilities}'
9
+ gem.license = 'MIT'
10
+ gem.authors = ['Frank Blaauw', 'Ando Emerencia']
11
+ gem.email = ['f.j.blaauw@umcg.nl', 'ando.emerencia@gmail.com']
12
+ gem.homepage = 'http://github.com/roqua/fizzy_api'
13
+
14
+ gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
15
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_dependency 'httparty', '~> 0.12'
20
+ gem.add_dependency 'active_interaction', '~> 1.3'
21
+ gem.add_dependency 'virtus', '~> 1.0'
22
+
23
+ gem.add_development_dependency 'bundler', '~> 1.7'
24
+ gem.add_development_dependency 'rake', '~> 10.4'
25
+ gem.add_development_dependency 'rspec', '~> 3.1'
26
+ gem.add_development_dependency 'factory_girl_rails', '~> 4.5'
27
+ end
@@ -0,0 +1,28 @@
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
+ when 404
21
+ fail Errors::GraphNotFoundError, 'Participant not found, or graph not supported.'
22
+ else
23
+ fail Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,8 @@
1
+ module Fizzy
2
+ module Api
3
+ module Errors
4
+ class GraphNotFoundError < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Fizzy
2
+ module Api
3
+ module Errors
4
+ class OutcomeNotAvailableError < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Fizzy
2
+ module Api
3
+ module Errors
4
+ class TooFewMeasurementsError < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Fizzy
2
+ module Api
3
+ module Errors
4
+ class UnexpectedStatusError < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ require 'fizzy/api/errors/graph_not_found_error'
2
+ require 'fizzy/api/errors/outcome_not_available_error'
3
+ require 'fizzy/api/errors/too_few_measurements_error'
4
+ require 'fizzy/api/errors/unexpected_status_error'
File without changes
@@ -0,0 +1,34 @@
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
+ when 202
23
+ fail Errors::OutcomeNotAvailableError, 'The results have not yet been calculated.'
24
+ when 204
25
+ fail Errors::TooFewMeasurementsError, 'Not enough measurements available.'
26
+ when 404
27
+ fail Errors::GraphNotFoundError, 'Graph not found.'
28
+ else
29
+ fail Errors::UnexpectedStatusError, "Status code #{response.code} not expected."
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,87 @@
1
+ module Fizzy
2
+ module Api
3
+ module Sessions
4
+ class BasicAuthSession
5
+ attr_reader :fizzy_url
6
+ attr_reader :username
7
+ attr_reader :password
8
+
9
+ def initialize(fizzy_url: ENV['FIZZY_URL'],
10
+ username: ENV['FIZZY_BASICAUTH_ID'],
11
+ password: ENV['FIZZY_BASICAUTH_SECRET'])
12
+ @fizzy_url = fizzy_url
13
+ @username = username
14
+ @password = password
15
+ end
16
+
17
+ def get(path, params = {})
18
+ perform_request_or_fail do
19
+ HTTParty.get(full_url_for(path),
20
+ query: params,
21
+ basic_auth: basic_auth)
22
+ end
23
+ end
24
+
25
+ def post(path, params = {})
26
+ perform_request_or_fail do
27
+ HTTParty.post(full_url_for(path),
28
+ headers: { 'Content-Type' => 'application/json' },
29
+ body: params.to_json,
30
+ basic_auth: basic_auth)
31
+ end
32
+ end
33
+
34
+ def patch(path, params = {})
35
+ perform_request_or_fail do
36
+ HTTParty.patch(full_url_for(path),
37
+ headers: { 'Content-Type' => 'application/json' },
38
+ body: params.to_json,
39
+ basic_auth: basic_auth)
40
+ end
41
+ end
42
+
43
+ def delete(path, params = {})
44
+ perform_request_or_fail do
45
+ HTTParty.delete(full_url_for(path),
46
+ query: params,
47
+ basic_auth: basic_auth)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def perform_request_or_fail(&_block)
54
+ response = yield
55
+ case response.code
56
+ when 401
57
+ access_denied(response)
58
+ when 500
59
+ fail response.parsed_response || "Received HTTP response code #{response.code}!"
60
+ else
61
+ response
62
+ end
63
+ end
64
+
65
+ def access_denied(response)
66
+ if response.headers['WWW-Authenticate']
67
+ fail NoSession
68
+ else
69
+ fail Unauthorized
70
+ end
71
+ end
72
+
73
+ def full_url_for(path)
74
+ fizzy_url + api_base + path
75
+ end
76
+
77
+ def api_base
78
+ '/api/v1'
79
+ end
80
+
81
+ def basic_auth
82
+ { username: username, password: password }
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,10 @@
1
+ require 'httparty'
2
+ require 'fizzy/api/sessions/basic_auth_session'
3
+
4
+ module Fizzy
5
+ module Api
6
+ def self.basic_auth_session(*arguments, &block)
7
+ Sessions::BasicAuthSession.new(*arguments, &block)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module Fizzy
2
+ module Api
3
+ VERSION = '0.0.2'
4
+ end
5
+ end
data/lib/fizzy/api.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'active_interaction'
2
+ require 'fizzy/api/version'
3
+ require 'fizzy/api/sessions'
4
+ require 'fizzy/api/models'
5
+ require 'fizzy/api/errors'
6
+
7
+ require 'fizzy/api/calculate_outcome'
8
+ require 'fizzy/api/render_graph'
9
+
10
+ module Fizzy
11
+ module Api
12
+ # Raised when a request failed due to an expired/non-existing session.
13
+ class NoSession < StandardError; end
14
+ class Unauthorized < StandardError; end
15
+ end
16
+ end
data/lib/fizzy-api.rb ADDED
@@ -0,0 +1 @@
1
+ require 'fizzy/api'
data/rubocop-todo.yml ADDED
File without changes
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :basic_auth_session do
3
+ initialize_with { new(username: 'some_username', password: 'some_password', fizzy_url: 'http://fizzy.dev') }
4
+ end
5
+ end
@@ -0,0 +1,51 @@
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
@@ -0,0 +1,86 @@
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
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+ include Sessions
3
+
4
+ describe BasicAuthSession do
5
+ let(:session) { FactoryGirl.build :basic_auth_session }
6
+ let(:response) { double('response', code: 201, parsed_response: 'some_response') }
7
+
8
+ describe '#initialize' do
9
+ it 'sets the fizzy_url instance attribute' do
10
+ session = Fizzy::Api.basic_auth_session fizzy_url: 'some_fizzy_url'
11
+ expect(session.fizzy_url).to eq('some_fizzy_url')
12
+ end
13
+
14
+ it 'defaults the fizzy_url to the FIZZY_URL env variable' do
15
+ orginal_env_fizzy_url = ENV['FIZZY_URL']
16
+ ENV['FIZZY_URL'] = 'some_env_fizzy_url'
17
+ session = Fizzy::Api.basic_auth_session
18
+ ENV['FIZZY_URL'] = orginal_env_fizzy_url
19
+ expect(session.fizzy_url).to eq('some_env_fizzy_url')
20
+ end
21
+
22
+ it 'sets the username instance variable' do
23
+ session = Fizzy::Api.basic_auth_session username: 'some_username'
24
+ expect(session.username).to eq('some_username')
25
+ end
26
+
27
+ it 'defaults the username to the FIZZY_BASICAUTH_ID env variable' do
28
+ orginal_env_fizzy_key = ENV['FIZZY_BASICAUTH_ID']
29
+ ENV['FIZZY_BASICAUTH_ID'] = 'some_env_fizzy_key'
30
+ session = Fizzy::Api.basic_auth_session
31
+ ENV['FIZZY_BASICAUTH_ID'] = orginal_env_fizzy_key
32
+ expect(session.username).to eq('some_env_fizzy_key')
33
+ end
34
+
35
+ it 'sets the password instance variable' do
36
+ session = Fizzy::Api.basic_auth_session password: 'some_password'
37
+ expect(session.password).to eq('some_password')
38
+ end
39
+
40
+ it 'defaults the password to the FIZZY_BASICAUTH_SECRET env variable' do
41
+ orginal_env_fizzy_secret = ENV['FIZZY_BASICAUTH_SECRET']
42
+ ENV['FIZZY_BASICAUTH_SECRET'] = 'some_env_fizzy_secret'
43
+ session = Fizzy::Api.basic_auth_session
44
+ ENV['FIZZY_BASICAUTH_SECRET'] = orginal_env_fizzy_secret
45
+ expect(session.password).to eq('some_env_fizzy_secret')
46
+ end
47
+ end
48
+
49
+ describe '#get' do
50
+ it 'performs a get request' do
51
+ expect(HTTParty).to receive(:get).with('http://fizzy.dev/api/v1/some_path',
52
+ query: { some: 'param' },
53
+ basic_auth: { username: 'some_username', password: 'some_password' })
54
+ .and_return(response)
55
+ session.get '/some_path', some: 'param'
56
+ end
57
+
58
+ it 'throws an error if the reponse is not within the 200 range' do
59
+ allow(response).to receive(:code).and_return(500)
60
+ allow(HTTParty).to receive(:get).and_return(response)
61
+ expect { session.get '/some_path' }.to raise_error(RuntimeError, 'some_response')
62
+ end
63
+
64
+ it 'throws a NoSession error if the basic auth is incorrect' do
65
+ allow(response).to receive(:code).and_return(401)
66
+ allow(HTTParty).to receive(:get).and_return(response)
67
+ allow(response).to receive(:headers).and_return('WWW-Authenticate' => 'Basic realm="Application"')
68
+ expect { session.get '/some_path' }.to raise_error(Fizzy::Api::NoSession)
69
+ end
70
+
71
+ it 'throws a Unauthorized error on 401 without www-authenticate header' do
72
+ allow(response).to receive(:code).and_return(401)
73
+ allow(HTTParty).to receive(:get).and_return(response)
74
+ allow(response).to receive(:headers).and_return('foo' => 'bar')
75
+ expect { session.get '/some_path' }.to raise_error(Fizzy::Api::Unauthorized)
76
+ end
77
+
78
+ it 'returns the response' do
79
+ allow(HTTParty).to receive(:get).and_return(response)
80
+ expect(session.get '/some_path').to eq(response)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1 @@
1
+ require 'spec_helper'
@@ -0,0 +1,17 @@
1
+ require 'rspec'
2
+ require 'factory_girl_rails'
3
+ require 'fizzy-api'
4
+ require 'httparty'
5
+ include Fizzy::Api
6
+ include Fizzy::Api::Sessions
7
+ # include Fizzy::Api::Models
8
+
9
+ Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'support', '*.rb')].each { |f| require f }
10
+ Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'factories', '*.rb')].each { |f| require f }
11
+
12
+ RSpec.configure do |config|
13
+ config.filter_run :focus
14
+ config.run_all_when_everything_filtered = true
15
+ end
16
+
17
+ # I18n.load_path << Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'support', '*.yml')]
@@ -0,0 +1,5 @@
1
+ def httparty_response(response_data)
2
+ allow(response_data).to receive(:code).and_return 200
3
+ allow(response_data).to receive(:parsed_response).and_return response_data
4
+ response_data
5
+ 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.1.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank Blaauw
@@ -109,15 +109,44 @@ dependencies:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
111
  version: '4.5'
112
- description: Provides authenticated access to ROM utilities
112
+ description: "%q{Provides authenticated access to fizzy utilities}"
113
113
  email:
114
114
  - f.j.blaauw@umcg.nl
115
- - acemerencia@gmail.com
115
+ - ando.emerencia@gmail.com
116
116
  executables: []
117
117
  extensions: []
118
118
  extra_rdoc_files: []
119
- files: []
120
- homepage: http://fizzy.com
119
+ files:
120
+ - ".gitignore"
121
+ - ".rubocop.yml"
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - README.md
125
+ - Rakefile
126
+ - circle.yml
127
+ - fizzy_api.gemspec
128
+ - lib/fizzy-api.rb
129
+ - lib/fizzy/api.rb
130
+ - lib/fizzy/api/calculate_outcome.rb
131
+ - lib/fizzy/api/errors.rb
132
+ - lib/fizzy/api/errors/graph_not_found_error.rb
133
+ - lib/fizzy/api/errors/outcome_not_available_error.rb
134
+ - lib/fizzy/api/errors/too_few_measurements_error.rb
135
+ - lib/fizzy/api/errors/unexpected_status_error.rb
136
+ - lib/fizzy/api/models.rb
137
+ - lib/fizzy/api/render_graph.rb
138
+ - lib/fizzy/api/sessions.rb
139
+ - lib/fizzy/api/sessions/basic_auth_session.rb
140
+ - lib/fizzy/api/version.rb
141
+ - rubocop-todo.yml
142
+ - spec/factories/basic_auth_session.rb
143
+ - spec/fizzy/api/calculate_outcome_spec.rb
144
+ - spec/fizzy/api/render_graph_spec.rb
145
+ - spec/fizzy/api/sessions/basic_auth_session_spec.rb
146
+ - spec/fizzy/api/sessions_spec.rb
147
+ - spec/spec_helper.rb
148
+ - spec/support/httparty_helpers.rb
149
+ homepage: http://github.com/roqua/fizzy_api
121
150
  licenses:
122
151
  - MIT
123
152
  metadata: {}
@@ -140,5 +169,12 @@ rubyforge_project:
140
169
  rubygems_version: 2.4.5
141
170
  signing_key:
142
171
  specification_version: 4
143
- summary: API wrapper gem around Fizzy's Graph API
144
- test_files: []
172
+ summary: "%q{API wrapper gem around Fizzy's Graph API}"
173
+ test_files:
174
+ - spec/factories/basic_auth_session.rb
175
+ - spec/fizzy/api/calculate_outcome_spec.rb
176
+ - spec/fizzy/api/render_graph_spec.rb
177
+ - spec/fizzy/api/sessions/basic_auth_session_spec.rb
178
+ - spec/fizzy/api/sessions_spec.rb
179
+ - spec/spec_helper.rb
180
+ - spec/support/httparty_helpers.rb