inferno_core 0.4.17 → 0.4.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/inferno/apps/cli/main.rb +1 -1
- data/lib/inferno/config/boot/suites.rb +8 -0
- data/lib/inferno/dsl/fhir_client.rb +79 -3
- data/lib/inferno/dsl/fhir_validation.rb +52 -11
- data/lib/inferno/exceptions.rb +10 -0
- data/lib/inferno/public/bundle.js +15 -15
- data/lib/inferno/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9b06c0f0ce1702d3ba9662e4762e3174eb22527a19a3eb35a5ec0e01dbf57d3
|
4
|
+
data.tar.gz: 8c019f778c84c0926ef1705e256e0d3b27fd39a2c6af4f32bd8c4d1ad731ff84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39690b392f9e9997081cc5d58ee93c249a15be3eaeecca3927619f4d116e00cd85cdecc8a91693385420bb7b7bc07398b05b636d9be94713b23ad52c99bc9161
|
7
|
+
data.tar.gz: f2970277134ae396003da04b2ba09c19cd3dc02f70e513cbdbeaf7a7e014561cbf742a95fc8ed40cec034a23723ad54ed823637989628dd0661fc467b49db11a
|
@@ -25,5 +25,13 @@ Inferno::Application.boot(:suites) do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
ObjectSpace.each_object(TracePoint, &:disable)
|
28
|
+
|
29
|
+
Inferno::Entities::TestSuite.descendants.each do |descendant|
|
30
|
+
# When ID not assigned in custom test suites, Runnable.id will return default ID
|
31
|
+
# equal to the custom test suite's parent class name
|
32
|
+
if descendant.id.blank? || descendant.id == 'Inferno::Entities::TestSuite'
|
33
|
+
raise StandardError, "Error initializing test suite #{descendant.name}: test suite ID is not set"
|
34
|
+
end
|
35
|
+
end
|
28
36
|
end
|
29
37
|
end
|
@@ -130,6 +130,78 @@ module Inferno
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
+
# Perform a FHIR vread interaction.
|
134
|
+
#
|
135
|
+
# @param resource_type [String, Symbol, Class]
|
136
|
+
# @param id [String]
|
137
|
+
# @param version_id [String]
|
138
|
+
# @param client [Symbol]
|
139
|
+
# @param name [Symbol] Name for this request to allow it to be used by
|
140
|
+
# other tests
|
141
|
+
# @return [Inferno::Entities::Request]
|
142
|
+
def fhir_vread(resource_type, id, version_id, client: :default, name: nil)
|
143
|
+
store_request_and_refresh_token(fhir_client(client), name) do
|
144
|
+
tcp_exception_handler do
|
145
|
+
fhir_client(client).vread(fhir_class_from_resource_type(resource_type), id, version_id)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
# Perform a FHIR update interaction.
|
151
|
+
#
|
152
|
+
# @param resource [FHIR::Model]
|
153
|
+
# @param id [String]
|
154
|
+
# @param client [Symbol]
|
155
|
+
# @param name [Symbol] Name for this request to allow it to be used by
|
156
|
+
# other tests
|
157
|
+
# @return [Inferno::Entities::Request]
|
158
|
+
def fhir_update(resource, id, client: :default, name: nil)
|
159
|
+
store_request_and_refresh_token(fhir_client(client), name) do
|
160
|
+
tcp_exception_handler do
|
161
|
+
fhir_client(client).update(resource, id)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Perform a FHIR patch interaction.
|
167
|
+
#
|
168
|
+
# @param resource_type [String, Symbol, Class]
|
169
|
+
# @param id [String]
|
170
|
+
# @param patchset [Array]
|
171
|
+
# @param client [Symbol]
|
172
|
+
# @param name [Symbol] Name for this request to allow it to be used by
|
173
|
+
# other tests
|
174
|
+
# @return [Inferno::Entities::Request]
|
175
|
+
def fhir_patch(resource_type, id, patchset, client: :default, name: nil)
|
176
|
+
store_request_and_refresh_token(fhir_client(client), name) do
|
177
|
+
tcp_exception_handler do
|
178
|
+
fhir_client(client).partial_update(fhir_class_from_resource_type(resource_type), id, patchset)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Perform a FHIR history interaction.
|
184
|
+
#
|
185
|
+
# @param resource_type [String, Symbol, Class]
|
186
|
+
# @param id [String]
|
187
|
+
# @param client [Symbol]
|
188
|
+
# @param name [Symbol] Name for this request to allow it to be used by
|
189
|
+
# other tests
|
190
|
+
# @return [Inferno::Entities::Request]
|
191
|
+
def fhir_history(resource_type = nil, id = nil, client: :default, name: nil)
|
192
|
+
store_request_and_refresh_token(fhir_client(client), name) do
|
193
|
+
tcp_exception_handler do
|
194
|
+
if id
|
195
|
+
fhir_client(client).resource_instance_history(fhir_class_from_resource_type(resource_type), id)
|
196
|
+
elsif resource_type
|
197
|
+
fhir_client(client).resource_history(fhir_class_from_resource_type(resource_type))
|
198
|
+
else
|
199
|
+
fhir_client(client).all_history
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
133
205
|
# Perform a FHIR search interaction.
|
134
206
|
#
|
135
207
|
# @param resource_type [String, Symbol, Class]
|
@@ -139,7 +211,7 @@ module Inferno
|
|
139
211
|
# other tests
|
140
212
|
# @param search_method [Symbol] Use `:post` to search via POST
|
141
213
|
# @return [Inferno::Entities::Request]
|
142
|
-
def fhir_search(resource_type, client: :default, params: {}, name: nil, search_method: :get)
|
214
|
+
def fhir_search(resource_type = nil, client: :default, params: {}, name: nil, search_method: :get)
|
143
215
|
search =
|
144
216
|
if search_method == :post
|
145
217
|
{ body: params }
|
@@ -149,8 +221,12 @@ module Inferno
|
|
149
221
|
|
150
222
|
store_request_and_refresh_token(fhir_client(client), name) do
|
151
223
|
tcp_exception_handler do
|
152
|
-
|
153
|
-
|
224
|
+
if resource_type
|
225
|
+
fhir_client(client)
|
226
|
+
.search(fhir_class_from_resource_type(resource_type), { search: })
|
227
|
+
else
|
228
|
+
fhir_client(client).search_all({ search: })
|
229
|
+
end
|
154
230
|
end
|
155
231
|
end
|
156
232
|
end
|
@@ -116,17 +116,26 @@ module Inferno
|
|
116
116
|
def resource_is_valid?(resource, profile_url, runnable)
|
117
117
|
profile_url ||= FHIR::Definitions.resource_definition(resource.resourceType).url
|
118
118
|
|
119
|
-
outcome =
|
119
|
+
outcome, http_status = validate(resource, profile_url, runnable)
|
120
120
|
|
121
|
-
message_hashes = outcome
|
121
|
+
message_hashes = message_hashes_from_outcome(outcome, resource, profile_url)
|
122
122
|
|
123
|
-
message_hashes
|
123
|
+
message_hashes
|
124
|
+
.each { |message_hash| runnable.add_message(message_hash[:type], message_hash[:message]) }
|
124
125
|
|
125
|
-
|
126
|
+
unless http_status == 200
|
127
|
+
raise Inferno::Exceptions::ErrorInValidatorException,
|
128
|
+
'Error occurred in the validator. Review Messages tab or validator service logs for more information.'
|
129
|
+
end
|
126
130
|
|
127
131
|
message_hashes
|
128
|
-
.each { |message_hash| runnable.add_message(message_hash[:type], message_hash[:message]) }
|
129
132
|
.none? { |message_hash| message_hash[:type] == 'error' }
|
133
|
+
rescue Inferno::Exceptions::ErrorInValidatorException
|
134
|
+
raise
|
135
|
+
rescue StandardError => e
|
136
|
+
runnable.add_message('error', e.message)
|
137
|
+
raise Inferno::Exceptions::ErrorInValidatorException,
|
138
|
+
'Error occurred in the validator. Review Messages tab or validator service logs for more information.'
|
130
139
|
end
|
131
140
|
|
132
141
|
# @private
|
@@ -134,6 +143,17 @@ module Inferno
|
|
134
143
|
message_hashes.reject! { |message| exclude_message.call(Entities::Message.new(message)) } if exclude_message
|
135
144
|
end
|
136
145
|
|
146
|
+
# @private
|
147
|
+
def message_hashes_from_outcome(outcome, resource, profile_url)
|
148
|
+
message_hashes = outcome.issue&.map { |issue| message_hash_from_issue(issue, resource) } || []
|
149
|
+
|
150
|
+
message_hashes.concat(additional_validation_messages(resource, profile_url))
|
151
|
+
|
152
|
+
filter_messages(message_hashes)
|
153
|
+
|
154
|
+
message_hashes
|
155
|
+
end
|
156
|
+
|
137
157
|
# @private
|
138
158
|
def message_hash_from_issue(issue, resource)
|
139
159
|
{
|
@@ -171,12 +191,33 @@ module Inferno
|
|
171
191
|
#
|
172
192
|
# @param resource [FHIR::Model]
|
173
193
|
# @param profile_url [String]
|
174
|
-
# @
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
194
|
+
# @param runnable [Inferno::Entities::Test]
|
195
|
+
# @return [[Array(FHIR::OperationOutcome, Number)] the validation response and HTTP status code
|
196
|
+
def validate(resource, profile_url, runnable)
|
197
|
+
begin
|
198
|
+
response = Faraday.new(
|
199
|
+
url,
|
200
|
+
params: { profile: profile_url }
|
201
|
+
).post('validate', resource.source_contents)
|
202
|
+
rescue StandardError => e
|
203
|
+
runnable.add_message('error', e.message)
|
204
|
+
raise Inferno::Exceptions::ErrorInValidatorException, "Unable to connect to validator at #{url}."
|
205
|
+
end
|
206
|
+
outcome = operation_outcome_from_validator_response(response.body, runnable)
|
207
|
+
|
208
|
+
[outcome, response.status]
|
209
|
+
end
|
210
|
+
|
211
|
+
# @private
|
212
|
+
def operation_outcome_from_validator_response(response, runnable)
|
213
|
+
if response.start_with? '{'
|
214
|
+
FHIR::OperationOutcome.new(JSON.parse(response))
|
215
|
+
else
|
216
|
+
runnable.add_message('error', "Validator Response: #{response}")
|
217
|
+
raise Inferno::Exceptions::ErrorInValidatorException,
|
218
|
+
'Validator response was an unexpected format. '\
|
219
|
+
'Review Messages tab or validator service logs for more information.'
|
220
|
+
end
|
180
221
|
end
|
181
222
|
end
|
182
223
|
|
data/lib/inferno/exceptions.rb
CHANGED
@@ -39,6 +39,16 @@ module Inferno
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
class ErrorInValidatorException < TestResultException
|
43
|
+
# This extends TestResultException instead of RuntimeError
|
44
|
+
# to bypass printing the stack trace in the UI.
|
45
|
+
# (The stack trace of this exception may not be useful,
|
46
|
+
# instead the message should point to where in the validator an error occurred)
|
47
|
+
def result
|
48
|
+
'error'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
42
52
|
class ParentNotLoadedException < RuntimeError
|
43
53
|
def initialize(klass, id)
|
44
54
|
super("No #{klass.name.demodulize} found with id '#{id}'")
|