blob: 4617998328a79001d4916e89697f368eac088013 [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.json
import eu.timepit.refined.auto._
import org.apache.james.core.Username
import org.apache.james.jmap.core.CapabilityIdentifier.CapabilityIdentifier
import org.apache.james.jmap.core.CoreCapabilityProperties.CollationAlgorithm
import org.apache.james.jmap.core.MailCapability.EmailQuerySortOption
import org.apache.james.jmap.core.{Account, Capabilities, CoreCapability, CoreCapabilityProperties, IsPersonal, IsReadOnly, MailCapability, MailCapabilityProperties, MaxCallsInRequest, MaxConcurrentRequests, MaxConcurrentUpload, MaxMailboxDepth, MaxMailboxesPerEmail, MaxObjectsInGet, MaxObjectsInSet, MaxSizeAttachmentsPerEmail, MaxSizeMailboxName, MaxSizeRequest, MaxSizeUpload, MayCreateTopLevelMailbox, QuotaCapability, Session, SharesCapability, UuidState, VacationResponseCapability}
import org.apache.james.jmap.json.SessionSerializationTest.SESSION
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec
import play.api.libs.json.Json
import scala.io.Source
import scala.util.Using
object SessionSerializationTest {
private val ALGO_1: CollationAlgorithm = "i;ascii-numeric"
private val ALGO_2: CollationAlgorithm = "i;ascii-casemap"
private val ALGO_3: CollationAlgorithm = "i;unicode-casemap"
private val MAX_SIZE_UPLOAD: MaxSizeUpload = MaxSizeUpload(50000000L)
private val MAX_CONCURRENT_UPLOAD : MaxConcurrentUpload = MaxConcurrentUpload(8L)
private val MAX_SIZE_REQUEST : MaxSizeRequest = MaxSizeRequest(10000000L)
private val MAX_CONCURRENT_REQUESTS : MaxConcurrentRequests = MaxConcurrentRequests(10000000L)
private val MAX_CALLS_IN_REQUEST : MaxCallsInRequest = MaxCallsInRequest(32L)
private val MAX_OBJECTS_IN_GET : MaxObjectsInGet = MaxObjectsInGet(256L)
private val MAX_OBJECTS_IN_SET : MaxObjectsInSet = MaxObjectsInSet(128L)
private val COLLATION_ALGORITHMS : List[CollationAlgorithm] = List(ALGO_1, ALGO_2, ALGO_3)
private val USER_1 = Username.of("user1@james.org")
private val USER_2 = Username.of("user2@james.org")
private val URL = org.apache.james.jmap.core.URL("http://james.org")
private val MAIL_IDENTIFIER: CapabilityIdentifier = "urn:ietf:params:jmap:mail"
private val CONTACT_IDENTIFIER: CapabilityIdentifier = "urn:ietf:params:jmap:contact"
private val CORE_CAPABILITY = CoreCapability(properties = CoreCapabilityProperties(
maxSizeUpload = MAX_SIZE_UPLOAD, maxConcurrentUpload = MAX_CONCURRENT_UPLOAD,
maxSizeRequest = MAX_SIZE_REQUEST, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS,
maxCallsInRequest = MAX_CALLS_IN_REQUEST, maxObjectsInGet = MAX_OBJECTS_IN_GET, maxObjectsInSet = MAX_OBJECTS_IN_SET,
collationAlgorithms = COLLATION_ALGORITHMS))
private val MAX_MAILBOX_DEPTH : MaxMailboxDepth = MaxMailboxDepth(Some(1432L))
private val MAX_MAILBOXES_PER_EMAIL : MaxMailboxesPerEmail = MaxMailboxesPerEmail(Some(9359L))
private val MAX_SIZE_MAILBOX_NAME : MaxSizeMailboxName = MaxSizeMailboxName(9000L)
private val MAX_SIZE_ATTACHMENTS_PER_EMAIL : MaxSizeAttachmentsPerEmail = MaxSizeAttachmentsPerEmail(890099L)
private val SIZE_QUERY_SORT_OPTION : EmailQuerySortOption = "size"
private val EMAIL_QUERY_SORT_OPTIONS : List[EmailQuerySortOption] = List(SIZE_QUERY_SORT_OPTION)
private val MAY_CREATE_TOP_LEVEL_MAILBOX : MayCreateTopLevelMailbox = MayCreateTopLevelMailbox(true)
private val MAIL_CAPABILITY = MailCapability(properties = MailCapabilityProperties(
maxMailboxDepth = MAX_MAILBOX_DEPTH,
maxMailboxesPerEmail = MAX_MAILBOXES_PER_EMAIL,
maxSizeMailboxName = MAX_SIZE_MAILBOX_NAME,
maxSizeAttachmentsPerEmail = MAX_SIZE_ATTACHMENTS_PER_EMAIL,
emailQuerySortOptions = EMAIL_QUERY_SORT_OPTIONS,
mayCreateTopLevelMailbox = MAY_CREATE_TOP_LEVEL_MAILBOX))
private val CAPABILITIES = Capabilities.of(CORE_CAPABILITY, MAIL_CAPABILITY, QuotaCapability(), SharesCapability(), VacationResponseCapability())
private val IS_PERSONAL : IsPersonal = IsPersonal(true)
private val IS_NOT_PERSONAL : IsPersonal = IsPersonal(false)
private val IS_NOT_READ_ONLY : IsReadOnly = IsReadOnly(false)
private val ACCOUNT_1: Account = Account.from(
name = USER_1,
isPersonal = IS_PERSONAL,
isReadOnly = IS_NOT_READ_ONLY,
accountCapabilities = Set(CORE_CAPABILITY)).toOption.get
private val ACCOUNT_2: Account = Account.from(
name = USER_2,
isPersonal = IS_NOT_PERSONAL,
isReadOnly = IS_NOT_READ_ONLY,
accountCapabilities = Set(CORE_CAPABILITY)).toOption.get
private val PRIMARY_ACCOUNTS = Map(
MAIL_IDENTIFIER -> ACCOUNT_1.accountId,
CONTACT_IDENTIFIER -> ACCOUNT_1.accountId
)
private val SESSION = Session(
capabilities = CAPABILITIES,
accounts = List(ACCOUNT_1, ACCOUNT_2),
primaryAccounts = PRIMARY_ACCOUNTS,
username = USER_1,
apiUrl = URL,
downloadUrl = URL,
uploadUrl = URL,
eventSourceUrl = URL,
state = UuidState.INSTANCE)
def readResource(resourceFileName: String): String = {
Using(Source.fromURL(getClass.getResource(resourceFileName), "UTF-8")) { source =>
source.mkString
}.get
}
}
class SessionSerializationTest extends AnyWordSpec with Matchers {
"sessionWrites" should {
"serialize session" in {
val json = Json.parse(
s"""{
| "capabilities": {
| "urn:ietf:params:jmap:core": {
| "maxSizeUpload": 50000000,
| "maxConcurrentUpload": 8,
| "maxSizeRequest": 10000000,
| "maxConcurrentRequests": 10000000,
| "maxCallsInRequest": 32,
| "maxObjectsInGet": 256,
| "maxObjectsInSet": 128,
| "collationAlgorithms": [
| "i;ascii-numeric",
| "i;ascii-casemap",
| "i;unicode-casemap"
| ]
| },
| "urn:ietf:params:jmap:mail": {
| "maxMailboxesPerEmail": 9359,
| "maxMailboxDepth": 1432,
| "maxSizeMailboxName": 9000,
| "maxSizeAttachmentsPerEmail": 890099,
| "emailQuerySortOptions": ["size"],
| "mayCreateTopLevelMailbox": true
| },
| "urn:apache:james:params:jmap:mail:quota":{},
| "urn:apache:james:params:jmap:mail:shares":{},
| "urn:ietf:params:jmap:vacationresponse":{}
| },
| "accounts": {
| "807a5306ccb4527af7790a0f9b48a776514bdbfba064e355461a76bcffbf2c90": {
| "name": "user1@james.org",
| "isPersonal": true,
| "isReadOnly": false,
| "accountCapabilities": {
| "urn:ietf:params:jmap:core": {
| "maxSizeUpload": 50000000,
| "maxConcurrentUpload": 8,
| "maxSizeRequest": 10000000,
| "maxConcurrentRequests": 10000000,
| "maxCallsInRequest": 32,
| "maxObjectsInGet": 256,
| "maxObjectsInSet": 128,
| "collationAlgorithms": [
| "i;ascii-numeric",
| "i;ascii-casemap",
| "i;unicode-casemap"
| ]
| }
| }
| },
| "a9b46834e106ff73268a40a34ffba9fcfeee8bdb601939d1a96ef9199dc2695c": {
| "name": "user2@james.org",
| "isPersonal": false,
| "isReadOnly": false,
| "accountCapabilities": {
| "urn:ietf:params:jmap:core": {
| "maxSizeUpload": 50000000,
| "maxConcurrentUpload": 8,
| "maxSizeRequest": 10000000,
| "maxConcurrentRequests": 10000000,
| "maxCallsInRequest": 32,
| "maxObjectsInGet": 256,
| "maxObjectsInSet": 128,
| "collationAlgorithms": [
| "i;ascii-numeric",
| "i;ascii-casemap",
| "i;unicode-casemap"
| ]
| }
| }
| }
| },
| "primaryAccounts": {
| "urn:ietf:params:jmap:mail": "807a5306ccb4527af7790a0f9b48a776514bdbfba064e355461a76bcffbf2c90",
| "urn:ietf:params:jmap:contact": "807a5306ccb4527af7790a0f9b48a776514bdbfba064e355461a76bcffbf2c90"
| },
| "username": "user1@james.org",
| "apiUrl": "http://james.org",
| "downloadUrl": "http://james.org",
| "uploadUrl": "http://james.org",
| "eventSourceUrl": "http://james.org",
| "state": "${UuidState.INSTANCE.value}"
|}""".stripMargin)
ResponseSerializer.serialize(SESSION) should equal(json)
}
}
}