blob: 023198ceb9295a6d8f59ed67f96e8bdd1db26192 [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you under the Apache License, Version 2.0 (the *
* "License"); you may not use this file except in compliance *
* with the License. You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
* KIND, either express or implied. See the License for the *
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
package org.apache.james.jmap.mailet.filter;
import static org.apache.james.jmap.mailet.filter.JMAPFilteringFixture.RECIPIENT_1;
import static org.apache.james.jmap.mailet.filter.JMAPFilteringFixture.RECIPIENT_1_MAILBOX_1;
import static org.apache.james.jmap.mailet.filter.JMAPFilteringFixture.RECIPIENT_1_USERNAME;
import static org.apache.james.jmap.mailet.filter.JMAPFilteringFixture.USER_1_ADDRESS;
import static org.mockito.Mockito.mock;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import jakarta.mail.MessagingException;
import org.apache.james.core.Username;
import org.apache.james.core.builder.MimeMessageBuilder;
import org.apache.james.domainlist.api.DomainList;
import org.apache.james.eventsourcing.eventstore.memory.InMemoryEventStore;
import org.apache.james.jmap.api.filtering.FilteringManagement;
import org.apache.james.jmap.api.filtering.Rule;
import org.apache.james.jmap.api.filtering.impl.EventSourcingFilteringManagement;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.user.memory.MemoryUsersRepository;
import org.apache.mailet.MailetConfig;
import org.apache.mailet.base.test.FakeMail;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
import com.google.common.collect.ImmutableList;
import reactor.core.publisher.Mono;
public class JMAPFilteringExtension implements BeforeEachCallback, ParameterResolver {
private static final DomainList NO_DOMAIN_LIST = null;
class JMAPFilteringTestSystem {
private final JMAPFiltering jmapFiltering;
private final FilteringManagement filteringManagement;
private final InMemoryMailboxManager mailboxManager;
private final MailboxId recipient1Mailbox;
JMAPFilteringTestSystem(JMAPFiltering jmapFiltering, FilteringManagement filteringManagement,
InMemoryMailboxManager mailboxManager) {
this.jmapFiltering = jmapFiltering;
this.filteringManagement = filteringManagement;
this.mailboxManager = mailboxManager;
try {
this.recipient1Mailbox = createMailbox(RECIPIENT_1_USERNAME, RECIPIENT_1_MAILBOX_1.value());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public JMAPFiltering getJmapFiltering() {
return jmapFiltering;
}
public FilteringManagement getFilteringManagement() {
return filteringManagement;
}
public InMemoryMailboxManager getMailboxManager() {
return mailboxManager;
}
public MailboxId getRecipient1MailboxId() {
return recipient1Mailbox;
}
public MailboxId createMailbox(Username username, String mailboxName) throws Exception {
MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
return mailboxManager
.createMailbox(MailboxPath.forUser(username, mailboxName), mailboxSession)
.orElseThrow(() -> new RuntimeException("Missing mailboxId when creating mailbox"));
}
public void defineRulesForRecipient1(Rule.Condition... conditions) {
defineRulesForRecipient1(Arrays.asList(conditions));
}
public void defineRulesForRecipient1(List<Rule.Condition> conditions) {
AtomicInteger counter = new AtomicInteger();
ImmutableList<Rule> rules = conditions
.stream()
.map(condition -> Rule.builder()
.id(Rule.Id.of(String.valueOf(counter.incrementAndGet())))
.name(String.valueOf(counter.incrementAndGet()))
.conditionGroup(condition)
.action(Rule.Action.of(Rule.Action.AppendInMailboxes.withMailboxIds(testSystem.getRecipient1MailboxId().serialize())))
.build())
.collect(ImmutableList.toImmutableList());
Mono.from(testSystem.getFilteringManagement().defineRulesForUser(RECIPIENT_1_USERNAME, rules, Optional.empty())).block();
}
public FakeMail asMail(MimeMessageBuilder mimeMessageBuilder) throws MessagingException {
return FakeMail.builder()
.name("name")
.sender(USER_1_ADDRESS)
.recipients(RECIPIENT_1)
.mimeMessage(mimeMessageBuilder)
.build();
}
}
private JMAPFilteringTestSystem testSystem;
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
FilteringManagement filteringManagement = new EventSourcingFilteringManagement(new InMemoryEventStore());
MemoryUsersRepository usersRepository = MemoryUsersRepository.withoutVirtualHosting(NO_DOMAIN_LIST);
InMemoryMailboxManager mailboxManager = InMemoryIntegrationResources.defaultResources().getMailboxManager();
ActionApplier.Factory actionApplierFactory = ActionApplier.factory(mailboxManager, new InMemoryId.Factory());
JMAPFiltering jmapFiltering = new JMAPFiltering(filteringManagement, usersRepository, actionApplierFactory);
jmapFiltering.init(mock(MailetConfig.class));
testSystem = new JMAPFilteringTestSystem(jmapFiltering, filteringManagement, mailboxManager);
}
@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return (parameterContext.getParameter().getType() == JMAPFilteringTestSystem.class);
}
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return testSystem;
}
}