Stream: Covid-19 Response
Topic: Inferno Testing
Nick Rupley (May 13 2020 at 14:29):
So currently the MeasureReport resources we have loaded in our system are just the ones directly from the examples.json.zip file in the Connectathon track page. Testing our using the Inferno client, I was surprised to see that the resource doesn't pass validation on many different points. Here's the first one I see:
MeasureReport/ExampleNJ-20200411-CDCPatientImpactAndHospitalCapacity: MeasureReport.group[0].code: None of the codes provided are in the value set http://hl7.org/fhir/us/saner/ValueSet/MeasureGroups (http://hl7.org/fhir/us/saner/ValueSet/MeasureGroups, and a code from this value set is required) (codes = http://hl7.org/fhir/us/saner/CodeSystem/GroupSystem#Beds)
But the code in that resource does appear to have the correct code, at least as far as I know:
<group>
<code>
<coding>
<system value="http://hl7.org/fhir/us/saner/CodeSystem/GroupSystem"/>
<code value="Beds"/>
</coding>
</code>
Are the examples from the official track Confluence page no longer valid / out of date? Or am I misunderstanding something?
John Moehrke (May 13 2020 at 14:33):
is that because there is no vocabulary binding in the core spec for MeasureReport? You might need to load the SANER profile on MeasureReport?
Reece Adamson (May 13 2020 at 14:35):
Can you share the inferno link you are using (if you click the "save" button in the top right it will give you a URL you can copy and paste here).
Reece Adamson (May 13 2020 at 14:37):
Looks like the codesystem is wrong and should be:
http://hl7.org/fhir/us/saner/CodeSystem/MeasureGroupSystem
not http://hl7.org/fhir/us/saner/CodeSystem/GroupSystem
.
See http://build.fhir.org/ig/HL7/fhir-saner/ValueSet-MeasureGroups.html
Reece Adamson (May 13 2020 at 14:38):
@Nick Rupley Thanks for bringing these up in chat too! Really helpful for our team to see these examples and find our own bugs.
Nick Rupley (May 13 2020 at 14:40):
Got it! I re-downloaded the examples.json.zip file and the resources have indeed changed since we last downloaded the file.
Reece Adamson (May 13 2020 at 15:16):
Another thing to note is that inferno is currently tuned pretty aggressively when validating resources against the SANER profiles in that it validates all resources returned from every search against it. In reality the link between the restful interface and the profile conformance is weak. A server may rightfully return MeasureReports that do not meet the PublicHealthMeasureReport profile because it also supports other use cases for things like search by date. As a previous chat.fhir discussion touched on, this is a bigger deal for testers than clients. For a tester, unless the resource claims in the meta.profile that it meets the profile, then its pretty much impossible to know if that resource should conform to a specific profile for any restful interaction. We can do, and have done, things that narrow down resources to be validated either on an IG level or a system-under-test level (e.g. all resources with a code = x
SHALL conform to the profile and x
is a parameter that can be provided to inferno).
From a Connectathon perspective it's probably not a huge deal because then you at least see everything. But, I think we might change the configuration to only validate the resource from the input id specified.
John Moehrke (May 13 2020 at 15:19):
Postels Law must prevail
John Moehrke (May 13 2020 at 15:20):
Often in a IG one must carefully explain to data creators that they MUST adhere to the profile; while also warning data consumers that they MUST expect the data to not be conformant.
Michael Donnelly (May 13 2020 at 15:22):
John Moehrke said:
Postels Law must prevail
I think about that at least three times a week.
Michael Donnelly (May 13 2020 at 16:37):
Woot - I just tried this out and passed 2/9 on the first try. :) https://infernotest.healthit.gov/inferno/lpbJEB3sGLP/test_sets/ad_hoc_testing/#MeasureSourcePullServer/ad_hoc_testing_MeasureSourcePullServer_MeasureSourcePullPublicHealthMeasureReportSequence
Michael Donnelly (May 13 2020 at 16:51):
@Reece Adamson I'm failing tests 3, 4, and 5 because we don't let you specify just one of those criteria. How hard is it to add a test that searches by measure and subject and period?
Nick Rupley (May 13 2020 at 17:10):
With the updated resources in our system still getting some validation errors, here's one:
MeasureReport/ExampleNJ-20200415-CDCPatientImpactAndHospitalCapacity: MeasureReport.group[0].population[2]: HasValueOrDataAbsentReason: A population.count must have a value, or .extension.url = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason' [count.exists() or (extension.url = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason')]
In that "ExampleNJ-20200415-CDCPatientImpactAndHospitalCapacity" resource here is group[0].population[2]:
<population>
<code>
<coding>
<system value="http://hl7.org/fhir/us/saner/CodeSystem/MeasurePopulationSystem"/>
<code value="numBedsOcc"/>
</coding>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/measure-population"/>
<code value="measure-population"/>
</coding>
</code>
<count>
<extension url="http://hl7.org/fhir/StructureDefinition/data-absent-reason">
<valueCode value="unsupported"/>
</extension>
</count>
</population>
So it does appear to have a data absent reason, yet it looks like it's still failing validation. Is this an issue on the Inferno side, or is that data absent reason extension not correct?
Reece Adamson (May 13 2020 at 17:10):
@Michael Donnelly Nice! Looks like the validator might have had an issue on our end for SPHMREP-09 that I'll check out (might be an intermittent network issue ¯\_(ツ)_/¯).
Currently the tests represent the requirements in the CapabilityStatements which doesn't include any search parameter combinations.
We can add a search parameter combination test for those 3 though so folks can try out that interaction.
(Assuming you mean something like[base]/MeasureReport/?measure=...&subject=...&period=...
right?). @Chase Zhou is gonna look at this now.
If there's others like this folks are interested let me know! I can also add them as "MAY" requirements to the CapabilityStatement (in a PR) if we think these belong in the IG to at least show developers its an option too if desired.
Reece Adamson (May 13 2020 at 17:16):
@Nick Rupley I'll take a look into that, could be a bug in our end. If you could share the inferno URL that would be helpful.
Nick Rupley (May 13 2020 at 17:17):
Is this the correct one? https://infernotest.healthit.gov/inferno/8fMzuMxnBOf/test_sets/ad_hoc_testing/#MeasureSourcePullServer/ad_hoc_testing_MeasureSourcePullServer_MeasureSourcePullPublicHealthMeasureReportSequence
Keith Boone (May 13 2020 at 18:04):
I have a question for @Reece Adamson wrt Measure Consumer Push:
image.png
It looks as if the client is asking me which Measure and Location to use when creating the MeasureReport, but also asking for a MeasureReport.id, which is confusing me, since create would get an id assigned to it by the server. Am I missing something here?
Chase Zhou (May 13 2020 at 18:08):
@Keith Boone I think that's an oversight on our part. Those values aren't used in the actual test so you should be able to input anything. I'll look into removing those requirements for the consumer push tests.
Michael Donnelly (May 13 2020 at 18:10):
Reece Adamson said:
We can add a search parameter combination test for those 3 though so folks can try out that interaction.
(Assuming you mean something like[base]/MeasureReport/?measure=...&subject=...&period=...
right?). Chase Zhou is gonna look at this now.
Exactly right.
Nick Rupley (May 13 2020 at 18:15):
FYI it looks like all of the Location resources in the examples don't have name/type, so they fail in the Inferno test:
Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.name': minimum required = 1, but only found 0
Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.type': minimum required = 1, but only found 0
Reece Adamson (May 13 2020 at 18:15):
@Keith Boone seconding what @Chase Zhou said. The Measure Source Pull tests (i.e. read and search) are currently the more robust option. We'll be cleaning them up and improving them over the next couple days.
Keith Boone (May 13 2020 at 18:19):
SPHMRE-01: Server creates MeasureReport resource with the MeasureReport create interaction results...
Fatal Error: undefined method `class_name' for #<Inferno::Sequence::MeasureConsumerPushPublicHealthMeasureReportSequence:0x000056226f2c26e8> Did you mean? class_eval
! SPHMRE-02: Server creates MeasureReport resource with the MeasureReport create interaction results...
Fatal Error: undefined method `class_name' for #<Inferno::Sequence::MeasureConsumerPushPublicHealthMeasureReportSequence:0x000056226f2c26e8> Did you mean? class_eval
Does this mean anything to y'all on Inferno side?
Reece Adamson (May 13 2020 at 18:19):
@Nick Rupley good find*.
Those are required fields for the resources in the profile (i.e. cardinality 1..1): http://build.fhir.org/ig/HL7/fhir-saner/StructureDefinition-saner-resource-location.html
Reece Adamson (May 13 2020 at 18:21):
@Keith Boone yes that's a bug (didn't have much of a chance to test the Push stuff before throwing it out here :slight_smile: ).
Can you send me the infernotest link? I'll fix that.
Keith Boone (May 13 2020 at 18:22):
Chase Zhou (May 13 2020 at 18:22):
@Keith Boone @Reece Adamson Thanks for catching that bug, it looks like a typo on our side where we forgot an '=' sign. We'll try to reoslve this soon
Keith Boone (May 13 2020 at 18:28):
I was so thrilled with all those green checkmarks to find out that they were all because the test couldn't be executed, not because anything we did succeeded as far as I can tell.
You might consider updating the UI to make them look like something other than "passed tests". I logged https://github.com/onc-healthit/inferno/issues/452 for that.
Keith Boone (May 13 2020 at 18:29):
Nick Rupley said:
FYI it looks like all of the Location resources in the examples don't have name/type, so they fail in the Inferno test:
Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.name': minimum required = 1, but only found 0 Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.type': minimum required = 1, but only found 0
I can probably address this quickly with a global search and replace on the instances.
Reece Adamson (May 13 2020 at 18:30):
@Keith Boone The checkmark issue looks like another bug because that doesn't happen in our other inferno projects (usually you get a purple exclamation point). I probably hastily broke something while creating the SANER tests... Thanks for submitting the issue and we'll look into it.
Nick Rupley (May 13 2020 at 18:35):
@Reece Adamson Sorry if I missed it, was there an update on that date-absent-reason issue above? Or you guys still looking into it?
Reece Adamson (May 13 2020 at 18:41):
Working on a fix as we speak. Because that DAR extension was on a primitive it was getting stripped out before being shipped to the validator service. I'll let you know when the fix is up.
Nick Rupley (May 13 2020 at 18:51):
Cool. In other news I just manually updated the Locations on our server for now to all have name/type/mode/status and now....
image.png
Nick Rupley (May 13 2020 at 18:54):
I also noticed this error for the MeasureReports:
MeasureReport/FHIR-197: MeasureReport.measure: URL value 'http://hl7.org/fhir/us/saner/FEMADailyHospitalCOVID19Reporting' does not resolve
That should be "http://hl7.org/fhir/us/saner/Measure/FEMADailyHospitalCOVID19Reporting" instead of "http://hl7.org/fhir/us/saner/FEMADailyHospitalCOVID19Reporting" right? Looks like another possible search/replace update for the resources if so @Keith Boone
Gino Canessa (May 13 2020 at 19:17):
I updated the generator, pushed out the examples, and updated a PR for the IG repo.
(edit: re: URL for MeasureReport.measure)
Gino Canessa (May 13 2020 at 19:25):
Keith Boone said:
Nick Rupley said:
FYI it looks like all of the Location resources in the examples don't have name/type, so they fail in the Inferno test:
Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.name': minimum required = 1, but only found 0 Location/Loc-X143302: Location: Profile http://hl7.org/fhir/us/saner/StructureDefinition/saner-resource-location, Element 'Location.type': minimum required = 1, but only found 0
I can probably address this quickly with a global search and replace on the instances.
Missed this one earlier - what should this look like?
Gino Canessa (May 13 2020 at 19:36):
RE: Location.name and type. I just updated everything with those changes. I used bu
(building) for the location type and just tacked on "Building" to the organization name for now - happy to change if something else would be better.
Nick Rupley (May 13 2020 at 19:37):
@Reece Adamson FYI on SPHMEA-03, it says:
Could not find parameter value for ["code"] to search by.
However Measure resources don't have a direct "code" property, I think that code parameter is meant to search inside the group/population/code and group/stratifier/code instead right?
Nick Rupley (May 13 2020 at 19:38):
I think that would also apply to SPHMSTR-03
Reece Adamson (May 13 2020 at 19:39):
@Gino Canessa I'll defer to @Keith Boone for what the values should be, but for type it might be nice to use a code from the extensibly bound value set: http://hl7.org/fhir/R4/v3/ServiceDeliveryLocationRoleType/vs.html
HOSP
seems fairly general ¯\_(ツ)_/¯
Keith Boone (May 13 2020 at 19:40):
Bingo. I'd call that good enough. We need a value set for these as they roll up.
And values for HSA, HRR, and PCSA in addition to zip-code, county, and state rollup locations.
Gino Canessa (May 13 2020 at 19:41):
Sounds good.. updating now
Nick Rupley (May 13 2020 at 19:47):
@Gino Canessa Also the states-NJ resource doesn't have mode/status fields in addition to the name/type fields.
I think should be mode=instance and status=active, judging from the other Location resources in the examples
Gino Canessa (May 13 2020 at 19:48):
RE: Location.type - now using the correct system with HOSP :-)
Gino Canessa (May 13 2020 at 19:48):
I'll have to punt on that one Nick - I'm not generating the summary versions
Nick Rupley (May 13 2020 at 19:51):
Got it no worries, I've just been updating them in my own database as I go
Reece Adamson (May 13 2020 at 19:58):
@Nick Rupley right now that test is only looking at the first option and otherwise skips. so for Measure it looks for the code in Measure.topic
, searches by that topic, and then makes sure that the resources returned actually have the topic that was searched for.
In reality it could be from any of Measure.topic | Measure.group.code | Measure.group.population.code | Measure.group.stratifier.code | Measure.group.stratifier.component.code | Measure.supplementalData.code
We have it on our list to make it more general and better handle this situation, but we threw this up as a first cut based on the amount of time we had. Thanks for bringing it up, I wasn't sure if anyone would run into it :wink: .
Nick Rupley (May 13 2020 at 20:06):
Gotcha, that's because I was using one of the Measure resources from the examples that did not have a topic. I ran it with the "ComputableFEMADailyHospitalCOVID19Reporting" measure instead and that particular test worked! However a separate test failed with that Measure:
SPHMEA-04: OPTIONAL | Server returns valid results for Measure search by definition-text. results...
Could not find parameter value for ["definition-text"] to search by.
Interestingly the "CDCPatientImpactAndHospitalCapacity" measure fails the "code" test but succeeds with the "definition-text" test. I'm assuming the definition-text one is similar, looks for one particular field like Measure.title?
Reece Adamson (May 13 2020 at 20:11):
@Nick Rupley you're right on the money. I talked to @Chase Zhou and we'll be looking at that after we push the next batch of updates.
Nick Rupley (May 13 2020 at 20:17):
Cool thanks! For now I've just updated my Measure resources to have both topic and title, and now all is well!
image.png
Reece Adamson (May 13 2020 at 21:13):
infernotest.healthit.gov has been redeployed!
Updates include:
- Now only validates the first resource which is provided by the
id
- properly checks resources with primitive extensions
- adds search combination test for measure+subject+period
Also...
:new: Validator app for checking individual resources.
https://infernotest.healthit.gov/validator
Usage:
- Copy/paste or select a file from your machine to be validated in the top section
- Select the Implementation Guide and then the profile in the multiselect OR copy and paste a profile (not recommended, but you can)
Click Submit.
You'll get the same validation results as the desktop jar and all the SANER profiles are preloaded. JSON for now (actively fixing the XML issues :slight_smile: ). It supports error highlighting and jumping to errors.
https://infernotest.healthit.gov/validator
Nick Rupley (May 13 2020 at 21:18):
Nice job @Reece Adamson !
image.png
Ping us when the Consumer Push side of things is ready and we'll test that out as well
John Moehrke (May 13 2020 at 21:48):
@Reece Adamson can you add that instructions to the confluence page? That way it doesn't get lost in the zulip noise.
Abbie Watson (May 14 2020 at 16:00):
Does anybody have an example of a MeasureReport that has the correct MeasureGroup value codes?
Screen-Shot-2020-05-14-at-10.42.14-AM.png
Nick Rupley (May 14 2020 at 16:03):
Is this FHIR-470 resource the same as yours? http://ec2-34-210-212-20.us-west-2.compute.amazonaws.com:9001/MeasureReport/FHIR-470/_history/3
Nick Rupley (May 14 2020 at 16:03):
We had an older version until we re-downloaded the examples.json.zip file and found the newer versions
Nick Rupley (May 14 2020 at 16:08):
Actually I just re-downloaded it again and many resources were removed, including FHIR-470!
Abbie Watson (May 14 2020 at 16:11):
Perfect! Thank you so much!
Screen-Shot-2020-05-14-at-11.07.57-AM.png
Michael Donnelly (May 14 2020 at 16:20):
If you want another one: https://connectathon.epic.com/Interconnect-Fhir-Unsecure/api/FHIR/R4/MeasureReport/ePnc97ybBBxHKmf4PuKGRdob0nJYkccqHYE2JYOrpDqsrVg.pkkhcZSELcFS.P9-53
Reece Adamson (May 15 2020 at 13:01):
@Keith Boone The Measure Consumer Push (Server) tests are working now. The tests are more rudimentary than the search ones because there are less options, but should at least ensure the basic functionality (content testing on a create or update is trickier in this situation when read is not required and when the server is permitted to not include all the data provided in the create/update based on what it supports).
I ran a quick test with your server and it looks good so far!
Screen-Shot-2020-05-15-at-8.56.13-AM.png
John Moehrke (May 15 2020 at 13:30):
In inferno, how are we separating the testing to SANER, which is an international specification, from testing against the USA specific measure definitions that are contained in SANER? I am not clear on how to completely test, that is to be ready to give a positive result to a MeasureReport that is not using a measure definition inside of SANER, while giving a bonus positive result for those conforming to the CDC or FEMA measure definition. The unclear part is to what extent can we support generically today deviations beyond FHIR core use of measure and measureReport?
Reece Adamson (May 15 2020 at 14:20):
@John Moehrke I just talked with @Keith Boone about this and I think this is going to require a bigger discussion on how we want to test this sort of thing and any additional language we need in the IG to back it up. Right now in Inferno the MeasureReport with the ID provided will be validated against the HL7 validator and the PublicHealthMeasureReport Profile with no special inferno consideration outside of what's in the profile. If there's any specific measure related checks (I didn't see any spec language on it in base FHIR validation section similar to what there is for Questionnaire, but maybe its somewhere else) then it should happen in that validation step.
In terms of "bonus positive results" I think we should maybe talk on Zoom or set up a meeting later next week so I can better understand what you mean and make sure we have any IG language to back it up. Plus I'm pretty new to MeasureReport/Measure so I'm sure I'll have a bunch of questions.
John Moehrke (May 15 2020 at 14:22):
we are all new to this.. if you have experience with Questionnaire then I would expect this to be similar.
John Moehrke (May 15 2020 at 14:22):
on timing, right.. I was mostly opening the discussion, not demanding any solution. Discussion beyond this week is expected
John Moehrke (May 15 2020 at 14:26):
what I was assuming is that a MeasureReport that points at a measure should be ( a ) tested against the SANER MeasureReport profile, and if the measure being asserted in the MeasureReport is one that you can understand (canonical or reference) then ( b ) that an additional check would be done to assure that the contents of the MeasureReport conform to the measure definition. The SANER profile of MeasureReport can't restrict the value in .measure (my assertion based on my new understanding that our PSS scope is international not CDC/FEMA specific).
Ben Levy (May 15 2020 at 14:26):
What kind of measure-related checks could we expect validators to do?
John Moehrke (May 15 2020 at 14:27):
I state this first to get reaction that I am wrong.. second to get my mind well enough to document it and write issues that support it
John Moehrke (May 15 2020 at 14:28):
Ben Levy said:
What kind of measure-related checks could we expect validators to do?
there is a set of measures defined in the Measure for a given class of measure (e.g. CDC or FEMA we have done). So if a MeasureReport says it is following CDC measure definition, then it better have those key/value pairs... not sure if we can complain if it has more than those.
John Moehrke (May 15 2020 at 14:29):
and we have had discussions about having less than defined in the measure..
Reece Adamson (May 15 2020 at 14:32):
So if a MeasureReport says it is following CDC measure definition, then it better have those key/value pairs...
Do you have a link to the language backing this in the spec? Asking solely for my own edification because I didn't see it based on a cursory look through the validation/Measure/MeasureReport sections.
John Moehrke (May 15 2020 at 14:35):
I am not saying that it says that now
John Moehrke (May 15 2020 at 14:35):
I am saying it seems like it should say that
John Moehrke (May 15 2020 at 14:35):
I was unaware of this layering until late last night
John Moehrke (May 15 2020 at 14:38):
I am thinking first that this could be additional constraint that SANER could apply, for those measures we have included in SANER. I am not sure it is appropriate for FHIR Core to say this, but it does seem like a useful 'should'. But I am way beyond my understanding.
Reece Adamson (May 15 2020 at 14:40):
Gotcha :thumbs_up: . I could clearly see a MeasureReport profile making this kind of check easy, but from a testing perspective I imagine we'd want to be able to point to a requirement if enforced by some other means.
I agree overall and that type of check makes sense.
John Moehrke (May 15 2020 at 14:48):
okay, I will write this into testplan as contingent on a closing of an open issue about if saner is limited to framework and that saner will not be imposing ANY library of measures.
John Moehrke (May 15 2020 at 14:54):
https://github.com/AudaciousInquiry/fhir-saner/issues/81
Reece Adamson (May 15 2020 at 16:09):
@Keith Boone & @John Moehrke There was some talk about authorization in the last call. Has there been any thought about those types of requirements (like using SMART) or desire for things like SMART-on-FHIR testing?
John Moehrke (May 15 2020 at 16:21):
We have a Security Considerations page http://build.fhir.org/ig/HL7/fhir-saner/security_considerations.html
John Moehrke (May 15 2020 at 16:22):
which, like everything, is up for debate.
John Moehrke (May 15 2020 at 16:24):
but what it indicates (my authorship) is that the MeasureReports are not patient specific, but might be business sensitive. So, the core SANER would not impose security, but a specific measure definition might (words not yet added). A specific instance of a publishing system might also add client authentication to support business sensitive, or SLA. Those specific instance security requirements are above-and-beyond SANER.
John Moehrke (May 15 2020 at 16:31):
https://github.com/AudaciousInquiry/fhir-saner/issues/82
Minh Tran (May 15 2020 at 17:06):
@Reece Adamson your PUSH test for Location Profile using a payload missing Location.name & Location.type and thus causing the next Pull test to fail validating it.
Abbie Watson (May 22 2020 at 03:50):
Hi,
So, I've been working through various different parts of the IG, and have gotten back around to Inferno testing. Happy to report that I have the push functionality all complete. Yay.
Screen-Shot-2020-05-21-at-10.20.42-PM.png
Abbie Watson (May 22 2020 at 03:52):
However, I'm having some problems with SPHMREP-10, RLP-12, SPHMEA-05, and SPHMSTR-05. I'm getting a This property must be an object, not a primitive property
error.
Screen-Shot-2020-05-21-at-10.19.41-PM.png
Abbie Watson (May 22 2020 at 03:53):
When I dig into the results, I get this:
Screen-Shot-2020-05-21-at-10.19.55-PM.png
Abbie Watson (May 22 2020 at 03:53):
And the http://hl7.org/fhir/us/saner/StructureDefinition/PublicHealthMeasure
leads to a 404. So.
Screen-Shot-2020-05-21-at-10.20.02-PM.png
Abbie Watson (May 22 2020 at 03:58):
Oh, and here's the JSON object in Postman. It's just got a plain text string in both id
and _id
. The JSON looks valid.
Screen-Shot-2020-05-21-at-10.56.10-PM.png
Abbie Watson (May 22 2020 at 04:08):
Any thoughts or recommendations on how to decypher this error message? Or what the Measure JSON should look like?
John Moehrke (May 22 2020 at 10:39):
@Reece Adamson ?
Reece Adamson (May 26 2020 at 14:42):
@Abigail Watson The two properties identified as having issues, Measure.id
and Measure.meta.lastUpdated
, are both prepended with an _
in JSON, indicating they should be an object containing just the id
and extensions
(if present) as the error indicates.
You'll see the same errors when taking that resource (measure.json) and validating it with the HL7 Desktop Jar:
java -jar ./org.hl7.fhir.validator.jar -ig hl7.fhir.us.saner#current -version 4.0.1 measure.json
FHIR Validation tool Version 4.2.18-SNAPSHOT (Git# 175d5fa0b72d). Built 2020-04-21T14:15:21.346+10:00 (35 days old)
Detected Java version: 1.8.0_252 from /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre on x86_64 (64bit). 3641MB available
Arguments: -ig hl7.fhir.us.saner#current -version 4.0.1 measure.json
Directories: Current = /Users/radamson/Desktop, Package Cache = /Users/radamson/.fhir/packages
.. FHIR Version 4.0, definitions from hl7.fhir.r4.core#4.0.1
.. connect to tx server @ http://tx.fhir.org
(v4.0.1)
+ .. load IG from hl7.fhir.us.saner#current
+ .. load IG from hl7.fhir.us.core#3.1.0
.. validate [measure.json]
Terminology server: Check for supported code systems for http://snomed.info/sct
*FAILURE* validating measure.json: error:3 warn:11 info:0
Error @ Measure.id (line 2, col30) : This property must be an object, not a primitive property
Error @ Measure.meta.lastUpdated (line 8, col4) : This property must be an object, not a primitive property
Note the last two lines are the same errors you see in Inferno. If we look at id
for example there are two properties:
{
"id": "Y3N6HzhYoJc8gP6w8",
"_id": "Y3N6HzhYoJc8gP6w8",
...
}
The JSON property prepended by an underscore should be an object containing an id
and/or extensions, not just a plain primitive. For example, see this example from the FHIR spec:
"birthDate": "1970-03-30",
"_birthDate": {
"id": "314159",
"extension" : [ {
"url" : "http://example.org/fhir/StructureDefinition/text",
"valueString" : "Easter 1970"
}]
}
See the relevant part of the FHIR spec here. Hopefully that helps!
Abbie Watson (May 26 2020 at 15:51):
Aaaaah. Gotchya. It _was_ the underscores. :)
Very good. Thank you very much for the confirmation and the nudge in the right direction!
Abbie Watson (May 29 2020 at 21:26):
Success!
Symptomatic-SANER-InferoTestingSanerEdition.png
Abbie Watson (May 30 2020 at 17:15):
(deleted)
Last updated: Apr 12 2022 at 19:14 UTC