onc_certification_g10_test_kit 3.5.0 → 3.6.0

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
  SHA256:
3
- metadata.gz: 86895a228600bf6b7def9bed5d5ec4a1097ecf51ab0894c270329bfbd59ddc7e
4
- data.tar.gz: c8ddb8549f55dbc1919e8e93464b622bdf26cd5b854ff605658ebb4ecd603267
3
+ metadata.gz: 5cb9581f7ee4744446ca16c9f22e240d122ea66a0664855fb84105e493711b12
4
+ data.tar.gz: 599e962523e39a5acde1d806dca01bdcc833cfcf8765d3ec4011b30b68461565
5
5
  SHA512:
6
- metadata.gz: 509654b9a9278a4d6d43665798ede7d41844fbbd35dd4073579f3a7a5b45a1036917f331b3fabb3453e9f7cead391a15cd82d98bc9ef5e618a9ec55b8c2395c1
7
- data.tar.gz: aeb3ecce391706bb755b16f8af66a95d5cddd934e85d0dd5035280f9eef34955c77800007175ccbb9c6820aebc104e72b49b3e9eaa636992e757a6a7558c125c
6
+ metadata.gz: 28a4f109f4790920c4651e4b5dcbe2f54f84729c8253df0ded0edfd0e4ee2be116de27f0b301e8cb91942d467e7ce7cc926124c3d72085279f3a92e56cdd2494
7
+ data.tar.gz: 539f9c928ba1c7f912cbb5c449835043f1e33bc84d9c365d9d6bba66aad8f2116a354c4ff55a4828d496dd6b26a60dee7d427ec8fec596cf81426f5604b64d32
@@ -0,0 +1,48 @@
1
+ require_relative 'export_kick_off_performer'
2
+
3
+ module ONCCertificationG10TestKit
4
+ class BulkDataGroupExportCancelSTU1 < Inferno::TestGroup
5
+ id :g10_bulk_data_export_cancel_stu1
6
+ title 'Group Compartment Export Cancel Tests'
7
+ description %(
8
+ Verify that the Bulk Data server supports cancelling requested exports.
9
+ This group initiates a new export and immediately cancels it to verify
10
+ correct behavior.
11
+ )
12
+
13
+ input :bearer_token
14
+ input :bulk_server_url,
15
+ title: 'Bulk Data FHIR URL',
16
+ description: 'The URL of the Bulk FHIR server.'
17
+ input :group_id,
18
+ title: 'Group ID',
19
+ description: 'The Group ID associated with the group of patients to be exported.'
20
+
21
+ http_client :bulk_server do
22
+ url :bulk_server_url
23
+ end
24
+
25
+ test do
26
+ id :g10_bulk_export_cancel
27
+ title 'Bulk Data Server returns "202 Accepted" for delete request'
28
+ description <<~DESCRIPTION
29
+ After a bulk data request has been started, a client MAY send a delete request to the URL provided in the Content-Location header to cancel the request.
30
+ Bulk Data Server MUST support client's delete request and return HTTP Status Code of "202 Accepted"
31
+ DESCRIPTION
32
+ # link 'http://hl7.org/fhir/uv/bulkdata/STU1.0.1/export/index.html#bulk-data-delete-request'
33
+
34
+ include ExportKickOffPerformer
35
+
36
+ output :cancelled_polling_url
37
+
38
+ run do
39
+ perform_export_kick_off_request
40
+ assert_response_status(202)
41
+
42
+ output cancelled_polling_url: request.response_header('content-location')&.value
43
+
44
+ delete_export_kick_off_request
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'bulk_data_group_export_cancel_stu1'
2
+
3
+ module ONCCertificationG10TestKit
4
+ class BulkDataGroupExportCancelSTU2 < BulkDataGroupExportCancelSTU1
5
+ id :g10_bulk_data_export_cancel_stu2
6
+
7
+ test do
8
+ title 'Bulk Data Server returns a 404 and OperationOutcome for polling requests to cancelled exports'
9
+ description <<~DESCRIPTION
10
+ > Following the delete request, when subsequent requests are made to the
11
+ polling location, the server SHALL return a 404 Not Found error and an
12
+ associated FHIR OperationOutcome in JSON format.
13
+
14
+ http://hl7.org/fhir/uv/bulkdata/STU2/export.html#bulk-data-delete-request
15
+ DESCRIPTION
16
+
17
+ id :bulk_data_poll_cancelled_export
18
+
19
+ input :cancelled_polling_url
20
+
21
+ run do
22
+ skip 'No polling url available' unless cancelled_polling_url.present?
23
+
24
+ get(cancelled_polling_url, headers: { authorization: "Bearer #{bearer_token}", accept: 'application/json' })
25
+
26
+ assert_response_status(404)
27
+
28
+ assert_valid_json(response[:body])
29
+ response_body = JSON.parse(response[:body])
30
+
31
+ assert response_body['resourceType'] == 'OperationOutcome', 'Server did not return an OperationOutcome'
32
+ assert_valid_resource(resource: FHIR::OperationOutcome.new(response_body))
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,96 @@
1
+ require_relative 'export_kick_off_performer'
2
+
3
+ module ONCCertificationG10TestKit
4
+ class BulkDataGroupExportParameters < Inferno::TestGroup
5
+ id :g10_bulk_data_export_parameters
6
+ title 'Group Compartment Export Parameters Tests'
7
+ description %(
8
+ Verify that the Bulk Data server supports required query parameters.
9
+ )
10
+
11
+ input :bearer_token
12
+ input :bulk_server_url,
13
+ title: 'Bulk Data FHIR URL',
14
+ description: 'The URL of the Bulk FHIR server.'
15
+ input :group_id,
16
+ title: 'Group ID',
17
+ description: 'The Group ID associated with the group of patients to be exported.'
18
+
19
+ http_client :bulk_server do
20
+ url :bulk_server_url
21
+ end
22
+
23
+ test do
24
+ title 'Bulk Data Server supports "_outputFormat" query parameter'
25
+ description <<~DESCRIPTION
26
+ [_outputFormat](http://hl7.org/fhir/uv/bulkdata/STU2/export.html#query-parameters):
27
+ The format for the requested Bulk Data files to be
28
+ generated as per FHIR Asynchronous Request Pattern. Defaults to
29
+ application/fhir+ndjson. The server SHALL support Newline Delimited
30
+ JSON, but MAY choose to support additional output formats. The server
31
+ SHALL accept the full content type of application/fhir+ndjson as well
32
+ as the abbreviated representations application/ndjson and ndjson.
33
+ DESCRIPTION
34
+
35
+ id :output_format_in_export_response
36
+
37
+ include ExportKickOffPerformer
38
+
39
+ run do
40
+ ['application/fhir+ndjson', 'application/ndjson', 'ndjson'].each do |format|
41
+ perform_export_kick_off_request(params: { _outputFormat: format })
42
+ assert_response_status(202)
43
+
44
+ delete_export_kick_off_request
45
+ end
46
+ end
47
+ end
48
+
49
+ test do
50
+ title 'Bulk Data Server supports "_since" query parameter'
51
+ description <<~DESCRIPTION
52
+ This test verifies that the server accepts an export request with the
53
+ `[_since](http://hl7.org/fhir/uv/bulkdata/STU2/export.html#query-parameters)`
54
+ query parameter. It initiates a new export using a _since parameter of
55
+ one week ago, and ensures that the export was initiated succesfully.
56
+
57
+ The test does not attempt to verify that resources returned were
58
+ modified after the _since date that was requested, because the Bulk Data
59
+ specification provides latitude in determining exactly what data is
60
+ returned by the server. The purpose of this test is to ensure that
61
+ export requests with this parameter are accepted and to highlight that
62
+ support of this parameter is required.
63
+
64
+ After the export was successfully initiated, it is then cancelled.
65
+ DESCRIPTION
66
+
67
+ id :g10_since_in_export_response
68
+
69
+ include ExportKickOffPerformer
70
+
71
+ input :since_timestamp,
72
+ title: 'Timestamp for _since parameter',
73
+ description: 'A timestamp formatted as a FHIR instant which will be used to test the ' \
74
+ "server's support for the `_since` query parameter",
75
+ default: 1.week.ago.iso8601
76
+
77
+ run do
78
+ fhir_instant_regex = /
79
+ ([0-9]([0-9]([0-9][1-9]|[1-9]0)|[1-9]00)|[1-9]000)
80
+ -(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])
81
+ T([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\.[0-9]+)
82
+ ?(Z|(\+|-)((0[0-9]|1[0-3]):[0-5][0-9]|14:00))
83
+ /x
84
+
85
+ assert since_timestamp.match?(fhir_instant_regex),
86
+ "The provided `_since` timestamp `#{since_timestamp}` is not a valid " \
87
+ '[FHIR instant](https://www.hl7.org/fhir/datatypes.html#instant).'
88
+
89
+ perform_export_kick_off_request(params: { _since: since_timestamp })
90
+ assert_response_status(202)
91
+
92
+ delete_export_kick_off_request
93
+ end
94
+ end
95
+ end
96
+ end
@@ -275,27 +275,5 @@ module ONCCertificationG10TestKit
275
275
  end
276
276
  end
277
277
  end
278
-
279
- test do
280
- title 'Bulk Data Server returns "202 Accepted" for delete request'
281
- description <<~DESCRIPTION
282
- After a bulk data request has been started, a client MAY send a delete request to the URL provided in the Content-Location header to cancel the request.
283
- Bulk Data Server MUST support client's delete request and return HTTP Status Code of "202 Accepted"
284
- DESCRIPTION
285
- # link 'http://hl7.org/fhir/uv/bulkdata/STU1.0.1/export/index.html#bulk-data-delete-request'
286
-
287
- include ExportKickOffPerformer
288
-
289
- output :cancelled_polling_url
290
-
291
- run do
292
- perform_export_kick_off_request
293
- assert_response_status(202)
294
-
295
- output cancelled_polling_url: request.response_header('content-location')&.value
296
-
297
- delete_export_kick_off_request
298
- end
299
- end
300
278
  end
301
279
  end
@@ -7,62 +7,5 @@ module ONCCertificationG10TestKit
7
7
  id :bulk_data_group_export_stu2
8
8
 
9
9
  config(options: { require_absolute_urls_in_output: true })
10
-
11
- test do
12
- title 'Bulk Data Server supports "_outputFormat" query parameter'
13
- description <<~DESCRIPTION
14
- [_outputFormat](http://hl7.org/fhir/uv/bulkdata/STU2/export.html#query-parameters):
15
- The format for the requested Bulk Data files to be
16
- generated as per FHIR Asynchronous Request Pattern. Defaults to
17
- application/fhir+ndjson. The server SHALL support Newline Delimited
18
- JSON, but MAY choose to support additional output formats. The server
19
- SHALL accept the full content type of application/fhir+ndjson as well
20
- as the abbreviated representations application/ndjson and ndjson.
21
- DESCRIPTION
22
-
23
- id :output_format_in_export_response
24
-
25
- include ExportKickOffPerformer
26
-
27
- input :bearer_token, :group_id, :bulk_server_url
28
-
29
- run do
30
- ['application/fhir+ndjson', 'application/ndjson', 'ndjson'].each do |format|
31
- perform_export_kick_off_request(params: { _outputFormat: format })
32
- assert_response_status(202)
33
-
34
- delete_export_kick_off_request
35
- end
36
- end
37
- end
38
-
39
- test do
40
- title 'Bulk Data Server returns a 404 and OperationOutcome for polling requests to cancelled exports'
41
- description <<~DESCRIPTION
42
- > Following the delete request, when subsequent requests are made to the
43
- polling location, the server SHALL return a 404 Not Found error and an
44
- associated FHIR OperationOutcome in JSON format.
45
-
46
- http://hl7.org/fhir/uv/bulkdata/STU2/export.html#bulk-data-delete-request
47
- DESCRIPTION
48
-
49
- id :bulk_data_poll_cancelled_export
50
-
51
- input :cancelled_polling_url
52
-
53
- run do
54
- skip 'No polling url available' unless cancelled_polling_url.present?
55
-
56
- get(cancelled_polling_url, headers: { authorization: "Bearer #{bearer_token}", accept: 'application/json' })
57
-
58
- assert_response_status(404)
59
-
60
- assert_valid_json(response[:body])
61
- response_body = JSON.parse(response[:body])
62
-
63
- assert response_body['resourceType'] == 'OperationOutcome', 'Server did not return an OperationOutcome'
64
- assert_valid_resource(resource: FHIR::OperationOutcome.new(response_body))
65
- end
66
- end
67
10
  end
68
11
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'bulk_data_authorization'
2
2
  require_relative 'bulk_data_group_export_stu1'
3
+ require_relative 'bulk_data_group_export_cancel_stu1'
3
4
  require_relative 'bulk_data_group_export_validation'
4
5
  require_relative 'incorrectly_permitted_tls_versions_messages_setup_test'
5
6
 
@@ -75,5 +76,7 @@ module ONCCertificationG10TestKit
75
76
 
76
77
  test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
77
78
  id: :g10_bulk_group_export_validation_messages_setup
79
+
80
+ group from: :g10_bulk_data_export_cancel_stu1
78
81
  end
79
82
  end
@@ -1,4 +1,6 @@
1
1
  require_relative 'bulk_data_authorization'
2
+ require_relative 'bulk_data_group_export_cancel_stu2'
3
+ require_relative 'bulk_data_group_export_parameters'
2
4
  require_relative 'bulk_data_group_export_stu2'
3
5
  require_relative 'bulk_data_group_export_validation'
4
6
 
@@ -74,5 +76,9 @@ module ONCCertificationG10TestKit
74
76
 
75
77
  test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
76
78
  id: :g10_bulk_group_export_validation_messages_setup
79
+
80
+ group from: :g10_bulk_data_export_cancel_stu2
81
+
82
+ group from: :g10_bulk_data_export_parameters
77
83
  end
78
84
  end
@@ -2160,6 +2160,8 @@ procedure:
2160
2160
  inferno_tests:
2161
2161
  - 7.2.04 - 7.2.05
2162
2162
  - 8.2.04 - 8.2.05
2163
+ - 8.5.01
2164
+ - 8.5.02
2163
2165
  - id: DAT-PAT-11
2164
2166
  SUT: |
2165
2167
  The health IT developer demonstrates the ability of the Health IT
@@ -2184,9 +2186,9 @@ procedure:
2184
2186
  adopted in § 170.215(a)(4).
2185
2187
  inferno_supported: 'yes'
2186
2188
  inferno_tests:
2187
- - 7.2.07
2188
- - 8.2.07
2189
- - 8.2.09
2189
+ - 7.4.01
2190
+ - 8.4.01
2191
+ - 8.4.02
2190
2192
  - id: DAT-PAT-13
2191
2193
  SUT: |
2192
2194
  The health IT developer demonstrates the ability of the Health IT
@@ -522,7 +522,6 @@ g10_certification-g10_single_patient_us_core_4_api-us_core_v400_device-us_core_v
522
522
  g10_certification-g10_single_patient_us_core_4_api-us_core_v400_device-us_core_v400_device_validation_test: 5.7.04
523
523
  g10_certification-g10_single_patient_us_core_4_api-us_core_v400_device-us_core_v400_device_must_support_test: 5.7.05
524
524
  g10_certification-g10_single_patient_us_core_4_api-us_core_v400_device-us_core_v400_device_reference_resolution_test: 5.7.06
525
- g10_certification-g10_single_patient_us_core_4_api-us_core_v400_device-us_core_v400_device_udi_pi_test: 5.7.07
526
525
  g10_certification-g10_single_patient_us_core_4_api-us_core_v400_diagnostic_report_lab: '5.8'
527
526
  ? g10_certification-g10_single_patient_us_core_4_api-us_core_v400_diagnostic_report_lab-us_core_v400_diagnostic_report_lab_patient_category_search_test
528
527
  : 5.8.01
@@ -922,7 +921,6 @@ g10_certification-g10_single_patient_us_core_5_api-us_core_v501_device-us_core_v
922
921
  g10_certification-g10_single_patient_us_core_5_api-us_core_v501_device-us_core_v501_device_validation_test: 6.8.04
923
922
  g10_certification-g10_single_patient_us_core_5_api-us_core_v501_device-us_core_v501_device_must_support_test: 6.8.05
924
923
  g10_certification-g10_single_patient_us_core_5_api-us_core_v501_device-us_core_v501_device_reference_resolution_test: 6.8.06
925
- g10_certification-g10_single_patient_us_core_5_api-us_core_v501_device-us_core_v400_device_udi_pi_test: 6.8.07
926
924
  g10_certification-g10_single_patient_us_core_5_api-us_core_v501_diagnostic_report_note: '6.9'
927
925
  ? g10_certification-g10_single_patient_us_core_5_api-us_core_v501_diagnostic_report_note-us_core_v501_diagnostic_report_note_patient_category_search_test
928
926
  : 6.9.01
@@ -1365,7 +1363,6 @@ g10_certification-multi_patient_api-bulk_data_group_export-Test03: 7.2.03
1365
1363
  g10_certification-multi_patient_api-bulk_data_group_export-Test04: 7.2.04
1366
1364
  g10_certification-multi_patient_api-bulk_data_group_export-Test05: 7.2.05
1367
1365
  g10_certification-multi_patient_api-bulk_data_group_export-Test06: 7.2.06
1368
- g10_certification-multi_patient_api-bulk_data_group_export-Test07: 7.2.07
1369
1366
  g10_certification-multi_patient_api-g10_bulk_group_export_tls_messages_setup: '7.02'
1370
1367
  g10_certification-multi_patient_api-bulk_data_group_export_validation: '7.3'
1371
1368
  g10_certification-multi_patient_api-bulk_data_group_export_validation-g10_bulk_file_server_tls_version: 7.3.01
@@ -1396,6 +1393,8 @@ g10_certification-multi_patient_api-bulk_data_group_export_validation-Test25: 7.
1396
1393
  g10_certification-multi_patient_api-bulk_data_group_export_validation-Test26: 7.3.26
1397
1394
  g10_certification-multi_patient_api-bulk_data_group_export_validation-Test27: 7.3.27
1398
1395
  g10_certification-multi_patient_api-g10_bulk_group_export_validation_messages_setup: '7.03'
1396
+ g10_certification-multi_patient_api-g10_bulk_data_export_cancel_stu1: '7.4'
1397
+ g10_certification-multi_patient_api-g10_bulk_data_export_cancel_stu1-g10_bulk_export_cancel: 7.4.01
1399
1398
  g10_certification-multi_patient_api_stu2: '8'
1400
1399
  g10_certification-multi_patient_api_stu2-bulk_data_authorization: '8.1'
1401
1400
  g10_certification-multi_patient_api_stu2-bulk_data_authorization-g10_bulk_token_tls_version: 8.1.01
@@ -1412,9 +1411,6 @@ g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-Test03: 8.2
1412
1411
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-Test04: 8.2.04
1413
1412
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-Test05: 8.2.05
1414
1413
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-Test06: 8.2.06
1415
- g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-Test07: 8.2.07
1416
- g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-output_format_in_export_response: 8.2.08
1417
- g10_certification-multi_patient_api_stu2-bulk_data_group_export_stu2-bulk_data_poll_cancelled_export: 8.2.09
1418
1414
  g10_certification-multi_patient_api_stu2-g10_bulk_group_export_tls_messages_setup: '8.02'
1419
1415
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_validation: '8.3'
1420
1416
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_validation-g10_bulk_file_server_tls_version: 8.3.01
@@ -1445,6 +1441,12 @@ g10_certification-multi_patient_api_stu2-bulk_data_group_export_validation-Test2
1445
1441
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_validation-Test26: 8.3.26
1446
1442
  g10_certification-multi_patient_api_stu2-bulk_data_group_export_validation-Test27: 8.3.27
1447
1443
  g10_certification-multi_patient_api_stu2-g10_bulk_group_export_validation_messages_setup: '8.03'
1444
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_cancel_stu2: '8.4'
1445
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_cancel_stu2-g10_bulk_export_cancel: 8.4.01
1446
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_cancel_stu2-bulk_data_poll_cancelled_export: 8.4.02
1447
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_parameters: '8.5'
1448
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_parameters-output_format_in_export_response: 8.5.01
1449
+ g10_certification-multi_patient_api_stu2-g10_bulk_data_export_parameters-g10_since_in_export_response: 8.5.02
1448
1450
  g10_certification-Group06: '9'
1449
1451
  g10_certification-Group06-g10_public_standalone_launch: '9.1'
1450
1452
  g10_certification-Group06-g10_public_standalone_launch-standalone_auth_tls: 9.1.01
@@ -1538,3 +1540,4 @@ g10_certification-Group06-g10_visual_inspection_and_attestations-Test13: 9.10.13
1538
1540
  g10_certification-Group06-g10_visual_inspection_and_attestations-g10_public_url_attestation: 9.10.14
1539
1541
  g10_certification-Group06-g10_visual_inspection_and_attestations-g10_tls_version_attestation: 9.10.15
1540
1542
  g10_certification-Group06-g10_visual_inspection_and_attestations-g10_refresh_token_refresh_attestation: 9.10.16
1543
+ g10_certification-Group06-g10_visual_inspection_and_attestations-g10_bulk_v2_since_attestation: 9.10.17
@@ -137,17 +137,11 @@ module ONCCertificationG10TestKit
137
137
  received_scopes: { name: :ehr_received_scopes }
138
138
  },
139
139
  options: {
140
- scope_version: :v1
140
+ scope_version: :v1,
141
+ required_scope_type: 'user',
142
+ required_scopes: ['openid', 'fhirUser', 'launch', 'offline_access']
141
143
  }
142
144
  )
143
-
144
- def required_scopes
145
- ['openid', 'fhirUser', 'launch', 'offline_access']
146
- end
147
-
148
- def required_scope_type
149
- 'user'
150
- end
151
145
  end
152
146
 
153
147
  test from: :g10_unauthorized_access,
@@ -289,17 +283,11 @@ module ONCCertificationG10TestKit
289
283
  received_scopes: { name: :ehr_received_scopes }
290
284
  },
291
285
  options: {
292
- scope_version: :v2
286
+ scope_version: :v2,
287
+ required_scope_type: 'user',
288
+ required_scopes: ['openid', 'fhirUser', 'launch', 'offline_access']
293
289
  }
294
290
  )
295
-
296
- def required_scopes
297
- ['openid', 'fhirUser', 'launch', 'offline_access']
298
- end
299
-
300
- def required_scope_type
301
- 'user'
302
- end
303
291
  end
304
292
 
305
293
  test from: :g10_unauthorized_access,
@@ -75,13 +75,25 @@ module ONCCertificationG10TestKit
75
75
  V5_VALID_RESOURCE_TYPES
76
76
  end
77
77
 
78
+ def required_scope_type
79
+ config.options[:required_scope_type]
80
+ end
81
+
82
+ def required_scopes
83
+ config.options[:required_scopes]
84
+ end
85
+
86
+ def scope_version
87
+ config.options[:scope_version]
88
+ end
89
+
78
90
  def read_format
79
91
  @read_format ||=
80
92
  begin
81
93
  v1_read_format = 'read'
82
94
  v2_read_format = 'c?ru?d?s?'
83
95
 
84
- case config.options[:scope_version]
96
+ case scope_version
85
97
  when :v1
86
98
  "#{v1_read_format} | *"
87
99
  when :v2
@@ -94,13 +106,13 @@ module ONCCertificationG10TestKit
94
106
 
95
107
  def access_level_regex
96
108
  @access_level_regex ||=
97
- case config.options[:scope_version]
109
+ case scope_version
98
110
  when :v1
99
- /\A(\*|read)/
111
+ /\A(\*|read)\b/
100
112
  when :v2
101
- /\A(\*|c?ru?d?s?\b)/
113
+ /\A(\*|c?ru?d?s?)\b/
102
114
  else
103
- /\A(\*|read|c?ru?d?s?\b)/
115
+ /\A(\*|read|c?ru?d?s?)\b/
104
116
  end
105
117
  end
106
118
 
@@ -112,41 +124,45 @@ module ONCCertificationG10TestKit
112
124
  end
113
125
 
114
126
  def strip_experimental_scope_syntax(full_scope)
115
- if config.options[:scope_version] == :v1
127
+ if scope_version == :v1
116
128
  full_scope
117
129
  else
118
130
  full_scope.split('?').first
119
131
  end
120
132
  end
121
133
 
122
- def requested_scope_test(scopes, patient_compartment_resource_types)
134
+ def assert_correct_scope_type(scope, scope_type, resource_type)
135
+ if required_scope_type == 'patient' && patient_compartment_resource_types.exclude?(resource_type)
136
+ assert ['user', 'patient'].include?(scope_type),
137
+ "Requested scope '#{scope}' must begin with either 'user/' or 'patient/'"
138
+ else
139
+ assert scope_type == required_scope_type, bad_format_message(scope)
140
+ end
141
+ end
142
+
143
+ def requested_scope_test(scopes)
123
144
  correct_scope_type_found = false
124
145
 
125
146
  scopes.each do |full_scope|
126
147
  scope = strip_experimental_scope_syntax(full_scope)
127
148
 
128
149
  scope_pieces = scope.split('/')
129
- assert scope_pieces.count == 2, bad_format_message(scope)
150
+ assert scope_pieces.length == 2, bad_format_message(scope)
130
151
 
131
152
  scope_type, resource_scope = scope_pieces
132
- resource_scope_parts = resource_scope.split('.')
133
153
 
154
+ resource_scope_parts = resource_scope.split('.')
134
155
  assert resource_scope_parts.length == 2, bad_format_message(scope)
135
156
 
136
157
  resource_type, access_level = resource_scope_parts
137
- bad_resource_message = "'#{resource_type}' must be either a valid resource type or '*'"
158
+ assert access_level =~ access_level_regex, bad_format_message(scope)
138
159
 
139
- if required_scope_type == 'patient' && patient_compartment_resource_types.exclude?(resource_type)
140
- assert ['user', 'patient'].include?(scope_type),
141
- "Requested scope '#{scope}' must begin with either 'user/' or 'patient/'"
142
- else
143
- assert scope_type == required_scope_type, bad_format_message(scope)
144
- end
160
+ assert_correct_scope_type(scope, scope_type, resource_type)
145
161
 
146
- assert valid_resource_types.include?(resource_type), bad_resource_message
147
- assert access_level =~ access_level_regex, bad_format_message(scope)
162
+ assert valid_resource_types.include?(resource_type),
163
+ "'#{resource_type}' must be either a permitted resource type or '*'"
148
164
 
149
- correct_scope_type_found = true
165
+ correct_scope_type_found = true if scope_type == required_scope_type
150
166
  end
151
167
 
152
168
  assert correct_scope_type_found,
@@ -154,22 +170,28 @@ module ONCCertificationG10TestKit
154
170
  "`#{required_scope_type}/[ <ResourceType> | * ].[ #{read_format} ]` was not requested."
155
171
  end
156
172
 
157
- def received_scope_test(scopes, patient_compartment_resource_types)
173
+ def received_scope_test(scopes)
158
174
  granted_resource_types = []
159
175
 
160
176
  scopes.each do |full_scope|
161
177
  scope = strip_experimental_scope_syntax(full_scope)
162
178
 
163
179
  scope_pieces = scope.split('/')
164
- next unless scope_pieces.count == 2
180
+ next unless scope_pieces.length == 2
165
181
 
166
- _scope_type, resource_scope = scope_pieces
182
+ scope_type, resource_scope = scope_pieces
167
183
 
168
184
  resource_scope_parts = resource_scope.split('.')
169
- next unless resource_scope_parts.count == 2
185
+ next unless resource_scope_parts.length == 2
170
186
 
171
187
  resource_type, access_level = resource_scope_parts
172
- granted_resource_types << resource_type if access_level =~ access_level_regex
188
+ next unless access_level =~ access_level_regex
189
+
190
+ next unless ['patient', 'user', 'system'].include?(scope_type)
191
+
192
+ assert_correct_scope_type(scope, scope_type, resource_type)
193
+
194
+ granted_resource_types << resource_type
173
195
  end
174
196
 
175
197
  missing_resource_types =
@@ -209,12 +231,12 @@ module ONCCertificationG10TestKit
209
231
  # 'launch/patient' for EHR launch and Standalone launch.
210
232
  # 'launch/encounter' is mentioned by SMART App Launch though not in
211
233
  # (g)(10) test procedure
212
- scopes -= ['online_access', 'launch', 'launch/patient', 'launch/encounter']
234
+ scopes -= ['online_access', 'offline_access', 'launch', 'launch/patient', 'launch/encounter']
213
235
 
214
236
  if received_or_requested == 'requested'
215
- requested_scope_test(scopes, patient_compartment_resource_types)
237
+ requested_scope_test(scopes)
216
238
  else
217
- received_scope_test(scopes, patient_compartment_resource_types)
239
+ received_scope_test(scopes)
218
240
  end
219
241
  end
220
242
  end
@@ -151,17 +151,11 @@ module ONCCertificationG10TestKit
151
151
  received_scopes: { name: :standalone_received_scopes }
152
152
  },
153
153
  options: {
154
- scope_version: :v1
154
+ scope_version: :v1,
155
+ required_scope_type: 'patient',
156
+ required_scopes: ['openid', 'fhirUser', 'launch/patient', 'offline_access']
155
157
  }
156
158
  )
157
-
158
- def required_scopes
159
- ['openid', 'fhirUser', 'launch/patient', 'offline_access']
160
- end
161
-
162
- def required_scope_type
163
- 'patient'
164
- end
165
159
  end
166
160
 
167
161
  test from: :g10_unauthorized_access,
@@ -267,17 +261,11 @@ module ONCCertificationG10TestKit
267
261
  received_scopes: { name: :standalone_received_scopes }
268
262
  },
269
263
  options: {
270
- scope_version: :v2
264
+ scope_version: :v2,
265
+ required_scope_type: 'patient',
266
+ required_scopes: ['openid', 'fhirUser', 'launch/patient', 'offline_access']
271
267
  }
272
268
  )
273
-
274
- def required_scopes
275
- ['openid', 'fhirUser', 'launch/patient', 'offline_access']
276
- end
277
-
278
- def required_scope_type
279
- 'patient'
280
- end
281
269
  end
282
270
 
283
271
  test from: :g10_unauthorized_access,
@@ -1,3 +1,3 @@
1
1
  module ONCCertificationG10TestKit
2
- VERSION = '3.5.0'.freeze
2
+ VERSION = '3.6.0'.freeze
3
3
  end
@@ -637,5 +637,55 @@ module ONCCertificationG10TestKit
637
637
  pass refresh_token_refresh_notes if refresh_token_refresh_notes.present?
638
638
  end
639
639
  end
640
+
641
+ test do
642
+ required_suite_options G10Options::BULK_DATA_2_REQUIREMENT
643
+ title 'Health IT developer attested that the Health IT Module meets the ' \
644
+ 'requirements for supporting the `_since` parameter for bulk data exports.'
645
+ description %(
646
+ Resources will be included in the response if their state has changed
647
+ after the supplied time (e.g., if `Resource.meta.lastUpdated` is later
648
+ than the supplied `_since` time). In the case of a Group level export, the
649
+ server MAY return additional resources modified prior to the supplied
650
+ time if the resources belong to the patient compartment of a patient
651
+ added to the Group after the supplied time (this behavior SHOULD be
652
+ clearly documented by the server). For Patient- and Group-level
653
+ requests, the server MAY return resources that are referenced by the
654
+ resources being returned regardless of when the referenced resources
655
+ were last updated. For resources where the server does not maintain a
656
+ last updated time, the server MAY include these resources in a response
657
+ irrespective of the _since value supplied by a client.
658
+ )
659
+ id :g10_bulk_v2_since_attestation
660
+ input :bulk_v2_since_attestation,
661
+ title: 'Health IT developer attested that the Health IT Module meets the ' \
662
+ 'requirements for supporting the `_since` parameter for bulk data exports.',
663
+ type: 'radio',
664
+ default: 'false',
665
+ options: {
666
+ list_options: [
667
+ {
668
+ label: 'Yes',
669
+ value: 'true'
670
+ },
671
+ {
672
+ label: 'No',
673
+ value: 'false'
674
+ }
675
+ ]
676
+ }
677
+ input :bulk_v2_since_attestation_notes,
678
+ title: 'Notes, if applicable:',
679
+ type: 'textarea',
680
+ optional: true
681
+
682
+ run do
683
+ assert bulk_v2_since_attestation == 'true',
684
+ 'Health IT developer did not attest that the Health IT Module meets the ' \
685
+ 'requirements for supporting the `_since` parameter for bulk data exports.'
686
+
687
+ pass bulk_v2_since_attestation_notes if bulk_v2_since_attestation_notes.present?
688
+ end
689
+ end
640
690
  end
641
691
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onc_certification_g10_test_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.0
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-08 00:00:00.000000000 Z
11
+ date: 2023-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bloomer
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - '='
144
144
  - !ruby/object:Gem::Version
145
- version: 0.4.5
145
+ version: 0.4.6
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 0.4.5
152
+ version: 0.4.6
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: database_cleaner-sequel
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -250,6 +250,9 @@ files:
250
250
  - lib/onc_certification_g10_test_kit/authorization_request_builder.rb
251
251
  - lib/onc_certification_g10_test_kit/base_token_refresh_group.rb
252
252
  - lib/onc_certification_g10_test_kit/bulk_data_authorization.rb
253
+ - lib/onc_certification_g10_test_kit/bulk_data_group_export_cancel_stu1.rb
254
+ - lib/onc_certification_g10_test_kit/bulk_data_group_export_cancel_stu2.rb
255
+ - lib/onc_certification_g10_test_kit/bulk_data_group_export_parameters.rb
253
256
  - lib/onc_certification_g10_test_kit/bulk_data_group_export_stu1.rb
254
257
  - lib/onc_certification_g10_test_kit/bulk_data_group_export_stu2.rb
255
258
  - lib/onc_certification_g10_test_kit/bulk_data_group_export_validation.rb