onc_certification_g10_test_kit 3.5.0 → 3.6.0

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