This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 705b600150bff1e02364cba9d7a395e7f0b03ee8 Author: Benoit Tellier <[email protected]> AuthorDate: Fri Feb 22 12:02:49 2019 +0700 MAILBOX-381 Contract for DeletedMessageVault --- mailbox/plugin/deleted-messages-vault/pom.xml | 5 + .../apache/james/vault/DeletedMessageFixture.java | 74 +++++++++++++ .../org/apache/james/vault/DeletedMessageTest.java | 85 +++++---------- .../james/vault/DeletedMessageVaultContract.java | 114 +++++++++++++++++++++ 4 files changed, 219 insertions(+), 59 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault/pom.xml b/mailbox/plugin/deleted-messages-vault/pom.xml index d931dd7..5423077 100644 --- a/mailbox/plugin/deleted-messages-vault/pom.xml +++ b/mailbox/plugin/deleted-messages-vault/pom.xml @@ -46,6 +46,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>apache-mailet-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java new file mode 100644 index 0000000..69f58e0 --- /dev/null +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java @@ -0,0 +1,74 @@ +/**************************************************************** + * 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.vault; + +import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1; +import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2; +import static org.apache.mailet.base.MailAddressFixture.SENDER; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.time.ZonedDateTime; +import java.util.function.Supplier; + +import org.apache.james.core.MaybeSender; +import org.apache.james.core.User; +import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.inmemory.InMemoryMessageId; + +public interface DeletedMessageFixture { + InMemoryMessageId MESSAGE_ID = InMemoryMessageId.of(42); + InMemoryMessageId MESSAGE_ID_2 = InMemoryMessageId.of(45); + InMemoryId MAILBOX_ID_1 = InMemoryId.of(43); + InMemoryId MAILBOX_ID_2 = InMemoryId.of(44); + User USER = User.fromUsername("[email protected]"); + User USER_2 = User.fromUsername("[email protected]"); + ZonedDateTime DELIVERY_DATE = ZonedDateTime.parse("2014-10-30T14:12:00Z"); + ZonedDateTime DELETION_DATE = ZonedDateTime.parse("2015-10-30T14:12:00Z"); + byte[] CONTENT = "header: value\r\n\r\ncontent".getBytes(StandardCharsets.UTF_8); + String SUBJECT = "subject"; + + + Supplier<DeletedMessage.Builder.FinalStage> FINAL_STAGE = () -> DeletedMessage.builder() + .messageId(MESSAGE_ID) + .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2) + .user(USER) + .deliveryDate(DELIVERY_DATE) + .deletionDate(DELETION_DATE) + .content(() -> new ByteArrayInputStream(CONTENT)) + .sender(MaybeSender.of(SENDER)) + .recipients(RECIPIENT1, RECIPIENT2) + .hasAttachment(false); + DeletedMessage DELETED_MESSAGE_WITH_SUBJECT = FINAL_STAGE.get() + .subject(SUBJECT) + .build(); + DeletedMessage DELETED_MESSAGE = FINAL_STAGE.get().build(); + DeletedMessage DELETED_MESSAGE_2 = DeletedMessage.builder() + .messageId(MESSAGE_ID_2) + .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2) + .user(USER) + .deliveryDate(DELIVERY_DATE) + .deletionDate(DELETION_DATE) + .content(() -> new ByteArrayInputStream(CONTENT)) + .sender(MaybeSender.of(SENDER)) + .recipients(RECIPIENT1, RECIPIENT2) + .hasAttachment(false) + .build(); +} diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java index 1ea1b6a..1426d74 100644 --- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java @@ -19,32 +19,30 @@ package org.apache.james.vault; +import static org.apache.james.vault.DeletedMessageFixture.CONTENT; +import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE; +import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_WITH_SUBJECT; +import static org.apache.james.vault.DeletedMessageFixture.DELETION_DATE; +import static org.apache.james.vault.DeletedMessageFixture.DELIVERY_DATE; +import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_1; +import static org.apache.james.vault.DeletedMessageFixture.MAILBOX_ID_2; +import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID; +import static org.apache.james.vault.DeletedMessageFixture.SUBJECT; +import static org.apache.james.vault.DeletedMessageFixture.USER; +import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1; +import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2; +import static org.apache.mailet.base.MailAddressFixture.SENDER; import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; -import java.time.ZonedDateTime; -import org.apache.james.core.MailAddress; import org.apache.james.core.MaybeSender; -import org.apache.james.core.User; -import org.apache.james.mailbox.inmemory.InMemoryId; -import org.apache.james.mailbox.inmemory.InMemoryMessageId; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Test; import nl.jqno.equalsverifier.EqualsVerifier; class DeletedMessageTest { - private static final InMemoryMessageId MESSAGE_ID = InMemoryMessageId.of(42); - private static final InMemoryId MAILBOX_ID_1 = InMemoryId.of(43); - private static final InMemoryId MAILBOX_ID_2 = InMemoryId.of(44); - private static final User USER = User.fromUsername("[email protected]"); - private static final ZonedDateTime DELIVERY_DATE = ZonedDateTime.parse("2014-10-30T14:12:00Z"); - private static final ZonedDateTime DELETION_DATE = ZonedDateTime.parse("2015-10-30T14:12:00Z"); - private static final byte[] CONTENT = "header: value\r\n\r\ncontent".getBytes(StandardCharsets.UTF_8); - private static final String SUBJECT = "subject"; - @Test void deletedMessageShouldMatchBeanContract() { EqualsVerifier.forClass(DeletedMessage.class) @@ -52,56 +50,25 @@ class DeletedMessageTest { } @Test - void buildShouldReturnDeletedMessageWithAllCompulsoryFields() throws Exception { - MaybeSender sender = MaybeSender.of(new MailAddress("[email protected]")); - MailAddress recipient1 = new MailAddress("[email protected]"); - MailAddress recipient2 = new MailAddress("[email protected]"); - DeletedMessage deletedMessage = DeletedMessage.builder() - .messageId(MESSAGE_ID) - .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2) - .user(USER) - .deliveryDate(DELIVERY_DATE) - .deletionDate(DELETION_DATE) - .content(() -> new ByteArrayInputStream(CONTENT)) - .sender(sender) - .recipients(recipient1, recipient2) - .hasAttachment(false) - .build(); - + void buildShouldReturnDeletedMessageWithAllCompulsoryFields() { SoftAssertions.assertSoftly( soft -> { - soft.assertThat(deletedMessage.getMessageId()).isEqualTo(MESSAGE_ID); - soft.assertThat(deletedMessage.getOriginMailboxes()).containsOnly(MAILBOX_ID_1, MAILBOX_ID_2); - soft.assertThat(deletedMessage.getOwner()).isEqualTo(USER); - soft.assertThat(deletedMessage.getDeliveryDate()).isEqualTo(DELIVERY_DATE); - soft.assertThat(deletedMessage.getDeletionDate()).isEqualTo(DELETION_DATE); - soft.assertThat(deletedMessage.getContent().get()).hasSameContentAs(new ByteArrayInputStream(CONTENT)); - soft.assertThat(deletedMessage.getSender()).isEqualTo(sender); - soft.assertThat(deletedMessage.getRecipients()).containsOnly(recipient1, recipient2); - soft.assertThat(deletedMessage.hasAttachment()).isFalse(); - soft.assertThat(deletedMessage.getSubject()).isEmpty(); + soft.assertThat(DELETED_MESSAGE.getMessageId()).isEqualTo(MESSAGE_ID); + soft.assertThat(DELETED_MESSAGE.getOriginMailboxes()).containsOnly(MAILBOX_ID_1, MAILBOX_ID_2); + soft.assertThat(DELETED_MESSAGE.getOwner()).isEqualTo(USER); + soft.assertThat(DELETED_MESSAGE.getDeliveryDate()).isEqualTo(DELIVERY_DATE); + soft.assertThat(DELETED_MESSAGE.getDeletionDate()).isEqualTo(DELETION_DATE); + soft.assertThat(DELETED_MESSAGE.getContent().get()).hasSameContentAs(new ByteArrayInputStream(CONTENT)); + soft.assertThat(DELETED_MESSAGE.getSender()).isEqualTo(MaybeSender.of(SENDER)); + soft.assertThat(DELETED_MESSAGE.getRecipients()).containsOnly(RECIPIENT1, RECIPIENT2); + soft.assertThat(DELETED_MESSAGE.hasAttachment()).isFalse(); + soft.assertThat(DELETED_MESSAGE.getSubject()).isEmpty(); } ); } @Test - void buildShouldReturnDeletedMessageWithSubject() throws Exception { - MaybeSender sender = MaybeSender.of(new MailAddress("[email protected]")); - MailAddress recipient1 = new MailAddress("[email protected]"); - MailAddress recipient2 = new MailAddress("[email protected]"); - DeletedMessage deletedMessage = DeletedMessage.builder() - .messageId(MESSAGE_ID) - .originMailboxes(MAILBOX_ID_1, MAILBOX_ID_2) - .user(USER) - .deliveryDate(DELIVERY_DATE) - .deletionDate(DELETION_DATE) - .content(() -> new ByteArrayInputStream(CONTENT)) - .sender(sender) - .recipients(recipient1, recipient2) - .hasAttachment(false) - .subject(SUBJECT) - .build(); - - assertThat(deletedMessage.getSubject()).contains(SUBJECT); + void buildShouldReturnDeletedMessageWithSubject() { + assertThat(DELETED_MESSAGE_WITH_SUBJECT.getSubject()).contains(SUBJECT); } } \ No newline at end of file diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java new file mode 100644 index 0000000..1474763 --- /dev/null +++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultContract.java @@ -0,0 +1,114 @@ +/**************************************************************** + * 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.vault; + +import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE; +import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_2; +import static org.apache.james.vault.DeletedMessageFixture.MESSAGE_ID; +import static org.apache.james.vault.DeletedMessageFixture.USER; +import static org.apache.james.vault.DeletedMessageFixture.USER_2; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface DeletedMessageVaultContract { + DeletedMessageVault getVault(); + + @Test + default void searchAllShouldThrowOnNullUser() { + assertThatThrownBy(() -> getVault().search(null, Query.all())) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void searchAllShouldThrowOnNullQuery() { + assertThatThrownBy(() -> getVault().search(USER, null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void appendShouldThrowOnNullMessage() { + assertThatThrownBy(() -> getVault().append(USER, null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void appendShouldThrowOnNullUser() { + assertThatThrownBy(() -> getVault().append(null, DELETED_MESSAGE)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void deleteShouldThrowOnNullMessageId() { + assertThatThrownBy(() -> getVault().delete(null, MESSAGE_ID)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void deleteShouldThrowOnNullUser() { + assertThatThrownBy(() -> getVault().delete(USER, null)) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void searchAllShouldReturnEmptyWhenNoItem() { + assertThat(Flux.from(getVault().search(USER, Query.all())).collectList().block()) + .isEmpty(); + } + + @Test + default void searchAllShouldReturnContainedItems() { + Mono.from(getVault().append(USER, DELETED_MESSAGE)).block(); + + assertThat(Flux.from(getVault().search(USER, Query.all())).collectList().block()) + .containsOnly(DELETED_MESSAGE); + } + + @Test + default void searchAllShouldReturnAllContainedItems() { + Mono.from(getVault().append(USER, DELETED_MESSAGE)).block(); + Mono.from(getVault().append(USER, DELETED_MESSAGE_2)).block(); + + assertThat(Flux.from(getVault().search(USER, Query.all())).collectList().block()) + .containsOnly(DELETED_MESSAGE, DELETED_MESSAGE_2); + } + + @Test + default void vaultShouldBePartitionnedByUser() { + Mono.from(getVault().append(USER, DELETED_MESSAGE)).block(); + + assertThat(Flux.from(getVault().search(USER_2, Query.all())).collectList().block()) + .isEmpty(); + } + + @Test + default void searchAllShouldNotReturnDeletedItems() { + Mono.from(getVault().append(USER, DELETED_MESSAGE)).block(); + + Mono.from(getVault().delete(USER, MESSAGE_ID)).block(); + + assertThat(Flux.from(getVault().search(USER, Query.all())).collectList().block()) + .isEmpty(); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
