MAILBOX-359 Do not mix system and user flags in JSON
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ae28a25a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ae28a25a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ae28a25a Branch: refs/heads/master Commit: ae28a25a26c38d6ff5d533c1f7f4abd087acb51b Parents: 110e9a2 Author: Matthieu Baechler <[email protected]> Authored: Wed Dec 19 14:51:36 2018 +0100 Committer: Benoit Tellier <[email protected]> Committed: Fri Dec 21 09:10:55 2018 +0700 ---------------------------------------------------------------------- .../org/apache/james/event/json/DTOs.scala | 84 ++--- .../james/event/json/EventSerializer.scala | 18 +- .../event/json/AddedSerializationTest.java | 358 +++++++++++++----- .../event/json/ExpungedSerializationTest.java | 370 +++++++++++++----- .../json/FlagsUpdatedSerializationTest.java | 371 +++++++++++++------ 5 files changed, 871 insertions(+), 330 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/ae28a25a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala ---------------------------------------------------------------------- diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala index c708f92..ec8bea4 100644 --- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala +++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala @@ -22,8 +22,10 @@ package org.apache.james.event.json import java.time.Instant import java.util.Date +import javax.mail.Flags.Flag import javax.mail.{Flags => JavaMailFlags} import org.apache.james.core.quota.QuotaValue +import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag import org.apache.james.mailbox.acl.{ACLDiff => JavaACLDiff} import org.apache.james.mailbox.model.{MailboxACL, MessageId, MailboxPath => JavaMailboxPath, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota, UpdatedFlags => JavaUpdatedFlags} import org.apache.james.mailbox.{FlagsBuilder, MessageUid} @@ -74,58 +76,56 @@ object DTOs { def fromJava(javaMessageMetaData: JavaMessageMetaData): MessageMetaData = DTOs.MessageMetaData( javaMessageMetaData.getUid, javaMessageMetaData.getModSeq, - javaMessageMetaData.getFlags, + Flags.fromJavaFlags(javaMessageMetaData.getFlags), javaMessageMetaData.getSize, javaMessageMetaData.getInternalDate.toInstant, javaMessageMetaData.getMessageId) } - case class MessageMetaData(uid: MessageUid, modSeq: Long, flags: JavaMailFlags, size: Long, internalDate: Instant, messageId: MessageId) { - def toJava: JavaMessageMetaData = new JavaMessageMetaData(uid, modSeq, flags, size, Date.from(internalDate), messageId) + case class MessageMetaData(uid: MessageUid, modSeq: Long, flags: Flags, size: Long, internalDate: Instant, messageId: MessageId) { + def toJava: JavaMessageMetaData = new JavaMessageMetaData(uid, modSeq, Flags.toJavaFlags(flags), size, Date.from(internalDate), messageId) } + case class UserFlag(value: String) extends AnyVal + + object SystemFlag extends Enumeration { + type SystemFlag = Value + val Answered, Deleted, Draft, Flagged, Recent, Seen = Value + } + + case class Flags(systemFlags: Seq[SystemFlag], userFlags: Seq[UserFlag]) + object Flags { - val ANSWERED = "\\Answered" - val DELETED = "\\Deleted" - val DRAFT = "\\Draft" - val FLAGGED = "\\Flagged" - val RECENT = "\\Recent" - val SEEN = "\\Seen" - val ALL_SYSTEM_FLAGS = List(ANSWERED, DELETED, DRAFT, FLAGGED, RECENT, SEEN) - - def toJavaFlags(serializedFlags: Array[String]): JavaMailFlags = { - serializedFlags - .map(toJavaMailFlag) - .foldLeft(new FlagsBuilder)((builder, flag) => builder.add(flag)) - .build() - } - def toJavaMailFlag(flag: String): JavaMailFlags = ALL_SYSTEM_FLAGS.contains(flag) match { - case true => new FlagsBuilder().add(stringToSystemFlag(flag)).build() - case false => new FlagsBuilder().add(flag).build() + def toJavaFlags(scalaFlags: Flags): JavaMailFlags = { + new FlagsBuilder { builder => + scalaFlags.userFlags.foreach(flag => builder.add(flag.value)) + scalaFlags.systemFlags.foreach(flag => addJavaFlag(builder, flag)) + }.build() } - def fromJavaFlags(flags: JavaMailFlags): Array[String] = { - flags.getUserFlags ++ flags.getSystemFlags.map(flag => systemFlagToString(flag)) + private def addJavaFlag(builder: FlagsBuilder, flag: SystemFlag): FlagsBuilder = flag match { + case SystemFlag.Answered => builder.add(Flag.ANSWERED) + case SystemFlag.Deleted => builder.add(Flag.DELETED) + case SystemFlag.Draft => builder.add(Flag.DRAFT) + case SystemFlag.Flagged => builder.add(Flag.FLAGGED) + case SystemFlag.Recent => builder.add(Flag.RECENT) + case SystemFlag.Seen => builder.add(Flag.SEEN) } - private def stringToSystemFlag(serializedFlag: String): JavaMailFlags.Flag = serializedFlag match { - case ANSWERED => JavaMailFlags.Flag.ANSWERED - case DELETED => JavaMailFlags.Flag.DELETED - case DRAFT => JavaMailFlags.Flag.DRAFT - case FLAGGED => JavaMailFlags.Flag.FLAGGED - case RECENT => JavaMailFlags.Flag.RECENT - case SEEN => JavaMailFlags.Flag.SEEN - case _ => throw new IllegalArgumentException(serializedFlag + " is not a system flag") + def fromJavaFlags(flags: JavaMailFlags): Flags = { + Flags( + flags.getSystemFlags.map(javaFlagToSystemFlag), + flags.getUserFlags.map(UserFlag)) } - private def systemFlagToString(flag: JavaMailFlags.Flag): String = flag match { - case JavaMailFlags.Flag.ANSWERED => ANSWERED - case JavaMailFlags.Flag.DELETED => DELETED - case JavaMailFlags.Flag.DRAFT => DRAFT - case JavaMailFlags.Flag.FLAGGED => FLAGGED - case JavaMailFlags.Flag.RECENT => RECENT - case JavaMailFlags.Flag.SEEN => SEEN + private def javaFlagToSystemFlag(flag: JavaMailFlags.Flag): SystemFlag = flag match { + case Flag.ANSWERED => SystemFlag.Answered + case Flag.DELETED => SystemFlag.Deleted + case Flag.DRAFT => SystemFlag.Draft + case Flag.FLAGGED => SystemFlag.Flagged + case Flag.RECENT => SystemFlag.Recent + case Flag.SEEN => SystemFlag.Seen } } @@ -133,16 +133,16 @@ object DTOs { def toUpdatedFlags(javaUpdatedFlags: JavaUpdatedFlags): UpdatedFlags = UpdatedFlags( javaUpdatedFlags.getUid, javaUpdatedFlags.getModSeq, - Flags.fromJavaFlags(javaUpdatedFlags.getOldFlags).toList, - Flags.fromJavaFlags(javaUpdatedFlags.getNewFlags).toList) + Flags.fromJavaFlags(javaUpdatedFlags.getOldFlags), + Flags.fromJavaFlags(javaUpdatedFlags.getNewFlags)) } - case class UpdatedFlags(uid: MessageUid, modSeq: Long, oldFlags: List[String], newFlags: List[String]) { + case class UpdatedFlags(uid: MessageUid, modSeq: Long, oldFlags: Flags, newFlags: Flags) { def toJava: JavaUpdatedFlags = JavaUpdatedFlags.builder() .uid(uid) .modSeq(modSeq) - .oldFlags(Flags.toJavaFlags(oldFlags.toArray)) - .newFlags(Flags.toJavaFlags(newFlags.toArray)) + .oldFlags(Flags.toJavaFlags(oldFlags)) + .newFlags(Flags.toJavaFlags(newFlags)) .build() } } http://git-wip-us.apache.org/repos/asf/james-project/blob/ae28a25a/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 b434164..af2785e 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 @@ -22,16 +22,16 @@ package org.apache.james.event.json import java.time.Instant import java.util.{Optional, TreeMap => JavaTreeMap} -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, Flags, MailboxPath, Quota} +import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag +import org.apache.james.event.json.DTOs.{ACLDiff, Flags, MailboxPath, Quota, SystemFlag, UserFlag} import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, FlagsUpdated => JavaFlagsUpdated, 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, 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 play.api.libs.json.{JsError, JsNull, JsNumber, JsObject, JsResult, JsString, JsSuccess, Json, OFormat, Reads, Writes} import scala.collection.JavaConverters._ @@ -191,6 +191,7 @@ private object ScalaConverter { } private class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: MessageId.Factory) { + implicit val systemFlagsWrites: Writes[SystemFlag] = Writes.enumNameWrites implicit val userWriters: Writes[User] = (user: User) => JsString(user.asString) implicit val quotaRootWrites: Writes[QuotaRoot] = quotaRoot => JsString(quotaRoot.getValue) implicit val quotaValueWrites: Writes[QuotaValue[_]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong()) @@ -205,10 +206,14 @@ private class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactor implicit val aclDiffWrites: Writes[ACLDiff] = Json.writes[ACLDiff] implicit val messageIdWrites: Writes[MessageId] = value => JsString(value.serialize()) implicit val messageUidWrites: Writes[MessageUid] = value => JsNumber(value.asLong()) - implicit val flagsWrites: Writes[JavaMailFlags] = value => JsArray(Flags.fromJavaFlags(value).map(flag => JsString(flag))) + implicit val userFlagWrites: Writes[UserFlag] = value => JsString(value.value) + implicit val flagWrites: Writes[Flags] = Json.writes[Flags] + implicit val messageMetaDataWrites: Writes[DTOs.MessageMetaData] = Json.writes[DTOs.MessageMetaData] implicit val updatedFlagsWrites: Writes[DTOs.UpdatedFlags] = Json.writes[DTOs.UpdatedFlags] + implicit val systemFlagsReads: Reads[SystemFlag] = Reads.enumNameReads(SystemFlag) + implicit val aclEntryKeyReads: Reads[JavaMailboxACL.EntryKey] = { case JsString(keyAsString) => JsSuccess(JavaMailboxACL.EntryKey.deserialize(keyAsString)) case _ => JsError() @@ -255,8 +260,8 @@ private class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactor case JsNumber(value) => JsSuccess(MessageUid.of(value.toLong)) case _ => JsError() } - implicit val flagsReads: Reads[JavaMailFlags] = { - case JsArray(seqOfJsValues) => JsSuccess(Flags.toJavaFlags(seqOfJsValues.toArray.map(jsValue => jsValue.toString()))) + implicit val userFlagsReads: Reads[UserFlag] = { + case JsString(x) => JsSuccess(UserFlag(x)) case _ => JsError() } @@ -291,6 +296,7 @@ private class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactor JsObject(m.map { case (k, v) => (String.valueOf(k.asLong()), vr.writes(v)) }.toSeq) } + implicit val flagsReads: Reads[Flags] = Json.reads[Flags] implicit val aclDiffReads: Reads[ACLDiff] = Json.reads[ACLDiff] implicit val quotaCReads: Reads[DTOs.Quota[QuotaCount]] = Json.reads[DTOs.Quota[QuotaCount]] implicit val quotaSReads: Reads[DTOs.Quota[QuotaSize]] = Json.reads[DTOs.Quota[QuotaSize]] http://git-wip-us.apache.org/repos/asf/james-project/blob/ae28a25a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java ---------------------------------------------------------------------- diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java index cbc481a..a96de11 100644 --- a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java +++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java @@ -81,7 +81,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -162,7 +164,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": []," + + " \"flags\": {" + + " \"systemFlags\":[], " + + " \"userFlags\":[]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -209,7 +213,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"Custom 1\", \"Custom 2\", \"\"]," + + " \"flags\": {" + + " \"systemFlags\":[], " + + " \"userFlags\":[\"Custom 1\", \"Custom 2\", \"\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -257,7 +263,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"\\\\Seen\", \"\\\\Answered\", \"\\\\Deleted\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Seen\",\"Answered\",\"Deleted\"], " + + " \"userFlags\":[]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -281,44 +289,6 @@ class AddedSerializationTest { .isEqualTo(onlySystemFlagsAddedEvent); } } - - @Nested - class WithFlagCaseSensitive { - - private static final String CASE_SENSITIVE_SYSTEM_FLAGS_EVENT_JSON = - "{" + - " \"Added\": {" + - " \"path\": {" + - " \"namespace\": \"#private\"," + - " \"user\": \"user\"," + - " \"name\": \"mailboxName\"" + - " }," + - " \"mailboxId\": \"18\"," + - " \"added\": {" + - " \"123456\": {" + - " \"uid\": 123456," + - " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\answereD\", \"\\\\dRaFt\"]," + - " \"size\": 45, " + - " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + - " \"messageId\": \"42\"" + - " }" + - " }," + - " \"sessionId\": 42," + - " \"user\": \"user\"" + - " }" + - "}"; - - @Test - void addedShouldCareAboutSystemFlagsCaseSensitive() { - MailboxListener.Added deSerializedEvent = (MailboxListener.Added) EVENT_SERIALIZER - .fromJson(CASE_SENSITIVE_SYSTEM_FLAGS_EVENT_JSON) - .get(); - - assertThat(deSerializedEvent.getMetaData(MESSAGE_UID).getFlags().getSystemFlags()) - .isEmpty(); - } - } } @Nested @@ -343,7 +313,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51+00:00\"," + " \"messageId\": \"42\"" + @@ -375,7 +347,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51Z\"," + " \"messageId\": \"42\"" + @@ -407,7 +381,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41Z\"," + " \"messageId\": \"42\"" + @@ -420,6 +396,7 @@ class AddedSerializationTest { .isEqualTo(eventRoundToMinute); } } + @Nested class NullOrEmptyNameSpaceInMailboxPath { @@ -437,7 +414,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -465,7 +444,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -501,7 +482,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -545,7 +528,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -572,7 +557,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -600,7 +587,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -631,7 +620,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -658,7 +649,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -686,7 +679,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -716,7 +711,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -744,7 +741,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -772,7 +771,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -806,7 +807,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -837,7 +840,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -869,7 +874,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -897,7 +904,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -951,7 +960,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": \"123456\"," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -979,7 +990,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": null," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -1011,7 +1024,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": \"35\"," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -1039,7 +1054,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": null," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -1053,7 +1070,6 @@ class AddedSerializationTest { } } - @Nested class DeserializationErrorOnSize { @@ -1072,7 +1088,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": \"45\", " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -1100,7 +1118,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": null, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + @@ -1132,7 +1152,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": 42" + @@ -1160,7 +1182,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": null" + @@ -1191,7 +1215,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14 12:52:36+07:00\"," + " \"messageId\": \"42\"" + @@ -1219,7 +1245,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14\"," + " \"messageId\": \"42\"" + @@ -1247,7 +1275,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14TZ\"," + " \"messageId\": \"42\"" + @@ -1275,7 +1305,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14T09:41:51.541\"," + " \"messageId\": \"42\"" + @@ -1303,7 +1335,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"2018-12-14Z\"," + " \"messageId\": \"42\"" + @@ -1331,7 +1365,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": \"\"," + " \"messageId\": \"42\"" + @@ -1359,7 +1395,9 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"User Custom Flag\", \"\\\\Answered\", \"\\\\Draft\"]," + + " \"flags\": {" + + " \"systemFlags\":[\"Answered\",\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + " \"internalDate\": null," + " \"messageId\": \"42\"" + @@ -1393,7 +1431,7 @@ class AddedSerializationTest { " \"modSeq\": 35," + " \"flags\": null," + " \"size\": 45, " + - " \"internalDate\": \"\"," + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + " }" + " }," + @@ -1405,7 +1443,7 @@ class AddedSerializationTest { } @Test - void addedShouldThrowWhenFlagsContainsNullElements() { + void addedShouldThrowWhenSystemFlagsContainsNullElements() { assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( "{" + " \"Added\": {" + @@ -1419,9 +1457,11 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"flag 1\", null, \"flags 2\", null]," + + " \"flags\": {" + + " \"systemFlags\":[null, \"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + " \"size\": 45, " + - " \"internalDate\": \"\"," + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + " }" + " }," + @@ -1433,7 +1473,7 @@ class AddedSerializationTest { } @Test - void addedShouldThrowWhenFlagsContainsNumberElements() { + void addedShouldThrowWhenUserFlagsContainsNullElements() { assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( "{" + " \"Added\": {" + @@ -1447,9 +1487,11 @@ class AddedSerializationTest { " \"123456\": {" + " \"uid\": 123456," + " \"modSeq\": 35," + - " \"flags\": [\"flag 1\", 1254, \"flags 2\", 125.36]," + + " \"flags\": {" + + " \"systemFlags\":[\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\", null]}," + " \"size\": 45, " + - " \"internalDate\": \"\"," + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + " \"messageId\": \"42\"" + " }" + " }," + @@ -1459,6 +1501,154 @@ class AddedSerializationTest { "}").get()) .isInstanceOf(NoSuchElementException.class); } + + @Test + void addedShouldThrowWhenSystemFlagsContainsNumberElements() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( + "{" + + " \"Added\": {" + + " \"path\": {" + + " \"namespace\": \"#private\"," + + " \"user\": \"user\"," + + " \"name\": \"mailboxName\"" + + " }," + + " \"mailboxId\": \"18\"," + + " \"added\": {" + + " \"123456\": {" + + " \"uid\": 123456," + + " \"modSeq\": 35," + + " \"flags\": {" + + " \"systemFlags\":[42, \"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + + " \"size\": 45, " + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + + " \"messageId\": \"42\"" + + " }" + + " }," + + " \"sessionId\": 42," + + " \"user\": \"user\"" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void addedShouldThrowWhenUserFlagsContainsNumberElements() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( + "{" + + " \"Added\": {" + + " \"path\": {" + + " \"namespace\": \"#private\"," + + " \"user\": \"user\"," + + " \"name\": \"mailboxName\"" + + " }," + + " \"mailboxId\": \"18\"," + + " \"added\": {" + + " \"123456\": {" + + " \"uid\": 123456," + + " \"modSeq\": 35," + + " \"flags\": {" + + " \"systemFlags\":[\"Draft\"], " + + " \"userFlags\":[\"User Custom Flag\", 42]}," + + " \"size\": 45, " + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + + " \"messageId\": \"42\"" + + " }" + + " }," + + " \"sessionId\": 42," + + " \"user\": \"user\"" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void addedShouldThrowWhenSystemFlagsDoNotHaveTheRightCase() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( + "{" + + " \"Added\": {" + + " \"path\": {" + + " \"namespace\": \"#private\"," + + " \"user\": \"user\"," + + " \"name\": \"mailboxName\"" + + " }," + + " \"mailboxId\": \"18\"," + + " \"added\": {" + + " \"123456\": {" + + " \"uid\": 123456," + + " \"modSeq\": 35," + + " \"flags\": {" + + " \"systemFlags\":[\"draft\"], " + + " \"userFlags\":[\"User Custom Flag\"]}," + + " \"size\": 45, " + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + + " \"messageId\": \"42\"" + + " }" + + " }," + + " \"sessionId\": 42," + + " \"user\": \"user\"" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void addedShouldThrowWhenNoSystemFlags() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( + "{" + + " \"Added\": {" + + " \"path\": {" + + " \"namespace\": \"#private\"," + + " \"user\": \"user\"," + + " \"name\": \"mailboxName\"" + + " }," + + " \"mailboxId\": \"18\"," + + " \"added\": {" + + " \"123456\": {" + + " \"uid\": 123456," + + " \"modSeq\": 35," + + " \"flags\": {" + + " \"userFlags\":[\"User Custom Flag\"]}," + + " \"size\": 45, " + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + + " \"messageId\": \"42\"" + + " }" + + " }," + + " \"sessionId\": 42," + + " \"user\": \"user\"" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } + + @Test + void addedShouldThrowWhenNoUserFlags() { + assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson( + "{" + + " \"Added\": {" + + " \"path\": {" + + " \"namespace\": \"#private\"," + + " \"user\": \"user\"," + + " \"name\": \"mailboxName\"" + + " }," + + " \"mailboxId\": \"18\"," + + " \"added\": {" + + " \"123456\": {" + + " \"uid\": 123456," + + " \"modSeq\": 35," + + " \"flags\": {" + + " \"systemFlags\":[\"Draft\"]}," + + " \"size\": 45, " + + " \"internalDate\": \"2018-12-14T09:41:51.541Z\"," + + " \"messageId\": \"42\"" + + " }" + + " }," + + " \"sessionId\": 42," + + " \"user\": \"user\"" + + " }" + + "}").get()) + .isInstanceOf(NoSuchElementException.class); + } } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
