You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2023/05/26 10:30:52 UTC

[james-project] 07/07: JAMES-3909 Integration tests for data deletion

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 2a353de3fd8028171575f68acc84605c869bd010
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 24 09:34:41 2023 +0700

    JAMES-3909 Integration tests for data deletion
    
    RRT, JMAP datas, Vacations, Delegations
---
 .../james/modules/data/CassandraJmapModule.java    |   9 +
 .../modules/data/CassandraVacationModule.java      |   5 +
 .../main/java/org/apache/james/CoreDataModule.java |   7 +-
 .../java/org/apache/james/utils/DataProbeImpl.java |  16 +-
 .../james/modules/data/MemoryDataJmapModule.java   |   9 +
 .../james/modules/data/MemoryDataModule.java       |   5 +
 .../java/org/apache/james/probe/DataProbe.java     |   3 +
 .../RecipientRewriteTableUserDeletionTaskStep.java |   3 +
 .../identity/CassandraCustomIdentityDAO.scala      |   2 +-
 .../james/jmap/api/model/PushSubscription.scala    |   4 +
 .../memory/MemoryUserDeletionIntegrationTest.java  | 200 ++++++++++++++++++++-
 11 files changed, 255 insertions(+), 8 deletions(-)

diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
index 7a3e8a65f4..e1b9584628 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraJmapModule.java
@@ -30,12 +30,15 @@ import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTO;
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
 import org.apache.james.jmap.api.access.AccessTokenRepository;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
+import org.apache.james.jmap.api.filtering.FiltersDeleteUserDataTaskStep;
 import org.apache.james.jmap.api.filtering.impl.EventSourcingFilteringManagement;
 import org.apache.james.jmap.api.filtering.impl.FilterUsernameChangeTaskStep;
 import org.apache.james.jmap.api.identity.CustomIdentityDAO;
+import org.apache.james.jmap.api.identity.IdentityUserDeletionTaskStep;
 import org.apache.james.jmap.api.projections.EmailQueryView;
 import org.apache.james.jmap.api.projections.MessageFastViewProjection;
 import org.apache.james.jmap.api.projections.MessageFastViewProjectionHealthCheck;
+import org.apache.james.jmap.api.pushsubscription.PushDeleteUserDataTaskStep;
 import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository;
 import org.apache.james.jmap.api.upload.UploadRepository;
 import org.apache.james.jmap.cassandra.access.CassandraAccessModule;
@@ -57,6 +60,7 @@ import org.apache.james.jmap.cassandra.upload.CassandraUploadRepository;
 import org.apache.james.jmap.cassandra.upload.UploadConfiguration;
 import org.apache.james.jmap.cassandra.upload.UploadDAO;
 import org.apache.james.jmap.cassandra.upload.UploadModule;
+import org.apache.james.user.api.DeleteUserDataTaskStep;
 import org.apache.james.user.api.UsernameChangeTaskStep;
 import org.apache.james.utils.PropertiesProvider;
 
@@ -116,6 +120,11 @@ public class CassandraJmapModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), UsernameChangeTaskStep.class)
             .addBinding()
             .to(FilterUsernameChangeTaskStep.class);
+
+        Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskSteps = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(FiltersDeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(IdentityUserDeletionTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(PushDeleteUserDataTaskStep.class);
     }
 
     @Singleton
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraVacationModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraVacationModule.java
index 61e47df883..f916dbdea3 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraVacationModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/data/CassandraVacationModule.java
@@ -21,7 +21,9 @@ package org.apache.james.modules.data;
 
 import org.apache.james.DefaultVacationService;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.user.api.DeleteUserDataTaskStep;
 import org.apache.james.vacation.api.NotificationRegistry;
+import org.apache.james.vacation.api.VacationDeleteUserTaskStep;
 import org.apache.james.vacation.api.VacationRepository;
 import org.apache.james.vacation.api.VacationService;
 import org.apache.james.vacation.cassandra.CassandraNotificationRegistry;
@@ -47,6 +49,9 @@ public class CassandraVacationModule extends AbstractModule {
         Multibinder<CassandraModule> cassandraVacationDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraVacationDefinitions.addBinding().toInstance(org.apache.james.vacation.cassandra.CassandraVacationModule.MODULE);
         cassandraVacationDefinitions.addBinding().toInstance(org.apache.james.vacation.cassandra.CassandraNotificationRegistryModule.MODULE);
+
+        Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskSteps = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(VacationDeleteUserTaskStep.class);
     }
 
 }
diff --git a/server/container/guice/common/src/main/java/org/apache/james/CoreDataModule.java b/server/container/guice/common/src/main/java/org/apache/james/CoreDataModule.java
index ae54975465..f04d4a3786 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/CoreDataModule.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/CoreDataModule.java
@@ -24,7 +24,9 @@ import java.util.Set;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.rrt.ForwardUsernameChangeTaskStep;
+import org.apache.james.rrt.RecipientRewriteTableUserDeletionTaskStep;
 import org.apache.james.server.core.configuration.ConfigurationProvider;
+import org.apache.james.user.api.DelegationUserDeletionTaskStep;
 import org.apache.james.user.api.DeleteUserDataTaskStep;
 import org.apache.james.user.api.UsernameChangeTaskStep;
 
@@ -40,7 +42,10 @@ public class CoreDataModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), UserEntityValidator.class).addBinding().to(RecipientRewriteTableUserEntityValidator.class);
 
         Multibinder.newSetBinder(binder(), UsernameChangeTaskStep.class).addBinding().to(ForwardUsernameChangeTaskStep.class);
-        Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+
+        Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskSteps = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(RecipientRewriteTableUserDeletionTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(DelegationUserDeletionTaskStep.class);
     }
 
     @Provides
diff --git a/server/container/guice/common/src/main/java/org/apache/james/utils/DataProbeImpl.java b/server/container/guice/common/src/main/java/org/apache/james/utils/DataProbeImpl.java
index 7dc2815105..1bb0826fcc 100644
--- a/server/container/guice/common/src/main/java/org/apache/james/utils/DataProbeImpl.java
+++ b/server/container/guice/common/src/main/java/org/apache/james/utils/DataProbeImpl.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.utils;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -39,6 +40,7 @@ import org.apache.james.util.streams.Iterators;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 public class DataProbeImpl implements GuiceProbe, DataProbe {
@@ -48,11 +50,8 @@ public class DataProbeImpl implements GuiceProbe, DataProbe {
     private final DelegationStore delegationStore;
 
     @Inject
-    private DataProbeImpl(
-        DomainList domainList,
-        UsersRepository usersRepository,
-        RecipientRewriteTable recipientRewriteTable,
-        DelegationStore delegationStore) {
+    private DataProbeImpl(DomainList domainList, UsersRepository usersRepository,
+                          RecipientRewriteTable recipientRewriteTable, DelegationStore delegationStore) {
         this.domainList = domainList;
         this.usersRepository = usersRepository;
         this.recipientRewriteTable = recipientRewriteTable;
@@ -145,4 +144,11 @@ public class DataProbeImpl implements GuiceProbe, DataProbe {
         Mono.from(delegationStore.addAuthorizedUser(baseUser, userWithAccess))
             .block();
     }
+
+    @Override
+    public Collection<Username> listAuthorizedUsers(Username baseUser) {
+        return Flux.from(delegationStore.authorizedUsers(baseUser))
+            .collectList()
+            .block();
+    }
 }
\ No newline at end of file
diff --git a/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataJmapModule.java b/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataJmapModule.java
index c7974d853a..09a866669e 100644
--- a/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataJmapModule.java
+++ b/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataJmapModule.java
@@ -22,12 +22,15 @@ package org.apache.james.modules.data;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.jmap.api.access.AccessTokenRepository;
 import org.apache.james.jmap.api.filtering.FilteringManagement;
+import org.apache.james.jmap.api.filtering.FiltersDeleteUserDataTaskStep;
 import org.apache.james.jmap.api.filtering.impl.EventSourcingFilteringManagement;
 import org.apache.james.jmap.api.filtering.impl.FilterUsernameChangeTaskStep;
 import org.apache.james.jmap.api.identity.CustomIdentityDAO;
+import org.apache.james.jmap.api.identity.IdentityUserDeletionTaskStep;
 import org.apache.james.jmap.api.projections.EmailQueryView;
 import org.apache.james.jmap.api.projections.MessageFastViewProjection;
 import org.apache.james.jmap.api.projections.MessageFastViewProjectionHealthCheck;
+import org.apache.james.jmap.api.pushsubscription.PushDeleteUserDataTaskStep;
 import org.apache.james.jmap.api.upload.UploadRepository;
 import org.apache.james.jmap.memory.access.MemoryAccessTokenRepository;
 import org.apache.james.jmap.memory.identity.MemoryCustomIdentityDAO;
@@ -37,6 +40,7 @@ import org.apache.james.jmap.memory.upload.InMemoryUploadRepository;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.extractor.JsoupTextExtractor;
+import org.apache.james.user.api.DeleteUserDataTaskStep;
 import org.apache.james.user.api.UsernameChangeTaskStep;
 
 import com.google.inject.AbstractModule;
@@ -76,5 +80,10 @@ public class MemoryDataJmapModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), UsernameChangeTaskStep.class)
             .addBinding()
             .to(FilterUsernameChangeTaskStep.class);
+
+        Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskSteps = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(FiltersDeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(IdentityUserDeletionTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(PushDeleteUserDataTaskStep.class);
     }
 }
diff --git a/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataModule.java b/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
index 42e8cb262b..de0beda071 100644
--- a/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
+++ b/server/container/guice/memory/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
@@ -41,11 +41,13 @@ import org.apache.james.rrt.lib.AliasReverseResolverImpl;
 import org.apache.james.rrt.lib.CanSendFromImpl;
 import org.apache.james.rrt.memory.MemoryRecipientRewriteTable;
 import org.apache.james.server.core.configuration.ConfigurationProvider;
+import org.apache.james.user.api.DeleteUserDataTaskStep;
 import org.apache.james.util.date.DefaultZonedDateTimeProvider;
 import org.apache.james.util.date.ZonedDateTimeProvider;
 import org.apache.james.utils.InitializationOperation;
 import org.apache.james.utils.InitilizationOperationBuilder;
 import org.apache.james.vacation.api.NotificationRegistry;
+import org.apache.james.vacation.api.VacationDeleteUserTaskStep;
 import org.apache.james.vacation.api.VacationRepository;
 import org.apache.james.vacation.api.VacationService;
 import org.apache.james.vacation.memory.MemoryNotificationRegistry;
@@ -105,6 +107,9 @@ public class MemoryDataModule extends AbstractModule {
 
         Multibinder.newSetBinder(binder(), MailRepositoryFactory.class)
                 .addBinding().to(MemoryMailRepositoryFactory.class);
+
+        Multibinder<DeleteUserDataTaskStep> deleteUserDataTaskSteps = Multibinder.newSetBinder(binder(), DeleteUserDataTaskStep.class);
+        deleteUserDataTaskSteps.addBinding().to(VacationDeleteUserTaskStep.class);
     }
 
     @ProvidesIntoSet
diff --git a/server/data/data-api/src/main/java/org/apache/james/probe/DataProbe.java b/server/data/data-api/src/main/java/org/apache/james/probe/DataProbe.java
index 4e637db32d..24a90ecf57 100644
--- a/server/data/data-api/src/main/java/org/apache/james/probe/DataProbe.java
+++ b/server/data/data-api/src/main/java/org/apache/james/probe/DataProbe.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.probe;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -83,4 +84,6 @@ public interface DataProbe {
     void addGroupAliasMapping(String fromGroup, String toAddress) throws Exception;
 
     void addAuthorizedUser(Username baseUser, Username userWithAccess);
+
+    Collection<Username> listAuthorizedUsers(Username baseUser);
 }
\ No newline at end of file
diff --git a/server/data/data-api/src/main/java/org/apache/james/rrt/RecipientRewriteTableUserDeletionTaskStep.java b/server/data/data-api/src/main/java/org/apache/james/rrt/RecipientRewriteTableUserDeletionTaskStep.java
index ecc8afe636..ae056c1180 100644
--- a/server/data/data-api/src/main/java/org/apache/james/rrt/RecipientRewriteTableUserDeletionTaskStep.java
+++ b/server/data/data-api/src/main/java/org/apache/james/rrt/RecipientRewriteTableUserDeletionTaskStep.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.rrt;
 
+import javax.inject.Inject;
+
 import org.apache.james.core.Username;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.lib.Mapping;
@@ -35,6 +37,7 @@ import reactor.core.publisher.Mono;
 public class RecipientRewriteTableUserDeletionTaskStep implements DeleteUserDataTaskStep {
     private final RecipientRewriteTable rrt;
 
+    @Inject
     public RecipientRewriteTableUserDeletionTaskStep(RecipientRewriteTable rrt) {
         this.rrt = rrt;
     }
diff --git a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityDAO.scala b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityDAO.scala
index 9078b49b31..3b2b3393d8 100644
--- a/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityDAO.scala
+++ b/server/data/data-jmap-cassandra/src/main/scala/org/apache/james/jmap/cassandra/identity/CassandraCustomIdentityDAO.scala
@@ -111,7 +111,7 @@ case class CassandraCustomIdentityDAO @Inject()(session: CqlSession,
       .`then`()
 
   override def delete(username: Username): SMono[Unit] =
-    SMono(executor.executeVoid(deleteOneStatement.bind()
+    SMono(executor.executeVoid(deleteAllStatement.bind()
         .setString(USER, username.asString())))
       .`then`()
 
diff --git a/server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/PushSubscription.scala b/server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/PushSubscription.scala
index 69d4f77567..3dfeac1035 100644
--- a/server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/PushSubscription.scala
+++ b/server/data/data-jmap/src/main/scala/org/apache/james/jmap/api/model/PushSubscription.scala
@@ -88,6 +88,10 @@ case class PushSubscriptionKeys(p256dh: String, auth: String) {
   private def asECPublicKey(): ECPublicKey = EllipticCurves.getEcPublicKey(Base64.getUrlDecoder.decode(p256dh))
 }
 
+object PushSubscriptionCreationRequest {
+  val noTypes: Seq[TypeName] = Seq()
+}
+
 case class PushSubscriptionCreationRequest(deviceClientId: DeviceClientId,
                                            url: PushSubscriptionServerURL,
                                            keys: Option[PushSubscriptionKeys] = None,
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUserDeletionIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUserDeletionIntegrationTest.java
index 40659bbac7..6fc450b308 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUserDeletionIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUserDeletionIntegrationTest.java
@@ -28,11 +28,30 @@ import static org.apache.james.jmap.JMAPTestingConstants.DOMAIN;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.hasSize;
 
+import java.net.URL;
+import java.util.List;
+import java.util.Optional;
+
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.MemoryJamesConfiguration;
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.core.MailAddress;
+import org.apache.james.core.Username;
+import org.apache.james.jmap.api.filtering.FilteringManagement;
+import org.apache.james.jmap.api.filtering.Rule;
+import org.apache.james.jmap.api.filtering.Rules;
+import org.apache.james.jmap.api.identity.CustomIdentityDAO;
+import org.apache.james.jmap.api.identity.IdentityCreationRequest;
+import org.apache.james.jmap.api.model.AccountId;
+import org.apache.james.jmap.api.model.EmailAddress;
+import org.apache.james.jmap.api.model.Identity;
+import org.apache.james.jmap.api.model.PushSubscription;
+import org.apache.james.jmap.api.model.PushSubscriptionCreationRequest;
+import org.apache.james.jmap.api.model.PushSubscriptionServerURL;
+import org.apache.james.jmap.api.pushsubscription.PushSubscriptionRepository;
+import org.apache.james.jmap.draft.JmapGuiceProbe;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.modules.ACLProbeImpl;
@@ -40,15 +59,69 @@ import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.GuiceProbe;
 import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.vacation.api.Vacation;
+import org.apache.james.vacation.api.VacationPatch;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
+
+import com.google.inject.Inject;
+import com.google.inject.multibindings.Multibinder;
 
 import io.restassured.specification.RequestSpecification;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import scala.None;
+import scala.Option;
+import scala.collection.immutable.Seq;
 
 class MemoryUserDeletionIntegrationTest {
+    public static class MemoryUserDeletionIntegrationTestProbe implements GuiceProbe {
+        private final FilteringManagement filteringManagement;
+        private final CustomIdentityDAO identityRepository;
+        private final PushSubscriptionRepository pushSubscriptionRepository;
+
+        @Inject
+        public MemoryUserDeletionIntegrationTestProbe(FilteringManagement filteringManagement, CustomIdentityDAO identityRepository, PushSubscriptionRepository pushSubscriptionRepository) {
+            this.filteringManagement = filteringManagement;
+            this.identityRepository = identityRepository;
+            this.pushSubscriptionRepository = pushSubscriptionRepository;
+        }
+
+        Rules listFilters(Username username) {
+            return Mono.from(filteringManagement.listRulesForUser(username))
+                .block();
+        }
+
+        void defineFilters(Username username, List<Rule> ruleList) {
+            Mono.from(filteringManagement.defineRulesForUser(username, ruleList, Optional.empty())).block();
+        }
+
+        List<Identity> listIdentities(Username username) {
+            return Flux.from(identityRepository.list(username))
+                .collectList()
+                .block();
+        }
+
+        void addIdentity(Username username, IdentityCreationRequest identity) {
+            Mono.from(identityRepository.save(username, identity)).block();
+        }
+
+        List<PushSubscription> listPushSubscriptions(Username username) {
+            return Flux.from(pushSubscriptionRepository.list(username))
+                .collectList()
+                .block();
+        }
+
+        void addPushSubscriptions(Username username, PushSubscriptionCreationRequest pushSubscription) {
+            Mono.from(pushSubscriptionRepository.save(username, pushSubscription)).block();
+        }
+    }
+
     @RegisterExtension
     static JamesServerExtension jamesServerExtension = new JamesServerBuilder<MemoryJamesConfiguration>(tmpDir ->
         MemoryJamesConfiguration.builder()
@@ -57,7 +130,10 @@ class MemoryUserDeletionIntegrationTest {
             .usersRepository(DEFAULT)
             .build())
         .server(configuration -> MemoryJamesServerMain.createServer(configuration)
-            .overrideWith(new TestJMAPServerModule()))
+            .overrideWith(new TestJMAPServerModule(),
+                binder -> Multibinder.newSetBinder(binder, GuiceProbe.class)
+                    .addBinding()
+                    .to(MemoryUserDeletionIntegrationTestProbe.class)))
         .build();
 
     private RequestSpecification webAdminApi;
@@ -108,4 +184,126 @@ class MemoryUserDeletionIntegrationTest {
             .hasSize(1)
             .containsEntry(MailboxACL.EntryKey.deserialize("owner"), MailboxACL.FULL_RIGHTS);
     }
+
+    @Test
+    void shouldDeleteRRTs(GuiceJamesServer server) throws Exception {
+        server.getProbe(DataProbeImpl.class)
+            .addAddressMapping(ALICE.getLocalPart(), DOMAIN, BOB.asString());
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(DataProbeImpl.class).listMappings())
+            .isEmpty();
+    }
+
+    @Test
+    void shouldDeleteDelegation(GuiceJamesServer server) {
+        server.getProbe(DataProbeImpl.class)
+            .addAuthorizedUser(ALICE, BOB);
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(DataProbeImpl.class).listAuthorizedUsers(ALICE))
+            .isEmpty();
+    }
+
+    @Test
+    void shouldDeleteVacation(GuiceJamesServer server) {
+        server.getProbe(JmapGuiceProbe.class)
+            .modifyVacation(AccountId.fromUsername(ALICE), VacationPatch.builder()
+                .textBody("text body")
+                .build());
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(JmapGuiceProbe.class).retrieveVacation(AccountId.fromUsername(ALICE)))
+            .isEqualTo(Vacation.builder()
+                .enabled(false)
+                .build());
+    }
+
+    @Test
+    void shouldDeleteFilters(GuiceJamesServer server) {
+        Rule.Condition CONDITION = Rule.Condition.of(Rule.Condition.Field.CC, Rule.Condition.Comparator.CONTAINS, "something");
+        Rule.Action ACTION = Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds("id-01"));
+        Rule.Builder RULE_BUILDER = Rule.builder().name("A name").condition(CONDITION).action(ACTION);
+        Rule RULE_1 = RULE_BUILDER.id(Rule.Id.of("1")).build();
+        server.getProbe(MemoryUserDeletionIntegrationTestProbe.class)
+            .defineFilters(ALICE, ImmutableList.of(RULE_1));
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(MemoryUserDeletionIntegrationTestProbe.class).listFilters(ALICE).getRules())
+            .isEmpty();
+    }
+
+    @Test
+    void shouldDeleteIdentities(GuiceJamesServer server) throws Exception {
+        server.getProbe(MemoryUserDeletionIntegrationTestProbe.class)
+            .addIdentity(ALICE, IdentityCreationRequest.fromJava(
+                ALICE.asMailAddress(),
+                Optional.of("identity name 1"),
+                Optional.of(List.of(EmailAddress.from(Optional.of("reply name 1"), new MailAddress("reply1@domain.org")))),
+                Optional.of(List.of(EmailAddress.from(Optional.of("bcc name 1"), new MailAddress("bcc1@domain.org")))),
+                Optional.of(1),
+                Optional.of("textSignature 1"),
+                Optional.of("htmlSignature 1")));
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(MemoryUserDeletionIntegrationTestProbe.class).listIdentities(ALICE))
+            .isEmpty();
+    }
+
+    @Test
+    void shouldDeletePushSubscriptions(GuiceJamesServer server) throws Exception {
+        server.getProbe(MemoryUserDeletionIntegrationTestProbe.class)
+            .addPushSubscriptions(ALICE, new PushSubscriptionCreationRequest(
+                "device",
+                new PushSubscriptionServerURL(new URL("http://whatever/toto")),
+                Option.empty(),
+                Option.empty(),
+                PushSubscriptionCreationRequest.noTypes()));
+
+        String taskId = webAdminApi
+            .queryParam("action", "deleteData")
+            .post("/users/" + ALICE.asString())
+            .jsonPath()
+            .get("taskId");
+
+        webAdminApi.get("/tasks/" + taskId + "/await");
+
+        assertThat(server.getProbe(MemoryUserDeletionIntegrationTestProbe.class).listPushSubscriptions(ALICE))
+            .isEmpty();
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org