blob: c9a0db315beab02f570f7f8a9319286ca2c1a296 [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.transport.mailets.delivery;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Flags;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.sieverepository.api.SieveRepository;
import org.apache.james.transport.mailets.ToRecipientFolder;
import org.apache.james.user.api.UsersRepository;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
import org.apache.mailet.base.test.FakeMail;
import org.apache.mailet.base.test.FakeMailContext;
import org.apache.mailet.base.test.FakeMailetConfig;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import com.google.common.collect.Lists;
public class ToRecipientFolderTest {
public static final String USER = "receiver@domain.com";
public static final MailboxPath INBOX = new MailboxPath("#private", USER, "INBOX");
public static final MailboxPath JUNK = new MailboxPath("#private", "receiver", "Junk");
public static final MailboxPath JUNK_VIRTUAL_HOSTING = new MailboxPath("#private", USER, "Junk");
private UsersRepository usersRepository;
private MailboxManager mailboxManager;
private ToRecipientFolder recipientFolder;
private FakeMailetConfig mailetConfig;
@Before
public void setUp() throws Exception {
usersRepository = mock(UsersRepository.class);
mailboxManager = mock(MailboxManager.class);
mailetConfig = new FakeMailetConfig("RecipientFolderTest", FakeMailContext.defaultContext());
recipientFolder = new ToRecipientFolder();
recipientFolder.setMailboxManager(mailboxManager);
recipientFolder.setUsersRepository(usersRepository);
recipientFolder.setSieveRepository(mock(SieveRepository.class));
}
@Test
public void initParameterTesting() throws Exception {
mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk");
recipientFolder.init(mailetConfig);
Assert.assertEquals("Junk", recipientFolder.getInitParameter(ToRecipientFolder.FOLDER_PARAMETER));
}
@Test
public void consumeOptionShouldGhostTheMail() throws Exception {
mailetConfig.setProperty(ToRecipientFolder.CONSUME_PARAMETER, "true");
recipientFolder.init(mailetConfig);
Mail mail = createMail();
recipientFolder.service(mail);
assertThat(mail.getState()).isEqualTo(Mail.GHOST);
}
@Test
public void consumeOptionShouldNotGhostTheMailByDefault() throws Exception {
recipientFolder.init(mailetConfig);
Mail mail = createMail();
recipientFolder.service(mail);
assertThat(mail.getState()).isEqualTo(Mail.DEFAULT);
}
@Test
public void folderParameterShouldIndicateDestinationFolder() throws Exception {
MessageManager messageManager = mock(MessageManager.class);
MailboxSession session = mock(MailboxSession.class);
when(usersRepository.supportVirtualHosting()).thenReturn(true);
when(mailboxManager.getMailbox(eq(JUNK_VIRTUAL_HOSTING), any(MailboxSession.class))).thenReturn(messageManager);
when(session.getPathDelimiter()).thenReturn('.');
when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session);
mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk");
recipientFolder.init(mailetConfig);
recipientFolder.service(createMail());
verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class));
}
@Test
public void folderParameterShouldBeInboxByDefault() throws Exception {
MessageManager messageManager = mock(MessageManager.class);
MailboxSession session = mock(MailboxSession.class);
when(usersRepository.supportVirtualHosting()).thenReturn(true);
when(mailboxManager.getMailbox(eq(INBOX), any(MailboxSession.class))).thenReturn(messageManager);
when(session.getPathDelimiter()).thenReturn('.');
when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session);
recipientFolder.init(mailetConfig);
recipientFolder.service(createMail());
verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class));
}
@Test
public void folderParameterShouldWorkWhenVirtualHostingIsTurnedOff() throws Exception {
MessageManager messageManager = mock(MessageManager.class);
MailboxSession session = mock(MailboxSession.class);
when(usersRepository.supportVirtualHosting()).thenReturn(false);
when(mailboxManager.getMailbox(eq(JUNK), any(MailboxSession.class))).thenReturn(messageManager);
when(session.getPathDelimiter()).thenReturn('.');
when(mailboxManager.createSystemSession(any(String.class), any(Logger.class))).thenReturn(session);
mailetConfig.setProperty(ToRecipientFolder.FOLDER_PARAMETER, "Junk");
recipientFolder.init(mailetConfig);
recipientFolder.service(createMail());
verify(messageManager).appendMessage(any(InputStream.class), any(Date.class), any(MailboxSession.class), eq(true), any(Flags.class));
}
private Mail createMail() throws MessagingException, IOException {
MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
message.setSubject("Subject");
message.setSender(new InternetAddress("sender@any.com"));
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(USER));
MimeMultipart multipart = new MimeMultipart();
MimeBodyPart scriptPart = new MimeBodyPart();
scriptPart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(
"toto",
"application/sieve; charset=UTF-8")
));
scriptPart.setDisposition(MimeBodyPart.ATTACHMENT);
scriptPart.setHeader("Content-Type", "application/sieve; charset=UTF-8");
scriptPart.setFileName("file.txt");
multipart.addBodyPart(scriptPart);
message.setContent(multipart);
message.saveChanges();
Mail mail = new FakeMail(message);
mail.setState(Mail.DEFAULT);
mail.setRecipients(Lists.newArrayList(new MailAddress(USER)));
return mail;
}
}