reproduced failure reported by FMCNA

This commit is contained in:
Ken Stevens 2019-04-03 11:42:21 -04:00
parent 767a84bddb
commit 28ea97ee9a
3 changed files with 42 additions and 1 deletions

View File

@ -224,6 +224,10 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao,
throw new MethodNotAllowedException("$expunge is not enabled on this server"); throw new MethodNotAllowedException("$expunge is not enabled on this server");
} }
if (theExpungeOptions.getLimit() < 1) {
throw new InvalidRequestException("Expunge limit may not be less than 1. Received expunge limit "+theExpungeOptions.getLimit() + ".");
}
AtomicInteger remainingCount = new AtomicInteger(theExpungeOptions.getLimit()); AtomicInteger remainingCount = new AtomicInteger(theExpungeOptions.getLimit());
if (theResourceName == null && theResourceId == null && theVersion == null) { if (theResourceName == null && theResourceId == null && theVersion == null) {

View File

@ -49,8 +49,9 @@ public class ExpungeOptions {
/** /**
* The maximum number of resource versions to expunge * The maximum number of resource versions to expunge
*/ */
public void setLimit(int theLimit) { public ExpungeOptions setLimit(int theLimit) {
myLimit = theLimit; myLimit = theLimit;
return this;
} }
public boolean isExpungeEverything() { public boolean isExpungeEverything() {

View File

@ -4,6 +4,7 @@ import ca.uhn.fhir.jpa.dao.DaoConfig;
import ca.uhn.fhir.jpa.dao.IFhirResourceDao; import ca.uhn.fhir.jpa.dao.IFhirResourceDao;
import ca.uhn.fhir.jpa.util.ExpungeOptions; import ca.uhn.fhir.jpa.util.ExpungeOptions;
import ca.uhn.fhir.jpa.util.JpaConstants; import ca.uhn.fhir.jpa.util.JpaConstants;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException; import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException; import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
@ -290,6 +291,41 @@ public class ResourceProviderExpungeDstu3Test extends BaseResourceProviderDstu3T
assertGone(myDeletedObservationId); assertGone(myDeletedObservationId);
} }
@Test
public void testExpungeLimitZero() {
try {
myPatientDao.expunge(new ExpungeOptions()
.setExpungeDeletedResources(true)
.setExpungeOldVersions(true)
.setLimit(0));
fail();
} catch (InvalidRequestException e) {
assertEquals("Expunge limit may not be less than 1. Received expunge limit 0.", e.getMessage());
}
}
@Test
public void testExpungeInstanceOldVersionsAndDeletedBoundaryLimit() {
myPatientDao.delete(myTwoVersionPatientId);
myPatientDao.expunge(myTwoVersionPatientId.toUnqualifiedVersionless(), new ExpungeOptions()
.setExpungeDeletedResources(true)
.setExpungeOldVersions(true)
.setLimit(2));
// Patients
assertStillThere(myOneVersionPatientId);
assertExpunged(myTwoVersionPatientId.withVersion("1"));
assertExpunged(myTwoVersionPatientId.withVersion("2"));
assertGone(myDeletedPatientId);
// No observations deleted
assertStillThere(myOneVersionObservationId);
assertStillThere(myTwoVersionObservationId.withVersion("1"));
assertStillThere(myTwoVersionObservationId.withVersion("2"));
assertGone(myDeletedObservationId);
}
@Test @Test
public void testParameters() { public void testParameters() {
Parameters p = new Parameters(); Parameters p = new Parameters();