uds_plus_test_kit 1.0.7 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/uds_plus_test_kit/examples/adverse_event.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/allergy_intollerance.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/condition.ndjson +1 -1
- data/lib/uds_plus_test_kit/examples/coverage.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/data_urls.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/encounter.ndjson +1 -1
- data/lib/uds_plus_test_kit/examples/immunization.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/location.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/manifest.json +204 -0
- data/lib/uds_plus_test_kit/examples/medication_request.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/medication_statement.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/observation.ndjson +6 -4
- data/lib/uds_plus_test_kit/examples/patient.ndjson +3 -2
- data/lib/uds_plus_test_kit/examples/procedure.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/related_person.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/reporting_parameters.ndjson +1 -0
- data/lib/uds_plus_test_kit/examples/service_request.ndjson +1 -0
- data/lib/uds_plus_test_kit/input_resource_tests/read_observation_test.rb +54 -0
- data/lib/uds_plus_test_kit/input_resource_tests/resource_group.rb +4 -0
- data/lib/uds_plus_test_kit/manifest_tests/read_data_test.rb +14 -3
- data/lib/uds_plus_test_kit/manifest_tests/uds_plus_test_group.rb +2 -0
- data/lib/uds_plus_test_kit/post_tests/post_group.rb +2 -0
- data/lib/uds_plus_test_kit/uds_plus_test_suite.rb +55 -5
- data/lib/uds_plus_test_kit/validate_clinical_result_test.rb +1 -1
- data/lib/uds_plus_test_kit/validate_income_test.rb +1 -1
- data/lib/uds_plus_test_kit/validate_lab_test.rb +3 -3
- data/lib/uds_plus_test_kit/validate_observation_test.rb +65 -0
- data/lib/uds_plus_test_kit/validate_sexual_orientation_test.rb +1 -1
- data/lib/uds_plus_test_kit/validate_special_observation_test.rb +2 -2
- data/lib/uds_plus_test_kit/version.rb +2 -2
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed7d6bf53a6a42927099680142517bfebe46c40a114f75511234aa120cc3b5a8
|
4
|
+
data.tar.gz: 50202697842a73535127a3163ca2fe6d1984eb0b8bc676cfca60a12fcd94fa16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 223ba819e78e68c3f68fadb3db5bcaf39f094f976ca1c3d4a91f49ae34d9032019f13170101c5b48de1483a5fa7f68ced256101cf319801ca02ceb1985a57a2f
|
7
|
+
data.tar.gz: 52a79a18d25ff80def8d233db7354c6d75ed1420ed0062a56df11acab4fa48f34774a0cdabef89f3480a0eb1a484c828b8afc89c86421eee121e607a6cb77c9d
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"AdverseEvent","id":"de-identified-example","meta":{"lastUpdated":"2017-05-26T11:56:57.250-04:00","profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-adverseevent"]},"actuality":"actual","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/adverse-event-category","code":"medication-mishap","display":"Medication Mishap"}],"text":"Medication Mishap - Wrong Dose"}],"event":{"coding":[{"system":"http://snomed.info/sct","code":"140004","display":"Chronic Pharyngitis"}],"text":"Chronic Pharyngitis"},"subject":{"reference":"Patient/de-identified-example"},"date":"2015","recordedDate":"2017"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"AllergyIntolerance","id":"de-identified-example","meta":{"lastUpdated":"2017-05-26T11:56:57.250-04:00","profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-allergyintolerance"]},"clinicalStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical","code":"active"}]},"verificationStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/allergyintolerance-verification","code":"confirmed"}]},"category":["medication"],"criticality":"high","code":{"coding":[{"system":"http://snomed.info/sct","code":"387406002","display":"Sulfonamide (substance)"}],"text":"sulfonamide antibacterial"},"patient":{"reference":"Patient/de-identified-example"},"onsetDateTime":"2015","recordedDate":"2017","reaction":[{"manifestation":[{"coding":[{"system":"http://snomed.info/sct","code":"271807003","display":"skin rash"}],"text":"skin rash"}],"severity":"mild"}]}
|
@@ -1 +1 @@
|
|
1
|
-
{
|
1
|
+
{"resourceType":"Condition","id":"de-identified-example","meta":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/instance-name","valueString":"De-identified Diagnosis Example"},{"url":"http://hl7.org/fhir/StructureDefinition/instance-description","valueMarkdown":"This example of a UDS+ Diagnosis profile which illustrates its use to capture de-identified information about a patient's diagnosis."}],"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-diagnosis"]},"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/condition-assertedDate","valueDateTime":"2007"}],"clinicalStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/condition-clinical","code":"active","display":"Active"}]},"verificationStatus":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/condition-ver-status","code":"confirmed","display":"Confirmed"}]},"category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/condition-category","code":"problem-list-item","display":"Problem List Item"}]}],"code":{"coding":[{"system":"http://hl7.org/fhir/sid/icd-10-cm","code":"B18.2","display":"Chronic viral hepatitis C"}]},"subject":{"reference":"Patient/de-identified-example"},"onsetDateTime":"2007","recordedDate":"2007"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{ "resourceType": "Coverage", "id": "de-identified-example", "meta": { "profile": [ "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-coverage" ] }, "extension": [ { "url": "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-capitated-member-months-extension", "valueQuantity": { "value": 36, "unit": "yr", "system": "http://unitsofmeasure.org", "code": "a" } }, { "url": "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-feeforservice-member-months-extension", "valueQuantity": { "value": 36, "unit": "yr", "system": "http://unitsofmeasure.org", "code": "a" } } ], "status": "active", "type": { "coding": [ { "system": "http://fhir.org/guides/hrsa/uds-plus/CodeSystem/uds-plus-insurance-codes", "code": "private-insurance", "display": "Private Insurance" } ] }, "beneficiary": { "reference": "Patient/de-identified-example" }, "period": { "start": "2019", "end": "2023" }, "payor": [ { "reference": "Organization/acme-payer" } ]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{ "resourceType": "Parameters", "id": "de-identify-data-operation-urls-example", "meta": { "profile": [ "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-deidentify-operation-data-urls-parameter" ] }, "parameter": [ { "name": "format", "valueCode": "fhir+ndjson" }, { "name": "udsData", "part": [ { "name": "resourceType", "valueCode": "Patient" }, { "name": "resourceUrl", "valueUrl": "http://example.com/Patient.ndjson" } ] } ]}
|
@@ -1 +1 @@
|
|
1
|
-
{
|
1
|
+
{"resourceType":"Encounter","id":"de-identified-example","meta":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/instance-name","valueString":"De-Identified Encounter Example"},{"url":"http://hl7.org/fhir/StructureDefinition/instance-description","valueMarkdown":"This is an encounter example for the *US Core Encounter Profile*."}],"lastUpdated":"2022-05-26T11:56:57.250-04:00","profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-encounter"]},"extension":[{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-age-extension","valueQuantity":{"value":36,"unit":"yr","system":"http://unitsofmeasure.org","code":"a"}}],"status":"finished","class":{"system":"http://terminology.hl7.org/CodeSystem/v3-ActCode","code":"AMB","display":"ambulatory"},"type":[{"coding":[{"system":"http://www.ama-assn.org/go/cpt","code":"99202"}]}],"subject":{"reference":"Patient/de-identified-example"},"period":{"start":"2022","end":"2022"},"hospitalization":{"dischargeDisposition":{"coding":[{"system":"http://www.nubc.org/patient-discharge","code":"01","display":"Discharged to Home"}]}},"location":[{"location":{"reference":"Location/hospital","display":"Holy Family Hospital"}}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"Immunization","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-immunization"]},"status":"completed","statusReason":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/condition-category","code":"encounter-diagnosis","display":"Encounter Diagnosis"}]},"vaccineCode":{"coding":[{"system":"http://hl7.org/fhir/sid/cvx","code":"197","display":"influenza, high-dose, quadrivalent"}]},"patient":{"reference":"Patient/de-identified-example"},"occurrenceDateTime":"2023","recorded":"2023","primarySource":true}
|
@@ -0,0 +1 @@
|
|
1
|
+
{ "resourceType": "Location", "id": "hospital", "meta": { "profile": [ "http://hl7.org/fhir/us/core/StructureDefinition/us-core-location", "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-location" ] }, "text": { "status": "extensions", "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p><b> Location</b><a name=\"Holy Family hospital\"> </a></p><div style=\"display: inline-block; background-color: #d9e0e7; padding: 6px; margin: 4px; border: 1px solid #8da1b4; border-radius: 5px; line-height: 60%\"><p style=\"margin-bottom: 0px\">Resource Location "hospital" </p><p style=\"margin-bottom: 0px\"></p></div><p><b>status</b>: active</p><p><b>name</b>: Holy Family Hospital</p><p><b>telecom</b>: ph: 9786870156</p><p><b>address</b>: 70 EAST STREET METHUEN MA 01844 US </p><p><b>managingOrganization</b>: <a href=\"Organization-holy-healthcare.html\">Organization/holy-healthcare: Holy Healthcare</a> "Holy Healthcare"</p></div>" }, "status": "active", "name": "Holy Family Hospital", "telecom": [ { "system": "phone", "value": "9786870156" } ], "address": { "line": [ "70 EAST STREET" ], "city": "METHUEN", "state": "MA", "postalCode": "01844", "country": "US" }, "managingOrganization": { "reference": "Organization/holy-healthcare", "display": "Holy Healthcare" }}
|
@@ -133,6 +133,176 @@
|
|
133
133
|
}
|
134
134
|
]
|
135
135
|
},
|
136
|
+
{
|
137
|
+
"name": "udsData",
|
138
|
+
"part": [
|
139
|
+
{
|
140
|
+
"name": "type",
|
141
|
+
"valueCode": "AdverseEvent"
|
142
|
+
},
|
143
|
+
{
|
144
|
+
"name": "url",
|
145
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/adverse_event"
|
146
|
+
},
|
147
|
+
{
|
148
|
+
"name": "expirationTime",
|
149
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
150
|
+
}
|
151
|
+
]
|
152
|
+
},
|
153
|
+
{
|
154
|
+
"name": "udsData",
|
155
|
+
"part": [
|
156
|
+
{
|
157
|
+
"name": "type",
|
158
|
+
"valueCode": "AllergyIntolerance"
|
159
|
+
},
|
160
|
+
{
|
161
|
+
"name": "url",
|
162
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/allergy_intollerance"
|
163
|
+
},
|
164
|
+
{
|
165
|
+
"name": "expirationTime",
|
166
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
167
|
+
}
|
168
|
+
]
|
169
|
+
},
|
170
|
+
{
|
171
|
+
"name": "udsData",
|
172
|
+
"part": [
|
173
|
+
{
|
174
|
+
"name": "type",
|
175
|
+
"valueCode": "Coverage"
|
176
|
+
},
|
177
|
+
{
|
178
|
+
"name": "url",
|
179
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/coverage"
|
180
|
+
},
|
181
|
+
{
|
182
|
+
"name": "expirationTime",
|
183
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
184
|
+
}
|
185
|
+
]
|
186
|
+
},
|
187
|
+
{
|
188
|
+
"name": "udsData",
|
189
|
+
"part": [
|
190
|
+
{
|
191
|
+
"name": "type",
|
192
|
+
"valueCode": "Immunization"
|
193
|
+
},
|
194
|
+
{
|
195
|
+
"name": "url",
|
196
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/immunization"
|
197
|
+
},
|
198
|
+
{
|
199
|
+
"name": "expirationTime",
|
200
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
201
|
+
}
|
202
|
+
]
|
203
|
+
},
|
204
|
+
{
|
205
|
+
"name": "udsData",
|
206
|
+
"part": [
|
207
|
+
{
|
208
|
+
"name": "type",
|
209
|
+
"valueCode": "MedicationRequest"
|
210
|
+
},
|
211
|
+
{
|
212
|
+
"name": "url",
|
213
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/medication_request"
|
214
|
+
},
|
215
|
+
{
|
216
|
+
"name": "expirationTime",
|
217
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
218
|
+
}
|
219
|
+
]
|
220
|
+
},
|
221
|
+
{
|
222
|
+
"name": "udsData",
|
223
|
+
"part": [
|
224
|
+
{
|
225
|
+
"name": "type",
|
226
|
+
"valueCode": "MedicationStatement"
|
227
|
+
},
|
228
|
+
{
|
229
|
+
"name": "url",
|
230
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/medication_statement"
|
231
|
+
},
|
232
|
+
{
|
233
|
+
"name": "expirationTime",
|
234
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
235
|
+
}
|
236
|
+
]
|
237
|
+
},
|
238
|
+
{
|
239
|
+
"name": "udsData",
|
240
|
+
"part": [
|
241
|
+
{
|
242
|
+
"name": "type",
|
243
|
+
"valueCode": "Procedure"
|
244
|
+
},
|
245
|
+
{
|
246
|
+
"name": "url",
|
247
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/procedure"
|
248
|
+
},
|
249
|
+
{
|
250
|
+
"name": "expirationTime",
|
251
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
252
|
+
}
|
253
|
+
]
|
254
|
+
},
|
255
|
+
{
|
256
|
+
"name": "udsData",
|
257
|
+
"part": [
|
258
|
+
{
|
259
|
+
"name": "type",
|
260
|
+
"valueCode": "RelatedPerson"
|
261
|
+
},
|
262
|
+
{
|
263
|
+
"name": "url",
|
264
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/related_person"
|
265
|
+
},
|
266
|
+
{
|
267
|
+
"name": "expirationTime",
|
268
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
269
|
+
}
|
270
|
+
]
|
271
|
+
},
|
272
|
+
{
|
273
|
+
"name": "udsData",
|
274
|
+
"part": [
|
275
|
+
{
|
276
|
+
"name": "type",
|
277
|
+
"valueCode": "Parameters"
|
278
|
+
},
|
279
|
+
{
|
280
|
+
"name": "url",
|
281
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/reporting_parameters"
|
282
|
+
},
|
283
|
+
{
|
284
|
+
"name": "expirationTime",
|
285
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
286
|
+
}
|
287
|
+
]
|
288
|
+
},
|
289
|
+
{
|
290
|
+
"name": "udsData",
|
291
|
+
"part": [
|
292
|
+
{
|
293
|
+
"name": "type",
|
294
|
+
"valueCode": "ServiceRequest"
|
295
|
+
},
|
296
|
+
{
|
297
|
+
"name": "url",
|
298
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/service_request"
|
299
|
+
},
|
300
|
+
{
|
301
|
+
"name": "expirationTime",
|
302
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
303
|
+
}
|
304
|
+
]
|
305
|
+
},
|
136
306
|
{
|
137
307
|
"name": "udsData",
|
138
308
|
"part": [
|
@@ -149,6 +319,40 @@
|
|
149
319
|
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
150
320
|
}
|
151
321
|
]
|
322
|
+
},
|
323
|
+
{
|
324
|
+
"name": "udsData",
|
325
|
+
"part": [
|
326
|
+
{
|
327
|
+
"name": "type",
|
328
|
+
"valueCode": "Parameters"
|
329
|
+
},
|
330
|
+
{
|
331
|
+
"name": "url",
|
332
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/data_urls"
|
333
|
+
},
|
334
|
+
{
|
335
|
+
"name": "expirationTime",
|
336
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
337
|
+
}
|
338
|
+
]
|
339
|
+
},
|
340
|
+
{
|
341
|
+
"name": "udsData",
|
342
|
+
"part": [
|
343
|
+
{
|
344
|
+
"name": "type",
|
345
|
+
"valueCode": "Location"
|
346
|
+
},
|
347
|
+
{
|
348
|
+
"name": "url",
|
349
|
+
"valueUrl": "http://localhost:4567/custom/uds_plus/examples/location"
|
350
|
+
},
|
351
|
+
{
|
352
|
+
"name": "expirationTime",
|
353
|
+
"valueDateTime": "2022-12-14T07:15:07-08:00"
|
354
|
+
}
|
355
|
+
]
|
152
356
|
}
|
153
357
|
]
|
154
358
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"MedicationRequest","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-medicationrequest"]},"status":"active","intent":"order","medicationCodeableConcept":{"coding":[{"system":"http://www.nlm.nih.gov/research/umls/rxnorm","code":"476872","display":"Nizatidine 15 MG/ML Oral Solution"}]},"subject":{"reference":"Patient/de-identified-example"},"encounter":{"reference":"Encounter/de-identified-example"},"authoredOn":"2008","requester":{"reference":"Practitioner/example"},"dosageInstruction":[{"text":"10 mL bid","timing":{"repeat":{"boundsPeriod":{"start":"2008-04-05"},"frequency":2,"period":1,"periodUnit":"d"}},"doseAndRate":[{"doseQuantity":{"value":10,"unit":"ml","system":"http://unitsofmeasure.org","code":"mL"}}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"MedicationStatement","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-medicationstatement"]},"status":"active","medicationCodeableConcept":{"coding":[{"system":"http://www.nlm.nih.gov/research/umls/rxnorm","code":"476872","display":"Nizatidine 15 MG/ML Oral Solution"}]},"subject":{"reference":"Patient/de-identified-example"},"effectiveDateTime":"2008","dateAsserted":"2008","dosage":[{"text":"10 mL bid","timing":{"repeat":{"boundsPeriod":{"start":"2008-04-05"},"frequency":2,"period":1,"periodUnit":"d"}},"doseAndRate":[{"doseQuantity":{"value":10,"unit":"ml","system":"http://unitsofmeasure.org","code":"mL"}}]}]}
|
@@ -1,4 +1,6 @@
|
|
1
|
-
{
|
2
|
-
{
|
3
|
-
{
|
4
|
-
{
|
1
|
+
{"resourceType":"Observation","id":"de-identified-income-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-income-observation"]},"status":"final","code":{"coding":[{"system":"http://loinc.org","code":"63058-2"}]},"subject":{"reference":"Patient/de-identified-example"},"effectiveDateTime":"2016","valueRange":{"low":{"value":101},"high":{"value":150}}}
|
2
|
+
{"resourceType":"Observation","id":"de-identified-income-with-quantity-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-income-observation"]},"status":"final","code":{"coding":[{"system":"http://loinc.org","code":"63058-2"}]},"subject":{"reference":"Patient/de-identified-example"},"effectiveDateTime":"2018","valueQuantity":{"value":200,"comparator":">","unit":"percent","system":"http://unitsofmeasure.org","code":"%"}}
|
3
|
+
{"resourceType":"Observation","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-lab-observation"]},"extension":[{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-deidentified-instant-extension","valueDateTime":"2005"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"laboratory","display":"Laboratory"}]}],"code":{"coding":[{"system":"http://loinc.org","code":"718-7","display":"Hemoglobin [Mass/volume] in Blood"}]},"subject":{"reference":"Patient/de-identified-example"},"encounter":{"reference":"Encounter/de-identified-example"},"effectiveDateTime":"2005","performer":[{"reference":"Practitioner/example"}],"valueQuantity":{"value":17,"unit":"g/dL","system":"http://unitsofmeasure.org"},"bodySite":{"coding":[{"system":"http://snomed.info/sct","code":"368208006","display":"Left upper arm structure"}]}}
|
4
|
+
{"resourceType":"Observation","id":"de-identified-sexual-orientation-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-sexual-orientation-observation"]},"status":"final","code":{"coding":[{"system":"http://loinc.org","code":"76690-7"}]},"subject":{"reference":"Patient/example"},"effectiveDateTime":"2007","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-NullFlavor","code":"NASK","display":"not asked"}]}}
|
5
|
+
{"resourceType":"Observation","id":"clinical-result-de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-clinical-result-observation"]},"extension":[{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-deidentified-instant-extension","valueDateTime":"2005"}],"status":"final","category":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/observation-category","code":"imaging","display":"Imaging"}]}],"code":{"coding":[{"system":"http://loinc.org","code":"80940-0","display":"DXA Femur-L Z-score BMD"}]},"subject":{"reference":"Patient/de-identified-example"},"encounter":{"reference":"Encounter/de-identified-example"},"effectivePeriod":{"end":"2005"},"performer":[{"reference":"Practitioner/example"}],"valueQuantity":{"value":0.05,"unit":"Z-Score","system":"http://unitsofmeasure.org","code":"{Z-Score}"}}
|
6
|
+
{ "resourceType": "Observation", "id": "generic-observation-de-identified-example", "meta": { "profile": [ "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-observation" ] }, "extension": [ { "url": "http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-deidentified-instant-extension", "valueDateTime": "2005" } ], "status": "final", "category": [ { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "social-history", "display": "Social History" } ] } ], "code": { "coding": [ { "system": "http://snomed.info/sct", "code": "160695008", "display": "Transport too expensive" } ] }, "subject": { "reference": "Patient/de-identified-example" }, "effectiveDateTime": "2021", "valueBoolean": true}
|
@@ -1,2 +1,3 @@
|
|
1
|
-
{
|
2
|
-
{
|
1
|
+
{"resourceType":"Patient","id":"de-identified-smallpop-example","meta":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/instance-name","valueString":"De-identified Patient Example"},{"url":"http://hl7.org/fhir/StructureDefinition/instance-description","valueMarkdown":"This is a patient example for the *UDS+ Patient Profile*."}],"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-patient"]},"extension":[{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2106-3","display":"White"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2108-9","display":"European"}},{"url":"text","valueString":"White"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race"},{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2135-2","display":"Hispanic or Latino"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2184-0","display":"Dominican"}},{"url":"text","valueString":"Hispanic or Latino"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-birthsex-extension","valueCode":"F"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-age-extension","valueQuantity":{"value":90,"comparator":">=","unit":"yr","system":"http://unitsofmeasure.org","code":"a"}},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-gender-identity-extension","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-NullFlavor","code":"NASK","display":"Not Asked"}],"text":"Not Asked"}}],"active":true,"gender":"female","address":[{"postalCode":"00000","_postalCode":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"masked"}]}}]}
|
2
|
+
{"resourceType":"Patient","id":"de-identified-example","meta":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/instance-name","valueString":"De-identified Patient Example"},{"url":"http://hl7.org/fhir/StructureDefinition/instance-description","valueMarkdown":"This is a patient example for the *UDS+ Patient Profile*."}],"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-patient"]},"extension":[{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2106-3","display":"White"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2108-9","display":"European"}},{"url":"text","valueString":"White"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race"},{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2135-2","display":"Hispanic or Latino"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2184-0","display":"Dominican"}},{"url":"text","valueString":"Hispanic or Latino"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-birthsex-extension","valueCode":"F"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-age-extension","valueQuantity":{"value":70,"unit":"yr","system":"http://unitsofmeasure.org","code":"a"}},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-gender-identity-extension","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-NullFlavor","code":"ASKU","display":"asked but unknown"}],"text":"asked but unknown"}},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/udsplus-agriculture-worker-status","valueCode":"migratory"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-housing-status-extension","valueCode":"permanent-supportive-housing"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-veteran-status-extension","valueBoolean":false}],"active":true,"gender":"female","address":[{"postalCode":"03600"}]}
|
3
|
+
{"resourceType":"Patient","id":"de-identified-age89-example","meta":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/instance-name","valueString":"De-identified Patient Example"},{"url":"http://hl7.org/fhir/StructureDefinition/instance-description","valueMarkdown":"This is a patient example for the *UDS+ Patient Profile*."}],"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-patient"]},"extension":[{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2106-3","display":"White"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2108-9","display":"European"}},{"url":"text","valueString":"White"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race"},{"extension":[{"url":"ombCategory","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2135-2","display":"Hispanic or Latino"}},{"url":"detailed","valueCoding":{"system":"urn:oid:2.16.840.1.113883.6.238","code":"2184-0","display":"Dominican"}},{"url":"text","valueString":"Hispanic or Latino"}],"url":"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-birthsex-extension","valueCode":"F"},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-age-extension","valueQuantity":{"value":90,"comparator":">=","unit":"yr","system":"http://unitsofmeasure.org","code":"a"}},{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-gender-identity-extension","valueCodeableConcept":{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-NullFlavor","code":"NASK","display":"Not Asked"}],"text":"Not Asked"}}],"active":true,"gender":"female","address":[{"postalCode":"00000","_postalCode":{"extension":[{"url":"http://hl7.org/fhir/StructureDefinition/data-absent-reason","valueCode":"masked"}]}}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"Procedure","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-procedure"]},"extension":[{"url":"http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-recordedDate-extension","valueDateTime":"2005"}],"status":"completed","code":{"coding":[{"system":"http://snomed.info/sct","code":"48387007","display":"Tracheotomy"}]},"subject":{"reference":"Patient/de-identified-example"},"encounter":{"reference":"Encounter/de-identified-example"},"performedDateTime":"2005","performer":[{"actor":{"reference":"Practitioner/example"}}],"bodySite":[{"coding":[{"system":"http://snomed.info/sct","code":"44567001","display":"Tracheal structure"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"RelatedPerson","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/de-identified-uds-plus-relatedperson"]},"patient":{"reference":"Patient/de-identified-example"},"relationship":[{"coding":[{"system":"http://terminology.hl7.org/CodeSystem/v3-RoleCode","code":"FAMMEMB","display":"family member"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"Parameters","id":"reporting-parameters-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-patient-reporting-parameters"]},"parameter":[{"name":"patientReference","valueReference":{"reference":"Patient/de-identified-example"}},{"name":"combinedFundingStreams","valueString":"CHC,MHC"},{"name":"reportNames","part":[{"name":"patientsByZip","valueBoolean":true},{"name":"table3A","valueBoolean":true},{"name":"table3B","valueBoolean":true},{"name":"table4","valueBoolean":true},{"name":"table6A","valueBoolean":true},{"name":"table6B-Line1-6-Age-Of-Prenatal-Care-Patients","valueBoolean":false},{"name":"table6B-Line7-9-Early-Entry-Into-Prenatal-Care","valueBoolean":true},{"name":"table6B-Line10-Childhood-Immunization-Status-CMS117","valueBoolean":true},{"name":"table6B-Line11-Cervical-Cancer-Screening-CMS124","valueBoolean":true},{"name":"table6B-Line11a-Breast-Cancer-Screening-CMS125","valueBoolean":true},{"name":"table6B-Line12-Weight-Assessment-And-Counselling-CMS155","valueBoolean":true},{"name":"table6B-Line13-Preventive-Care-And-Screening-BMI-CMS69","valueBoolean":true},{"name":"table6B-Line14a-Preventive-Care-And-Screening-Tobacco-Use-CMS138","valueBoolean":true},{"name":"table6B-Line17a-Statin-Therapy-CMS347","valueBoolean":true},{"name":"table6B-Line18-Ischmic-Vascular-Disease-CMS164","valueBoolean":true},{"name":"table6B-Line19-Colorectal-Cancer-Screening-CMS130","valueBoolean":true},{"name":"table6B-Line20-HIV-Linkage-To-Care","valueBoolean":true},{"name":"table6B-Line20a-HIV-Screening-CMS349","valueBoolean":true},{"name":"table6B-Line21-Preventive-Care-And-Screening-For-Depression-CMS2","valueBoolean":true},{"name":"table6B-Line21a-Depression-Remission-At-Twelve-Months-CMS159","valueBoolean":true},{"name":"table6B-Line22-Dental-Sealants-For-Children-CMS277","valueBoolean":true},{"name":"table7-Line0-HIV-Positive-Pregnant-Patients","valueBoolean":true},{"name":"table7-Line2-Deliveries-Performed-By-Health-Center","valueBoolean":true},{"name":"table7-Line1a-d-Prenatal-Care-Patient-Deliveries","valueBoolean":true},{"name":"table7-Line2a-c-Controlling-High-Blood-Pressure-CMS165","valueBoolean":true},{"name":"table7-Line3a-f-HbA1c-Poor-Control-CMS122","valueBoolean":true}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"resourceType":"ServiceRequest","id":"de-identified-example","meta":{"profile":["http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-servicerequest"]},"status":"completed","intent":"order","doNotPerform":false,"code":{"coding":[{"system":"http://snomed.info/sct","code":"76164006","display":"Biopsy of colon (procedure)"}]},"subject":{"reference":"Patient/de-identified-example"},"encounter":{"reference":"Encounter/de-identified-example"},"authoredOn":"2017","requester":{"reference":"Practitioner/example"},"bodySite":[{"coding":[{"system":"http://snomed.info/sct","code":"485005","display":"Transverse colon structure"}]}]}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module UDSPlusTestKit
|
4
|
+
class ReadObservationTest < Inferno::Test
|
5
|
+
id :uds_plus_read_observation_test
|
6
|
+
title 'Receive UDS+ Observation Data'
|
7
|
+
description %(
|
8
|
+
Test takes from the user either: the http location of observation data
|
9
|
+
(not including UDS+ specialized observation resources) or the raw JSON of the data itself.
|
10
|
+
It attempts to GET the data stored at the given location if a link is provided,
|
11
|
+
then validates whether a FHIR resource can be generated from the input data.
|
12
|
+
)
|
13
|
+
|
14
|
+
input :observation_data,
|
15
|
+
title: 'UDS+ Observation Data',
|
16
|
+
optional: true,
|
17
|
+
description: %q(
|
18
|
+
User can input the data as:
|
19
|
+
a URL link to the location of the data (ex: http://www.example.com/observation.json)
|
20
|
+
OR a JSON string that composes the data. Leaving this blank will skip the test.
|
21
|
+
)
|
22
|
+
|
23
|
+
def data_scratch
|
24
|
+
scratch[:data_resources] ||= {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def data_to_test
|
28
|
+
data_scratch['Observation'] ||= []
|
29
|
+
end
|
30
|
+
|
31
|
+
run do
|
32
|
+
omit_if !observation_data.present?, "No data provided; skipping test."
|
33
|
+
|
34
|
+
# if the input is a url, else it is a json
|
35
|
+
if observation_data.strip[0] != '{'
|
36
|
+
assert_valid_http_uri(observation_data, "Location provided is not a valid http uri.")
|
37
|
+
get observation_data
|
38
|
+
assert_response_status(200)
|
39
|
+
assert_valid_json(request.response_body, "Data received from request is not a valid JSON")
|
40
|
+
data = request.response_body
|
41
|
+
else
|
42
|
+
assert_valid_json(observation_data, "JSON inputted was not in a valid format")
|
43
|
+
data = observation_data
|
44
|
+
end
|
45
|
+
|
46
|
+
resource = FHIR::Json.from_json(data)
|
47
|
+
assert resource.is_a?(FHIR::Model), "Could not generate a valid resource from the input provided"
|
48
|
+
|
49
|
+
if resource.is_a?(FHIR::Model)
|
50
|
+
data_to_test << resource
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -15,6 +15,8 @@ require_relative '../validate_procedure_test'
|
|
15
15
|
require_relative '../validate_sexual_orientation_test'
|
16
16
|
require_relative './read_manifest_ind_test'
|
17
17
|
require_relative '../manifest_tests/validate_manifest_test'
|
18
|
+
require_relative './read_observation_test'
|
19
|
+
require_relative '../validate_observation_test'
|
18
20
|
require_relative './read_special_observation_test'
|
19
21
|
require_relative '../validate_special_observation_test'
|
20
22
|
require_relative './read_related_person_test'
|
@@ -87,6 +89,8 @@ module UDSPlusTestKit
|
|
87
89
|
test from: :uds_plus_validate_lab_test
|
88
90
|
test from: :uds_plus_read_clinical_result_test
|
89
91
|
test from: :uds_plus_validate_clinical_result_test
|
92
|
+
test from: :uds_plus_read_observation_test
|
93
|
+
test from: :uds_plus_validate_observation_test
|
90
94
|
test from: :uds_plus_read_special_observation_test
|
91
95
|
test from: :uds_plus_validate_special_observation_test
|
92
96
|
test from: :uds_plus_read_medication_request_test
|
@@ -37,12 +37,16 @@ module UDSPlusTestKit
|
|
37
37
|
|
38
38
|
profile_name = "NO NAME"
|
39
39
|
profile_url = "NO URL"
|
40
|
+
bearer_token = "NO BEARER"
|
41
|
+
|
40
42
|
source['part'].each do |container|
|
41
43
|
case container['name']
|
42
44
|
when 'type'
|
43
45
|
profile_name = container['valueCode']
|
44
46
|
when 'url'
|
45
47
|
profile_url = container['valueUrl']
|
48
|
+
when 'bearer'
|
49
|
+
bearer_token = container['valueString']
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
@@ -55,8 +59,15 @@ module UDSPlusTestKit
|
|
55
59
|
|
56
60
|
invalid_uri_message = "Invalid URL provided for type #{profile_name}"
|
57
61
|
assert_valid_http_uri(profile_url, invalid_uri_message)
|
58
|
-
|
59
|
-
|
62
|
+
|
63
|
+
oauth2_headers={}
|
64
|
+
if bearer_token != "NO BEARER"
|
65
|
+
oauth2_headers={
|
66
|
+
'Authorization' => "Bearer #{bearer_token}"
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
get(profile_url, headers: oauth2_headers)
|
60
71
|
assert_response_status(200)
|
61
72
|
|
62
73
|
request.response_body.each_line do |json_body|
|
@@ -72,4 +83,4 @@ module UDSPlusTestKit
|
|
72
83
|
end
|
73
84
|
end
|
74
85
|
end
|
75
|
-
end
|
86
|
+
end
|
@@ -10,6 +10,7 @@ require_relative './validate_manifest_test'
|
|
10
10
|
require_relative '../validate_patient_test'
|
11
11
|
require_relative '../validate_procedure_test'
|
12
12
|
require_relative '../validate_sexual_orientation_test'
|
13
|
+
require_relative '../validate_observation_test'
|
13
14
|
require_relative '../validate_special_observation_test'
|
14
15
|
require_relative '../validate_related_person_test'
|
15
16
|
require_relative '../validate_immunization_test'
|
@@ -54,6 +55,7 @@ module UDSPlusTestKit
|
|
54
55
|
test from: :uds_plus_validate_sexual_orientation_test
|
55
56
|
test from: :uds_plus_validate_lab_test
|
56
57
|
test from: :uds_plus_validate_clinical_result_test
|
58
|
+
test from: :uds_plus_validate_observation_test
|
57
59
|
test from: :uds_plus_validate_special_observation_test
|
58
60
|
test from: :uds_plus_validate_medication_request_test
|
59
61
|
test from: :uds_plus_validate_medication_statement_test
|
@@ -15,6 +15,7 @@ require_relative '../validate_income_test'
|
|
15
15
|
require_relative '../validate_patient_test'
|
16
16
|
require_relative '../validate_procedure_test'
|
17
17
|
require_relative '../validate_sexual_orientation_test'
|
18
|
+
require_relative '../validate_observation_test'
|
18
19
|
require_relative '../validate_special_observation_test'
|
19
20
|
require_relative '../validate_related_person_test'
|
20
21
|
require_relative '../validate_immunization_test'
|
@@ -60,6 +61,7 @@ module UDSPlusTestKit
|
|
60
61
|
test from: :uds_plus_validate_sexual_orientation_test
|
61
62
|
test from: :uds_plus_validate_lab_test
|
62
63
|
test from: :uds_plus_validate_clinical_result_test
|
64
|
+
test from: :uds_plus_validate_observation_test
|
63
65
|
test from: :uds_plus_validate_special_observation_test
|
64
66
|
test from: :uds_plus_validate_medication_request_test
|
65
67
|
test from: :uds_plus_validate_medication_statement_test
|
@@ -9,7 +9,7 @@ module UDSPlusTestKit
|
|
9
9
|
title 'UDS+ Test Kit'
|
10
10
|
description %(
|
11
11
|
The UDS+ Test Kit tests systems for their conformance to the [UDS+
|
12
|
-
Implementation Guide v1.0
|
12
|
+
Implementation Guide v1.1.0](https://fhir.org/guides/hrsa/uds-plus/index.html).
|
13
13
|
The included tests function as a rudimentary data receiver. This receiver will
|
14
14
|
take a provided Import Manifest, either as an HTTP location or as a raw json,
|
15
15
|
and validate its contents. This includes validating the structure of the manifest,
|
@@ -18,11 +18,13 @@ module UDSPlusTestKit
|
|
18
18
|
|
19
19
|
version VERSION
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
fhir_resource_validator do
|
22
|
+
# The home-lab-report contains validation tools for certain codes missing in the UDS+ package
|
23
|
+
igs('fhir.hrsa.uds-plus#1.1.0', 'hl7.fhir.us.home-lab-report#1.0.0')
|
23
24
|
|
24
25
|
# Messages will be excluded if the block evaluates to a truthy value
|
25
26
|
exclude_message do |message|
|
27
|
+
message.message.match?(/\A\S+: \S+: URL value '.*' does not resolve/) ||
|
26
28
|
(message.type == 'warning' &&
|
27
29
|
message.message.match?(/Global Profile reference .* could not be resolved, so has not been checked/)) ||
|
28
30
|
(message.type == 'error' &&
|
@@ -66,6 +68,54 @@ module UDSPlusTestKit
|
|
66
68
|
observation_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [observation_ex]] }
|
67
69
|
route(:get, "/examples/observation", observation_ex_route_handler)
|
68
70
|
|
71
|
+
adverse_event_ex = File.read(File.join(__dir__, 'examples/adverse_event.ndjson'))
|
72
|
+
adverse_event_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [adverse_event_ex]] }
|
73
|
+
route(:get, "/examples/adverse_event", adverse_event_ex_route_handler)
|
74
|
+
|
75
|
+
allergy_intollerance_ex = File.read(File.join(__dir__, 'examples/allergy_intollerance.ndjson'))
|
76
|
+
allergy_intollerance_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [allergy_intollerance_ex]] }
|
77
|
+
route(:get, "/examples/allergy_intollerance", allergy_intollerance_ex_route_handler)
|
78
|
+
|
79
|
+
coverage_ex = File.read(File.join(__dir__, 'examples/coverage.ndjson'))
|
80
|
+
coverage_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [coverage_ex]] }
|
81
|
+
route(:get, "/examples/coverage", coverage_ex_route_handler)
|
82
|
+
|
83
|
+
immunization_ex = File.read(File.join(__dir__, 'examples/immunization.ndjson'))
|
84
|
+
immunization_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [immunization_ex]] }
|
85
|
+
route(:get, "/examples/immunization", immunization_ex_route_handler)
|
86
|
+
|
87
|
+
medication_request_ex = File.read(File.join(__dir__, 'examples/medication_request.ndjson'))
|
88
|
+
medication_request_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [medication_request_ex]] }
|
89
|
+
route(:get, "/examples/medication_request", medication_request_ex_route_handler)
|
90
|
+
|
91
|
+
medication_statement_ex = File.read(File.join(__dir__, 'examples/medication_statement.ndjson'))
|
92
|
+
medication_statement_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [medication_statement_ex]] }
|
93
|
+
route(:get, "/examples/medication_statement", medication_statement_ex_route_handler)
|
94
|
+
|
95
|
+
procedure_ex = File.read(File.join(__dir__, 'examples/procedure.ndjson'))
|
96
|
+
procedure_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [procedure_ex]] }
|
97
|
+
route(:get, "/examples/procedure", procedure_ex_route_handler)
|
98
|
+
|
99
|
+
related_person_ex = File.read(File.join(__dir__, 'examples/related_person.ndjson'))
|
100
|
+
related_person_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [related_person_ex]] }
|
101
|
+
route(:get, "/examples/related_person", related_person_ex_route_handler)
|
102
|
+
|
103
|
+
reporting_parameters_ex = File.read(File.join(__dir__, 'examples/reporting_parameters.ndjson'))
|
104
|
+
reporting_parameters_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [reporting_parameters_ex]] }
|
105
|
+
route(:get, "/examples/reporting_parameters", reporting_parameters_ex_route_handler)
|
106
|
+
|
107
|
+
service_request_ex = File.read(File.join(__dir__, 'examples/service_request.ndjson'))
|
108
|
+
service_request_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [service_request_ex]] }
|
109
|
+
route(:get, "/examples/service_request", service_request_ex_route_handler)
|
110
|
+
|
111
|
+
data_urls_ex = File.read(File.join(__dir__, 'examples/data_urls.ndjson'))
|
112
|
+
data_urls_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [data_urls_ex]] }
|
113
|
+
route(:get, "/examples/data_urls", data_urls_ex_route_handler)
|
114
|
+
|
115
|
+
location_ex = File.read(File.join(__dir__, 'examples/location.ndjson'))
|
116
|
+
location_ex_route_handler = proc { [200, { 'Content-Type' => 'application/ndjson' }, [location_ex]] }
|
117
|
+
route(:get, "/examples/location", location_ex_route_handler)
|
118
|
+
|
69
119
|
# Receive Manifest via POST set-up
|
70
120
|
resume_test_route :post, '/postHere' do |request|
|
71
121
|
request.query_parameters["id"]
|
@@ -81,8 +131,8 @@ module UDSPlusTestKit
|
|
81
131
|
url: 'https://github.com/inferno-framework/uds-plus-test-kit/'
|
82
132
|
},
|
83
133
|
{
|
84
|
-
label: 'UDS+ Implementation Guide v1.0
|
85
|
-
url: 'https://fhir.org/guides/hrsa/uds-plus/'
|
134
|
+
label: 'UDS+ Implementation Guide v1.1.0',
|
135
|
+
url: 'https://fhir.org/guides/hrsa/uds-plus/index.html'
|
86
136
|
}
|
87
137
|
]
|
88
138
|
|
@@ -31,7 +31,7 @@ module UDSPlusTestKit
|
|
31
31
|
not exist in this resource, or its contents do not point to a valid
|
32
32
|
location for type Observation. **NOTE:**
|
33
33
|
If this error occurs, it can trigger a fail for all observation-type tests,
|
34
|
-
regardless of whether
|
34
|
+
regardless of whether all such tests were meant to run.)
|
35
35
|
|
36
36
|
data_to_test.each do |resource|
|
37
37
|
# All these assertions are to differentiate Observation data between orientation types.
|
@@ -31,7 +31,7 @@ module UDSPlusTestKit
|
|
31
31
|
not exist in this resource, or its contents do not point to a valid
|
32
32
|
location for type Observation. **NOTE:**
|
33
33
|
If this error occurs, it can trigger a fail for all observation-type tests,
|
34
|
-
regardless of whether
|
34
|
+
regardless of whether all such tests were meant to run.)
|
35
35
|
|
36
36
|
data_to_test.each do |resource|
|
37
37
|
# All these assertions are to differentiate Observation data between orientation types.
|
@@ -31,11 +31,11 @@ module UDSPlusTestKit
|
|
31
31
|
not exist in this resource, or its contents do not point to a valid
|
32
32
|
location for type Observation. **NOTE:**
|
33
33
|
If this error occurs, it can trigger a fail for all observation-type tests,
|
34
|
-
regardless of whether
|
34
|
+
regardless of whether all such tests were meant to run.)
|
35
35
|
|
36
36
|
data_to_test.each do |resource|
|
37
|
-
# All these assertions are to differentiate Observation data between
|
38
|
-
# A resource is skipped if it
|
37
|
+
# All these assertions are to differentiate Observation data between orientation types.
|
38
|
+
# A resource is skipped if it cannot be identified as lab obsevation resource.
|
39
39
|
type_identifier = resource.to_hash
|
40
40
|
assert type_identifier['meta'].present?, identifier_fail_message
|
41
41
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './version'
|
3
|
+
|
4
|
+
module UDSPlusTestKit
|
5
|
+
class ValidateObservationTest < Inferno::Test
|
6
|
+
id :uds_plus_validate_observation_test
|
7
|
+
title 'Validate UDS+ Observation Data'
|
8
|
+
description %(
|
9
|
+
Test takes the Observation resources identified
|
10
|
+
by the import manifest, and validates whether they conform
|
11
|
+
to their UDS+ Structure Definitions (not including UDS+ specialized observation resources).
|
12
|
+
)
|
13
|
+
|
14
|
+
def data_scratch
|
15
|
+
scratch[:data_resources] ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def data_to_test
|
19
|
+
data_scratch['Observation'] ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
run do
|
23
|
+
omit_if data_to_test.empty?, "No data of this type was identified."
|
24
|
+
|
25
|
+
profile_definition = 'http://fhir.org/guides/hrsa/uds-plus/StructureDefinition/uds-plus-observation'
|
26
|
+
profile_with_version = "#{profile_definition}|#{UDS_PLUS_VERSION}"
|
27
|
+
|
28
|
+
no_resource_of_this_type = true
|
29
|
+
identifier_fail_message = %(Resource.meta.profile should contain the HTTP location of the
|
30
|
+
resource's Structure Definition. Resource.meta.profile either does
|
31
|
+
not exist in this resource, or its contents do not point to a valid
|
32
|
+
location for type Observation. **NOTE:**
|
33
|
+
If this error occurs, it can trigger a fail for all observation-type tests,
|
34
|
+
regardless of whether all such tests were meant to run.)
|
35
|
+
|
36
|
+
data_to_test.each do |resource|
|
37
|
+
# All these assertions are to differentiate Observation data between orientation types.
|
38
|
+
# A resource is skipped if it cannot be identified as a general observation resource.
|
39
|
+
type_identifier = resource.to_hash
|
40
|
+
assert type_identifier['meta'].present?, identifier_fail_message
|
41
|
+
|
42
|
+
type_identifier = type_identifier['meta']
|
43
|
+
assert type_identifier.is_a?(Hash), identifier_fail_message
|
44
|
+
assert type_identifier['profile'].present?, identifier_fail_message
|
45
|
+
|
46
|
+
type_identifier = type_identifier['profile']
|
47
|
+
assert type_identifier.is_a?(Array), identifier_fail_message
|
48
|
+
assert !type_identifier.empty?, identifier_fail_message
|
49
|
+
|
50
|
+
|
51
|
+
type_identifier = type_identifier.first
|
52
|
+
assert type_identifier.is_a?(String), identifier_fail_message
|
53
|
+
if !type_identifier.include?("uds-plus-observation")
|
54
|
+
next
|
55
|
+
end
|
56
|
+
|
57
|
+
no_resource_of_this_type = false
|
58
|
+
|
59
|
+
assert_valid_resource(resource: resource, profile_url: profile_with_version)
|
60
|
+
end
|
61
|
+
|
62
|
+
omit_if no_resource_of_this_type, "No data of this type was identified."
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -31,7 +31,7 @@ module UDSPlusTestKit
|
|
31
31
|
not exist in this resource, or its contents do not point to a valid
|
32
32
|
location for type Observation. **NOTE:**
|
33
33
|
If this error occurs, it can trigger a fail for all observation-type tests,
|
34
|
-
regardless of whether
|
34
|
+
regardless of whether all such tests were meant to run.)
|
35
35
|
|
36
36
|
data_to_test.each do |resource|
|
37
37
|
# All these assertions are to differentiate Observation data between orientation types.
|
@@ -29,7 +29,7 @@ module UDSPlusTestKit
|
|
29
29
|
not exist in this resource, or its contents do not point to a valid
|
30
30
|
location for type Observation. **NOTE:**
|
31
31
|
If this error occurs, it can trigger a fail for all observation-type tests,
|
32
|
-
regardless of whether
|
32
|
+
regardless of whether all such tests were meant to run.)
|
33
33
|
|
34
34
|
data_to_test.each do |resource|
|
35
35
|
# All these assertions are to differentiate Observation data between orientation types.
|
@@ -49,7 +49,7 @@ module UDSPlusTestKit
|
|
49
49
|
type_identifier = type_identifier.first
|
50
50
|
assert type_identifier.is_a?(String), identifier_fail_message
|
51
51
|
|
52
|
-
known_observations = ["income", "sexual-orientation", "-lab-", "clinical-result"]
|
52
|
+
known_observations = ["income", "sexual-orientation", "-lab-", "clinical-result", "uds-plus-observation"]
|
53
53
|
is_known_observation = false
|
54
54
|
known_observations.each do |cur|
|
55
55
|
is_known_observation = (is_known_observation || type_identifier.include?(cur))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uds_plus_test_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leap Orbit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inferno_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.4.
|
19
|
+
version: 0.4.37
|
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.4.
|
26
|
+
version: 0.4.37
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: database_cleaner-sequel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -89,14 +89,26 @@ extra_rdoc_files: []
|
|
89
89
|
files:
|
90
90
|
- LICENSE
|
91
91
|
- lib/uds_plus_test_kit.rb
|
92
|
+
- lib/uds_plus_test_kit/examples/adverse_event.ndjson
|
93
|
+
- lib/uds_plus_test_kit/examples/allergy_intollerance.ndjson
|
92
94
|
- lib/uds_plus_test_kit/examples/condition.ndjson
|
95
|
+
- lib/uds_plus_test_kit/examples/coverage.ndjson
|
96
|
+
- lib/uds_plus_test_kit/examples/data_urls.ndjson
|
93
97
|
- lib/uds_plus_test_kit/examples/encounter.ndjson
|
98
|
+
- lib/uds_plus_test_kit/examples/immunization.ndjson
|
94
99
|
- lib/uds_plus_test_kit/examples/invalid_condition.ndjson
|
95
100
|
- lib/uds_plus_test_kit/examples/invalid_encounter.ndjson
|
96
101
|
- lib/uds_plus_test_kit/examples/invalid_patient.ndjson
|
102
|
+
- lib/uds_plus_test_kit/examples/location.ndjson
|
97
103
|
- lib/uds_plus_test_kit/examples/manifest.json
|
104
|
+
- lib/uds_plus_test_kit/examples/medication_request.ndjson
|
105
|
+
- lib/uds_plus_test_kit/examples/medication_statement.ndjson
|
98
106
|
- lib/uds_plus_test_kit/examples/observation.ndjson
|
99
107
|
- lib/uds_plus_test_kit/examples/patient.ndjson
|
108
|
+
- lib/uds_plus_test_kit/examples/procedure.ndjson
|
109
|
+
- lib/uds_plus_test_kit/examples/related_person.ndjson
|
110
|
+
- lib/uds_plus_test_kit/examples/reporting_parameters.ndjson
|
111
|
+
- lib/uds_plus_test_kit/examples/service_request.ndjson
|
100
112
|
- lib/uds_plus_test_kit/input_resource_tests/read_adverse_event_test.rb
|
101
113
|
- lib/uds_plus_test_kit/input_resource_tests/read_allergy_intolerance_test.rb
|
102
114
|
- lib/uds_plus_test_kit/input_resource_tests/read_clinical_result_test.rb
|
@@ -111,6 +123,7 @@ files:
|
|
111
123
|
- lib/uds_plus_test_kit/input_resource_tests/read_manifest_ind_test.rb
|
112
124
|
- lib/uds_plus_test_kit/input_resource_tests/read_med_request_test.rb
|
113
125
|
- lib/uds_plus_test_kit/input_resource_tests/read_med_statement_test.rb
|
126
|
+
- lib/uds_plus_test_kit/input_resource_tests/read_observation_test.rb
|
114
127
|
- lib/uds_plus_test_kit/input_resource_tests/read_patient_reporting_parameters_test.rb
|
115
128
|
- lib/uds_plus_test_kit/input_resource_tests/read_patient_test.rb
|
116
129
|
- lib/uds_plus_test_kit/input_resource_tests/read_procedure_test.rb
|
@@ -141,6 +154,7 @@ files:
|
|
141
154
|
- lib/uds_plus_test_kit/validate_location_test.rb
|
142
155
|
- lib/uds_plus_test_kit/validate_med_request_test.rb
|
143
156
|
- lib/uds_plus_test_kit/validate_med_statement_test.rb
|
157
|
+
- lib/uds_plus_test_kit/validate_observation_test.rb
|
144
158
|
- lib/uds_plus_test_kit/validate_patient_reporting_parameters_test.rb
|
145
159
|
- lib/uds_plus_test_kit/validate_patient_test.rb
|
146
160
|
- lib/uds_plus_test_kit/validate_procedure_test.rb
|