MAILBOX-363 MessageMoveEvent JSON serialization
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/26af5b2b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/26af5b2b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/26af5b2b Branch: refs/heads/master Commit: 26af5b2bd46dedc2e7734f508930443566639891 Parents: 8a91427 Author: Benoit Tellier <[email protected]> Authored: Mon Dec 17 10:46:17 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Wed Dec 19 18:24:21 2018 +0700 ---------------------------------------------------------------------- .../james/event/json/EventSerializer.scala | 34 +- .../json/MessageMoveEventSerializationTest.java | 412 +++++++++++++++++++ 2 files changed, 436 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/26af5b2b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala ---------------------------------------------------------------------- diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala index 01cb1b8..31ebf49 100644 --- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala +++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala @@ -26,17 +26,11 @@ import javax.mail.{Flags => JavaMailFlags} import julienrf.json.derived import org.apache.james.core.quota.{QuotaCount, QuotaSize, QuotaValue} import org.apache.james.core.{Domain, User} -import org.apache.james.event.json.DTOs.{ACLDiff, MailboxPath, Quota} -import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, - MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, - MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent} +import org.apache.james.event.json.DTOs.{ACLDiff, Flags, MailboxPath, Quota} +import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent} import org.apache.james.mailbox.MailboxSession.SessionId -import org.apache.james.mailbox.model.{MailboxId, MessageId, QuotaRoot, MailboxACL => JavaMailboxACL, Quota => JavaQuota} -import org.apache.james.event.json.DTOs.{Flags, MailboxPath, Quota} -import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent} -import org.apache.james.mailbox.MailboxSession.SessionId -import org.apache.james.mailbox.model.{MailboxId, MessageId, QuotaRoot, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota} -import org.apache.james.mailbox.{MessageUid, Event => JavaEvent} +import org.apache.james.mailbox.model.{MailboxId, MessageId, MessageMoves, QuotaRoot, MailboxACL => JavaMailboxACL, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota} +import org.apache.james.mailbox.{MessageUid, Event => JavaEvent, MessageMoveEvent => JavaMessageMoveEvent} import play.api.libs.json.{JsArray, JsError, JsNull, JsNumber, JsObject, JsResult, JsString, JsSuccess, Json, OFormat, Reads, Writes} import scala.collection.JavaConverters._ @@ -89,6 +83,18 @@ private object DTO { mailboxId, expunged.mapValues(_.toJava).asJava) } + + case class MessageMoveEvent(user: User, previousMailboxIds: Seq[MailboxId], targetMailboxIds: Seq[MailboxId], + messageIds: Seq[MessageId]) extends Event { + override def toJava: JavaEvent = JavaMessageMoveEvent.builder() + .user(user) + .messageId(messageIds.asJava) + .messageMoves(MessageMoves.builder() + .previousMailboxIds(previousMailboxIds.asJava) + .targetMailboxIds(targetMailboxIds.asJava) + .build()) + .build() + } } private object ScalaConverter { @@ -149,6 +155,13 @@ private object ScalaConverter { expunged = event.getExpunged.asScala.mapValues(DTOs.MessageMetaData.fromJava).toMap ) + private def toScala(event: JavaMessageMoveEvent): DTO.MessageMoveEvent = DTO.MessageMoveEvent( + user = event.getUser, + previousMailboxIds = event.getMessageMoves.getPreviousMailboxIds.asScala.toList, + targetMailboxIds = event.getMessageMoves.getTargetMailboxIds.asScala.toList, + messageIds = event.getMessageIds.asScala.toList) + + def toScala(javaEvent: JavaEvent): Event = javaEvent match { case e: JavaAdded => toScala(e) case e: JavaExpunged => toScala(e) @@ -156,6 +169,7 @@ private object ScalaConverter { case e: JavaMailboxAdded => toScala(e) case e: JavaMailboxDeletion => toScala(e) case e: JavaMailboxRenamed => toScala(e) + case e: JavaMessageMoveEvent => toScala(e) case e: JavaQuotaUsageUpdatedEvent => toScala(e) case _ => throw new RuntimeException("no Scala conversion known") } http://git-wip-us.apache.org/repos/asf/james-project/blob/26af5b2b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java ---------------------------------------------------------------------- diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java new file mode 100644 index 0000000..f3008dc --- /dev/null +++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java @@ -0,0 +1,412 @@ +/**************************************************************** + * 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.event.json; + +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.NoSuchElementException; + +import org.apache.james.core.User; +import org.apache.james.mailbox.Event; +import org.apache.james.mailbox.MessageMoveEvent; +import org.apache.james.mailbox.model.MessageMoves; +import org.apache.james.mailbox.model.TestId; +import org.apache.james.mailbox.model.TestMessageId; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class MessageMoveEventSerializationTest { + private static final EventSerializer EVENT_SERIALIZER = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory()); + + private static final Event EVENT = MessageMoveEvent.builder() + .user(User.fromUsername("[email protected]")) + .messageId(TestMessageId.of(42)) + .messageMoves( + MessageMoves.builder() + .previousMailboxIds(TestId.of(18), TestId.of(24)) + .targetMailboxIds(TestId.of(36)) + .build()) + .build(); + private static final String JSON = "{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}"; + + @Test + void messageMoveEventShouldBeWellSerialized() { + assertThatJson(EVENT_SERIALIZER.toJson(EVENT)) + .isEqualTo(JSON); + } + + @Test + void messageMoveEventShouldBeWellDeSerialized() { + assertThat(EVENT_SERIALIZER.fromJson(JSON).get()) + .isEqualTo(EVENT); + } + + @Nested + class ValidPayloads { + @Nested + class NoVirtualHosting { + private final Event event = MessageMoveEvent.builder() + .user(User.fromUsername("bob")) + .messageId(TestMessageId.of(42)) + .messageMoves( + MessageMoves.builder() + .previousMailboxIds(TestId.of(18), TestId.of(24)) + .targetMailboxIds(TestId.of(36)) + .build()) + .build(); + private final String json = "{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"bob\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}"; + + @Test + void messageMoveEventShouldBeWellSerialized() { + assertThatJson(EVENT_SERIALIZER.toJson(event)) + .isEqualTo(json); + } + + @Test + void messageMoveEventShouldBeWellDeSerialized() { + assertThat(EVENT_SERIALIZER.fromJson(json).get()) + .isEqualTo(event); + } + } + + @Nested + class EmptyTargetMailboxIds { + private final Event event = MessageMoveEvent.builder() + .user(User.fromUsername("bob")) + .messageId(TestMessageId.of(42)) + .messageMoves( + MessageMoves.builder() + .previousMailboxIds(TestId.of(18), TestId.of(24)) + .build()) + .build(); + private final String json = "{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"bob\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": []," + + " \"messageIds\": [\"42\"]" + + " }" + + "}"; + + @Test + void messageMoveEventShouldBeWellSerialized() { + assertThatJson(EVENT_SERIALIZER.toJson(event)) + .isEqualTo(json); + } + + @Test + void messageMoveEventShouldBeWellDeSerialized() { + assertThat(EVENT_SERIALIZER.fromJson(json).get()) + .isEqualTo(event); + } + } + + @Nested + class EmptyPreviousMailboxIds { + private final Event event = MessageMoveEvent.builder() + .user(User.fromUsername("bob")) + .messageId(TestMessageId.of(42)) + .messageMoves( + MessageMoves.builder() + .targetMailboxIds(TestId.of(36)) + .build()) + .build(); + private final String json = "{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"bob\"," + + " \"previousMailboxIds\": []," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}"; + + @Test + void messageMoveEventShouldBeWellSerialized() { + assertThatJson(EVENT_SERIALIZER.toJson(event)) + .isEqualTo(json); + } + + @Test + void messageMoveEventShouldBeWellDeSerialized() { + assertThat(EVENT_SERIALIZER.fromJson(json).get()) + .isEqualTo(event); + } + } + + @Nested + class EmptyMessagesIds { + private final Event event = MessageMoveEvent.builder() + .user(User.fromUsername("bob")) + .messageMoves( + MessageMoves.builder() + .previousMailboxIds(TestId.of(18), TestId.of(24)) + .targetMailboxIds(TestId.of(36)) + .build()) + .build(); + private final String json = "{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"bob\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": []" + + " }" + + "}"; + + @Test + void messageMoveEventShouldBeWellSerialized() { + assertThatJson(EVENT_SERIALIZER.toJson(event)) + .isEqualTo(json); + } + + @Test + void messageMoveEventShouldBeWellDeSerialized() { + assertThat(EVENT_SERIALIZER.fromJson(json).get()) + .isEqualTo(event); + } + } + } + + @Nested + class InvalidPayloads { + @Test + void emptyUserShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void basUsersShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]@bad\"," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void nonStringUserShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": 42," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullUserShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": null," + + " \"previousMailboxIds\": [\"18\", \"24\"]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullPreviousMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": null," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonCollectionPreviousMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": 42," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonStringElementInPreviousMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [42]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullElementInPreviousMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [null]," + + " \"targetMailboxIds\": [\"36\"]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullTargetMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": null," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonCollectionTargetMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": 42," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonStringElementInTargetMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [42]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullElementInTargetMailboxIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [null]," + + " \"messageIds\": [\"42\"]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullMessageIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [\"42\"]," + + " \"messageIds\": null" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonCollectionMessageIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [\"42\"]," + + " \"messageIds\": 42" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nonStringElementInMessageIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [\"42\"]," + + " \"messageIds\": [42]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void nullElementInMessageIdsShouldBeRejected() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" + + " \"MessageMoveEvent\": {" + + " \"user\": \"[email protected]\"," + + " \"previousMailboxIds\": [\"36\"]," + + " \"targetMailboxIds\": [\"42\"]," + + " \"messageIds\": [null]" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
