Work on tests

This commit is contained in:
James Agnew 2024-11-07 12:15:49 -05:00
parent 215cbaa80c
commit 3e837ecfcd
3 changed files with 35 additions and 62 deletions

View File

@ -318,10 +318,12 @@ public class ExpungeEverythingService implements IExpungeEverythingService {
nativeQuery.setMaxResults(800);
List pids = nativeQuery.getResultList();
nativeQuery = myEntityManager.createQuery("DELETE FROM " + theEntityType.getSimpleName()
if (!pids.isEmpty()) {
nativeQuery = myEntityManager.createQuery("DELETE FROM " + theEntityType.getSimpleName()
+ " WHERE " + idProperty + " IN (:pids)");
nativeQuery.setParameter("pids", pids);
nativeQuery.executeUpdate();
nativeQuery.setParameter("pids", pids);
nativeQuery.executeUpdate();
}
return pids.size();
});

View File

@ -258,7 +258,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
myPartitionSelectorInterceptor.setNextPartitionId(PARTITION_1);
try {
IIdType obsId = createObservation(withSubject(patientId));
if (myIncludePartitionIdsInSql) {
if (myIncludePartitionIdsInSql && theAllowReferencesToCrossPartition == PartitionSettings.CrossPartitionReferenceMode.NOT_ALLOWED) {
runInTransaction(()->{
List<ResourceTable> resources = myResourceTableDao.findAll();
String failMessage = "Resources:\n * " + resources.stream().map(ResourceTable::toString).collect(Collectors.joining("\n * "));
@ -272,6 +272,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
}
} catch (InvalidRequestException e) {
if (myIncludePartitionIdsInSql) {
assertEquals(PartitionSettings.CrossPartitionReferenceMode.NOT_ALLOWED, theAllowReferencesToCrossPartition);
assertThat(e.getMessage()).contains("not found, specified in path: Observation.subject");
} else {
fail();
@ -370,13 +371,13 @@ abstract class TestDefinitions implements ITestDataBuilder {
}
if (myIncludePartitionIdsInSql) {
assertEquals("select count(rht1_0.PID) from HFJ_RES_VER rht1_0 where rht1_0.RES_ID='" + id.getIdPartAsLong() + "' and rht1_0.PARTITION_ID='1'", getSelectSql(1));
assertEquals("select count(rht1_0.PID) from HFJ_RES_VER rht1_0 where rht1_0.PARTITION_ID in ('1') and rht1_0.RES_ID='" + id.getIdPartAsLong() + "'", getSelectSql(1));
} else {
assertEquals("select count(rht1_0.PID) from HFJ_RES_VER rht1_0 where rht1_0.RES_ID='" + id.getIdPartAsLong() + "'", getSelectSql(1));
}
if (myIncludePartitionIdsInSql) {
assertThat(getSelectSql(2)).contains(" from HFJ_RES_VER rht1_0 where rht1_0.RES_ID='" + id.getIdPartAsLong() + "' and rht1_0.PARTITION_ID='1' ");
assertThat(getSelectSql(2)).contains(" from HFJ_RES_VER rht1_0 where rht1_0.PARTITION_ID in ('1') and rht1_0.RES_ID='" + id.getIdPartAsLong() + "'");
} else {
assertThat(getSelectSql(2)).contains(" from HFJ_RES_VER rht1_0 where rht1_0.RES_ID='" + id.getIdPartAsLong() + "' ");
}
@ -456,7 +457,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
assertThat(actualIds).asList().containsExactlyInAnyOrder("Patient/" + id.getIdPart() + "/_history/3", "Patient/" + id.getIdPart() + "/_history/2", "Patient/" + id.getIdPart() + "/_history/1");
if (myIncludePartitionIdsInSql) {
assertEquals("select count(*) from HFJ_RES_VER rht1_0 where rht1_0.PARTITION_ID in ('1')", getSelectSql(0));
assertEquals("select count(rht1_0.PID) from HFJ_RES_VER rht1_0 where rht1_0.PARTITION_ID in ('1')", getSelectSql(0));
} else {
assertEquals("select count(rht1_0.PID) from HFJ_RES_VER rht1_0", getSelectSql(0));
}
@ -471,57 +472,6 @@ abstract class TestDefinitions implements ITestDataBuilder {
assertEquals(2, myCaptureQueriesListener.countSelectQueries());
}
@Test
public void testOperation_Everything() {
// Setup
myPartitionSelectorInterceptor.setNextPartitionId(PARTITION_1);
CreatedResourceIds ids = createPatientWithOrganizationAndEncounterReferences();
// Test
myCaptureQueriesListener.clear();
IBundleProvider outcome = myPatientDao.patientInstanceEverything(null, new SystemRequestDetails(), new PatientEverythingParameters(), ids.patientId);
// Verify
myCaptureQueriesListener.logSelectQueries();
List<String> actualIds = toUnqualifiedVersionlessIdValues(outcome);
assertThat(actualIds).asList().containsExactlyInAnyOrder(ids.allIdValues().toArray(new String[0]));
if (myIncludePartitionIdsInSql) {
assertThat(getSelectSql(0)).startsWith("SELECT DISTINCT t0.PARTITION_ID,t0.SRC_RESOURCE_ID FROM HFJ_RES_LINK");
} else {
assertThat(getSelectSql(0)).startsWith("SELECT DISTINCT t0.SRC_RESOURCE_ID FROM HFJ_RES_LINK");
}
if (myIncludePartitionIdsInPks) {
assertThat(getSelectSql(0)).contains("WHERE ((t0.TARGET_RES_PARTITION_ID,t0.TARGET_RESOURCE_ID) IN (('1','" + ids.patientPid + "')) )");
assertThat(getSelectSql(0)).contains("GROUP BY t0.PARTITION_ID,t0.SRC_RESOURCE_ID ");
assertThat(getSelectSql(0)).endsWith("ORDER BY t0.PARTITION_ID,t0.SRC_RESOURCE_ID");
assertThat(getSelectSql(1)).containsAnyOf(
"from HFJ_RES_LINK rl1_0 where rl1_0.PARTITION_ID='1' and rl1_0.SRC_RESOURCE_ID in ('" + ids.patientPid() + "','" + ids.encounterPid() + "') ",
"from HFJ_RES_LINK rl1_0 where rl1_0.PARTITION_ID='1' and rl1_0.SRC_RESOURCE_ID in ('" + ids.encounterPid() + "','" + ids.patientPid() + "') "
);
assertThat(getSelectSql(2)).contains("from HFJ_RES_LINK rl1_0 where rl1_0.PARTITION_ID='0' and rl1_0.SRC_RESOURCE_ID in ('" + ids.childOrgPid() + "') ");
assertThat(getSelectSql(3)).contains("from HFJ_RES_LINK rl1_0 where rl1_0.PARTITION_ID='0' and rl1_0.SRC_RESOURCE_ID in ('" + ids.parentOrgPid() + "') ");
} else {
assertThat(getSelectSql(0)).contains("WHERE (t0.TARGET_RESOURCE_ID = '" + ids.patientPid() + "') ");
if (myIncludePartitionIdsInSql) {
assertThat(getSelectSql(0)).contains(" GROUP BY t0.PARTITION_ID,t0.SRC_RESOURCE_ID ");
} else {
assertThat(getSelectSql(0)).contains(" GROUP BY t0.SRC_RESOURCE_ID ");
}
assertThat(getSelectSql(0)).endsWith(" ORDER BY t0.SRC_RESOURCE_ID");
assertThat(getSelectSql(1)).containsAnyOf(
"from HFJ_RES_LINK rl1_0 where rl1_0.SRC_RESOURCE_ID in ('" + ids.patientPid() + "','" + ids.encounterPid() + "') ",
"from HFJ_RES_LINK rl1_0 where rl1_0.SRC_RESOURCE_ID in ('" + ids.encounterPid() + "','" + ids.patientPid() + "') "
);
assertThat(getSelectSql(2)).contains("from HFJ_RES_LINK rl1_0 where rl1_0.SRC_RESOURCE_ID in ('" + ids.childOrgPid() + "') ");
assertThat(getSelectSql(3)).contains("from HFJ_RES_LINK rl1_0 where rl1_0.SRC_RESOURCE_ID in ('" + ids.parentOrgPid() + "') ");
}
assertEquals(5, myCaptureQueriesListener.countSelectQueries());
}
@Test
public void testOperation_ExpungeEverything() {
myPartitionSelectorInterceptor.setNextPartitionId(PARTITION_1);
@ -562,7 +512,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
if (myIncludePartitionIdsInPks) {
sql = "select rht1_0.PARTITION_ID,rht1_0.PID from HFJ_RES_VER rht1_0 fetch first '400' rows only";
} else {
sql = "select rht1_0.PID from HFJ_RES_VER rht1_0 fetch first '400' rows only";
sql = "select rht1_0.PID from HFJ_RES_VER rht1_0 fetch first '800' rows only";
}
assertThat(selectResVerQueries.get(0).getSql(true, false)).isEqualTo(sql);
assertThat(selectResVerQueries.get(1).getSql(true, false)).isEqualTo(sql);
@ -573,7 +523,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
if (myIncludePartitionIdsInPks) {
assertThat(deleteResVerQueries.get(0).getSql(true, false)).startsWith("delete from HFJ_RES_VER where (PARTITION_ID,PID) in ");
} else {
assertThat(deleteResVerQueries.get(0).getSql(true, false)).startsWith("delete from HFJ_RES_VER where (PID) in ");
assertThat(deleteResVerQueries.get(0).getSql(true, false)).startsWith("delete from HFJ_RES_VER where PID in ");
}
assertEquals(1, deleteResVerQueries.size());
}
@ -581,6 +531,7 @@ abstract class TestDefinitions implements ITestDataBuilder {
@Test
public void testRead_DefaultPartition() {
// Setup
myPartitionSelectorInterceptor.addNonPartitionableResource("Organization");
IIdType id = createOrganization(withId("O"), withName("PARENT"));
long pid = findId("Organization", "O").getId();
@ -1358,7 +1309,9 @@ abstract class TestDefinitions implements ITestDataBuilder {
@Test
public void testSearch_Includes_Reverse_Star() {
// Setup
myPartitionSettings.setAllowReferencesAcrossPartitions(PartitionSettings.CrossPartitionReferenceMode.ALLOWED_UNQUALIFIED);
myPartitionSelectorInterceptor.setNextPartitionId(PARTITION_1);
myPartitionSelectorInterceptor.addNonPartitionableResource("Organization");
CreatedResourceIds ids = createPatientWithOrganizationReferences();
// Test
@ -1424,7 +1377,9 @@ abstract class TestDefinitions implements ITestDataBuilder {
@Test
public void testSearch_Includes_Reverse_Specific() {
// Setup
myPartitionSettings.setAllowReferencesAcrossPartitions(PartitionSettings.CrossPartitionReferenceMode.ALLOWED_UNQUALIFIED);
myPartitionSelectorInterceptor.setNextPartitionId(PARTITION_1);
myPartitionSelectorInterceptor.addNonPartitionableResource("Organization");
CreatedResourceIds ids = createPatientWithOrganizationReferences();
// Test

View File

@ -8,10 +8,15 @@ import ca.uhn.fhir.interceptor.model.RequestPartitionId;
import ca.uhn.fhir.jpa.partition.BaseRequestPartitionHelperSvc;
import ca.uhn.fhir.jpa.partition.RequestPartitionHelperSvc;
import jakarta.annotation.Nonnull;
import org.apache.commons.lang3.Validate;
import org.hl7.fhir.instance.model.api.IBaseResource;
import java.util.HashSet;
import java.util.Set;
public class TestPartitionSelectorInterceptor {
private RequestPartitionId myNextPartition;
private final Set<String> myNonPartitionableResources = new HashSet<>();
private BaseRequestPartitionHelperSvc myHelperSvc = new RequestPartitionHelperSvc();
/**
@ -21,6 +26,12 @@ public class TestPartitionSelectorInterceptor {
super();
}
public TestPartitionSelectorInterceptor addNonPartitionableResource(@Nonnull String theResourceName) {
Validate.notBlank(theResourceName, "Must not be blank");
myNonPartitionableResources.add(theResourceName);
return this;
}
public void setNextPartitionId(Integer theNextPartitionId) {
myNextPartition = RequestPartitionId.fromPartitionId(theNextPartitionId);
}
@ -42,8 +53,13 @@ public class TestPartitionSelectorInterceptor {
@Nonnull
private RequestPartitionId selectPartition(String theResourceType) {
if (!myHelperSvc.isResourcePartitionable(theResourceType)) {
return RequestPartitionId.defaultPartition();
if (theResourceType != null) {
if (!myHelperSvc.isResourcePartitionable(theResourceType)) {
return RequestPartitionId.defaultPartition();
}
if (myNonPartitionableResources.contains(theResourceType)) {
return RequestPartitionId.defaultPartition();
}
}
assert myNextPartition != null;