package ca.uhn.fhir.jpa.provider; import static java.util.Collections.addAll; import static org.junit.Assert.assertEquals; import org.junit.AfterClass; import org.junit.Test; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.jpa.dao.SearchParameterMap; import ca.uhn.fhir.jpa.dao.SearchParameterMap.EverythingModeEnum; import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; import ca.uhn.fhir.rest.param.*; import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.UrlUtil; public class SearchParameterMapTest { @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } private static FhirContext ourCtx = FhirContext.forDstu3(); @Test public void testToQueryStringAndOr() { SearchParameterMap map = new SearchParameterMap(); StringAndListParam familyAnd = new StringAndListParam() .addAnd(new StringOrListParam().add(new StringParam("ZZZ?").setExact(true))) .addAnd(new StringOrListParam().add(new StringParam("homer")).add(new StringParam("jay"))) .addAnd(new StringOrListParam().add(new StringParam("simpson")).add(new StringParam("bouvier"))); map.add("name", familyAnd); DateAndListParam birthdateAnd = new DateAndListParam() .addAnd(new DateOrListParam().add(new DateParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, "2001"))) .addAnd(new DateOrListParam().add(new DateParam(ParamPrefixEnum.LESSTHAN, "2002"))); map.add("birthdate", birthdateAnd); String queryString = map.toNormalizedQueryString(ourCtx); ourLog.info(queryString); assertEquals("?birthdate=ge2001&birthdate=lt2002&name=bouvier,simpson&name=homer,jay&name:exact=ZZZ%3F", queryString); assertEquals("?birthdate=ge2001&birthdate=lt2002&name=bouvier,simpson&name=homer,jay&name:exact=ZZZ?", UrlUtil.unescape(queryString)); } @Test public void testToQueryStringEmpty() { SearchParameterMap map = new SearchParameterMap(); String queryString = map.toNormalizedQueryString(ourCtx); ourLog.info(queryString); assertEquals("?", queryString); assertEquals("?", UrlUtil.unescape(queryString)); } @Test public void testToQueryStringInclude() { SearchParameterMap map = new SearchParameterMap(); map.add("birthdate", new DateParam(ParamPrefixEnum.APPROXIMATE, "2011")); map.addInclude(new Include("Patient:subject")); map.addInclude(new Include("Patient:aartvark", true)); map.addInclude(new Include("Patient:aartvark:z")); map.addInclude(new Include("Patient:aartvark:a")); String queryString = map.toNormalizedQueryString(ourCtx); ourLog.info(queryString); ourLog.info(UrlUtil.unescape(queryString)); assertEquals("?birthdate=ap2011&_include=Patient:aartvark&_include=Patient:aartvark:a&_include=Patient:aartvark:z&_include=Patient:subject", queryString); assertEquals("?birthdate=ap2011&_include=Patient:aartvark&_include=Patient:aartvark:a&_include=Patient:aartvark:z&_include=Patient:subject", UrlUtil.unescape(queryString)); } @Test public void testToQueryStringRevInclude() { SearchParameterMap map = new SearchParameterMap(); map.add("birthdate", new DateParam(ParamPrefixEnum.APPROXIMATE, "2011")); map.addRevInclude(new Include("Patient:subject")); map.addRevInclude(new Include("Patient:aartvark", true)); map.addRevInclude(new Include("Patient:aartvark:z")); map.addRevInclude(new Include("Patient:aartvark:a")); String queryString = map.toNormalizedQueryString(ourCtx); ourLog.info(queryString); ourLog.info(UrlUtil.unescape(queryString)); assertEquals("?birthdate=ap2011&_revinclude=Patient:aartvark&_revinclude=Patient:aartvark:a&_revinclude=Patient:aartvark:z&_revinclude=Patient:subject", queryString); assertEquals("?birthdate=ap2011&_revinclude=Patient:aartvark&_revinclude=Patient:aartvark:a&_revinclude=Patient:aartvark:z&_revinclude=Patient:subject", UrlUtil.unescape(queryString)); } @Test public void testToQueryStringSort() { SearchParameterMap map = new SearchParameterMap(); TokenAndListParam tokenAnd = new TokenAndListParam() .addAnd(new TokenOrListParam().add(new TokenParam("SYS", "|VAL"))); // | needs escaping map.add("identifier", tokenAnd); map.setSort(new SortSpec("name").setChain(new SortSpec("identifier", SortOrderEnum.DESC))); String queryString = map.toNormalizedQueryString(ourCtx); ourLog.info(queryString); ourLog.info(UrlUtil.unescape(queryString)); assertEquals("?identifier=SYS%7C%5C%7CVAL&_sort=name,-identifier", queryString); assertEquals("?identifier=SYS|\\|VAL&_sort=name,-identifier", UrlUtil.unescape(queryString)); } private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SearchParameterMapTest.class); /** * {@link Search} uses these ordinals so they shouldn't get out of order */ @Test public void testEverythingOrdinals() { assertEquals(0, EverythingModeEnum.ENCOUNTER_INSTANCE.ordinal()); assertEquals(1, EverythingModeEnum.ENCOUNTER_TYPE.ordinal()); assertEquals(2, EverythingModeEnum.PATIENT_INSTANCE.ordinal()); assertEquals(3, EverythingModeEnum.PATIENT_TYPE.ordinal()); } }