1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.openehealth.ipf.commons.ihe.xds.core.transform.hl7.pid;
17
18 import org.joda.time.DateTime;
19 import org.joda.time.DateTimeZone;
20 import org.junit.Test;
21 import org.openehealth.ipf.commons.ihe.xds.XDS;
22 import org.openehealth.ipf.commons.ihe.xds.core.SampleData;
23 import org.openehealth.ipf.commons.ihe.xds.core.ebxml.ebxml30.EbXMLFactory30;
24 import org.openehealth.ipf.commons.ihe.xds.core.metadata.*;
25 import org.openehealth.ipf.commons.ihe.xds.core.requests.RegisterDocumentSet;
26 import org.openehealth.ipf.commons.ihe.xds.core.transform.hl7.PatientInfoTransformer;
27 import org.openehealth.ipf.commons.ihe.xds.core.transform.requests.RegisterDocumentSetTransformer;
28 import org.openehealth.ipf.commons.ihe.xds.core.validate.ValidationMessage;
29 import org.openehealth.ipf.commons.ihe.xds.core.validate.XDSMetaDataException;
30 import org.openehealth.ipf.commons.ihe.xds.core.validate.requests.SubmitObjectsRequestValidator;
31
32 import java.util.List;
33 import java.util.ListIterator;
34 import java.util.stream.Collectors;
35
36 import static org.junit.Assert.*;
37
38
39
40
41 public class PatientInfoTest {
42
43 private static final SubmitObjectsRequestValidator SUBMIT_OBJECTS_REQUEST_VALIDATOR = new SubmitObjectsRequestValidator();
44 private static final RegisterDocumentSetTransformer REGISTER_DOCUMENT_SET_TRANSFORMER = new RegisterDocumentSetTransformer(new EbXMLFactory30());
45 private static final PatientInfoTransformer PATIENT_INFO_TRANSFORMER = new PatientInfoTransformer();
46
47 private static void assertValidationFailure(RegisterDocumentSet request, ValidationMessage expectedValidationMessage) {
48 boolean failed = false;
49 try {
50 SUBMIT_OBJECTS_REQUEST_VALIDATOR.validate(REGISTER_DOCUMENT_SET_TRANSFORMER.toEbXML(request), XDS.Interactions.ITI_42);
51 } catch (XDSMetaDataException e) {
52 assertEquals(expectedValidationMessage, e.getValidationMessage());
53 failed = true;
54 }
55 assertTrue(failed);
56 }
57
58 private static List<String> getRenderedStrings(List<String> strings, String fieldName, int expectedCount) {
59 List<String> result = strings.stream()
60 .filter(s -> s.startsWith(fieldName + '|'))
61 .collect(Collectors.toList());
62 assertEquals("Expected " + expectedCount + " lines for " + fieldName, expectedCount, result.size());
63 return result;
64 }
65
66 private static List<String> getRenderedStrings(PatientInfo patientInfo, String fieldName, int expectedCount) {
67 return getRenderedStrings(PATIENT_INFO_TRANSFORMER.toHL7(patientInfo), fieldName, expectedCount);
68 }
69
70 @Test
71 public void testNonPidFields() {
72 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
73 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
74 patientInfo.getHl7FieldIterator("OBX-5").add("abc");
75 assertValidationFailure(request, ValidationMessage.INVALID_PID);
76 }
77
78 @Test
79 public void testRawNamesHandling() {
80 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
81 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
82 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-5");
83 assertTrue(rawIterator.hasNext());
84
85
86 while (rawIterator.hasNext()) {
87 rawIterator.next();
88 rawIterator.remove();
89 }
90 assertFalse(rawIterator.hasNext());
91
92
93 rawIterator.add("Krause^Peter^^^^Dr.^^^^^^");
94 rawIterator.add(null);
95 rawIterator.add("Schmitt^Jens^Klaus Heinz^^Ritter^^^^^^");
96 rawIterator.add("");
97 rawIterator.add("^^^^^");
98
99
100 ListIterator<Name> xdsIterator = patientInfo.getNames();
101 assertEquals(new XcnName("Krause", "Peter", null, null, null, "Dr."), xdsIterator.next());
102 assertEquals(null, xdsIterator.next());
103 assertEquals(new XpnName("Schmitt", "Jens", "Klaus Heinz", null, "Ritter", null), xdsIterator.next());
104 assertEquals(null, xdsIterator.next());
105 assertEquals(null, xdsIterator.next());
106 assertFalse(xdsIterator.hasNext());
107
108
109 List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-5", 1);
110 assertEquals("PID-5|Krause^Peter^^^^Dr.^^^^^^~~Schmitt^Jens^Klaus Heinz^^Ritter^^^^^^~~^^^^^", renderedStrings.get(0));
111 }
112
113 @Test
114 public void testXdsNamesHandling() {
115 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
116 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
117 ListIterator<Name> xdsIterator = patientInfo.getNames();
118 assertTrue(xdsIterator.hasNext());
119
120
121 while (xdsIterator.hasNext()) {
122 xdsIterator.next();
123 xdsIterator.remove();
124 }
125 assertFalse(xdsIterator.hasNext());
126
127
128 xdsIterator.add(new XcnName("Krause", "Peter", null, null, null, "Dr."));
129 xdsIterator.add(null);
130 xdsIterator.add(new XpnName("Schmitt", "Jens", "Klaus Heinz", null, "Ritter", null));
131 xdsIterator.add(null);
132
133
134 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-5");
135 assertEquals("Krause^Peter^^^^Dr.", rawIterator.next());
136 assertEquals("", rawIterator.next());
137 assertEquals("Schmitt^Jens^Klaus Heinz^^Ritter", rawIterator.next());
138 assertEquals("", rawIterator.next());
139 assertFalse(rawIterator.hasNext());
140 }
141
142 @Test
143 public void testRawBirthDateHandling() {
144 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
145 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
146 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-7");
147 assertTrue(rawIterator.hasNext());
148
149
150 while (rawIterator.hasNext()) {
151 rawIterator.next();
152 rawIterator.remove();
153 }
154 assertFalse(rawIterator.hasNext());
155
156
157 rawIterator.add("");
158 rawIterator.add(null);
159 rawIterator.add("20010203040506");
160
161
162 assertEquals(null, patientInfo.getDateOfBirth());
163 List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-7", 1);
164 assertEquals("PID-7|~~20010203040506", renderedStrings.get(0));
165
166
167 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
168 rawIterator.next();
169 rawIterator.remove();
170 assertEquals(null, patientInfo.getDateOfBirth());
171 renderedStrings = getRenderedStrings(patientInfo, "PID-7", 1);
172 assertEquals("PID-7|~20010203040506", renderedStrings.get(0));
173
174
175 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
176 rawIterator.next();
177 rawIterator.remove();
178 assertEquals(new Timestamp(new DateTime(2001, 2, 3, 4, 5, 6, DateTimeZone.UTC), Timestamp.Precision.SECOND), patientInfo.getDateOfBirth());
179 renderedStrings = getRenderedStrings(patientInfo, "PID-7", 1);
180 assertEquals("PID-7|20010203040506", renderedStrings.get(0));
181 }
182
183 @Test
184 public void testXdsBirthDateHandling() {
185 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
186 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
187 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-7");
188 assertTrue(rawIterator.hasNext());
189
190
191 while (rawIterator.hasNext()) {
192 rawIterator.next();
193 rawIterator.remove();
194 }
195 assertFalse(rawIterator.hasNext());
196
197
198 rawIterator.add("");
199 rawIterator.add(null);
200 rawIterator.add("20010203040506");
201
202
203 patientInfo.setDateOfBirth("20010203");
204 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
205 assertEquals("20010203", rawIterator.next());
206 assertFalse(rawIterator.hasNext());
207 List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-7", 1);
208 assertEquals("PID-7|20010203", renderedStrings.get(0));
209 assertEquals(new Timestamp(new DateTime(2001, 2, 3, 4, 5, 6, DateTimeZone.UTC), Timestamp.Precision.DAY), patientInfo.getDateOfBirth());
210
211
212 patientInfo.setDateOfBirth("");
213 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
214 assertFalse(rawIterator.hasNext());
215 renderedStrings = getRenderedStrings(patientInfo, "PID-7", 0);
216 assertEquals(null, patientInfo.getDateOfBirth());
217
218
219 patientInfo.setDateOfBirth((String) null);
220 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
221 assertFalse(rawIterator.hasNext());
222 renderedStrings = getRenderedStrings(patientInfo, "PID-7", 0);
223 assertEquals(null, patientInfo.getDateOfBirth());
224
225
226 patientInfo.setDateOfBirth((Timestamp) null);
227 rawIterator = patientInfo.getHl7FieldIterator("PID-7");
228 assertFalse(rawIterator.hasNext());
229 renderedStrings = getRenderedStrings(patientInfo, "PID-7", 0);
230 assertEquals(null, patientInfo.getDateOfBirth());
231 }
232
233 @Test
234 public void testRawGenderHandling() {
235 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
236 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
237 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-8");
238 assertTrue(rawIterator.hasNext());
239
240
241 while (rawIterator.hasNext()) {
242 rawIterator.next();
243 rawIterator.remove();
244 }
245 assertFalse(rawIterator.hasNext());
246
247
248 rawIterator.add("");
249 rawIterator.add(null);
250 rawIterator.add("M");
251
252
253 assertEquals(null, patientInfo.getGender());
254 List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-8", 1);
255 assertEquals("PID-8|~~M", renderedStrings.get(0));
256
257
258 rawIterator = patientInfo.getHl7FieldIterator("PID-8");
259 rawIterator.next();
260 rawIterator.remove();
261 assertEquals(null, patientInfo.getGender());
262 renderedStrings = getRenderedStrings(patientInfo, "PID-8", 1);
263 assertEquals("PID-8|~M", renderedStrings.get(0));
264
265
266 rawIterator = patientInfo.getHl7FieldIterator("PID-8");
267 rawIterator.next();
268 rawIterator.remove();
269 assertEquals("M", patientInfo.getGender());
270 renderedStrings = getRenderedStrings(patientInfo, "PID-8", 1);
271 assertEquals("PID-8|M", renderedStrings.get(0));
272 }
273
274 @Test
275 public void testXdsGenderHandling() {
276 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
277 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
278 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-8");
279 assertTrue(rawIterator.hasNext());
280
281
282 while (rawIterator.hasNext()) {
283 rawIterator.next();
284 rawIterator.remove();
285 }
286 assertFalse(rawIterator.hasNext());
287
288
289 rawIterator.add("");
290 rawIterator.add(null);
291 rawIterator.add("M");
292
293
294 patientInfo.setGender("F");
295 rawIterator = patientInfo.getHl7FieldIterator("PID-8");
296 assertEquals("F", rawIterator.next());
297 assertFalse(rawIterator.hasNext());
298 List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-8", 1);
299 assertEquals("PID-8|F", renderedStrings.get(0));
300 assertEquals("F", patientInfo.getGender());
301
302
303 patientInfo.setGender("");
304 rawIterator = patientInfo.getHl7FieldIterator("PID-8");
305 assertFalse(rawIterator.hasNext());
306 renderedStrings = getRenderedStrings(patientInfo, "PID-8", 0);
307 assertEquals(null, patientInfo.getGender());
308
309
310 patientInfo.setGender(null);
311 rawIterator = patientInfo.getHl7FieldIterator("PID-8");
312 assertFalse(rawIterator.hasNext());
313 renderedStrings = getRenderedStrings(patientInfo, "PID-8", 0);
314 assertEquals(null, patientInfo.getGender());
315 }
316
317 @Test
318 public void testInPlaceModification() {
319 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
320 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
321 ListIterator<Name> xdsIterator = patientInfo.getNames();
322 assertTrue(xdsIterator.hasNext());
323
324
325 while (xdsIterator.hasNext()) {
326 xdsIterator.next();
327 xdsIterator.remove();
328 }
329 assertFalse(xdsIterator.hasNext());
330
331
332 xdsIterator.add(new XcnName("Krause", "Peter", null, null, null, "Dr."));
333 xdsIterator.add(null);
334 xdsIterator.add(new XpnName("Schmitt", "Jens", "Klaus Heinz", null, "Ritter", null));
335 xdsIterator.add(null);
336
337
338 ListIterator<String> rawIterator = patientInfo.getHl7FieldIterator("PID-5");
339 assertEquals("Krause^Peter^^^^Dr.", rawIterator.next());
340 assertEquals("", rawIterator.next());
341 assertEquals("Schmitt^Jens^Klaus Heinz^^Ritter", rawIterator.next());
342 assertEquals("", rawIterator.next());
343 assertFalse(rawIterator.hasNext());
344
345
346 xdsIterator = patientInfo.getNames();
347 Name name = xdsIterator.next();
348 assertEquals(new XcnName("Krause", "Peter", null, null, null, "Dr."), name);
349 name.setFamilyName("Mueller");
350 assertEquals(new XcnName("Mueller", "Peter", null, null, null, "Dr."), name);
351 rawIterator = patientInfo.getHl7FieldIterator("PID-5");
352 assertEquals("Krause^Peter^^^^Dr.", rawIterator.next());
353
354
355 xdsIterator = patientInfo.getNames();
356 name = xdsIterator.next();
357 assertEquals(new XcnName("Mueller", "Peter", null, null, null, "Dr."), name);
358 name.setFamilyName("Krusenstern");
359 assertEquals(new XcnName("Krusenstern", "Peter", null, null, null, "Dr."), name);
360
361 xdsIterator.set(name);
362
363 rawIterator = patientInfo.getHl7FieldIterator("PID-5");
364 assertEquals("Krusenstern^Peter^^^^Dr.", rawIterator.next());
365 }
366
367 @Test
368 public void testToString() {
369 RegisterDocumentSet request = SampleData.createRegisterDocumentSet();
370 PatientInfo patientInfo = request.getDocumentEntries().get(0).getSourcePatientInfo();
371
372
373 patientInfo.getIds().add(new Identifiable("123", new AssigningAuthority("1.2.3")));
374 patientInfo.getIds().add(new Identifiable("124", new AssigningAuthority("1.2.3")));
375 patientInfo.getNames().add(new XcnName("Krause", "Peter", null, null, null, "Dr."));
376 patientInfo.getNames().add(new XpnName("Schmitt", "Jens", "Klaus Heinz", null, "Ritter", null));
377 patientInfo.setDateOfBirth("19761230");
378 patientInfo.setGender("M");
379
380
381 ListIterator<String> citizenships = patientInfo.getHl7FieldIterator("PID-26");
382 citizenships.add("Greenland");
383 citizenships.add("New Guinea");
384
385 ListIterator<String> religions = patientInfo.getHl7FieldIterator("PID-17");
386 religions.add("Buddhism");
387
388 ListIterator<String> maritalStatuses = patientInfo.getHl7FieldIterator("PID-16");
389 maritalStatuses.add(null);
390 maritalStatuses.add("");
391 maritalStatuses.add(null);
392 maritalStatuses.add("");
393
394 ListIterator<String> ethnicGroups = patientInfo.getHl7FieldIterator("PID-22");
395
396
397 ListIterator<String> motherIdentifiers = patientInfo.getHl7FieldIterator("PID-21");
398 motherIdentifiers.add("motherId^^^&1.2.3.4.5&ISO");
399
400
401 String s = patientInfo.toString();
402 assertTrue(s.contains("PID-16=[null, , null, ], PID-17=[Buddhism], PID-21=[motherId^^^&1.2.3.4.5&ISO], PID-26=[Greenland, New Guinea]"));
403
404
405 List<String> rendered = PATIENT_INFO_TRANSFORMER.toHL7(patientInfo);
406 assertEquals("PID-3|124^^^&1.2.3&ISO~123^^^&1.2.3&ISO", rendered.get(0));
407 assertEquals("PID-5|Schmitt^Jens^Klaus Heinz^^Ritter~Krause^Peter^^^^Dr.~Susi", rendered.get(1));
408 assertEquals("PID-7|19761230", rendered.get(2));
409 assertEquals("PID-8|M", rendered.get(3));
410 assertEquals("PID-11|hier", rendered.get(4));
411 assertEquals("PID-16|~~~", rendered.get(5));
412 assertEquals("PID-17|Buddhism", rendered.get(6));
413 assertEquals("PID-21|motherId^^^&1.2.3.4.5&ISO", rendered.get(7));
414 assertEquals("PID-26|Greenland~New Guinea", rendered.get(8));
415 }
416
417 }