roqua-rom-api 0.1.5 → 0.1.6

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.
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: