Skip to content

Commit 14183ff

Browse files
committed
refactor loading resources and add unit tests
1 parent 5dec93d commit 14183ff

12 files changed

Lines changed: 1008 additions & 81 deletions

File tree

src/main/java/software/nhs/FHIRValidator/HandlerStream.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,8 @@ public HandlerStream() {
2525
validator = new Validator();
2626

2727
log.info("Validating once to force the loading of all the validator related classes");
28-
29-
ClassLoader loader = Thread.currentThread().getContextClassLoader();
30-
InputStream inputStream = loader.getResourceAsStream("primerPayload.json");
31-
ByteArrayOutputStream result = new ByteArrayOutputStream();
32-
byte[] buffer = new byte[1024];
33-
try {
34-
for (int length; (length = inputStream.read(buffer)) != -1;) {
35-
result.write(buffer, 0, length);
36-
}
37-
String primerPayload = result.toString("UTF-8");
38-
validator.validate(primerPayload);
39-
} catch (IOException e) {
40-
// TODO Auto-generated catch block
41-
e.printStackTrace();
42-
}
28+
String primerPayload = Utils.getResourceContent("primerPayload.json");
29+
validator.validate(primerPayload);
4330

4431
log.info("Validator is ready");
4532
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package software.nhs.FHIRValidator;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
7+
public final class Utils {
8+
public static String getResourceContent(String resource) {
9+
ClassLoader loader = Thread.currentThread().getContextClassLoader();
10+
InputStream inputStream = loader.getResourceAsStream(resource);
11+
ByteArrayOutputStream result = new ByteArrayOutputStream();
12+
byte[] buffer = new byte[1024];
13+
try {
14+
for (int length; (length = inputStream.read(buffer)) != -1;) {
15+
result.write(buffer, 0, length);
16+
}
17+
String rawData = result.toString("UTF-8");
18+
return rawData;
19+
20+
} catch (IOException e) {
21+
e.printStackTrace();
22+
return null;
23+
}
24+
}
25+
}

src/main/java/software/nhs/FHIRValidator/Validator.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@
4141
*/
4242

4343
public class Validator {
44-
private static final Gson GSON = new Gson();
45-
public static final String DEFAULT_IMPLEMENTATION_GUIDES_FOLDER = "implementationGuides";
46-
public static final String FHIR_R4 = "4.0.1";
47-
public static final String FHIR_STU3 = "3.0.1";
48-
4944
private final FhirValidator validator;
5045

5146
private final FhirContext ctx;
@@ -230,22 +225,8 @@ public IValidationSupport.CodeValidationResult validateCodeInValueSet(
230225
}
231226

232227
private SimplifierPackage[] getPackages() {
233-
ClassLoader loader = Thread.currentThread().getContextClassLoader();
234-
InputStream inputStream = loader.getResourceAsStream("manifest.json");
235-
ByteArrayOutputStream result = new ByteArrayOutputStream();
236-
byte[] buffer = new byte[1024];
237-
try {
238-
for (int length; (length = inputStream.read(buffer)) != -1;) {
239-
result.write(buffer, 0, length);
240-
}
241-
String manifestContent = result.toString("UTF-8");
242-
SimplifierPackage[] packages = new Gson().fromJson(manifestContent, SimplifierPackage[].class);
243-
return packages;
244-
245-
} catch (IOException e) {
246-
// TODO Auto-generated catch block
247-
e.printStackTrace();
248-
return null;
249-
}
228+
String manifestContent = Utils.getResourceContent("manifest.json");
229+
SimplifierPackage[] packages = new Gson().fromJson(manifestContent, SimplifierPackage[].class);
230+
return packages;
250231
}
251232
}

src/test/java/software/nhs/FHIRValidator/ValidatorTest.java

Lines changed: 111 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,52 +33,120 @@ static void setup() {
3333
}
3434

3535
@Test
36-
void validFHIR() {
37-
ClassLoader loader = Thread.currentThread().getContextClassLoader();
38-
InputStream inputStream = loader.getResourceAsStream("examples/validFHIR.json");
39-
ByteArrayOutputStream result = new ByteArrayOutputStream();
40-
byte[] buffer = new byte[1024];
41-
try {
42-
for (int length; (length = inputStream.read(buffer)) != -1;) {
43-
result.write(buffer, 0, length);
44-
}
45-
String rawInput = result.toString("UTF-8");
46-
ValidatorResponse validatorResult = validator.validate(rawInput);
47-
assertTrue((validatorResult.isSuccessful()));
48-
} catch (IOException e) {
49-
// TODO Auto-generated catch block
50-
e.printStackTrace();
51-
}
36+
void validBundle() {
37+
String FHIRDocument = Utils.getResourceContent("examples/validBundle.json");
38+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
39+
assertTrue((validatorResult.isSuccessful()));
40+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
41+
assertEquals(errorMessages.size(), 0);
5242
}
5343

5444
@Test
55-
void invalidFHIR() {
56-
ClassLoader loader = Thread.currentThread().getContextClassLoader();
57-
InputStream inputStream = loader.getResourceAsStream("examples/invalidFHIR.json");
58-
ByteArrayOutputStream result = new ByteArrayOutputStream();
59-
byte[] buffer = new byte[1024];
60-
try {
61-
for (int length; (length = inputStream.read(buffer)) != -1;) {
62-
result.write(buffer, 0, length);
63-
}
64-
String rawInput = result.toString("UTF-8");
65-
ValidatorResponse validatorResult = validator.validate(rawInput);
66-
assertFalse((validatorResult.isSuccessful()));
67-
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
68-
.msg("Bundle.entry[0] - Bundle entry missing fullUrl")
69-
.severity("error")
70-
.build();
71-
ValidatorErrorMessage expectedMessage2 = ValidatorErrorMessage.builder()
72-
.msg("Bundle.entry[0] - Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry ")
73-
.severity("error")
74-
.build();
75-
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
76-
assertTrue(errorMessages.contains(expectedMessage1));
77-
assertTrue(errorMessages.contains(expectedMessage2));
78-
} catch (IOException e) {
79-
// TODO Auto-generated catch block
80-
e.printStackTrace();
81-
}
45+
void invalidBundle() {
46+
String FHIRDocument = Utils.getResourceContent("examples/invalidBundle.json");
47+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
48+
assertFalse((validatorResult.isSuccessful()));
49+
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
50+
.msg("Bundle.entry[0] - Bundle entry missing fullUrl")
51+
.severity("error")
52+
.build();
53+
ValidatorErrorMessage expectedMessage2 = ValidatorErrorMessage.builder()
54+
.msg("Bundle.entry[0] - Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry ")
55+
.severity("error")
56+
.build();
57+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
58+
assertEquals(errorMessages.size(), 2);
59+
assertTrue(errorMessages.contains(expectedMessage1));
60+
assertTrue(errorMessages.contains(expectedMessage2));
61+
}
62+
63+
@Test
64+
void warningBundle() {
65+
String FHIRDocument = Utils.getResourceContent("examples/warningBundle.json");
66+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
67+
assertTrue((validatorResult.isSuccessful()));
68+
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
69+
.msg("Bundle.entry[4].resource.ofType(PractitionerRole).code[0].coding[0] - Unknown code in fragment CodeSystem 'https://fhir.nhs.uk/CodeSystem/NHSDigital-SDS-JobRoleCode#S8000:G8000:R8000' for 'https://fhir.nhs.uk/CodeSystem/NHSDigital-SDS-JobRoleCode#S8000:G8000:R8000'")
70+
.severity("warning")
71+
.build();
72+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
73+
assertEquals(errorMessages.size(), 1);
74+
assertTrue(errorMessages.contains(expectedMessage1));
75+
}
76+
77+
@Test
78+
void mixedErrorWarningBundle() {
79+
String FHIRDocument = Utils.getResourceContent("examples/mixedErrorWarning.json");
80+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
81+
assertFalse((validatorResult.isSuccessful()));
82+
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
83+
.msg("Bundle.entry[0] - Bundle entry missing fullUrl")
84+
.severity("error")
85+
.build();
86+
ValidatorErrorMessage expectedMessage2 = ValidatorErrorMessage.builder()
87+
.msg("Bundle.entry[0] - Except for transactions and batches, each entry in a Bundle must have a fullUrl which is the identity of the resource in the entry ")
88+
.severity("error")
89+
.build();
90+
ValidatorErrorMessage expectedMessage3 = ValidatorErrorMessage.builder()
91+
.msg("Bundle.entry[4].resource.ofType(PractitionerRole).code[0].coding[0] - Unknown code in fragment CodeSystem 'https://fhir.nhs.uk/CodeSystem/NHSDigital-SDS-JobRoleCode#S8000:G8000:R8000' for 'https://fhir.nhs.uk/CodeSystem/NHSDigital-SDS-JobRoleCode#S8000:G8000:R8000'")
92+
.severity("warning")
93+
.build();
94+
ValidatorErrorMessage expectedMessage4 = ValidatorErrorMessage.builder()
95+
.msg("Bundle.entry[4].resource.ofType(PractitionerRole).code[0].coding[0].display - value should not start or finish with whitespace")
96+
.severity("warning")
97+
.build();
98+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
99+
assertEquals(errorMessages.size(), 4);
100+
assertTrue(errorMessages.contains(expectedMessage1));
101+
assertTrue(errorMessages.contains(expectedMessage2));
102+
assertTrue(errorMessages.contains(expectedMessage3));
103+
assertTrue(errorMessages.contains(expectedMessage4));
104+
}
105+
106+
@Test
107+
void validParameters() {
108+
String FHIRDocument = Utils.getResourceContent("examples/validParameters.json");
109+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
110+
assertTrue((validatorResult.isSuccessful()));
111+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
112+
assertEquals(errorMessages.size(), 0);
113+
}
114+
115+
@Test
116+
void invalidParameters() {
117+
String FHIRDocument = Utils.getResourceContent("examples/invalidParameters.json");
118+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
119+
assertFalse((validatorResult.isSuccessful()));
120+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
121+
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
122+
.msg("Parameters.parameter[0] - inv-1: 'A parameter must have one and only one of (value, resource, part)' Rule 'A parameter must have one and only one of (value, resource, part)' Failed")
123+
.severity("error")
124+
.build();
125+
assertEquals(errorMessages.size(), 1);
126+
assertTrue(errorMessages.contains(expectedMessage1));
127+
}
128+
129+
@Test
130+
void validOperationOutcome() {
131+
String FHIRDocument = Utils.getResourceContent("examples/validOperationOutcome.json");
132+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
133+
assertTrue((validatorResult.isSuccessful()));
134+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
135+
assertEquals(errorMessages.size(), 0);
136+
}
137+
138+
@Test
139+
void invalidOperationOutcome() {
140+
String FHIRDocument = Utils.getResourceContent("examples/invalidOperationOutcome.json");
141+
ValidatorResponse validatorResult = validator.validate(FHIRDocument);
142+
assertFalse((validatorResult.isSuccessful()));
143+
List<ValidatorErrorMessage> errorMessages = validatorResult.getErrorMessages();
144+
ValidatorErrorMessage expectedMessage1 = ValidatorErrorMessage.builder()
145+
.msg("OperationOutcome - OperationOutcome.issue: minimum required = 1, but only found 0 (from http://hl7.org/fhir/StructureDefinition/OperationOutcome)")
146+
.severity("error")
147+
.build();
148+
assertEquals(errorMessages.size(), 1);
149+
assertTrue(errorMessages.contains(expectedMessage1));
82150
}
83151

84152
@Test

0 commit comments

Comments
 (0)