diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/MockAcmeServer.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/MockAcmeServer.java index f5872a5d..a2a76d33 100644 --- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/MockAcmeServer.java +++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/MockAcmeServer.java @@ -247,6 +247,17 @@ public class MockAcmeServer { .findFirst(); } + /** + * Removes a {@link MockAccount}. + * + * @param account + * {@link MockAccount} to remove + */ + public void removeAccount(MockAccount account) { + account.detach(repository); + accounts.remove(account); + } + /** * Creates a new {@link MockAuthorization} for the given {@link Identifier}. If there * is already a {@link MockAuthorization} for that {@link Identifier}, it is returned @@ -272,6 +283,17 @@ public class MockAcmeServer { return Optional.ofNullable(authorizations.get(identifier)); } + /** + * Removes a {@link MockAuthorization}. + * + * @param authorization + * {@link MockAuthorization} to remove + */ + public void removeAuthorization(MockAuthorization authorization) { + authorization.detach(repository); + authorizations.remove(authorization.getIdentifier()); + } + /** * Creates a new {@link MockChallenge} instance of the given type. * @@ -284,6 +306,16 @@ public class MockAcmeServer { return MockChallenge.create(repository, type); } + /** + * Removes a {@link MockChallenge}. + * + * @param challenge + * {@link MockChallenge} to remove + */ + public void removeChallenge(MockChallenge challenge) { + challenge.detach(repository); + } + /** * Creates a new {@link MockOrder} for the given {@link Identifier}. *
@@ -343,6 +375,16 @@ public class MockAcmeServer {
return MockOrder.create(repository, identifiers, authorizations, ca);
}
+ /**
+ * Removes a {@link MockOrder}.
+ *
+ * @param order
+ * {@link MockOrder} to remove
+ */
+ public void removeOrder(MockOrder order) {
+ order.detach(repository);
+ }
+
/**
* Returns the {@link MockAccount} that corresponds to the given {@link Account}.
*
diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/connection/Repository.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/connection/Repository.java
index 80dc99a3..45eb7f3d 100644
--- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/connection/Repository.java
+++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/connection/Repository.java
@@ -87,6 +87,21 @@ public class Repository {
resourceMap.put(uri, wrapperFactory.apply(receiver));
}
+ /**
+ * Removes a controller {@link URL}.
+ *
+ * @param url
+ * {@link URL} of the controller to be removed
+ */
+ public void removeController(URL url) {
+ URI uri = safeToURI(url);
+ Controller receiver = resourceMap.get(uri);
+ if (receiver == null) {
+ throw new IllegalArgumentException("No controller is registered for " + url);
+ }
+ resourceMap.remove(uri);
+ }
+
/**
* Adds a {@link MockResource} to this repository.
*
@@ -115,6 +130,21 @@ public class Repository {
.map(type::cast);
}
+ /**
+ * Removes a {@link MockResource} from this repository. Also removes the controller.
+ *
+ * @param resource
+ * {@link MockResource} to remove
+ */
+ public void removeResource(MockResource resource) {
+ URI uri = safeToURI(resource.getLocation());
+ if (!resources.containsKey(uri)) {
+ throw new IllegalArgumentException("Unknown resource " + resource.getLocation());
+ }
+ removeController(resource.getLocation());
+ resources.remove(uri);
+ }
+
/**
* Safely converts an {@link URL} to an {@link URI}.
*
diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAccount.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAccount.java
index b29af4ad..1ac1eff8 100644
--- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAccount.java
+++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAccount.java
@@ -182,6 +182,17 @@ public class MockAccount extends MockResource {
return buildUrl("account", getUniqueId(), "orders");
}
+ /**
+ * Detaches this {@link MockAccount} from the {@link Repository}.
+ *
+ * @param repository
+ * {@link Repository} to remove the account from.
+ */
+ public void detach(Repository repository) {
+ repository.removeController(getOrdersLocation());
+ repository.removeResource(this);
+ }
+
@Override
public JSON toJSON() {
JSONBuilder jb = new JSONBuilder();
diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAuthorization.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAuthorization.java
index bb5d0f2e..295e2871 100644
--- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAuthorization.java
+++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockAuthorization.java
@@ -164,6 +164,16 @@ public class MockAuthorization extends MockResource {
return buildUrl("authz", getUniqueId());
}
+ /**
+ * Detaches this {@link MockAuthorization} from the {@link Repository}.
+ *
+ * @param repository
+ * {@link Repository} to remove the authorization from.
+ */
+ public void detach(Repository repository) {
+ repository.removeResource(this);
+ }
+
@Override
public JSON toJSON() {
JSONBuilder jb = new JSONBuilder();
diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockChallenge.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockChallenge.java
index 461f69dd..45b0d1cf 100644
--- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockChallenge.java
+++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockChallenge.java
@@ -193,6 +193,16 @@ public class MockChallenge extends MockResource {
return buildUrl("challenge", getUniqueId());
}
+ /**
+ * Detaches this {@link MockChallenge} from the {@link Repository}.
+ *
+ * @param repository
+ * {@link Repository} to remove the challenge from.
+ */
+ public void detach(Repository repository) {
+ repository.removeResource(this);
+ }
+
@Override
public JSON toJSON() {
JSONBuilder jb = new JSONBuilder();
diff --git a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockOrder.java b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockOrder.java
index 977eef8e..51c697da 100644
--- a/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockOrder.java
+++ b/acme4j-mock/src/main/java/org/shredzone/acme4j/mock/model/MockOrder.java
@@ -319,6 +319,18 @@ public class MockOrder extends MockResource {
return buildUrl("certificate", getUniqueId());
}
+ /**
+ * Detaches this {@link MockOrder} from the {@link Repository}.
+ *
+ * @param repository
+ * {@link Repository} to remove the order from.
+ */
+ public void detach(Repository repository) {
+ repository.removeController(getFinalizeLocation());
+ repository.removeController(getCertificateLocation());
+ repository.removeResource(this);
+ }
+
@Override
public JSON toJSON() {
JSONBuilder jb = new JSONBuilder();
diff --git a/acme4j-mock/src/test/java/org/shredzone/acme4j/mock/MockAcmeServerTest.java b/acme4j-mock/src/test/java/org/shredzone/acme4j/mock/MockAcmeServerTest.java
index b2676063..b206c8f4 100644
--- a/acme4j-mock/src/test/java/org/shredzone/acme4j/mock/MockAcmeServerTest.java
+++ b/acme4j-mock/src/test/java/org/shredzone/acme4j/mock/MockAcmeServerTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.fail;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.KeyPair;
+import java.util.NoSuchElementException;
import java.util.Optional;
import org.junit.Test;
@@ -184,6 +185,12 @@ public class MockAcmeServerTest {
assertThat(server.getAccounts().size(), is(2));
assertThat(server.findAccount(keyPair1.getPublic()).isPresent(), is(false));
assertThat(server.findAccount(keyPair2.getPublic()).isPresent(), is(false));
+
+ server.removeAccount(account1);
+ assertThat(server.getAccounts().size(), is(1));
+
+ server.removeAccount(account2);
+ assertThat(server.getAccounts().size(), is(0));
}
/**
@@ -213,6 +220,9 @@ public class MockAcmeServerTest {
Optional