View Javadoc
1   /*
2    * Copyright 2017 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * @author Dmytro Rud
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          // clear the list
86          while (rawIterator.hasNext()) {
87              rawIterator.next();
88              rawIterator.remove();
89          }
90          assertFalse(rawIterator.hasNext());
91  
92          // fill the list with some values
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          // check using other iterator type
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         // check rendering
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         // clear the list
121         while (xdsIterator.hasNext()) {
122             xdsIterator.next();
123             xdsIterator.remove();
124         }
125         assertFalse(xdsIterator.hasNext());
126 
127         // fill the list with some values
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         // check using other iterator type
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         // clear the list
150         while (rawIterator.hasNext()) {
151             rawIterator.next();
152             rawIterator.remove();
153         }
154         assertFalse(rawIterator.hasNext());
155 
156         // fill the list with some values
157         rawIterator.add("");
158         rawIterator.add(null);
159         rawIterator.add("20010203040506");
160 
161         // check
162         assertEquals(null, patientInfo.getDateOfBirth());
163         List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-7", 1);
164         assertEquals("PID-7|~~20010203040506", renderedStrings.get(0));
165 
166         // delete the first value and check again
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         // delete the first value and check again
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         // clear the list
191         while (rawIterator.hasNext()) {
192             rawIterator.next();
193             rawIterator.remove();
194         }
195         assertFalse(rawIterator.hasNext());
196 
197         // fill the list with some values
198         rawIterator.add("");
199         rawIterator.add(null);
200         rawIterator.add("20010203040506");
201 
202         // overwrite the value using metadata mechanisms 1
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         // overwrite the value using metadata mechanisms 2
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         // overwrite the value using metadata mechanisms 3
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         // overwrite the value using metadata mechanisms 4
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         // clear the list
241         while (rawIterator.hasNext()) {
242             rawIterator.next();
243             rawIterator.remove();
244         }
245         assertFalse(rawIterator.hasNext());
246 
247         // fill the list with some values
248         rawIterator.add("");
249         rawIterator.add(null);
250         rawIterator.add("M");
251 
252         // check
253         assertEquals(null, patientInfo.getGender());
254         List<String> renderedStrings = getRenderedStrings(patientInfo, "PID-8", 1);
255         assertEquals("PID-8|~~M", renderedStrings.get(0));
256 
257         // delete the first value and check again
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         // delete the first value and check again
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         // clear the list
282         while (rawIterator.hasNext()) {
283             rawIterator.next();
284             rawIterator.remove();
285         }
286         assertFalse(rawIterator.hasNext());
287 
288         // fill the list with some values
289         rawIterator.add("");
290         rawIterator.add(null);
291         rawIterator.add("M");
292 
293         // overwrite the value using metadata mechanisms 1
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         // overwrite the value using metadata mechanisms 2
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         // overwrite the value using metadata mechanisms 3
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         // clear the list
325         while (xdsIterator.hasNext()) {
326             xdsIterator.next();
327             xdsIterator.remove();
328         }
329         assertFalse(xdsIterator.hasNext());
330 
331         // fill the list with some values
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         // check using other iterator type
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         // modify values in place -- shall be NOT propagated to HL7 strings
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         // modify values by calling xdsIterator.set() -- SHALL be propagated to HL7 strings
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         // standard fields
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         // custom fields
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         // do not add any ethnic group, the call was just to create an empty entry
396 
397         ListIterator<String> motherIdentifiers = patientInfo.getHl7FieldIterator("PID-21");
398         motherIdentifiers.add("motherId^^^&1.2.3.4.5&ISO");
399 
400         // check toString() -- the fields must be in proper order, and without PID-22
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         // check HL7 rendering -- the fields must be in proper order, and without PID-22
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 }