ipa_test_kit 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/presets/ipa_preset.json +99 -0
- data/lib/ipa_test_kit/generated/v1.0.0/ipa_test_suite.rb +19 -2
- data/lib/ipa_test_kit/generator/templates/group.rb.erb +32 -0
- data/lib/ipa_test_kit/generator/templates/must_support.rb.erb +43 -0
- data/lib/ipa_test_kit/generator/templates/provenance_revinclude_search.rb.erb +50 -0
- data/lib/ipa_test_kit/generator/templates/read.rb.erb +26 -0
- data/lib/ipa_test_kit/generator/templates/reference_resolution.rb.erb +42 -0
- data/lib/ipa_test_kit/generator/templates/resource_list.rb.erb +9 -0
- data/lib/ipa_test_kit/generator/templates/search.rb.erb +46 -0
- data/lib/ipa_test_kit/generator/templates/suite.rb.erb +106 -0
- data/lib/ipa_test_kit/generator/templates/validation.rb.erb +31 -0
- data/lib/ipa_test_kit/igs/README.md +21 -0
- data/lib/ipa_test_kit/metadata.rb +59 -0
- data/lib/ipa_test_kit/version.rb +2 -1
- data/lib/ipa_test_kit.rb +1 -2
- metadata +23 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eacbed4af77cb113726af060c4c3e60099260ae5ca7beb2c0bb6c791eb6f6156
|
4
|
+
data.tar.gz: 6de273c296c1eb228c2f36e631abe36f960169b082a2dfc6a3711f06d8c8a1ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66763e3f1226d9bb1d05207038d11222934ef5e5a3e21ae30f756f511933ffa7210906648d063428383e94c40db64d63f18770d78b5fa70051e6218e84d91f1a
|
7
|
+
data.tar.gz: 701447c3a28143e0e3b5b685ec8439369cb6759973f547a8449ddfb2d6caa7afb2c6061ae0fa40b2c42dca39cae6abbf71644cdc974d74562509ab7d284410aa
|
@@ -0,0 +1,99 @@
|
|
1
|
+
{
|
2
|
+
"title": "Inferno Reference Server",
|
3
|
+
"id": "reference-server-ipa",
|
4
|
+
"test_suite_id": "ipa_v100",
|
5
|
+
"inputs": [
|
6
|
+
{
|
7
|
+
"name": "url",
|
8
|
+
"value": "https://inferno.healthit.gov/reference-server/r4",
|
9
|
+
"_title": "FHIR Endpoint",
|
10
|
+
"_description": "URL of the FHIR endpoint",
|
11
|
+
"_type": "text"
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"name": "standalone_client_id",
|
15
|
+
"value": "SAMPLE_PUBLIC_CLIENT_ID",
|
16
|
+
"_title": "Standalone Client ID",
|
17
|
+
"_description": "Client ID provided during registration of Inferno as a standalone application",
|
18
|
+
"_type": "text"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"name": "standalone_requested_scopes",
|
22
|
+
"value": "launch/patient openid fhirUser offline_access patient/*.rs",
|
23
|
+
"_title": "Standalone Scope",
|
24
|
+
"_description": "OAuth 2.0 scope provided by system to enable all required functionality",
|
25
|
+
"_type": "textarea"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"name": "use_pkce",
|
29
|
+
"value": "true",
|
30
|
+
"_title": "Proof Key for Code Exchange (PKCE)",
|
31
|
+
"_type": "radio",
|
32
|
+
"_options": {
|
33
|
+
"list_options": [
|
34
|
+
{
|
35
|
+
"label": "Enabled",
|
36
|
+
"value": "true"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"label": "Disabled",
|
40
|
+
"value": "false"
|
41
|
+
}
|
42
|
+
]
|
43
|
+
},
|
44
|
+
"_locked": true
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"name": "pkce_code_challenge_method",
|
48
|
+
"value": "S256",
|
49
|
+
"_title": "PKCE Code Challenge Method",
|
50
|
+
"_type": "radio",
|
51
|
+
"_optional": true,
|
52
|
+
"_options": {
|
53
|
+
"list_options": [
|
54
|
+
{
|
55
|
+
"label": "S256",
|
56
|
+
"value": "S256"
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"label": "plain",
|
60
|
+
"value": "plain"
|
61
|
+
}
|
62
|
+
]
|
63
|
+
},
|
64
|
+
"_locked": true
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"name": "authorization_method",
|
68
|
+
"value": "get",
|
69
|
+
"_title": "Authorization Method",
|
70
|
+
"_type": "radio",
|
71
|
+
"_options": {
|
72
|
+
"list_options": [
|
73
|
+
{
|
74
|
+
"label": "GET",
|
75
|
+
"value": "get"
|
76
|
+
},
|
77
|
+
{
|
78
|
+
"label": "POST",
|
79
|
+
"value": "post"
|
80
|
+
}
|
81
|
+
]
|
82
|
+
}
|
83
|
+
},
|
84
|
+
{
|
85
|
+
"name": "patient_ids",
|
86
|
+
"value": "85,355",
|
87
|
+
"_title": "Patient IDs",
|
88
|
+
"_description": "Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements",
|
89
|
+
"_type": "text"
|
90
|
+
},
|
91
|
+
{
|
92
|
+
"name": "observation_categories",
|
93
|
+
"value": "social-history,imaging,laboratory,procedure,survey,exam,therapy,activity",
|
94
|
+
"_title": "Observation categories",
|
95
|
+
"_description": "A comma-separated list of observation categories.",
|
96
|
+
"_type": "text"
|
97
|
+
}
|
98
|
+
]
|
99
|
+
}
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'inferno/dsl/oauth_credentials'
|
2
2
|
require 'smart_app_launch_test_kit'
|
3
3
|
|
4
|
-
require_relative '../../version'
|
5
4
|
require_relative '../../custom_groups/v1.0.0/capability_statement_group'
|
6
5
|
require_relative '../../custom_groups/v1.0.0/ipa_smart_launch_group'
|
7
6
|
require_relative '../../provenance_validator'
|
@@ -45,7 +44,6 @@ module IpaTestKit
|
|
45
44
|
* Verify that the server requires both a code and system for Patient identifier
|
46
45
|
search.
|
47
46
|
)
|
48
|
-
version VERSION
|
49
47
|
id :ipa_v100
|
50
48
|
|
51
49
|
VALIDATION_MESSAGE_FILTERS = [
|
@@ -108,6 +106,25 @@ module IpaTestKit
|
|
108
106
|
group from: :ipa_v100_practitioner
|
109
107
|
group from: :ipa_v100_practitioner_role
|
110
108
|
end
|
109
|
+
|
110
|
+
links [
|
111
|
+
{
|
112
|
+
type: 'report_issue',
|
113
|
+
label: 'Report Issue',
|
114
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/issues/'
|
115
|
+
},
|
116
|
+
{
|
117
|
+
type: 'source_code',
|
118
|
+
label: 'Open Source',
|
119
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/'
|
120
|
+
},
|
121
|
+
{
|
122
|
+
type: 'download',
|
123
|
+
label: 'Download',
|
124
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/releases/'
|
125
|
+
}
|
126
|
+
]
|
127
|
+
|
111
128
|
end
|
112
129
|
end
|
113
130
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<% test_file_list.each do |file_name| %>require_relative '<%= file_name %>'
|
2
|
+
<% end %>
|
3
|
+
module IpaTestKit
|
4
|
+
module <%= module_name %>
|
5
|
+
class <%= class_name %> < Inferno::TestGroup
|
6
|
+
title '<%= title %> Tests'
|
7
|
+
short_description '<%= short_description %>'
|
8
|
+
description %(
|
9
|
+
<%= description %>
|
10
|
+
)
|
11
|
+
|
12
|
+
id :<%= group_id %>
|
13
|
+
run_as_group<% if optional? %>
|
14
|
+
optional
|
15
|
+
<% end %>
|
16
|
+
input :standalone_smart_credentials,
|
17
|
+
title: 'SMART App Launch Credentials',
|
18
|
+
type: 'oauth_credentials',
|
19
|
+
optional: true<% if base_observation_group? %>
|
20
|
+
input :observation_categories,
|
21
|
+
title: 'Observation categories',
|
22
|
+
description: 'A comma-separated list of observation categories.',
|
23
|
+
default: 'social-history,imaging,laboratory,procedure,survey,exam,therapy,activity'<% end %>
|
24
|
+
|
25
|
+
def self.metadata
|
26
|
+
@metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, '<%= profile_identifier %>', 'metadata.yml'), aliases: true))
|
27
|
+
end
|
28
|
+
<% test_id_list.each do |id| %>
|
29
|
+
test from: :<%= id %><% if read_all_resources?(id) %>, config: { options: { read_all_resources: true } }<% end %><% end %>
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../../../must_support_test'
|
2
|
+
|
3
|
+
module IpaTestKit
|
4
|
+
module <%= module_name %>
|
5
|
+
class <%= class_name %> < Inferno::Test
|
6
|
+
include IpaTestKit::MustSupportTest
|
7
|
+
|
8
|
+
title 'All must support elements are provided in the <%= resource_type %> resources returned'
|
9
|
+
description %(
|
10
|
+
Responders conforming to a profile in IPA SHALL return a Must Support
|
11
|
+
element if that element is available. This test will look through the
|
12
|
+
<%= resource_type %> resources found previously for the following must
|
13
|
+
support elements:
|
14
|
+
|
15
|
+
<%= must_support_list_string %>
|
16
|
+
|
17
|
+
Note: Responders who cannot store or return a data element tagged as
|
18
|
+
Supported in IPA profiles can still claim conformance to the IPA
|
19
|
+
profiles per the IPA conformance resources.
|
20
|
+
)
|
21
|
+
|
22
|
+
id :<%= test_id %>
|
23
|
+
|
24
|
+
optional
|
25
|
+
|
26
|
+
def resource_type
|
27
|
+
'<%= resource_type %>'
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.metadata
|
31
|
+
@metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
32
|
+
end
|
33
|
+
|
34
|
+
def scratch_resources
|
35
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
36
|
+
end
|
37
|
+
|
38
|
+
run do
|
39
|
+
perform_must_support_test(<%= resource_collection_string %>)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative '../../../search_test'
|
2
|
+
require_relative '../../../generator/group_metadata'
|
3
|
+
|
4
|
+
module IpaTestKit
|
5
|
+
module <%= module_name %>
|
6
|
+
class <%= class_name %> < Inferno::Test
|
7
|
+
include IpaTestKit::SearchTest
|
8
|
+
|
9
|
+
title 'Server returns Provenance resources from <%= resource_type %> search by <%= search_param_name_string %>'
|
10
|
+
description %(
|
11
|
+
A server SHALL be capable of supporting _revIncludes:Provenance:target.
|
12
|
+
|
13
|
+
This test will perform a search by <%= search_param_name_string %> and
|
14
|
+
will pass if a Provenance resource is found in the response.
|
15
|
+
%)
|
16
|
+
|
17
|
+
id :<%= test_id %>
|
18
|
+
<% if needs_patient_id? %>
|
19
|
+
input :patient_ids,
|
20
|
+
title: 'Patient IDs',
|
21
|
+
description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
|
22
|
+
<% end %>
|
23
|
+
def properties
|
24
|
+
@properties ||= SearchTestProperties.new(
|
25
|
+
<%= search_test_properties_string %>
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.metadata
|
30
|
+
@metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml')))
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.provenance_metadata
|
34
|
+
# @provenance_metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, '..', 'provenance', 'metadata.yml'), aliases: true))
|
35
|
+
end
|
36
|
+
|
37
|
+
def scratch_resources
|
38
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
39
|
+
end
|
40
|
+
|
41
|
+
def scratch_provenance_resources
|
42
|
+
scratch[:provenance_resources] ||= {}
|
43
|
+
end
|
44
|
+
|
45
|
+
run do
|
46
|
+
run_provenance_revinclude_search_test
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../../read_test'
|
2
|
+
|
3
|
+
module IpaTestKit
|
4
|
+
module <%= module_name %>
|
5
|
+
class <%= class_name %> < Inferno::Test
|
6
|
+
include IpaTestKit::ReadTest
|
7
|
+
|
8
|
+
title 'Server returns correct <%= resource_type %> resource from <%= resource_type %> read interaction'
|
9
|
+
description 'A server <%= conformance_expectation %> support the <%= resource_type %> read interaction.'
|
10
|
+
|
11
|
+
id :<%= test_id %>
|
12
|
+
|
13
|
+
def resource_type
|
14
|
+
'<%= resource_type %>'
|
15
|
+
end
|
16
|
+
|
17
|
+
def scratch_resources
|
18
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
run do
|
22
|
+
perform_read_test(<%= resource_collection_string %>)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative '../../../reference_resolution_test'
|
2
|
+
require_relative '../resource_list'
|
3
|
+
|
4
|
+
module IpaTestKit
|
5
|
+
module <%= module_name %>
|
6
|
+
class <%= class_name %> < Inferno::Test
|
7
|
+
include IpaTestKit::ReferenceResolutionTest
|
8
|
+
include ResourceList
|
9
|
+
|
10
|
+
title 'MustSupport references within <%= resource_type %> resources are valid'
|
11
|
+
description %(
|
12
|
+
This test will attempt to read external references provided within elements
|
13
|
+
marked as 'MustSupport', if any are available.
|
14
|
+
|
15
|
+
It verifies that at least one external reference for each MustSupport Reference element
|
16
|
+
can be accessed by the test client, and conforms to corresponding IPA profile.
|
17
|
+
|
18
|
+
Elements which may provide external references include:
|
19
|
+
|
20
|
+
<%= must_support_reference_list_string %>
|
21
|
+
)
|
22
|
+
|
23
|
+
id :<%= test_id %>
|
24
|
+
|
25
|
+
def resource_type
|
26
|
+
'<%= resource_type %>'
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.metadata
|
30
|
+
@metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
31
|
+
end
|
32
|
+
|
33
|
+
def scratch_resources
|
34
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
35
|
+
end
|
36
|
+
|
37
|
+
run do
|
38
|
+
perform_reference_resolution_test(<%= resource_collection_string %>)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../../../search_test'
|
2
|
+
require_relative '../../../generator/group_metadata'
|
3
|
+
|
4
|
+
module IpaTestKit
|
5
|
+
module <%= module_name %>
|
6
|
+
class <%= class_name %> < Inferno::Test
|
7
|
+
include IpaTestKit::SearchTest
|
8
|
+
|
9
|
+
title 'Server returns valid results for <%= resource_type %> search by <%= search_param_name_string %>'
|
10
|
+
description %(
|
11
|
+
<%= description %>
|
12
|
+
)
|
13
|
+
|
14
|
+
id :<%= test_id %><% if optional? %>
|
15
|
+
optional
|
16
|
+
<% end %><% if needs_patient_id? %>
|
17
|
+
input :patient_ids,
|
18
|
+
title: 'Patient IDs',
|
19
|
+
description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
|
20
|
+
<% end %><% if resource_type == 'Device' %>
|
21
|
+
input :implantable_device_codes,
|
22
|
+
title: 'Implantable Device Type Code',
|
23
|
+
description: 'Enter the code for an Implantable Device type, or multiple codes separated by commas. '\
|
24
|
+
'If blank, Inferno will validate all Device resources against the Implantable Device profile',
|
25
|
+
optional: true
|
26
|
+
<% end %>
|
27
|
+
def self.properties
|
28
|
+
@properties ||= SearchTestProperties.new(
|
29
|
+
<%= search_test_properties_string %>
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.metadata
|
34
|
+
@metadata ||= Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
35
|
+
end
|
36
|
+
|
37
|
+
def scratch_resources
|
38
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
39
|
+
end
|
40
|
+
|
41
|
+
run do
|
42
|
+
run_search_test
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'inferno/dsl/oauth_credentials'
|
2
|
+
require 'smart_app_launch_test_kit'
|
3
|
+
|
4
|
+
require_relative '<%= capability_statement_file_name %>'
|
5
|
+
require_relative '<%= smart_launch_file_name %>'
|
6
|
+
require_relative '../../provenance_validator'
|
7
|
+
<% group_file_list.each do |file_name| %>require_relative '<%= file_name %>'
|
8
|
+
<% end %>
|
9
|
+
module IpaTestKit
|
10
|
+
module <%= module_name %>
|
11
|
+
class <%= class_name %> < Inferno::TestSuite
|
12
|
+
title '<%= title %>'
|
13
|
+
short_title '<%= short_title %>'
|
14
|
+
description %(
|
15
|
+
This test suite evaluates the ability of a system to support applications
|
16
|
+
acting on behalf of patients to access clinical records using an HL7® FHIR® R4 API
|
17
|
+
in accordance to the [International Patient Access Implementation Guide (IPA IG)](https://www.hl7.org/fhir/uv/ipa/).
|
18
|
+
|
19
|
+
It accomplishes this by simulating requests performed by a realistic IPA Requestor
|
20
|
+
and validating responses based on requirements specified within the IPA IG and
|
21
|
+
the base FHIR specification.
|
22
|
+
|
23
|
+
Resources are validated with the FHIR Java validator using `tx.fhir.org`
|
24
|
+
as the terminology server.
|
25
|
+
|
26
|
+
The following are not yet implemented:
|
27
|
+
* Test for `client-confidential-asymmetric`.
|
28
|
+
* Verify that the server supports all required SMART capabilities, rather than
|
29
|
+
just verifying that the server advertises support for them.
|
30
|
+
* Test `$docref` operation.
|
31
|
+
* Test `Patient.link` requirements.
|
32
|
+
* Verify that the server requires both a code and system for Patient identifier
|
33
|
+
search.
|
34
|
+
)
|
35
|
+
id :<%= suite_id %>
|
36
|
+
|
37
|
+
VALIDATION_MESSAGE_FILTERS = [
|
38
|
+
%r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
|
39
|
+
%r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
|
40
|
+
/Observation\.effective\.ofType\(Period\): .*vs-1:/, # Invalid invariant in FHIR v4.0.1
|
41
|
+
/\A\S+: \S+: URL value '.*' does not resolve/,
|
42
|
+
].freeze
|
43
|
+
|
44
|
+
def self.metadata
|
45
|
+
@metadata ||= YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true)[:groups].map do |raw_metadata|
|
46
|
+
Generator::GroupMetadata.new(raw_metadata)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
fhir_resource_validator do
|
51
|
+
igs '<%= ig_identifier %>'
|
52
|
+
|
53
|
+
exclude_message do |message|
|
54
|
+
VALIDATION_MESSAGE_FILTERS.any? { |filter| filter.match? message.message }
|
55
|
+
end
|
56
|
+
|
57
|
+
perform_additional_validation do |resource, profile_url|
|
58
|
+
ProvenanceValidator.validate(resource) if resource.instance_of?(FHIR::Provenance)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
input :url,
|
63
|
+
title: 'FHIR Endpoint',
|
64
|
+
description: 'URL of the FHIR endpoint'
|
65
|
+
|
66
|
+
fhir_client do
|
67
|
+
url :url
|
68
|
+
oauth_credentials :standalone_smart_credentials
|
69
|
+
end
|
70
|
+
|
71
|
+
group from: :<%= smart_launch_group_id %>
|
72
|
+
|
73
|
+
group do
|
74
|
+
title 'IPA Responder Tests'
|
75
|
+
description %(
|
76
|
+
The IPA Responder Tests evaluate the ability of an IPA Responder (IPA FHIR Server)
|
77
|
+
to support required and optional FHIR operations and search parameters to return
|
78
|
+
conformant IPA resources.
|
79
|
+
)
|
80
|
+
|
81
|
+
group from: :<%= capability_statement_group_id %>
|
82
|
+
<% group_id_list.each do |id| %>
|
83
|
+
group from: :<%= id %><% end %>
|
84
|
+
end
|
85
|
+
|
86
|
+
links [
|
87
|
+
{
|
88
|
+
type: 'report_issue',
|
89
|
+
label: 'Report Issue',
|
90
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/issues/'
|
91
|
+
},
|
92
|
+
{
|
93
|
+
type: 'source_code',
|
94
|
+
label: 'Open Source',
|
95
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/'
|
96
|
+
},
|
97
|
+
{
|
98
|
+
type: 'download',
|
99
|
+
label: 'Download',
|
100
|
+
url: 'https://github.com/inferno-framework/ipa-test-kit/releases/'
|
101
|
+
}
|
102
|
+
]
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../../../validation_test'
|
2
|
+
|
3
|
+
module IpaTestKit
|
4
|
+
module <%= module_name %>
|
5
|
+
class <%= class_name %> < Inferno::Test
|
6
|
+
include IpaTestKit::ValidationTest
|
7
|
+
|
8
|
+
id :<%= test_id %>
|
9
|
+
title '<%= resource_type %> resources returned during previous tests conform to the <%= profile_name %>'
|
10
|
+
description %(
|
11
|
+
<%= description %>
|
12
|
+
)
|
13
|
+
output :dar_code_found, :dar_extension_found
|
14
|
+
|
15
|
+
def resource_type
|
16
|
+
'<%= resource_type %>'
|
17
|
+
end
|
18
|
+
|
19
|
+
def scratch_resources
|
20
|
+
scratch[:<%= profile_identifier %>_resources] ||= {}
|
21
|
+
end
|
22
|
+
|
23
|
+
run do
|
24
|
+
perform_validation_test(scratch_resources[:all] || [],
|
25
|
+
'<%= profile_url %>',
|
26
|
+
'<%= profile_version %>',
|
27
|
+
skip_if_empty: <%= skip_if_empty %>)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Note on this IGs folder
|
2
|
+
|
3
|
+
There are three reasons why it would be necessary to put an IG package.tgz in this folder. If none of these apply, you do not need to put any files here, or can consider removing any existing files to make it clear they are unused.
|
4
|
+
|
5
|
+
## 1. Generated Test Suites
|
6
|
+
Some test kits use a "generator" to automatically generate the contents of a test suite for an IG. The IG files are required every time the test suites need to be regenerated. Examples of test kits that use this approach are the US Core Test Kit and CARIN IG for Blue Button® Test Kit.
|
7
|
+
|
8
|
+
|
9
|
+
## 2. Non-published IG
|
10
|
+
If your IG, or the specific version of the IG you want to test against, is not published, then the validator service needs to load the IG from file in order to be able to validate resources with it. The IG must be referenced in the `fhir_resource_validator` block in the test suite definition by filename, ie:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
fhir_resource_validator do
|
14
|
+
igs 'igs/filename.tgz'
|
15
|
+
|
16
|
+
...
|
17
|
+
end
|
18
|
+
```
|
19
|
+
|
20
|
+
## 3. Inferno Validator UI
|
21
|
+
The Inferno Validator UI is configured to auto-load any IGs present in the igs folder and include them in all validations. The Inferno Validator UI is currently disabled by default, so this is only relevant if you choose to re-enable it. In general, the Inferno team is currently leaving IGs in this folder even if not otherwise necessary to make it easy to re-enable the validator UI.
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative 'version'
|
2
|
+
|
3
|
+
module IpaTestKit
|
4
|
+
class Metadata < Inferno::TestKit
|
5
|
+
id :ipa_test_kit
|
6
|
+
title 'International Patient Acess Test Kit'
|
7
|
+
suite_ids [:ipa_v100]
|
8
|
+
tags ['SMART App Launch']
|
9
|
+
last_updated IpaTestKit::LAST_UPDATED
|
10
|
+
version IpaTestKit::VERSION
|
11
|
+
maturity 'Medium'
|
12
|
+
authors ['Inferno Core Team']
|
13
|
+
repo 'https://github.com/inferno-framework/ipa-test-kit'
|
14
|
+
description <<~DESCRIPTION
|
15
|
+
The International Patient Access Test Kit provides an executable set of tests for the [International Patient Access (IPA) Implementation Guide v1.0.0](https://hl7.org/fhir/uv/ipa/STU1/). This test kit evaluates the ability of a system to support applications acting on behalf of patients to access clinical records using an HL7® FHIR® R4 API in accordance to the IPA IG. It accomplishes this by simulating requests performed by a realistic IPA Requestor and validating responses based on requirements specified within the IPA IG and the base FHIR specification.
|
16
|
+
<!-- break -->
|
17
|
+
|
18
|
+
This test kit is [open source](https://github.com/inferno-framework/ipa-test-kit#license) and freely available for use or adoption by the health IT community including EHR vendors, health app developers, and testing labs. It is built using the [Inferno Framework](https://inferno-framework.github.io/inferno-core/). The Inferno Framework is designed for reuse and aims to make it easier to build test kits for any FHIR-based data exchange.
|
19
|
+
|
20
|
+
## Status
|
21
|
+
|
22
|
+
These tests are intended to allow IPA server implementers to perform checks of their server against IPA requrirements. Future versions of these tests may validate other requirements and may change how these are tested.
|
23
|
+
|
24
|
+
The test kit currently tests the following requirements:
|
25
|
+
|
26
|
+
- SMART App Launch Protocol’s standalone launch sequence
|
27
|
+
- Support for Capability Statement
|
28
|
+
- Support for all IPA Profiles
|
29
|
+
- Searches required for each resource
|
30
|
+
- Support for Must Support Elements
|
31
|
+
- Profile Validation
|
32
|
+
- Reference Validation
|
33
|
+
|
34
|
+
See the test descriptions within the test kit for detail on the specific validations performed as part of testing these requirements.
|
35
|
+
|
36
|
+
The following are not yet implemented:
|
37
|
+
|
38
|
+
- Test for client-confidential-asymmetric.
|
39
|
+
- Verify that the server supports all required SMART capabilities, rather than just verifying that the server advertises support for them.
|
40
|
+
- Test $docref operation.
|
41
|
+
- Test Patient.link requirements.
|
42
|
+
- Verify that the server requires both a code and system for Patient identifier search.
|
43
|
+
|
44
|
+
## Repository
|
45
|
+
|
46
|
+
The IPA Test Kit GitHub repository can be [found here](https://github.com/inferno-framework/ipa-test-kit).
|
47
|
+
|
48
|
+
## Providing Feedback and Reporting Issues
|
49
|
+
|
50
|
+
We welcome feedback on the tests, including but not limited to the following areas:
|
51
|
+
|
52
|
+
- Validation logic, such as potential bugs, lax checks, and unexpected failures.
|
53
|
+
- Requirements coverage, such as requirements that have been missed, tests that necessitate features that the IG does not require, or other issues with the interpretation of the IG’s requirements.
|
54
|
+
- User experience, such as confusing or missing information in the test UI.
|
55
|
+
|
56
|
+
Please report any issues with this set of tests in the [issues section](https://github.com/inferno-framework/ipa-test-kit/issues) of the repository.
|
57
|
+
DESCRIPTION
|
58
|
+
end
|
59
|
+
end
|
data/lib/ipa_test_kit/version.rb
CHANGED
data/lib/ipa_test_kit.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ipa_test_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Inferno Core Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inferno_core
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.6.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.6.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: smart_app_launch_test_kit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.5.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.5.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: tls_test_kit
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.3.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.3.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: database_cleaner-sequel
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,6 +116,7 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- LICENSE
|
119
|
+
- config/presets/ipa_preset.json
|
119
120
|
- lib/ipa_test_kit.rb
|
120
121
|
- lib/ipa_test_kit/custom_groups/v1.0.0/capability_statement/conformance_support_test.rb
|
121
122
|
- lib/ipa_test_kit/custom_groups/v1.0.0/capability_statement/fhir_version_test.rb
|
@@ -291,12 +292,23 @@ files:
|
|
291
292
|
- lib/ipa_test_kit/generator/search_test_generator.rb
|
292
293
|
- lib/ipa_test_kit/generator/special_cases.rb
|
293
294
|
- lib/ipa_test_kit/generator/suite_generator.rb
|
295
|
+
- lib/ipa_test_kit/generator/templates/group.rb.erb
|
296
|
+
- lib/ipa_test_kit/generator/templates/must_support.rb.erb
|
297
|
+
- lib/ipa_test_kit/generator/templates/provenance_revinclude_search.rb.erb
|
298
|
+
- lib/ipa_test_kit/generator/templates/read.rb.erb
|
299
|
+
- lib/ipa_test_kit/generator/templates/reference_resolution.rb.erb
|
300
|
+
- lib/ipa_test_kit/generator/templates/resource_list.rb.erb
|
301
|
+
- lib/ipa_test_kit/generator/templates/search.rb.erb
|
302
|
+
- lib/ipa_test_kit/generator/templates/suite.rb.erb
|
303
|
+
- lib/ipa_test_kit/generator/templates/validation.rb.erb
|
294
304
|
- lib/ipa_test_kit/generator/terminology_binding_metadata_extractor.rb
|
295
305
|
- lib/ipa_test_kit/generator/validation_test_generator.rb
|
296
306
|
- lib/ipa_test_kit/generator/value_extractor.rb
|
307
|
+
- lib/ipa_test_kit/igs/README.md
|
297
308
|
- lib/ipa_test_kit/igs/ipa_v100.tgz
|
298
309
|
- lib/ipa_test_kit/igs/ipa_v100/search-parameters.json
|
299
310
|
- lib/ipa_test_kit/igs/ipa_v100/vitalsigns.profile.json
|
311
|
+
- lib/ipa_test_kit/metadata.rb
|
300
312
|
- lib/ipa_test_kit/must_support_test.rb
|
301
313
|
- lib/ipa_test_kit/provenance_validator.rb
|
302
314
|
- lib/ipa_test_kit/read_test.rb
|
@@ -312,6 +324,7 @@ licenses:
|
|
312
324
|
metadata:
|
313
325
|
homepage_uri: https://github.com/inferno-framework/ipa-test-kit
|
314
326
|
source_code_uri: https://github.com/inferno-framework/ipa-test-kit
|
327
|
+
inferno_test_kit: 'true'
|
315
328
|
post_install_message:
|
316
329
|
rdoc_options: []
|
317
330
|
require_paths:
|
@@ -320,14 +333,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
320
333
|
requirements:
|
321
334
|
- - ">="
|
322
335
|
- !ruby/object:Gem::Version
|
323
|
-
version: 3.
|
336
|
+
version: 3.3.6
|
324
337
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
325
338
|
requirements:
|
326
339
|
- - ">="
|
327
340
|
- !ruby/object:Gem::Version
|
328
341
|
version: '0'
|
329
342
|
requirements: []
|
330
|
-
rubygems_version: 3.
|
343
|
+
rubygems_version: 3.5.22
|
331
344
|
signing_key:
|
332
345
|
specification_version: 4
|
333
346
|
summary: IPA Inferno tests
|