Compare commits
12 Commits
65c4cb55f4
...
7b8c452d58
Author | SHA1 | Date |
---|---|---|
Martha Mitran | 7b8c452d58 | |
Thomas Papke | 3f6d1eb29b | |
Tadgh | 377e44b6ca | |
Martha Mitran | 20d3e6bb25 | |
Martha Mitran | 80519bf0c4 | |
Martha Mitran | d3b1d75dce | |
Martha Mitran | 3ccb548036 | |
Martha Mitran | 3885690716 | |
Martha Mitran | be1d3fac76 | |
Martha Mitran | 5ed382228d | |
Martha Mitran | 49d209823f | |
Martha Mitran | 15497e39a9 |
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
type: fix
|
||||
issue: 6290
|
||||
title: "Previously, a specific migration task was using the `TRIM()` function, which does not exist in MSSQL 2012. This was causing migrations targeting MSSQL 2012 to fail.
|
||||
This has been corrected and replaced with usage of a combination of LTRIM() and RTRIM(). Thanks to Primož Delopst at Better for the contribution!"
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
type: fix
|
||||
issue: 6305
|
||||
title: "Previously, when having StorageSettings#getIndexMissingFields() == IndexEnabledEnum.DISABLED (default value)
|
||||
and attempting to search with the missing qualifier against a resource type with multiple search parameters of type reference,
|
||||
the returned results would be incorrect. This has been fixed."
|
|
@ -800,14 +800,19 @@ public class ResourceLinkPredicateBuilder extends BaseJoiningPredicateBuilder im
|
|||
subquery.addCustomColumns(1);
|
||||
subquery.addFromTable(getTable());
|
||||
|
||||
String resourceType = theParams.getResourceTablePredicateBuilder().getResourceType();
|
||||
RuntimeSearchParam paramDefinition =
|
||||
mySearchParamRegistry.getRuntimeSearchParam(resourceType, theParams.getParamName());
|
||||
List<String> pathList = paramDefinition.getPathsSplitForResourceType(resourceType);
|
||||
|
||||
Condition subQueryCondition = ComboCondition.and(
|
||||
BinaryCondition.equalTo(
|
||||
getResourceIdColumn(),
|
||||
theParams.getResourceTablePredicateBuilder().getResourceIdColumn()),
|
||||
BinaryCondition.equalTo(
|
||||
getResourceTypeColumn(),
|
||||
generatePlaceholder(
|
||||
theParams.getResourceTablePredicateBuilder().getResourceType())));
|
||||
BinaryCondition.equalTo(getResourceTypeColumn(), generatePlaceholder(resourceType)),
|
||||
ComboCondition.or(pathList.stream()
|
||||
.map(path -> BinaryCondition.equalTo(getColumnSourcePath(), generatePlaceholder(path)))
|
||||
.toArray(BinaryCondition[]::new)));
|
||||
|
||||
subquery.addCondition(subQueryCondition);
|
||||
|
||||
|
|
|
@ -70,6 +70,11 @@
|
|||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.mail</groupId>
|
||||
<artifactId>jakarta.mail-api</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- test dependencies -->
|
||||
<dependency>
|
||||
|
|
|
@ -28,8 +28,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
|
|
@ -17,8 +17,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
|
|
@ -26,8 +26,8 @@ import org.junit.jupiter.api.Test;
|
|||
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -217,7 +217,7 @@ import static org.mockito.Mockito.when;
|
|||
public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderR4Test.class);
|
||||
private SearchCoordinatorSvcImpl mySearchCoordinatorSvcRaw;
|
||||
private CapturingInterceptor myCapturingInterceptor = new CapturingInterceptor();
|
||||
private final CapturingInterceptor myCapturingInterceptor = new CapturingInterceptor();
|
||||
@Autowired
|
||||
private ISearchDao mySearchEntityDao;
|
||||
|
||||
|
@ -413,15 +413,15 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient pt1 = new Patient();
|
||||
pt1.addName().setFamily("Elizabeth");
|
||||
String pt1id = myPatientDao.create(pt1).getId().toUnqualifiedVersionless().getValue();
|
||||
String pt1id = myPatientDao.create(pt1, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Patient pt2 = new Patient();
|
||||
pt2.addName().setFamily("fghijk");
|
||||
String pt2id = myPatientDao.create(pt2).getId().toUnqualifiedVersionless().getValue();
|
||||
String pt2id = myPatientDao.create(pt2, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Patient pt3 = new Patient();
|
||||
pt3.addName().setFamily("zzzzz");
|
||||
myPatientDao.create(pt3).getId().toUnqualifiedVersionless().getValue();
|
||||
myPatientDao.create(pt3, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
|
||||
Bundle output = myClient
|
||||
|
@ -450,7 +450,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient pt1 = new Patient();
|
||||
pt1.addName().setFamily("Smith%");
|
||||
String pt1id = myPatientDao.create(pt1).getId().toUnqualifiedVersionless().getValue();
|
||||
String pt1id = myPatientDao.create(pt1, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Bundle output = myClient
|
||||
.search()
|
||||
|
@ -463,7 +463,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient pt2 = new Patient();
|
||||
pt2.addName().setFamily("Sm%ith");
|
||||
String pt2id = myPatientDao.create(pt2).getId().toUnqualifiedVersionless().getValue();
|
||||
String pt2id = myPatientDao.create(pt2, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
output = myClient
|
||||
.search()
|
||||
|
@ -740,7 +740,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient p = new Patient();
|
||||
p.addName().setFamily("FAM").addGiven("GIV");
|
||||
IIdType id = myPatientDao.create(p).getId();
|
||||
IIdType id = myPatientDao.create(p, mySrd).getId();
|
||||
|
||||
myClient.read().resource("Patient").withId(id.toUnqualifiedVersionless()).execute();
|
||||
|
||||
|
@ -763,7 +763,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient p = new Patient();
|
||||
p.addName().setFamily("FAM").addGiven("GIV");
|
||||
IIdType id = myPatientDao.create(p).getId().toUnqualifiedVersionless();
|
||||
IIdType id = myPatientDao.create(p, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
myClient
|
||||
.delete()
|
||||
|
@ -1025,57 +1025,58 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
public void testCreateAndReadBackResourceWithContainedReferenceToContainer() {
|
||||
myFhirContext.setParserErrorHandler(new StrictErrorHandler());
|
||||
|
||||
String input = "{\n" +
|
||||
" \"resourceType\": \"Organization\",\n" +
|
||||
" \"id\": \"1\",\n" +
|
||||
" \"meta\": {\n" +
|
||||
" \"tag\": [\n" +
|
||||
" {\n" +
|
||||
" \"system\": \"https://blah.org/deployment\",\n" +
|
||||
" \"code\": \"e69414dd-b5c2-462d-bcfd-9d04d6b16596\",\n" +
|
||||
" \"display\": \"DEPLOYMENT\"\n" +
|
||||
" },\n" +
|
||||
" {\n" +
|
||||
" \"system\": \"https://blah.org/region\",\n" +
|
||||
" \"code\": \"b47d7a5b-b159-4bed-a8f8-3258e6603adb\",\n" +
|
||||
" \"display\": \"REGION\"\n" +
|
||||
" },\n" +
|
||||
" {\n" +
|
||||
" \"system\": \"https://blah.org/provider\",\n" +
|
||||
" \"code\": \"28c30004-0333-40cf-9e7f-3f9e080930bd\",\n" +
|
||||
" \"display\": \"PROVIDER\"\n" +
|
||||
" }\n" +
|
||||
" ]\n" +
|
||||
" },\n" +
|
||||
" \"contained\": [\n" +
|
||||
" {\n" +
|
||||
" \"resourceType\": \"Location\",\n" +
|
||||
" \"id\": \"2\",\n" +
|
||||
" \"position\": {\n" +
|
||||
" \"longitude\": 51.443238301454289,\n" +
|
||||
" \"latitude\": 7.34196905697293\n" +
|
||||
" },\n" +
|
||||
" \"managingOrganization\": {\n" +
|
||||
" \"reference\": \"#\"\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"type\": [\n" +
|
||||
" {\n" +
|
||||
" \"coding\": [\n" +
|
||||
" {\n" +
|
||||
" \"system\": \"https://blah.org/fmc/OrganizationType\",\n" +
|
||||
" \"code\": \"CLINIC\",\n" +
|
||||
" \"display\": \"Clinic\"\n" +
|
||||
" }\n" +
|
||||
" ]\n" +
|
||||
" }\n" +
|
||||
" ],\n" +
|
||||
" \"name\": \"testOrg\"\n" +
|
||||
"}";
|
||||
String input = """
|
||||
{
|
||||
"resourceType": "Organization",
|
||||
"id": "1",
|
||||
"meta": {
|
||||
"tag": [
|
||||
{
|
||||
"system": "https://blah.org/deployment",
|
||||
"code": "e69414dd-b5c2-462d-bcfd-9d04d6b16596",
|
||||
"display": "DEPLOYMENT"
|
||||
},
|
||||
{
|
||||
"system": "https://blah.org/region",
|
||||
"code": "b47d7a5b-b159-4bed-a8f8-3258e6603adb",
|
||||
"display": "REGION"
|
||||
},
|
||||
{
|
||||
"system": "https://blah.org/provider",
|
||||
"code": "28c30004-0333-40cf-9e7f-3f9e080930bd",
|
||||
"display": "PROVIDER"
|
||||
}
|
||||
]
|
||||
},
|
||||
"contained": [
|
||||
{
|
||||
"resourceType": "Location",
|
||||
"id": "2",
|
||||
"position": {
|
||||
"longitude": 51.443238301454289,
|
||||
"latitude": 7.34196905697293
|
||||
},
|
||||
"managingOrganization": {
|
||||
"reference": "#"
|
||||
}
|
||||
}
|
||||
],
|
||||
"type": [
|
||||
{
|
||||
"coding": [
|
||||
{
|
||||
"system": "https://blah.org/fmc/OrganizationType",
|
||||
"code": "CLINIC",
|
||||
"display": "Clinic"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"name": "testOrg"
|
||||
}""";
|
||||
|
||||
Organization org = myFhirContext.newJsonParser().parseResource(Organization.class, input);
|
||||
IIdType id = myOrganizationDao.create(org).getId();
|
||||
IIdType id = myOrganizationDao.create(org, mySrd).getId();
|
||||
org = myOrganizationDao.read(id);
|
||||
|
||||
String output = myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(org);
|
||||
|
@ -1095,9 +1096,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
}
|
||||
List<IBaseResource> outcome = myClient.transaction().withResources(resources).prettyPrint().encodedXml().execute();
|
||||
|
||||
runInTransaction(() -> {
|
||||
assertEquals(100, myResourceTableDao.count());
|
||||
});
|
||||
runInTransaction(() -> assertEquals(100, myResourceTableDao.count()));
|
||||
|
||||
Bundle found = myClient
|
||||
.search()
|
||||
|
@ -1306,7 +1305,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testCreateQuestionnaireResponseWithValidation() throws IOException {
|
||||
public void testCreateQuestionnaireResponseWithValidation() {
|
||||
CodeSystem cs = new CodeSystem();
|
||||
cs.setUrl("http://cs");
|
||||
cs.setStatus(Enumerations.PublicationStatus.ACTIVE);
|
||||
|
@ -1906,8 +1905,8 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
* Try it with a raw socket call. The Apache client won't let us use the unescaped "|" in the URL but we want to make sure that works too..
|
||||
*/
|
||||
Socket sock = new Socket();
|
||||
sock.setSoTimeout(3000);
|
||||
try {
|
||||
try (sock) {
|
||||
sock.setSoTimeout(3000);
|
||||
sock.connect(new InetSocketAddress("localhost", myPort));
|
||||
sock.getOutputStream().write(("DELETE /fhir/context/Patient?identifier=http://ghh.org/patient|" + methodName + " HTTP/1.1\n").getBytes(StandardCharsets.UTF_8));
|
||||
sock.getOutputStream().write("Host: localhost\n".getBytes(StandardCharsets.UTF_8));
|
||||
|
@ -1915,7 +1914,6 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
BufferedReader socketInput = new BufferedReader(new InputStreamReader(sock.getInputStream()));
|
||||
|
||||
// String response = "";
|
||||
StringBuilder b = new StringBuilder();
|
||||
char[] buf = new char[1000];
|
||||
while (socketInput.read(buf) != -1) {
|
||||
|
@ -1925,9 +1923,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
ourLog.debug("Resp: {}", resp);
|
||||
} catch (SocketTimeoutException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
sock.close();
|
||||
ourLog.debug(e.getMessage(), e);
|
||||
}
|
||||
|
||||
Thread.sleep(1000);
|
||||
|
@ -2398,7 +2394,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
assertThat(idValues).as(idValues.toString()).hasSize(10);
|
||||
|
||||
idValues = searchAndReturnUnqualifiedIdValues(myServerBase + "/_history?_at=gt" + InstantDt.withCurrentTime().getYear());
|
||||
assertThat(idValues).hasSize(0);
|
||||
assertThat(idValues).isEmpty();
|
||||
}
|
||||
|
||||
|
||||
|
@ -2427,7 +2423,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
myMemoryCacheService.invalidateCaches(MemoryCacheService.CacheEnum.PID_TO_FORCED_ID);
|
||||
}
|
||||
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).andReturnBundle(Bundle.class).execute();
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).returnBundle(Bundle.class).execute();
|
||||
assertEquals(1, history.getEntry().size());
|
||||
BundleEntryComponent historyEntry0 = history.getEntry().get(0);
|
||||
// validate entry.fullUrl
|
||||
|
@ -2476,7 +2472,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
myMemoryCacheService.invalidateCaches(MemoryCacheService.CacheEnum.PID_TO_FORCED_ID);
|
||||
}
|
||||
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).andReturnBundle(Bundle.class).execute();
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).returnBundle(Bundle.class).execute();
|
||||
assertEquals(1, history.getEntry().size());
|
||||
BundleEntryComponent historyEntry0 = history.getEntry().get(0);
|
||||
// validate entry.fullUrl
|
||||
|
@ -2508,7 +2504,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
ourLog.info("Res ID: {}", id);
|
||||
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).andReturnBundle(Bundle.class).prettyPrint().summaryMode(SummaryEnum.DATA).execute();
|
||||
Bundle history = myClient.history().onInstance(id.getValue()).returnBundle(Bundle.class).prettyPrint().summaryMode(SummaryEnum.DATA).execute();
|
||||
assertThat(history.getEntry()).hasSize(3);
|
||||
assertEquals(id.withVersion("3").getValue(), history.getEntry().get(0).getResource().getId());
|
||||
assertThat(((Patient) history.getEntry().get(0).getResource()).getName()).hasSize(1);
|
||||
|
@ -2746,7 +2742,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
int total = 20;
|
||||
Organization org = new Organization();
|
||||
org.setName("ORG");
|
||||
IIdType orgId = myOrganizationDao.create(org).getId().toUnqualifiedVersionless();
|
||||
IIdType orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Coding tagCode = new Coding();
|
||||
tagCode.setCode("test");
|
||||
|
@ -2757,7 +2753,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
.addTag(tagCode);
|
||||
t.setStatus(Task.TaskStatus.REQUESTED);
|
||||
t.getOwner().setReference(orgId.getValue());
|
||||
myTaskDao.create(t);
|
||||
myTaskDao.create(t, mySrd);
|
||||
}
|
||||
HashSet<String> ids = new HashSet<>();
|
||||
|
||||
|
@ -2835,12 +2831,12 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
if (orgCount > 0) {
|
||||
Organization org = new Organization();
|
||||
org.setName("ORG");
|
||||
IIdType orgId = myOrganizationDao.create(org).getId().toUnqualifiedVersionless();
|
||||
IIdType orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
orgCount--;
|
||||
t.getOwner().setReference(orgId.getValue());
|
||||
}
|
||||
myTaskDao.create(t);
|
||||
myTaskDao.create(t, mySrd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2909,12 +2905,12 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
if (orgCount > 0) {
|
||||
Organization org = new Organization();
|
||||
org.setName("ORG");
|
||||
IIdType orgId = myOrganizationDao.create(org).getId().toUnqualifiedVersionless();
|
||||
IIdType orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
orgCount--;
|
||||
t.getOwner().setReference(orgId.getValue());
|
||||
}
|
||||
myTaskDao.create(t);
|
||||
myTaskDao.create(t, mySrd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2961,13 +2957,13 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
public void testIncludeCountDoesntIncludeIncludes() {
|
||||
Organization org = new Organization();
|
||||
org.setName("ORG");
|
||||
IIdType orgId = myOrganizationDao.create(org).getId().toUnqualifiedVersionless();
|
||||
IIdType orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
Patient pt = new Patient();
|
||||
pt.getManagingOrganization().setReference(orgId.getValue());
|
||||
pt.addName().setFamily("FAM" + i);
|
||||
myPatientDao.create(pt);
|
||||
myPatientDao.create(pt, mySrd);
|
||||
}
|
||||
|
||||
Bundle bundle = myClient
|
||||
|
@ -3168,7 +3164,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient newPt = myClient.read().resource(Patient.class).withId(pid1.getIdPart()).execute();
|
||||
assertEquals("2", newPt.getIdElement().getVersionIdPart());
|
||||
assertEquals(false, newPt.getActive());
|
||||
assertFalse(newPt.getActive());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -3196,7 +3192,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient newPt = myClient.read().resource(Patient.class).withId(pid1.getIdPart()).execute();
|
||||
assertEquals("1", newPt.getIdElement().getVersionIdPart());
|
||||
assertEquals(true, newPt.getActive());
|
||||
assertTrue(newPt.getActive());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -3226,7 +3222,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient newPt = myClient.read().resource(Patient.class).withId(pid1.getIdPart()).execute();
|
||||
assertEquals("2", newPt.getIdElement().getVersionIdPart());
|
||||
assertEquals(false, newPt.getActive());
|
||||
assertFalse(newPt.getActive());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -3255,7 +3251,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
Patient newPt = myClient.read().resource(Patient.class).withId(pid1.getIdPart()).execute();
|
||||
assertEquals("2", newPt.getIdElement().getVersionIdPart());
|
||||
assertEquals(false, newPt.getActive());
|
||||
assertFalse(newPt.getActive());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -3323,12 +3319,12 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
{
|
||||
Bundle returned = myClient.search().forResource(Patient.class).encodedXml().returnBundle(Bundle.class).execute();
|
||||
assertThat(returned.getEntry().size()).isGreaterThan(1);
|
||||
assertThat(returned.getEntry()).hasSizeGreaterThan(1);
|
||||
assertEquals(BundleType.SEARCHSET, returned.getType());
|
||||
}
|
||||
{
|
||||
Bundle returned = myClient.search().forResource(Patient.class).encodedJson().returnBundle(Bundle.class).execute();
|
||||
assertThat(returned.getEntry().size()).isGreaterThan(1);
|
||||
assertThat(returned.getEntry()).hasSizeGreaterThan(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3350,7 +3346,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
}
|
||||
});
|
||||
|
||||
Bundle bundle = myClient.history().onServer().andReturnBundle(Bundle.class).execute();
|
||||
Bundle bundle = myClient.history().onServer().returnBundle(Bundle.class).execute();
|
||||
assertEquals(1, bundle.getTotal());
|
||||
assertThat(bundle.getEntry()).hasSize(1);
|
||||
assertEquals(id2.getIdPart(), bundle.getEntry().get(0).getResource().getIdElement().getIdPart());
|
||||
|
@ -3507,15 +3503,6 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
assertThat(text).doesNotContain("\"B\"");
|
||||
assertThat(text).doesNotContain("\"B1\"");
|
||||
}
|
||||
|
||||
|
||||
// HttpGet read = new HttpGet(ourServerBase + "/Observation?patient=P5000000302&_sort:desc=code&code:in=http://fkcfhir.org/fhir/vs/ccdacapddialysisorder");
|
||||
// try (CloseableHttpResponse response = ourHttpClient.execute(read)) {
|
||||
// String text = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
|
||||
// ourLog.info(text);
|
||||
// assertEquals(Constants.STATUS_HTTP_200_OK, response.getStatusLine().getStatusCode());
|
||||
// assertThat(text).doesNotContain("\"text\",\"type\"");
|
||||
// }
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -3873,9 +3860,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
p.addName().setFamily(methodName + "1");
|
||||
IIdType pid1 = myClient.create().resource(p).execute().getId().toUnqualifiedVersionless();
|
||||
|
||||
Thread.sleep(10);
|
||||
long time1 = System.currentTimeMillis();
|
||||
Thread.sleep(10);
|
||||
|
||||
Patient p2 = new Patient();
|
||||
p2.addName().setFamily(methodName + "2");
|
||||
|
@ -4064,9 +4049,6 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
public void testSearchLastUpdatedParamRp() throws InterruptedException {
|
||||
String methodName = "testSearchLastUpdatedParamRp";
|
||||
|
||||
int sleep = 100;
|
||||
Thread.sleep(sleep);
|
||||
|
||||
DateTimeType beforeAny = new DateTimeType(new Date(), TemporalPrecisionEnum.MILLI);
|
||||
IIdType id1a;
|
||||
{
|
||||
|
@ -4083,9 +4065,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
id1b = myClient.create().resource(patient).execute().getId().toUnqualifiedVersionless();
|
||||
}
|
||||
|
||||
Thread.sleep(1100);
|
||||
DateTimeType beforeR2 = new DateTimeType(new Date(), TemporalPrecisionEnum.MILLI);
|
||||
Thread.sleep(1100);
|
||||
|
||||
IIdType id2;
|
||||
{
|
||||
|
@ -4249,13 +4229,12 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
Bundle bundle = myFhirContext.newXmlParser().parseResource(Bundle.class, resp);
|
||||
matches = bundle.getEntry().size();
|
||||
|
||||
assertThat(matches).isGreaterThan(0);
|
||||
assertThat(matches).isPositive();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchReturnsSearchDate() throws Exception {
|
||||
Date before = new Date();
|
||||
Thread.sleep(1);
|
||||
|
||||
//@formatter:off
|
||||
Bundle found = myClient
|
||||
|
@ -4266,7 +4245,6 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
.execute();
|
||||
//@formatter:on
|
||||
|
||||
Thread.sleep(1);
|
||||
Date after = new Date();
|
||||
|
||||
InstantType updated = found.getMeta().getLastUpdatedElement();
|
||||
|
@ -4300,7 +4278,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4313,7 +4291,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4326,7 +4304,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4339,24 +4317,24 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
// > 1m
|
||||
String uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt1|http://unitsofmeasure.org|m");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
List<String> ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(3);
|
||||
|
||||
//>= 100cm
|
||||
uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt100|http://unitsofmeasure.org|cm");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(3);
|
||||
|
||||
//>= 10dm
|
||||
uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt10|http://unitsofmeasure.org|dm");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(3);
|
||||
}
|
||||
|
@ -4381,7 +4359,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4392,7 +4370,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4403,7 +4381,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4414,7 +4392,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
String uri;
|
||||
|
@ -4451,7 +4429,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4462,7 +4440,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -4474,7 +4452,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
myCaptureQueriesListener.clear();
|
||||
|
@ -4490,8 +4468,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
//-- check use normalized quantity table to search
|
||||
String searchSql = myCaptureQueriesListener.getSelectQueries().get(0).getSql(true, true);
|
||||
assertThat(searchSql).doesNotContain("HFJ_SPIDX_QUANTITY t0");
|
||||
assertThat(searchSql).contains("HFJ_SPIDX_QUANTITY_NRML");
|
||||
assertThat(searchSql).doesNotContain("HFJ_SPIDX_QUANTITY t0").contains("HFJ_SPIDX_QUANTITY_NRML");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -5044,7 +5021,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid1 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5056,7 +5033,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid2 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5068,7 +5045,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid3 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5080,7 +5057,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid4 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
String uri = myServerBase + "/Observation?_sort=code-value-quantity";
|
||||
|
@ -5092,7 +5069,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
found = myFhirContext.newXmlParser().parseResource(Bundle.class, output);
|
||||
}
|
||||
|
||||
ourLog.debug("Bundle: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(found));
|
||||
ourLog.debug("Bundle: {}\n", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(found));
|
||||
|
||||
List<IIdType> list = toUnqualifiedVersionlessIds(found);
|
||||
assertThat(found.getEntry()).hasSize(4);
|
||||
|
@ -5129,7 +5106,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid1 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5145,7 +5122,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid2 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5161,7 +5138,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
oid3 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -5176,7 +5153,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
comp.setValue(new Quantity().setValue(250));
|
||||
oid4 = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
String uri = myServerBase + "/Observation?_sort=combo-code-value-quantity";
|
||||
|
@ -5188,7 +5165,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
found = myFhirContext.newXmlParser().parseResource(Bundle.class, output);
|
||||
}
|
||||
|
||||
ourLog.debug("Bundle: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(found));
|
||||
ourLog.debug("Bundle: {}\n", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(found));
|
||||
|
||||
List<IIdType> list = toUnqualifiedVersionlessIds(found);
|
||||
assertThat(found.getEntry()).hasSize(4);
|
||||
|
@ -5264,9 +5241,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
List<IIdType> list = toUnqualifiedVersionlessIds(found);
|
||||
ourLog.info(methodName + " found: " + list.toString() + " - Wanted " + orgMissing + " but not " + orgNotMissing);
|
||||
assertThat(list).doesNotContain(orgNotMissing);
|
||||
assertThat(list).doesNotContain(deletedIdMissingTrue);
|
||||
assertThat(list).contains(orgMissing);
|
||||
assertThat(list).doesNotContain(orgNotMissing).doesNotContain(deletedIdMissingTrue).contains(orgMissing);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -5927,7 +5902,6 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
}
|
||||
|
||||
Date before = new Date();
|
||||
Thread.sleep(100);
|
||||
|
||||
pt = new Patient();
|
||||
pt.setId(id.getIdPart());
|
||||
|
@ -6450,7 +6424,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
cc.addCoding().setCode("2345-7").setSystem("http://loinc.org");
|
||||
obs.setValue(new Quantity().setValueElement(new DecimalType(125.12)).setUnit("CM").setSystem(UcumServiceUtil.UCUM_CODESYSTEM_URL).setCode("cm"));
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
|
||||
IIdType opid1 = myObservationDao.create(obs, mySrd).getId();
|
||||
|
||||
|
@ -6463,7 +6437,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
cc.addCoding().setCode("2345-7").setSystem("http://loinc.org");
|
||||
obs.setValue(new Quantity().setValueElement(new DecimalType(24.12)).setUnit("CM").setSystem(UcumServiceUtil.UCUM_CODESYSTEM_URL).setCode("cm"));
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
|
||||
myObservationDao.update(obs, mySrd);
|
||||
}
|
||||
|
@ -6479,7 +6453,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -6492,7 +6466,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -6505,25 +6479,25 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
|
||||
myObservationDao.create(obs, mySrd);
|
||||
|
||||
ourLog.debug("Observation: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
ourLog.debug("Observation: {}", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(obs));
|
||||
}
|
||||
|
||||
// > 1m
|
||||
String uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt1|http://unitsofmeasure.org|m");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
List<String> ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(2);
|
||||
|
||||
|
||||
//>= 100cm
|
||||
uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt100|http://unitsofmeasure.org|cm");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(2);
|
||||
|
||||
//>= 10dm
|
||||
uri = myServerBase + "/Observation?code-value-quantity=http://" + UrlUtil.escapeUrlParam("loinc.org|2345-7$gt10|http://unitsofmeasure.org|dm");
|
||||
ourLog.info("uri = " + uri);
|
||||
ourLog.info("uri = {}", uri);
|
||||
ids = searchAndReturnUnqualifiedVersionlessIdValues(uri);
|
||||
assertThat(ids).hasSize(2);
|
||||
}
|
||||
|
@ -6540,7 +6514,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
patient.setBirthDateElement(new DateType("2073"));
|
||||
pid0 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
ourLog.debug("Patient: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(patient));
|
||||
ourLog.debug("Patient: {}\n", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(patient));
|
||||
|
||||
ourLog.info("pid0 " + pid0);
|
||||
}
|
||||
|
@ -6553,7 +6527,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
String resp = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
|
||||
ourLog.info(resp);
|
||||
Bundle bundle = myFhirContext.newXmlParser().parseResource(Bundle.class, resp);
|
||||
ourLog.debug("Patient: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
||||
ourLog.debug("Patient: {}\n", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
||||
}
|
||||
|
||||
uri = myServerBase + "/Patient?_total=accurate&birthdate=gt2072-01-01";
|
||||
|
@ -6564,7 +6538,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
String resp = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8);
|
||||
ourLog.info(resp);
|
||||
Bundle bundle = myFhirContext.newXmlParser().parseResource(Bundle.class, resp);
|
||||
ourLog.debug("Patient: \n" + myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
||||
ourLog.debug("Patient: {}\n", myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(bundle));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6995,9 +6969,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
&& theInput.IsEnforceRefOnType
|
||||
&& theInput.IsEnforceRefOnWrite).isFalse();
|
||||
} catch (InvalidRequestException ex) {
|
||||
assertThat(ex.getMessage().contains(
|
||||
"Invalid resource reference"
|
||||
)).as(ex.getMessage()).isTrue();
|
||||
assertThat(ex.getMessage()).as(ex.getMessage()).contains("Invalid resource reference");
|
||||
} finally {
|
||||
myStorageSettings.setEnforceReferentialIntegrityOnWrite(isEnforceRefOnWrite);
|
||||
myStorageSettings.setEnforceReferenceTargetTypes(isEnforceRefTargetTypes);
|
||||
|
@ -7331,9 +7303,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
patient.setBirthDate(cal.getTime());
|
||||
}
|
||||
return patient;
|
||||
}, (isMissing) -> {
|
||||
return doSearch(Patient.class, Patient.BIRTHDATE.isMissing(isMissing));
|
||||
});
|
||||
}, (isMissing) -> doSearch(Patient.class, Patient.BIRTHDATE.isMissing(isMissing)));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -7346,9 +7316,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
patient.setGender(AdministrativeGender.FEMALE);
|
||||
}
|
||||
return patient;
|
||||
}, isMissing -> {
|
||||
return doSearch(Patient.class, Patient.GENDER.isMissing(isMissing));
|
||||
});
|
||||
}, isMissing -> doSearch(Patient.class, Patient.GENDER.isMissing(isMissing)));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -7364,9 +7332,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
patient.setGeneralPractitioner(Collections.singletonList(new Reference(practitionerId)));
|
||||
}
|
||||
return patient;
|
||||
}, isMissing -> {
|
||||
return doSearch(Patient.class, Patient.GENERAL_PRACTITIONER.isMissing(isMissing));
|
||||
});
|
||||
}, isMissing -> doSearch(Patient.class, Patient.GENERAL_PRACTITIONER.isMissing(isMissing)));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -7409,9 +7375,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
sp.setUrl("http://example.com");
|
||||
}
|
||||
return sp;
|
||||
}, isMissing -> {
|
||||
return doSearch(SearchParameter.class, SearchParameter.URL.isMissing(isMissing));
|
||||
});
|
||||
}, isMissing -> doSearch(SearchParameter.class, SearchParameter.URL.isMissing(isMissing)));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -7424,9 +7388,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
obs.setValue(new Quantity(3));
|
||||
}
|
||||
return obs;
|
||||
}, isMissing -> {
|
||||
return doSearch(Observation.class, Observation.VALUE_QUANTITY.isMissing(isMissing));
|
||||
});
|
||||
}, isMissing -> doSearch(Observation.class, Observation.VALUE_QUANTITY.isMissing(isMissing)));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -7457,7 +7419,7 @@ public class ResourceProviderR4Test extends BaseResourceProviderR4Test {
|
|||
Y doTask(X theInput);
|
||||
}
|
||||
|
||||
private static class MissingSearchTestParameters {
|
||||
public static class MissingSearchTestParameters {
|
||||
/**
|
||||
* The setting for IndexMissingFields
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,171 @@
|
|||
package ca.uhn.fhir.jpa.validation;
|
||||
|
||||
import ca.uhn.fhir.context.support.DefaultProfileValidationSupport;
|
||||
import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||
import ca.uhn.fhir.jpa.provider.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||
import ca.uhn.fhir.rest.server.interceptor.RequestValidatingInterceptor;
|
||||
import ca.uhn.fhir.validation.ResultSeverityEnum;
|
||||
import org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyService;
|
||||
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
|
||||
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||
import org.hl7.fhir.r4.model.Meta;
|
||||
import org.hl7.fhir.r4.model.Patient;
|
||||
import org.hl7.fhir.r4.model.StructureDefinition;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
public class EndpointResourceValidationR4Test extends BaseResourceProviderR4Test {
|
||||
private static final String myResourceType = "Patient";
|
||||
private final String myProfile = "http://example.org/fhir/StructureDefinition/TestPatient";
|
||||
private PrePopulatedValidationSupport myPrePopulatedValidationSupport;
|
||||
|
||||
@BeforeEach
|
||||
public void before() {
|
||||
CachingValidationSupport myValidationSupport = createCachingValidationSupport();
|
||||
FhirInstanceValidator fhirInstanceValidator = new FhirInstanceValidator(myValidationSupport);
|
||||
RequestValidatingInterceptor interceptor = new RequestValidatingInterceptor();
|
||||
interceptor.addValidatorModule(fhirInstanceValidator);
|
||||
interceptor.setFailOnSeverity(ResultSeverityEnum.ERROR);
|
||||
interceptor.setAddResponseHeaderOnSeverity(ResultSeverityEnum.INFORMATION);
|
||||
myServer.registerInterceptor(interceptor);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private CachingValidationSupport createCachingValidationSupport() {
|
||||
myPrePopulatedValidationSupport = new PrePopulatedValidationSupport(myFhirContext);
|
||||
ValidationSupportChain chain = new ValidationSupportChain(
|
||||
new DefaultProfileValidationSupport(myFhirContext),
|
||||
new SnapshotGeneratingValidationSupport(myFhirContext),
|
||||
new CommonCodeSystemsTerminologyService(myFhirContext),
|
||||
new InMemoryTerminologyServerValidationSupport(myFhirContext),
|
||||
myPrePopulatedValidationSupport);
|
||||
return new CachingValidationSupport(chain, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatientRequest_withProfileNotRegistered_unknownProfile() {
|
||||
createProfile(myProfile, "1", "Patient.identifier");
|
||||
|
||||
final Patient patient = new Patient();
|
||||
patient.setMeta(new Meta().addProfile(myProfile));
|
||||
|
||||
try {
|
||||
myClient.create().resource(patient).execute();
|
||||
fail();
|
||||
} catch (UnprocessableEntityException e) {
|
||||
assertEquals("HTTP 422 Unprocessable Entity: Profile reference '" + myProfile + "' has not been checked because it is unknown", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatientRequest_withProfileNoVersion_throwsExceptionWithLatestVersion() {
|
||||
createAndRegisterProfile("1", "Patient.identifier");
|
||||
createAndRegisterProfile("2", "Patient.name");
|
||||
|
||||
final Patient patient = new Patient();
|
||||
patient.setMeta(new Meta().addProfile(myProfile));
|
||||
|
||||
try {
|
||||
myClient.create().resource(patient).execute();
|
||||
fail();
|
||||
} catch (UnprocessableEntityException e) {
|
||||
assertEquals("HTTP 422 Unprocessable Entity: Patient.name: minimum required = 1, but only found 0 (from " + myProfile + "|2)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatientRequest_withProfileWithVersion_throwsExceptionWithSpecifiedVersion() {
|
||||
createAndRegisterProfile("1", "Patient.identifier");
|
||||
createAndRegisterProfile("2", "Patient.name");
|
||||
|
||||
final Patient patient = new Patient();
|
||||
patient.setMeta(new Meta().addProfile(myProfile + "|1"));
|
||||
|
||||
try {
|
||||
myClient.create().resource(patient).execute();
|
||||
fail();
|
||||
} catch (UnprocessableEntityException e) {
|
||||
assertEquals("HTTP 422 Unprocessable Entity: Patient.identifier: minimum required = 1, but only found 0 (from " + myProfile + "|1)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatientRequest_withMultipleProfiles_throwsExceptionWithFirstDeclaredProfile() {
|
||||
final String sdIdentifier = myProfile + "-identifier";
|
||||
final String sdName = myProfile + "-name";
|
||||
|
||||
createAndRegisterProfile(sdIdentifier, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(sdName, "1", "Patient.name");
|
||||
|
||||
final Patient patient = new Patient();
|
||||
patient.setMeta(new Meta().addProfile(sdIdentifier).addProfile(sdName));
|
||||
|
||||
try {
|
||||
myClient.create().resource(patient).execute();
|
||||
fail();
|
||||
} catch (UnprocessableEntityException e) {
|
||||
assertEquals("HTTP 422 Unprocessable Entity: Patient.identifier: minimum required = 1, but only found 0 (from " + sdIdentifier + "|1)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatientRequest_withMultipleVersions_throwsExceptionWithFirstDeclaredProfile() {
|
||||
createAndRegisterProfile(myProfile, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(myProfile, "2", "Patient.name");
|
||||
createAndRegisterProfile(myProfile, "3", "Patient.birthDate");
|
||||
|
||||
final Patient patient = new Patient();
|
||||
patient.setMeta(new Meta()
|
||||
.addProfile(myProfile + "|2")
|
||||
.addProfile(myProfile + "|1")
|
||||
.addProfile(myProfile + "|3"));
|
||||
|
||||
try {
|
||||
myClient.create().resource(patient).execute();
|
||||
fail();
|
||||
} catch (UnprocessableEntityException e) {
|
||||
assertEquals("HTTP 422 Unprocessable Entity: Patient.name: minimum required = 1, but only found 0 (from " + myProfile + "|2)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void createAndRegisterProfile(String theVersion, String thePath) {
|
||||
createAndRegisterProfile(myProfile, theVersion, thePath);
|
||||
}
|
||||
|
||||
private void createAndRegisterProfile(String theUrl, String theVersion, String thePath) {
|
||||
StructureDefinition sd = createProfile(theUrl, theVersion, thePath);
|
||||
myPrePopulatedValidationSupport.addStructureDefinition(sd);
|
||||
}
|
||||
|
||||
private StructureDefinition createProfile(String theUrl, String theVersion, String thePath) {
|
||||
final String baseProfile = "http://hl7.org/fhir/StructureDefinition/Patient";
|
||||
final String profileId = "TestProfile";
|
||||
|
||||
StructureDefinition sd = new StructureDefinition()
|
||||
.setUrl(theUrl).setVersion(theVersion)
|
||||
.setBaseDefinition(baseProfile)
|
||||
.setType(myResourceType)
|
||||
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||
sd.setId(profileId);
|
||||
sd.getDifferential().addElement()
|
||||
.setPath(thePath)
|
||||
.setMin(1)
|
||||
.setId(thePath);
|
||||
|
||||
DaoMethodOutcome outcome = myStructureDefinitionDao.update(sd, new SystemRequestDetails());
|
||||
assertNotNull(outcome.getResource());
|
||||
return (StructureDefinition) outcome.getResource();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,180 @@
|
|||
package ca.uhn.fhir.jpa.validation;
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.support.DefaultProfileValidationSupport;
|
||||
import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||
import ca.uhn.fhir.jpa.provider.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.validation.FhirValidator;
|
||||
import ca.uhn.fhir.validation.SingleValidationMessage;
|
||||
import ca.uhn.fhir.validation.ValidationResult;
|
||||
import org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyService;
|
||||
import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport;
|
||||
import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain;
|
||||
import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.hl7.fhir.r4.model.Patient;
|
||||
import org.hl7.fhir.r4.model.StructureDefinition;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
public class OnDemandResourceValidationR4Test extends BaseResourceProviderR4Test {
|
||||
private static final FhirContext ourCtx = FhirContext.forR4();
|
||||
private static final String myResourceType = "Patient";
|
||||
private final String myProfile = "http://example.org/fhir/StructureDefinition/TestPatient";
|
||||
|
||||
@Test
|
||||
public void testCreateStructureDefinition_createMultipleWithWithSameUrl_isStoredSuccessfully() {
|
||||
createProfile("1", "Patient.identifier");
|
||||
createProfile("2", "Patient.name");
|
||||
createProfile("3", "Patient.birthdate");
|
||||
}
|
||||
|
||||
private static FhirValidator myFhirValidator;
|
||||
private static PrePopulatedValidationSupport ourValidationSupport;
|
||||
|
||||
@BeforeEach
|
||||
public void before() {
|
||||
myFhirValidator = ourCtx.newValidator();
|
||||
myFhirValidator.setValidateAgainstStandardSchema(false);
|
||||
myFhirValidator.setValidateAgainstStandardSchematron(false);
|
||||
|
||||
ourValidationSupport = new PrePopulatedValidationSupport(ourCtx);
|
||||
|
||||
ValidationSupportChain chain = new ValidationSupportChain(
|
||||
new DefaultProfileValidationSupport(ourCtx),
|
||||
new SnapshotGeneratingValidationSupport(ourCtx),
|
||||
new CommonCodeSystemsTerminologyService(ourCtx),
|
||||
new InMemoryTerminologyServerValidationSupport(ourCtx),
|
||||
ourValidationSupport);
|
||||
CachingValidationSupport myValidationSupport = new CachingValidationSupport(chain, true);
|
||||
FhirInstanceValidator myInstanceVal = new FhirInstanceValidator(myValidationSupport);
|
||||
myFhirValidator.registerValidatorModule(myInstanceVal);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidatePatient_withProfileNotRegistered_unknownProfile() {
|
||||
createProfile(myProfile, "1", "Patient.identifier");
|
||||
|
||||
IIdType idType = createPatient(withProfile(myProfile));
|
||||
Patient patient = myPatientDao.read(idType, mySrd);
|
||||
|
||||
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||
assertFalse(validationResult.isSuccessful());
|
||||
assertEquals(1, validationResult.getMessages().size());
|
||||
|
||||
SingleValidationMessage message = validationResult.getMessages().iterator().next();
|
||||
assertEquals("Profile reference '" + myProfile + "' has not been checked because it is unknown", message.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidatePatient_withProfileNoVersion_shouldUsesLatestVersion() {
|
||||
createAndRegisterProfile(myProfile, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(myProfile, "2", "Patient.name");
|
||||
|
||||
IIdType idType = createPatient(withProfile(myProfile));
|
||||
Patient patient = myPatientDao.read(idType, mySrd);
|
||||
|
||||
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||
assertFalse(validationResult.isSuccessful());
|
||||
assertEquals(1, validationResult.getMessages().size());
|
||||
|
||||
SingleValidationMessage message = validationResult.getMessages().iterator().next();
|
||||
assertEquals("Patient.name: minimum required = 1, but only found 0 (from " + myProfile + "|2)", message.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidatePatient_withProfileWithVersion_shouldUseSpecifiedVersion() {
|
||||
|
||||
createAndRegisterProfile(myProfile, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(myProfile, "2", "Patient.name");
|
||||
|
||||
IIdType idType = createPatient(withProfile(myProfile + "|1"));
|
||||
Patient patient = myPatientDao.read(idType, mySrd);
|
||||
|
||||
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||
assertFalse(validationResult.isSuccessful());
|
||||
assertEquals(1, validationResult.getMessages().size());
|
||||
|
||||
SingleValidationMessage message = validationResult.getMessages().iterator().next();
|
||||
assertEquals("Patient.identifier: minimum required = 1, but only found 0 (from " + myProfile + "|1)", message.getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidatePatient_withMultipleProfiles_validatesAgainstAllProfiles() {
|
||||
final String sdIdentifier = myProfile + "-identifier";
|
||||
final String sdName = myProfile + "-name";
|
||||
|
||||
createAndRegisterProfile(sdIdentifier, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(sdName, "1", "Patient.name");
|
||||
|
||||
IIdType idType = createPatient(withProfile(sdIdentifier), withProfile(sdName));
|
||||
Patient patient = myPatientDao.read(idType, mySrd);
|
||||
|
||||
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||
assertFalse(validationResult.isSuccessful());
|
||||
assertEquals(2, validationResult.getMessages().size());
|
||||
|
||||
Iterator<SingleValidationMessage> messageIterator = validationResult.getMessages().iterator();
|
||||
assertEquals("Patient.identifier: minimum required = 1, but only found 0 (from " + myProfile + "-identifier|1)", messageIterator.next().getMessage());
|
||||
assertEquals("Patient.name: minimum required = 1, but only found 0 (from " + myProfile + "-name|1)", messageIterator.next().getMessage());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testValidatePatient_withMultipleVersions_validatesAgainstFirstVersion() {
|
||||
createAndRegisterProfile(myProfile, "1", "Patient.identifier");
|
||||
createAndRegisterProfile(myProfile, "2", "Patient.name");
|
||||
createAndRegisterProfile(myProfile, "3", "Patient.birthDate");
|
||||
|
||||
IIdType idType = createPatient(
|
||||
withProfile(myProfile + "|2"),
|
||||
withProfile(myProfile + "|1"),
|
||||
withProfile(myProfile + "|3"));
|
||||
Patient patient = myPatientDao.read(idType, mySrd);
|
||||
|
||||
ValidationResult validationResult = myFhirValidator.validateWithResult(patient);
|
||||
assertFalse(validationResult.isSuccessful());
|
||||
assertEquals(1, validationResult.getMessages().size());
|
||||
|
||||
SingleValidationMessage message = validationResult.getMessages().iterator().next();
|
||||
assertEquals("Patient.identifier: minimum required = 1, but only found 0 (from " + myProfile + "|1)", message.getMessage());
|
||||
}
|
||||
|
||||
private void createAndRegisterProfile(String theUrl, String theVersion, String thePath) {
|
||||
StructureDefinition sd = createProfile(theUrl, theVersion, thePath);
|
||||
ourValidationSupport.addStructureDefinition(sd);
|
||||
}
|
||||
|
||||
private void createProfile(String theVersion, String theRequiredPath) {
|
||||
createProfile(myProfile, theVersion, theRequiredPath);
|
||||
}
|
||||
|
||||
private StructureDefinition createProfile(String theUrl, String theVersion, String theRequiredPath) {
|
||||
final String myResourceTypeDefinition = "http://hl7.org/fhir/StructureDefinition/Patient";
|
||||
final String myProfileId = "TestProfile";
|
||||
|
||||
StructureDefinition sd = new StructureDefinition()
|
||||
.setUrl(theUrl).setVersion(theVersion)
|
||||
.setBaseDefinition(myResourceTypeDefinition)
|
||||
.setType(myResourceType)
|
||||
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||
sd.setId(myProfileId);
|
||||
sd.getDifferential().addElement()
|
||||
.setPath(theRequiredPath)
|
||||
.setMin(1)
|
||||
.setId(theRequiredPath);
|
||||
|
||||
DaoMethodOutcome outcome = myStructureDefinitionDao.update(sd, mySrd);
|
||||
assertNotNull(outcome.getResource());
|
||||
return (StructureDefinition) outcome.getResource();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
package ca.uhn.fhir.jpa.validation;
|
||||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.i18n.Msg;
|
||||
import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||
import ca.uhn.fhir.jpa.interceptor.validation.IRepositoryValidatingRule;
|
||||
import ca.uhn.fhir.jpa.interceptor.validation.RepositoryValidatingInterceptor;
|
||||
import ca.uhn.fhir.jpa.interceptor.validation.RepositoryValidatingRuleBuilder;
|
||||
import ca.uhn.fhir.jpa.provider.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||
import org.hl7.fhir.r4.model.StructureDefinition;
|
||||
import org.hl7.fhir.r5.utils.validation.constants.BestPracticeWarningLevel;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
public class RepositoryValidationOnCreateResourceR4Test extends BaseResourceProviderR4Test {
|
||||
private static final String myResourceType = "Patient";
|
||||
private final String myProfile = "http://example.org/fhir/StructureDefinition/TestPatient";
|
||||
|
||||
private static final FhirContext ourCtx = FhirContext.forR4();
|
||||
private final RepositoryValidatingInterceptor myRepositoryValidatingInterceptor = new RepositoryValidatingInterceptor(ourCtx, Collections.emptyList());
|
||||
|
||||
@BeforeEach
|
||||
public void before() {
|
||||
myInterceptorRegistry.registerInterceptor(myRepositoryValidatingInterceptor);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void after() {
|
||||
myInterceptorRegistry.unregisterInterceptor(myRepositoryValidatingInterceptor);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatient_withValidationRuleNoVersion_validatesAgainstLatestVersion() {
|
||||
createProfile("1", "Patient.identifier");
|
||||
createProfile("2", "Patient.name");
|
||||
|
||||
setupRepositoryValidationRules(myProfile);
|
||||
|
||||
try {
|
||||
createPatient(withProfile(myProfile));
|
||||
fail();
|
||||
} catch (PreconditionFailedException e) {
|
||||
assertEquals(Msg.code(574)
|
||||
+ "Patient.name: minimum required = 1, but only found 0 (from " + myProfile + "|2)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatient_withValidationRuleWithVersion_unknownProfile() {
|
||||
createProfile("1", "Patient.identifier");
|
||||
createProfile("2", "Patient.name");
|
||||
|
||||
setupRepositoryValidationRules(myProfile + "|1");
|
||||
|
||||
try {
|
||||
createPatient(withProfile(myProfile + "|1"));
|
||||
fail();
|
||||
} catch (PreconditionFailedException e) {
|
||||
assertEquals(Msg.code(574) + "Profile reference '" + myProfile
|
||||
+ "|1' has not been checked because it is unknown, and the validator is set to not fetch unknown profiles", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatient_withProfileWithVersion_doesNotConform() {
|
||||
setupRepositoryValidationRules(myProfile);
|
||||
|
||||
try {
|
||||
createPatient(withProfile(myProfile + "|1"));
|
||||
fail();
|
||||
} catch (PreconditionFailedException e) {
|
||||
assertEquals(Msg.code(575) + "Resource of type \"" + myResourceType
|
||||
+ "\" does not declare conformance to profile from: [" + myProfile + "]", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatient_withValidationRuleWithVersion_doesNotConform() {
|
||||
setupRepositoryValidationRules(myProfile + "|1");
|
||||
try {
|
||||
createPatient(withProfile(myProfile));
|
||||
fail();
|
||||
} catch (PreconditionFailedException e) {
|
||||
assertEquals(Msg.code(575) + "Resource of type \"" + myResourceType
|
||||
+ "\" does not declare conformance to profile from: [" + myProfile + "|1]", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreatePatient_withMultipleProfiles_validatesAgainstLastProfile() {
|
||||
final String sdIdentifier = myProfile + "-identifier";
|
||||
final String sdName = myProfile + "-name";
|
||||
|
||||
createProfile(sdIdentifier, "1", "Patient.identifier");
|
||||
createProfile(sdName, "1", "Patient.name");
|
||||
|
||||
setupRepositoryValidationRules(sdIdentifier, sdName);
|
||||
try {
|
||||
createPatient(withProfile(sdIdentifier), withProfile(sdName));
|
||||
fail();
|
||||
} catch (PreconditionFailedException e) {
|
||||
assertEquals(Msg.code(574)
|
||||
+ "Patient.name: minimum required = 1, but only found 0 (from " + sdName + "|1)", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void setupRepositoryValidationRules(String... theProfiles) {
|
||||
List<IRepositoryValidatingRule> rules = myAppCtx
|
||||
.getBean(RepositoryValidatingRuleBuilder.REPOSITORY_VALIDATING_RULE_BUILDER, RepositoryValidatingRuleBuilder.class)
|
||||
.forResourcesOfType(myResourceType)
|
||||
.requireAtLeastOneProfileOf(theProfiles)
|
||||
.and()
|
||||
.requireValidationToDeclaredProfiles()
|
||||
.withBestPracticeWarningLevel(BestPracticeWarningLevel.Ignore)
|
||||
.rejectOnSeverity("error")
|
||||
.build();
|
||||
|
||||
myRepositoryValidatingInterceptor.setRules(rules);
|
||||
}
|
||||
|
||||
private void createProfile(String theVersion, String theRequiredPath) {
|
||||
createProfile(myProfile, theVersion, theRequiredPath);
|
||||
}
|
||||
|
||||
private void createProfile(String theUrl, String theVersion, String thePath) {
|
||||
final String baseProfile = "http://hl7.org/fhir/StructureDefinition/Patient";
|
||||
final String profileId = "TestProfile";
|
||||
|
||||
StructureDefinition sd = new StructureDefinition()
|
||||
.setUrl(theUrl).setVersion(theVersion)
|
||||
.setBaseDefinition(baseProfile)
|
||||
.setType(myResourceType)
|
||||
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||
sd.setId(profileId);
|
||||
sd.getDifferential().addElement()
|
||||
.setPath(thePath)
|
||||
.setMin(1)
|
||||
.setId(thePath);
|
||||
|
||||
DaoMethodOutcome outcome = myStructureDefinitionDao.update(sd, new SystemRequestDetails());
|
||||
assertNotNull(outcome.getResource());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
package ca.uhn.fhir.jpa.validation;
|
||||
|
||||
import ca.uhn.fhir.jpa.api.model.DaoMethodOutcome;
|
||||
import ca.uhn.fhir.jpa.provider.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
||||
import ca.uhn.fhir.rest.param.UriParam;
|
||||
import ca.uhn.fhir.rest.param.UriParamQualifierEnum;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.hl7.fhir.r4.model.Bundle;
|
||||
import org.hl7.fhir.r4.model.StructureDefinition;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.containsInAnyOrder;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
public class SearchWithResourceProfileR4Test extends BaseResourceProviderR4Test {
|
||||
private static final String myResourceType = "Patient";
|
||||
private final String myProfile = "http://example.org/fhir/StructureDefinition/TestPatient";
|
||||
|
||||
@Test
|
||||
public void testSearchPatient_withProfileBelowCriteria_returnsAllMatches() {
|
||||
createProfile();
|
||||
IIdType id1 = createPatient(withProfile(myProfile));
|
||||
IIdType id2 = createPatient(withProfile(myProfile + "|1"));
|
||||
|
||||
SearchParameterMap params = new SearchParameterMap();
|
||||
params.add("_profile", new UriParam(myProfile).setQualifier(UriParamQualifierEnum.BELOW));
|
||||
IBundleProvider bundleProvider = myPatientDao.search(params, mySrd);
|
||||
assertFalse(bundleProvider.isEmpty());
|
||||
assertThat(toUnqualifiedVersionlessIdValues(bundleProvider),
|
||||
containsInAnyOrder(id1.toUnqualifiedVersionless().getValue(), id2.toUnqualifiedVersionless().getValue()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPatient_withProfileExactCriteriaWithoutVersionAndPatientProfileWithoutVersion_returnsExactMatch() {
|
||||
createProfile();
|
||||
IIdType id1 = createPatient(withProfile(myProfile));
|
||||
IIdType id2 = createPatient(withProfile(myProfile));
|
||||
|
||||
Bundle outcome = myClient.search().forResource(myResourceType)
|
||||
.where(new TokenClientParam("_profile").exactly().code(myProfile))
|
||||
.returnBundle(Bundle.class).execute();
|
||||
assertThat(toUnqualifiedVersionlessIdValues(outcome),
|
||||
containsInAnyOrder(id1.toUnqualifiedVersionless().getValue(), id2.toUnqualifiedVersionless().getValue()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPatient_withProfileExactCriteriaWithVersionAndPatientProfileWithVersion_returnsExactMatch() {
|
||||
createProfile();
|
||||
IIdType id1 = createPatient(withProfile(myProfile + "|1"));
|
||||
|
||||
Bundle outcome = myClient.search().forResource(myResourceType)
|
||||
.where(new TokenClientParam("_profile").exactly().code(myProfile + "|1"))
|
||||
.returnBundle(Bundle.class).execute();
|
||||
assertThat(toUnqualifiedVersionlessIdValues(outcome),
|
||||
containsInAnyOrder(id1.toUnqualifiedVersionless().getValue()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPatient_withProfileExactCriteria_returnsNoMatch() {
|
||||
createProfile();
|
||||
createPatient(withProfile(myProfile + "|1"));
|
||||
|
||||
Bundle outcome = myClient.search().forResource(myResourceType)
|
||||
.where(new TokenClientParam("_profile").exactly().code(myProfile))
|
||||
.returnBundle(Bundle.class).execute();
|
||||
assertTrue(outcome.getEntryFirstRep().isEmpty());
|
||||
}
|
||||
|
||||
private void createProfile() {
|
||||
final String baseProfile = "http://hl7.org/fhir/StructureDefinition/Patient";
|
||||
final String profileId = "TestProfile";
|
||||
final String version = "1";
|
||||
final String rulePath = "Patient.identifier";
|
||||
|
||||
StructureDefinition sd = new StructureDefinition()
|
||||
.setUrl(myProfile).setVersion(version)
|
||||
.setBaseDefinition(baseProfile)
|
||||
.setType(myResourceType)
|
||||
.setDerivation(StructureDefinition.TypeDerivationRule.CONSTRAINT);
|
||||
sd.setId(profileId);
|
||||
sd.getDifferential().addElement()
|
||||
.setPath(rulePath)
|
||||
.setMin(1)
|
||||
.setId(rulePath);
|
||||
|
||||
DaoMethodOutcome outcome = myStructureDefinitionDao.update(sd, new SystemRequestDetails());
|
||||
assertNotNull(outcome.getResource());
|
||||
}
|
||||
}
|
|
@ -79,25 +79,11 @@
|
|||
<dependency>
|
||||
<groupId>org.simplejavamail</groupId>
|
||||
<artifactId>simple-java-mail</artifactId>
|
||||
<!-- Excluded in favor of jakarta.activation:jakarta.activation-api -->
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.icegreen</groupId>
|
||||
<artifactId>greenmail</artifactId>
|
||||
<scope>compile</scope>
|
||||
<!-- Excluded in favor of jakarta.activation:jakarta.activation-api -->
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
|
|
@ -21,9 +21,9 @@ package ca.uhn.fhir.rest.server.mail;
|
|||
|
||||
import jakarta.annotation.Nonnull;
|
||||
import org.simplejavamail.api.email.Email;
|
||||
import org.simplejavamail.api.mailer.AsyncResponse;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public interface IMailSvc {
|
||||
void sendMail(@Nonnull List<Email> theEmails);
|
||||
|
@ -31,7 +31,5 @@ public interface IMailSvc {
|
|||
void sendMail(@Nonnull Email theEmail);
|
||||
|
||||
void sendMail(
|
||||
@Nonnull Email theEmail,
|
||||
@Nonnull Runnable theOnSuccess,
|
||||
@Nonnull AsyncResponse.ExceptionConsumer theErrorHandler);
|
||||
@Nonnull Email theEmail, @Nonnull Runnable theOnSuccess, @Nonnull Consumer<Throwable> theErrorHandler);
|
||||
}
|
||||
|
|
|
@ -20,12 +20,9 @@
|
|||
package ca.uhn.fhir.rest.server.mail;
|
||||
|
||||
import jakarta.annotation.Nonnull;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.simplejavamail.MailException;
|
||||
import org.simplejavamail.api.email.Email;
|
||||
import org.simplejavamail.api.email.Recipient;
|
||||
import org.simplejavamail.api.mailer.AsyncResponse;
|
||||
import org.simplejavamail.api.mailer.AsyncResponse.ExceptionConsumer;
|
||||
import org.simplejavamail.api.mailer.Mailer;
|
||||
import org.simplejavamail.api.mailer.config.TransportStrategy;
|
||||
import org.simplejavamail.mailer.MailerBuilder;
|
||||
|
@ -33,6 +30,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class MailSvc implements IMailSvc {
|
||||
|
@ -42,14 +41,14 @@ public class MailSvc implements IMailSvc {
|
|||
private final Mailer myMailer;
|
||||
|
||||
public MailSvc(@Nonnull MailConfig theMailConfig) {
|
||||
Validate.notNull(theMailConfig);
|
||||
Objects.requireNonNull(theMailConfig);
|
||||
myMailConfig = theMailConfig;
|
||||
myMailer = makeMailer(myMailConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMail(@Nonnull List<Email> theEmails) {
|
||||
Validate.notNull(theEmails);
|
||||
Objects.requireNonNull(theEmails);
|
||||
theEmails.forEach(theEmail -> send(theEmail, new OnSuccess(theEmail), new ErrorHandler(theEmail)));
|
||||
}
|
||||
|
||||
|
@ -60,21 +59,23 @@ public class MailSvc implements IMailSvc {
|
|||
|
||||
@Override
|
||||
public void sendMail(
|
||||
@Nonnull Email theEmail, @Nonnull Runnable theOnSuccess, @Nonnull ExceptionConsumer theErrorHandler) {
|
||||
@Nonnull Email theEmail, @Nonnull Runnable theOnSuccess, @Nonnull Consumer<Throwable> theErrorHandler) {
|
||||
send(theEmail, theOnSuccess, theErrorHandler);
|
||||
}
|
||||
|
||||
private void send(
|
||||
@Nonnull Email theEmail, @Nonnull Runnable theOnSuccess, @Nonnull ExceptionConsumer theErrorHandler) {
|
||||
Validate.notNull(theEmail);
|
||||
Validate.notNull(theOnSuccess);
|
||||
Validate.notNull(theErrorHandler);
|
||||
@Nonnull Email theEmail, @Nonnull Runnable theOnSuccess, @Nonnull Consumer<Throwable> theErrorHandler) {
|
||||
Objects.requireNonNull(theEmail);
|
||||
Objects.requireNonNull(theOnSuccess);
|
||||
Objects.requireNonNull(theErrorHandler);
|
||||
try {
|
||||
final AsyncResponse asyncResponse = myMailer.sendMail(theEmail, true);
|
||||
if (asyncResponse != null) {
|
||||
asyncResponse.onSuccess(theOnSuccess);
|
||||
asyncResponse.onException(theErrorHandler);
|
||||
}
|
||||
myMailer.sendMail(theEmail, true).whenComplete((result, ex) -> {
|
||||
if (ex != null) {
|
||||
theErrorHandler.accept(ex);
|
||||
} else {
|
||||
theOnSuccess.run();
|
||||
}
|
||||
});
|
||||
} catch (MailException e) {
|
||||
theErrorHandler.accept(e);
|
||||
}
|
||||
|
@ -117,7 +118,7 @@ public class MailSvc implements IMailSvc {
|
|||
}
|
||||
}
|
||||
|
||||
private class ErrorHandler implements ExceptionConsumer {
|
||||
private class ErrorHandler implements Consumer<Throwable> {
|
||||
private final Email myEmail;
|
||||
|
||||
private ErrorHandler(@Nonnull Email theEmail) {
|
||||
|
@ -125,7 +126,7 @@ public class MailSvc implements IMailSvc {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void accept(Exception t) {
|
||||
public void accept(Throwable t) {
|
||||
ourLog.error("Email not sent" + makeMessage(myEmail), t);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import com.icegreen.greenmail.junit5.GreenMailExtension;
|
|||
import com.icegreen.greenmail.util.GreenMailUtil;
|
||||
import com.icegreen.greenmail.util.ServerSetupTest;
|
||||
import jakarta.annotation.Nonnull;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
|
@ -11,7 +12,6 @@ import org.simplejavamail.MailException;
|
|||
import org.simplejavamail.api.email.Email;
|
||||
import org.simplejavamail.email.EmailBuilder;
|
||||
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -86,13 +86,14 @@ public class MailSvcIT {
|
|||
@Test
|
||||
public void testSendMailWithInvalidToAddressExpectErrorHandler() {
|
||||
// setup
|
||||
final Email email = withEmail("xyz");
|
||||
String invalidEmailAdress = "xyz";
|
||||
final Email email = withEmail(invalidEmailAdress);
|
||||
// execute
|
||||
fixture.sendMail(email,
|
||||
() -> fail("Should not execute on Success"),
|
||||
(e) -> {
|
||||
assertTrue(e instanceof MailException);
|
||||
assertEquals("Invalid TO address: " + email, e.getMessage());
|
||||
assertEquals("Invalid TO address: " + invalidEmailAdress, e.getMessage());
|
||||
});
|
||||
// validate
|
||||
assertTrue(ourGreenMail.waitForIncomingEmail(1000, 0));
|
||||
|
|
34
pom.xml
34
pom.xml
|
@ -869,6 +869,7 @@
|
|||
<developer>
|
||||
<id>delopst</id>
|
||||
<name>Primož Delopst</name>
|
||||
<organization>Better</organization>
|
||||
</developer>
|
||||
<developer>
|
||||
<id>Zach Smith</id>
|
||||
|
@ -1160,27 +1161,38 @@
|
|||
<dependency>
|
||||
<groupId>org.simplejavamail</groupId>
|
||||
<artifactId>simple-java-mail</artifactId>
|
||||
<version>6.6.1</version>
|
||||
<version>8.11.2</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation-api</artifactId>
|
||||
<groupId>com.github.bbottema</groupId>
|
||||
<artifactId>jetbrains-runtime-annotations</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>com.sun.activation</groupId>
|
||||
<artifactId>jakarta.activation</artifactId>
|
||||
<groupId>jakarta.mail</groupId>
|
||||
<artifactId>jakarta.mail-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>jakarta.mail</groupId>
|
||||
<artifactId>jakarta.mail-api</artifactId>
|
||||
<version>2.1.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.icegreen</groupId>
|
||||
<artifactId>greenmail</artifactId>
|
||||
<version>2.1.0-rc-1</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>jakarta.mail</groupId>
|
||||
<artifactId>jakarta.mail-api</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.icegreen</groupId>
|
||||
<artifactId>greenmail</artifactId>
|
||||
<version>1.6.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.icegreen</groupId>
|
||||
<artifactId>greenmail-junit5</artifactId>
|
||||
<version>1.6.4</version>
|
||||
<version>2.1.0-rc-1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<!-- mail end -->
|
||||
|
|
Loading…
Reference in New Issue