roqua-rom-api 0.1.5 → 0.1.6

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: da682d985d0f1bb2d2e18a3102d89b011e0afb75
4
- data.tar.gz: 11a6c235df4e6e994b4d6eb3c82907fa22c1db1b
3
+ metadata.gz: e3f8ea4f36ee2e5dc8e00beed8c9a5becfb4f378
4
+ data.tar.gz: 8efa2129625a8f6efca60d7d6ab8731a49b432ee
5
5
  SHA512:
6
- metadata.gz: 9017fb16837df479fa72b5f9e49b27b04915fd161d1246a46c9bf5601145c550992023d7453d918f0208726cf1dff3e25e64944c652744f75047bc28f70a4bfe
7
- data.tar.gz: 847a62e1c49da738586b52459656055a24d996e20ae8dc6ba434f3bd89fd1ded413e547689e321eead4ee19b2f291cf7253f26badb2ea7c19e5560b32cce1ae8
6
+ metadata.gz: f340bf0b6bba37bcc393461fa3d8e90b5c373dad5f071e5947a5ed0ee77dd7aff97a4283e80aa2889f5b27341e5cf7a99fa943b69b8d1e41001c2ecca57af981
7
+ data.tar.gz: 36459698211d7cfc780f3f2d1dada4e7c2314180f19ccd70c8d252900986adfc20a52864cef1a88a02a5a746df91b039fbaabc2e4e1caf13034d11f0bef27d04
data/ChangeLog.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### 0.1.6 / 2014-07-02
2
+
3
+ * Implement start\_fill\_out session for aborted answers
4
+ * Add id to the responses api
5
+ * Add 'aborted' status to the responses api
6
+ * Allow multiple questionnaires in start\_fill\_out_session api
7
+
1
8
  ### 0.1.5 / 2014-06-10
2
9
 
3
10
  * Added CreateFillOutRequest
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # A sample Guardfile
2
2
  # More info at https://github.com/guard/guard#readme
3
3
 
4
- guard :rspec, cmd: 'bundle exec rspec --format Fuubar --colour' do
4
+ guard :rspec, cmd: 'bundle exec rspec --format Fuubar --colour', failed_mode: :none do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { "spec" }
data/README.md CHANGED
@@ -12,21 +12,47 @@ An HTTP basic auth username password combination can be generated in the RoQua a
12
12
 
13
13
  By default the ROM API Gem supports the `:nl` language only. If you use another locale or want to change some of the messages, simply extend your locale file by providing a value for some or all of the keys defined `config/locales/*.yml` in the root of this Gem.
14
14
 
15
- ## FillOut Sessions
16
15
 
17
- To start filling out a questionnaire run:
16
+ ## Fill Out Requests
17
+
18
+ See [api](http://roqua.github.io/developer/rom_v1/dossier/fill_out_requests/) for more info what this does and format of callbacks.
19
+
20
+ To create a fill out request run:
21
+
22
+ Roqua::RomApi::CreateFillOutRequest.run! dossier_id: dossier_id,
23
+ questionnaire_keys: ['key1', 'key2'],
24
+ callback_url: notify_callback_path(token: 'secret')
25
+
26
+ #### Parameters
27
+
28
+ * `dossier_id` [Required] - Unique dossier identifier string for the patient about to fill out questionnaires
29
+ * `questionnaire_keys [Required] - Array of keys of questionnaires to fill out
30
+ * open_from - Time the patient can start filling out the questionnaires and time.
31
+ * open_till - Time the patient can no longer fill in the questionnaire.
32
+ * callback_url [Required] - Url for event callbacks
33
+ * reminders - Array of durations after which a reminder should be sent if fill_out_request has not been finished.
34
+ * respondent_type - Defaults to 'patient_version', each type is a separate list of questionnaires to fill out.
35
+
36
+
37
+ ## Fill Out Sessions
38
+
39
+ To start filling out a set of questionnaires run:
18
40
 
19
41
  outcome = Roqua::RomApi::StartFillOutSession.run dossier_id: dossier_id,
20
- questionnaire_key: questionnaire_key,
42
+ questionnaire_keys: questionnaire_keys,
21
43
  return_to: '/some/return/url/or/path'
22
44
 
23
45
  #### Parameters
24
46
 
25
- * `dossier_id:` [Required] - Unique dossier identifier for the patient about to fill out a questionnaire.
26
- * `questionnaire_key:` [Required] - Key uniquely identifying the questionnaire to be filled out.
27
- * `return_to:` [Required] - Address to return to after filling out the questionnaire.
47
+ * `dossier_id:` [Required] - Unique dossier identifier for the patient about to fill out a questionnaire.
48
+ * `questionnaire_keys:` - Array of keys uniquely identifying the questionnaires to be filled out.
49
+ * `response_ids:` - Array of ids uniquely identifying aborted responses for which filling out has to be resumed.
50
+ * `return_to:` [Required] - Address to return to after filling out the questionnaire.
28
51
 
29
- Redirect to the questionnaire url received when the outcome is valid:
52
+ When questionnaire keys are provided, a set of blank questionnaires will be filled out. When response ids are provided,
53
+ filling out questionnaires for these responses is resumed.
54
+
55
+ Redirect to the fill_out url received when the outcome is valid:
30
56
 
31
57
  if outcome.valid?
32
58
  redirect_to outcome.result
@@ -37,6 +63,7 @@ or do something with the validation errors:
37
63
  log_or_display outcome.errors.full_messages
38
64
  end
39
65
 
66
+
40
67
  ## Protocol Subscriptions
41
68
 
42
69
  ### Index
@@ -4,15 +4,13 @@ nl:
4
4
  models:
5
5
  roqua/rom_api/start_fill_out_session:
6
6
  attributes:
7
- questionnaire_key:
8
- questionnaire_not_found_by_key: met sleutel '%{value}' niet gevonden
9
7
  roqua/rom_api/start_protocol_subscription:
10
8
  attributes:
11
9
  protocol_key:
12
10
  protocol_not_found_by_key: met sleutel '%{value}' niet gevonden
13
11
  attributes:
14
12
  roqua/rom_api/start_fill_out_session:
15
- questionnaire_key: Vragenlijst
13
+ questionnaire_keys: Vragenlijsten
16
14
  return_to: Return url
17
15
  roqua/rom_api/start_protocol_subscription:
18
- protocol_key: Protocol
16
+ protocol_key: Protocol
@@ -6,12 +6,14 @@ module Roqua
6
6
 
7
7
  def validate_response_for
8
8
  response = yield
9
- if response.is_a?(Hash) && response['errors']
9
+ if response.parsed_response.is_a?(Hash) && response['errors'].present?
10
10
  response['errors'].each do |attribute, attribute_errors|
11
11
  attribute_errors.each do |error|
12
12
  errors.add attribute.to_sym, error.to_sym
13
13
  end
14
14
  end
15
+ elsif response.code == 422
16
+ errors.add :base, 'Validations failed!'
15
17
  else
16
18
  response_to_result response
17
19
  end
@@ -48,7 +48,7 @@ module Roqua
48
48
  when 401
49
49
  access_denied(response)
50
50
  else
51
- fail response.parsed_response || 'error'
51
+ fail response.parsed_response || "Received HTTP response code #{response.code}!"
52
52
  end
53
53
  end
54
54
 
@@ -3,21 +3,25 @@ module Roqua
3
3
  # @api private
4
4
  class StartFillOutSession < Endpoint
5
5
  string :dossier_id
6
- string :questionnaire_key
6
+ array :questionnaire_keys, default: [] do string end
7
+ array :response_ids, default: [] do integer end
7
8
  string :return_to
8
9
  string :stylesheet, default: nil
9
10
 
11
+ validates :questionnaire_keys, presence: {unless: -> { response_ids.present? }}
12
+
10
13
  def execute
11
14
  validate_response_for do
12
15
  RomApi.basic_auth_session.post("/dossiers/#{dossier_id}/fill_out_sessions",
13
- questionnaire_key: questionnaire_key,
16
+ questionnaire_keys: questionnaire_keys,
17
+ response_ids: response_ids,
14
18
  return_to: return_to,
15
19
  stylesheet: stylesheet)
16
20
  end
17
21
  end
18
22
 
19
23
  def response_to_result(response)
20
- response['questionnaire_url']
24
+ response['fill_out_url']
21
25
  end
22
26
  end
23
27
  end
@@ -1,5 +1,5 @@
1
1
  module Roqua
2
2
  module RomApi
3
- VERSION = '0.1.5'
3
+ VERSION = '0.1.6'
4
4
  end
5
5
  end
@@ -1,15 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CreateFillOutRequest do
4
- let(:options) { {dossier_id: 'some_dossier_id',
5
- questionnaire_keys: ['qkey1', 'qkey2'],
6
- respondent_type: 'patient_version',
7
- callback_url: 'http://callback.url',
8
- reminders: [1000, 2000],
9
- open_from: Time.now,
10
- open_till: Time.now + 100_000} }
11
- let(:session) { Sessions::BasicAuthSession.new }
12
- let(:response) { double('response', :[] => nil) }
4
+ let(:options) { {dossier_id: 'some_dossier_id',
5
+ questionnaire_keys: ['qkey1', 'qkey2'],
6
+ respondent_type: 'patient_version',
7
+ callback_url: 'http://callback.url',
8
+ reminders: [1000, 2000],
9
+ open_from: Time.now,
10
+ open_till: Time.now + 100_000} }
11
+ let(:session) { Sessions::BasicAuthSession.new }
12
+ let(:response) { httparty_response({}) }
13
13
  before do
14
14
  allow(Sessions::BasicAuthSession).to receive(:new).and_return session
15
15
  allow(session).to receive(:post).and_return response
@@ -27,12 +27,13 @@ describe CreateFillOutRequest do
27
27
  end
28
28
 
29
29
  it 'returns the id of the created fill_out_request' do
30
- allow(session).to receive(:post).and_return 'id' => 'fill_out_request_id'
30
+ response['id'] = 'fill_out_request_id'
31
31
  outcome = CreateFillOutRequest.run(options)
32
32
  expect(outcome.result).to eq('fill_out_request_id')
33
33
  end
34
34
 
35
35
  it 'accepts explicit nil values' do
36
+ response['id'] = 'fill_out_request_id'
36
37
  options[:open_from] = nil
37
38
  options[:open_till] = nil
38
39
  options[:reminders] = nil
@@ -40,7 +41,7 @@ describe CreateFillOutRequest do
40
41
  expect(args[:fill_out_request][:open_from]).to eq nil
41
42
  expect(args[:fill_out_request][:open_till]).to eq nil
42
43
  expect(args[:fill_out_request][:reminders]).to eq nil
43
- {'id' => 'fill_out_request_id'}
44
+ response
44
45
  end
45
46
  CreateFillOutRequest.run!(options)
46
47
  end
@@ -2,11 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe Endpoint do
4
4
  class TestEndpoint < Endpoint
5
- hash :response, strip: false
5
+ model :response, class: RSpec::Mocks::Mock
6
6
 
7
7
  def execute
8
8
  validate_response_for do
9
- response.stringify_keys
9
+ response
10
10
  end
11
11
  end
12
12
 
@@ -16,31 +16,51 @@ describe Endpoint do
16
16
  end
17
17
 
18
18
  describe 'with validations' do
19
+ let(:response) do
20
+ double('httparty_repsonse', code: 200, parsed_response: {}).tap do |response|
21
+ allow(response).to receive(:[]).with('key').and_return ['values']
22
+ allow(response).to receive(:[]).with('errors').and_return []
23
+ end
24
+ end
25
+
19
26
  it 'returns the parsed response' do
20
- outcome = TestEndpoint.run response: {'key' => ['values']}
27
+ outcome = TestEndpoint.run response: response
21
28
  expect(outcome.result).to eq(['values'])
22
29
  end
23
30
 
24
31
  it 'is valid' do
25
- result = TestEndpoint.run response: {'key' => ['values']}
32
+ result = TestEndpoint.run response: response
26
33
  expect(result).to be_valid
27
34
  end
28
35
 
29
36
  context 'when the response contains errors' do
37
+ before do
38
+ allow(response).to receive(:[]).with('errors').and_return('base' => ['some_annoying_error'])
39
+ end
40
+
30
41
  it 'adds the errors' do
31
- outcome = TestEndpoint.run response: {'errors' => {'base' => ['Some annoying error']}}
42
+ outcome = TestEndpoint.run response: response
32
43
  expect(outcome.errors.full_messages.first).to match('Some annoying error')
33
44
  end
34
45
 
35
46
  it 'marks the outcome as invalid' do
36
- outcome = TestEndpoint.run response: {'errors' => {'base' => ['Some annoying error']}}
47
+ outcome = TestEndpoint.run response: response
37
48
  expect(outcome).not_to be_valid
38
49
  end
39
50
 
40
51
  it 'does not return a result' do
41
- outcome = TestEndpoint.run response: {'errors' => {'base' => ['Some annoying error']}}
52
+ outcome = TestEndpoint.run response: response
42
53
  expect(outcome.result).to be_nil
43
54
  end
44
55
  end
56
+
57
+ context 'when the response code is 422 but the response contains no errors' do
58
+ it 'adds an error to base' do
59
+ allow(response).to receive(:code).and_return 422
60
+ outcome = TestEndpoint.run response: response
61
+ expect(outcome).not_to be_valid
62
+ expect(outcome.errors.full_messages).to include('Validations failed!')
63
+ end
64
+ end
45
65
  end
46
66
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe ListProtocolSubscriptions do
4
4
  let(:options) { {dossier_id: '1'} }
5
5
  let(:api_path) { "/dossiers/#{options[:dossier_id]}/protocol_subscriptions" }
6
- let(:response) { [{"id" => 1}] }
6
+ let(:response) { httparty_response [{'id' => 1}] }
7
7
  let(:session) { Fabricate :basic_auth_session }
8
8
  before { allow(BasicAuthSession).to receive(:new).and_return session }
9
9
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe ListResponses do
4
4
  let(:options) { {dossier_id: '1'} }
5
5
  let(:api_path) { "/dossiers/#{options[:dossier_id]}/responses" }
6
- let(:response) { [{"questionnaire_name" => "response_1"}, {"questionnaire_name" => "response_2"}] }
6
+ let(:response) { httparty_response [{"questionnaire_name" => "response_1"}, {"questionnaire_name" => "response_2"}] }
7
7
  let(:session) { Fabricate :basic_auth_session }
8
8
  before { allow(BasicAuthSession).to receive(:new).and_return session }
9
9
 
@@ -1,26 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe StartFillOutSession do
4
- let(:options) { {dossier_id: 'some_dossier_id', questionnaire_key: 'some_key',
5
- return_to: '/some/return/url', stylesheet: 'https://example.org/stylesheet.css'} }
6
- let(:session) { Sessions::BasicAuthSession.new }
7
- let(:response) { double('response', :[] => nil) }
4
+ let(:options) { {dossier_id: 'some_dossier_id', questionnaire_keys: ['some_key'],
5
+ return_to: '/some/return/url', stylesheet: 'https://example.org/stylesheet.css'} }
6
+ let(:session) { Sessions::BasicAuthSession.new }
7
+ let(:response) { httparty_response 'fill_out_url' => 'some_fill_out_url' }
8
8
  before do
9
9
  allow(Sessions::BasicAuthSession).to receive(:new).and_return session
10
10
  allow(session).to receive(:post).and_return response
11
11
  end
12
12
 
13
13
  it 'does a post to the rom fill_out_sessions api' do
14
+ options[:response_ids] = [1, 2]
14
15
  expect(session).to receive(:post).with("/dossiers/#{options[:dossier_id]}/fill_out_sessions",
15
- questionnaire_key: options[:questionnaire_key],
16
+ questionnaire_keys: options[:questionnaire_keys],
17
+ response_ids: options[:response_ids],
16
18
  return_to: options[:return_to],
17
19
  stylesheet: options[:stylesheet])
18
20
  StartFillOutSession.run!(options)
19
21
  end
20
22
 
21
- it 'returns the received questionnaire url' do
22
- allow(session).to receive(:post).and_return 'questionnaire_url' => 'some_questionnaire_url'
23
+ it 'returns the received fill_out url' do
23
24
  outcome = StartFillOutSession.run(options)
24
- expect(outcome.result).to eq('some_questionnaire_url')
25
+ expect(outcome.result).to eq('some_fill_out_url')
26
+ end
27
+
28
+ it 'validates the presence of questionnaire keys' do
29
+ options[:questionnaire_keys] = []
30
+ outcome = StartFillOutSession.run(options)
31
+ expect(outcome).not_to be_valid
32
+ expect(outcome.errors.full_messages).to include("Questionnaire keys can't be blank")
33
+ end
34
+
35
+ it 'does not validate the presence of questionnaire keys when answer_ids are given' do
36
+ options[:questionnaire_keys] = []
37
+ options[:response_ids] = [1, 2]
38
+ outcome = StartFillOutSession.run(options)
39
+ expect(outcome).to be_valid
25
40
  end
26
41
  end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe StartProtocolSubscription do
4
- let(:options) { {dossier_id: 'some_dossier_id', protocol_key: 'some_key'} }
5
- let(:session) { Sessions::BasicAuthSession.new }
6
- let(:response) { double('response', :[] => nil) }
4
+ let(:options) { {dossier_id: 'some_dossier_id', protocol_key: 'some_key'} }
5
+ let(:session) { Sessions::BasicAuthSession.new }
6
+ let(:response) { httparty_response({}) }
7
7
  before do
8
8
  allow(Sessions::BasicAuthSession).to receive(:new).and_return session
9
9
  allow(session).to receive(:post).and_return response
@@ -2,9 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe StopProtocolSubscription do
4
4
  let(:options) { {dossier_id: 'some_dossier_id', protocol_subscription_id: 'some_protsub_id'} }
5
- let(:response) { double('response', :[] => nil) }
6
-
7
- let(:session) { Fabricate :basic_auth_session }
5
+ let(:response) { httparty_response({}) }
6
+ let(:session) { Fabricate :basic_auth_session }
8
7
  before do
9
8
  allow(Sessions::BasicAuthSession).to receive(:new).and_return session
10
9
  allow(session).to receive(:delete).and_return response
data/spec/spec_helper.rb CHANGED
@@ -4,3 +4,7 @@ require 'roqua-rom-api'
4
4
  include Roqua::RomApi
5
5
  include Roqua::RomApi::Sessions
6
6
  include Roqua::RomApi::Models
7
+
8
+ Dir[File.join(File.expand_path(File.dirname(__FILE__)), 'support', '*.rb')].each {|f| require f}
9
+
10
+ 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
@@ -0,0 +1,8 @@
1
+ en:
2
+ active_interaction:
3
+ errors:
4
+ models:
5
+ test_endpoint:
6
+ attributes:
7
+ base:
8
+ some_annoying_error: Some annoying error
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roqua-rom-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Esposito
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-10 00:00:00.000000000 Z
11
+ date: 2014-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -168,6 +168,8 @@ files:
168
168
  - spec/lib/roqua/rom_api/stop_protocol_subscription_spec.rb
169
169
  - spec/lib/roqua_rom_api_spec.rb
170
170
  - spec/spec_helper.rb
171
+ - spec/support/httparty_helpers.rb
172
+ - spec/support/test.yml
171
173
  homepage: https://github.com/roqua/roqua/blob/master/rom_api/README.md
172
174
  licenses:
173
175
  - MIT
@@ -188,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
190
  version: '0'
189
191
  requirements: []
190
192
  rubyforge_project:
191
- rubygems_version: 2.2.0
193
+ rubygems_version: 2.2.2
192
194
  signing_key:
193
195
  specification_version: 4
194
196
  summary: API wrapper gem around RoQua's ROM API
@@ -206,4 +208,6 @@ test_files:
206
208
  - spec/lib/roqua/rom_api/stop_protocol_subscription_spec.rb
207
209
  - spec/lib/roqua_rom_api_spec.rb
208
210
  - spec/spec_helper.rb
211
+ - spec/support/httparty_helpers.rb
212
+ - spec/support/test.yml
209
213
  has_rdoc: