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 103be4ed1f83f2f59ea0e5acd544ee37e3e7c734 Author: Raphael Ouazana <[email protected]> AuthorDate: Thu Jan 28 15:04:22 2021 +0100 JAMES-3491 Write tests for RFC-8887 JMAP over websocket support --- .../jmap/rfc8621/contract/WebSocketContract.scala | 183 ++++++++++++++++++++- 1 file changed, 174 insertions(+), 9 deletions(-) diff --git a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala index 73ea439..8b87d55 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala @@ -251,22 +251,187 @@ trait WebSocketContract { @Test def badTypeFieldShouldTriggerError(server: GuiceJamesServer): Unit = { - /* - * TODO send something with @type being a JsNumber and get an error level error - * */ + println("started") + val port = server.getProbe(classOf[JmapGuiceProbe]) + .getJmapPort + .getValue + val client = new ExampleClient(new URI(s"ws://127.0.0.1:$port/jmap/ws")) + client.addHeader("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + client.addHeader("Accept", ACCEPT_RFC8621_VERSION_HEADER) + + client.connectBlocking() + + Thread.sleep(500) + + client.send("""{ + | "@type": 42, + | "requestId": "req-36", + | "using": [ "urn:ietf:params:jmap:core"], + | "methodCalls": [ + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c1" + | ] + | ] + |}""".stripMargin) + + Thread.sleep(500) + + assertThat(client.receivedResponses).hasSize(1) + assertThatJson(client.receivedResponses.get(0)).isEqualTo( + """ + |{ + | "status":400, + | "detail":"The request was successfully parsed as JSON but did not match the type signature of the Request object: List((,List(JsonValidationError(List(Invalid @type filed on a webSocket inbound message: expecting a JsString, got 42),ArraySeq()))))", + | "type":"urn:ietf:params:jmap:error:notRequest", + | "requestId":null, + | "@type":"RequestError" + |} + |""".stripMargin + ) + } @Test def unknownTypeFieldShouldTriggerError(server: GuiceJamesServer): Unit = { - /* - * TODO send something with @type being a JsString("unknown") and get an error level error - * */ + println("started") + val port = server.getProbe(classOf[JmapGuiceProbe]) + .getJmapPort + .getValue + val client = new ExampleClient(new URI(s"ws://127.0.0.1:$port/jmap/ws")) + client.addHeader("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + client.addHeader("Accept", ACCEPT_RFC8621_VERSION_HEADER) + + client.connectBlocking() + + Thread.sleep(500) + + client.send( + """{ + | "@type": "unknown", + | "requestId": "req-36", + | "using": [ "urn:ietf:params:jmap:core"], + | "methodCalls": [ + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c1" + | ] + | ] + |}""".stripMargin) + + Thread.sleep(500) + + assertThat(client.receivedResponses).hasSize(1) + assertThatJson(client.receivedResponses.get(0)).isEqualTo( + """ + |{ + | "status":400, + | "detail":"The request was successfully parsed as JSON but did not match the type signature of the Request object: List((,List(JsonValidationError(List(Unknown @type filed on a webSocket inbound message: unknown),ArraySeq()))))", + | "type":"urn:ietf:params:jmap:error:notRequest", + | "requestId":null, + | "@type":"RequestError" + |} + |""".stripMargin + ) + } + + + @Test + def clientSendingARespondTypeFieldShouldTriggerError(server: GuiceJamesServer): Unit = { + println("started") + val port = server.getProbe(classOf[JmapGuiceProbe]) + .getJmapPort + .getValue + val client = new ExampleClient(new URI(s"ws://127.0.0.1:$port/jmap/ws")) + client.addHeader("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + client.addHeader("Accept", ACCEPT_RFC8621_VERSION_HEADER) + + client.connectBlocking() + + Thread.sleep(500) + + client.send( + """{ + | "@type": "Response", + | "requestId": "req-36", + | "using": [ "urn:ietf:params:jmap:core"], + | "methodCalls": [ + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c1" + | ] + | ] + |}""".stripMargin) + + Thread.sleep(500) + + assertThat(client.receivedResponses).hasSize(1) + assertThatJson(client.receivedResponses.get(0)).isEqualTo( + """ + |{ + | "status":400, + | "detail":"The request was successfully parsed as JSON but did not match the type signature of the Request object: List((,List(JsonValidationError(List(Unknown @type filed on a webSocket inbound message: Response),ArraySeq()))))", + | "type":"urn:ietf:params:jmap:error:notRequest", + | "requestId":null, + | "@type":"RequestError" + |} + |""".stripMargin + ) + } @Test def requestLevelErrorShouldReturnAPIError(server: GuiceJamesServer): Unit = { - /* - * TODO send a request triggering a method level error (eg Mailbox/get with an invalid JSON payload) - * */ + println("started") + val port = server.getProbe(classOf[JmapGuiceProbe]) + .getJmapPort + .getValue + val client = new ExampleClient(new URI(s"ws://127.0.0.1:$port/jmap/ws")) + client.addHeader("Authorization", "Basic Ym9iQGRvbWFpbi50bGQ6Ym9icGFzc3dvcmQ=") + client.addHeader("Accept", ACCEPT_RFC8621_VERSION_HEADER) + + client.connectBlocking() + + Thread.sleep(500) + + client.send(s"""{ + | "@type": "Request", + | "using": [ + | "urn:ietf:params:jmap:core", + | "urn:ietf:params:jmap:mail"], + | "methodCalls": [[ + | "Mailbox/get", + | { + | "accountId": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6", + | "properties": ["invalidProperty"] + | }, + | "c1"]] + |}""".stripMargin) + + Thread.sleep(500) + + + assertThat(client.receivedResponses).hasSize(1) + assertThatJson(client.receivedResponses.get(0)).isEqualTo( + """ + |{ + | "@type": "Response", + | "requestId": null, + | "sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943", + | "methodResponses": [["error",{"type":"invalidArguments","description":"The following properties [invalidProperty] do not exist."},"c1"]] + |} + |""".stripMargin) } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
