Author: aduprat Date: Wed Jan 13 10:11:53 2016 New Revision: 1724384 URL: http://svn.apache.org/viewvc?rev=1724384&view=rev Log: JAMES-1648 Method can return a response Stream. Contributed by Baechler <matthieu.baech...@gmail.com>
Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPServlet.java Wed Jan 13 10:11:53 2016 @@ -63,7 +63,7 @@ public class JMAPServlet extends HttpSer requestAsJsonStream(req) .map(ProtocolRequest::deserialize) .map(x -> AuthenticatedProtocolRequest.decorate(x, req)) - .map(requestHandler::handle) + .flatMap(requestHandler::handle) .map(ProtocolResponse::asProtocolSpecification) .collect(Collectors.toList()); Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java Wed Jan 13 10:11:53 2016 @@ -20,9 +20,11 @@ package org.apache.james.jmap.methods; import java.util.Optional; +import java.util.stream.Stream; import javax.inject.Inject; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.GetMailboxesRequest; import org.apache.james.jmap.model.GetMailboxesResponse; import org.apache.james.jmap.model.mailbox.Mailbox; @@ -65,35 +67,31 @@ public class GetMailboxesMethod<Id exten } @Override - public Method.Response.Name responseName() { - return RESPONSE_NAME; - } - - @Override public Class<? extends JmapRequest> requestType() { return GetMailboxesRequest.class; } - - @Override - public GetMailboxesResponse process(JmapRequest request, MailboxSession mailboxSession) { + + public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { Preconditions.checkArgument(request instanceof GetMailboxesRequest); + return Stream.of( + JmapResponse.builder().clientId(clientId) + .response(getMailboxesResponse(mailboxSession)) + .responseName(RESPONSE_NAME) + .build()); + } + + private GetMailboxesResponse getMailboxesResponse(MailboxSession mailboxSession) { + GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder(); try { - return getMailboxesResponse(mailboxSession); + mailboxManager.list(mailboxSession) + .stream() + .map(mailboxPath -> mailboxFromMailboxPath(mailboxPath, mailboxSession)) + .forEach(mailbox -> builder.add(mailbox.get())); + return builder.build(); } catch (MailboxException e) { throw Throwables.propagate(e); } } - - private GetMailboxesResponse getMailboxesResponse(MailboxSession mailboxSession) throws MailboxException { - GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder(); - - mailboxManager.list(mailboxSession) - .stream() - .map(mailboxPath -> mailboxFromMailboxPath(mailboxPath, mailboxSession)) - .forEach(mailbox -> builder.add(mailbox.get())); - - return builder.build(); - } private Optional<Mailbox> mailboxFromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) { try { Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java Wed Jan 13 10:11:53 2016 @@ -28,6 +28,7 @@ import java.util.stream.Stream; import javax.inject.Inject; import javax.inject.Named; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.FilterCondition; import org.apache.james.jmap.model.GetMessageListRequest; import org.apache.james.jmap.model.GetMessageListResponse; @@ -84,38 +85,37 @@ public class GetMessageListMethod<Id ext } @Override - public Method.Response.Name responseName() { - return RESPONSE_NAME; - } - - @Override public Class<? extends JmapRequest> requestType() { return GetMessageListRequest.class; } @Override - public GetMessageListResponse process(JmapRequest request, MailboxSession mailboxSession) { + public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { Preconditions.checkArgument(request instanceof GetMessageListRequest); - try { - return getMessageListResponse((GetMessageListRequest) request, mailboxSession); - } catch (MailboxException e) { - throw Throwables.propagate(e); - } + return Stream.of( + JmapResponse.builder().clientId(clientId) + .response(getMessageListResponse((GetMessageListRequest) request, mailboxSession)) + .responseName(RESPONSE_NAME) + .build()); } - private GetMessageListResponse getMessageListResponse(GetMessageListRequest jmapRequest, MailboxSession mailboxSession) throws MailboxException { + private GetMessageListResponse getMessageListResponse(GetMessageListRequest jmapRequest, MailboxSession mailboxSession) { GetMessageListResponse.Builder builder = GetMessageListResponse.builder(); + try { - mailboxManager.list(mailboxSession) - .stream() - .filter(mailboxPath -> isMailboxRequested(jmapRequest, mailboxPath)) - .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest)) - .skip(jmapRequest.getPosition()) - .limit(limit(jmapRequest.getLimit())) - .map(MessageId::serialize) - .forEach(builder::messageId); + mailboxManager.list(mailboxSession) + .stream() + .filter(mailboxPath -> isMailboxRequested(jmapRequest, mailboxPath)) + .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest)) + .skip(jmapRequest.getPosition()) + .limit(limit(jmapRequest.getLimit())) + .map(MessageId::serialize) + .forEach(builder::messageId); - return builder.build(); + return builder.build(); + } catch (MailboxException e) { + throw Throwables.propagate(e); + } } private Stream<MessageId> listMessages(MailboxPath mailboxPath, MailboxSession mailboxSession, GetMessageListRequest jmapRequest) { Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java Wed Jan 13 10:11:53 2016 @@ -29,6 +29,7 @@ import java.util.stream.StreamSupport; import javax.inject.Inject; import org.apache.commons.lang.NotImplementedException; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.GetMessagesRequest; import org.apache.james.jmap.model.GetMessagesResponse; import org.apache.james.jmap.model.Message; @@ -70,21 +71,23 @@ public class GetMessagesMethod<Id extend } @Override - public Method.Response.Name responseName() { - return RESPONSE_NAME; - } - - @Override public Class<? extends JmapRequest> requestType() { return GetMessagesRequest.class; } @Override - public GetMessagesResponse process(JmapRequest request, MailboxSession mailboxSession) { + public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(mailboxSession); Preconditions.checkArgument(request instanceof GetMessagesRequest); GetMessagesRequest getMessagesRequest = (GetMessagesRequest) request; + return Stream.of(JmapResponse.builder().clientId(clientId) + .response(getMessagesResponse(mailboxSession, getMessagesRequest)) + .responseName(RESPONSE_NAME) + .build()); + } + + private GetMessagesResponse getMessagesResponse(MailboxSession mailboxSession, GetMessagesRequest getMessagesRequest) { getMessagesRequest.getAccountId().ifPresent(GetMessagesMethod::notImplemented); Function<MessageId, Stream<Pair<MailboxMessage<Id>, MailboxPath>>> loadMessages = loadMessage(mailboxSession); Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriter.java Wed Jan 13 10:11:53 2016 @@ -21,8 +21,10 @@ package org.apache.james.jmap.methods; import org.apache.james.jmap.model.ProtocolResponse; +import java.util.stream.Stream; + public interface JmapResponseWriter { - ProtocolResponse formatMethodResponse(JmapResponse jmapResponse); + Stream<ProtocolResponse> formatMethodResponse(Stream<JmapResponse> jmapResponse); } \ No newline at end of file Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponseWriterImpl.java Wed Jan 13 10:11:53 2016 @@ -21,6 +21,7 @@ package org.apache.james.jmap.methods; import java.util.Optional; import java.util.Set; +import java.util.stream.Stream; import javax.inject.Inject; @@ -44,13 +45,15 @@ public class JmapResponseWriterImpl impl } @Override - public ProtocolResponse formatMethodResponse(JmapResponse jmapResponse) { - ObjectMapper objectMapper = newConfiguredObjectMapper(jmapResponse); - - return new ProtocolResponse( - jmapResponse.getResponseName(), - objectMapper.valueToTree(jmapResponse.getResponse()), - jmapResponse.getClientId()); + public Stream<ProtocolResponse> formatMethodResponse(Stream<JmapResponse> jmapResponses) { + return jmapResponses.map(jmapResponse -> { + ObjectMapper objectMapper = newConfiguredObjectMapper(jmapResponse); + + return new ProtocolResponse( + jmapResponse.getResponseName(), + objectMapper.valueToTree(jmapResponse.getResponse()), + jmapResponse.getClientId()); + }); } private FilterProvider buildPropertiesFilter(Optional<Set<String>> properties) { Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java Wed Jan 13 10:11:53 2016 @@ -22,7 +22,9 @@ package org.apache.james.jmap.methods; import static com.google.common.base.Objects.toStringHelper; import java.util.Objects; +import java.util.stream.Stream; +import org.apache.james.jmap.model.ClientId; import org.apache.james.mailbox.MailboxSession; import com.fasterxml.jackson.annotation.JsonValue; @@ -118,10 +120,8 @@ public interface Method { Request.Name requestHandled(); - Response.Name responseName(); - Class<? extends JmapRequest> requestType(); - Response process(JmapRequest request, MailboxSession mailboxSession); + Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession); } Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java (original) +++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/RequestHandler.java Wed Jan 13 10:11:53 2016 @@ -25,11 +25,11 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.inject.Inject; import org.apache.commons.lang.NotImplementedException; -import org.apache.james.jmap.methods.JmapResponse.Builder; import org.apache.james.jmap.model.AuthenticatedProtocolRequest; import org.apache.james.jmap.model.ProtocolResponse; import org.apache.james.mailbox.MailboxSession; @@ -48,32 +48,31 @@ public class RequestHandler { .collect(Collectors.toMap(Method::requestHandled, Function.identity())); } - public ProtocolResponse handle(AuthenticatedProtocolRequest request) { - Builder responseBuilder = JmapResponse.builder().clientId(request.getClientId()); + public Stream<ProtocolResponse> handle(AuthenticatedProtocolRequest request) { return Optional.ofNullable(methods.get(request.getMethodName())) - .map(extractAndProcess(request, responseBuilder)) + .map(extractAndProcess(request)) .map(jmapResponseWriter::formatMethodResponse) .orElseThrow(() -> new IllegalStateException("unknown method")); } - private Function<Method, JmapResponse> extractAndProcess(AuthenticatedProtocolRequest request, JmapResponse.Builder responseBuilder) { + private Function<Method, Stream<JmapResponse>> extractAndProcess(AuthenticatedProtocolRequest request) { MailboxSession mailboxSession = request.getMailboxSession(); return (Method method) -> { try { JmapRequest jmapRequest = jmapRequestParser.extractJmapRequest(request, method.requestType()); - return responseBuilder - .response(method.process(jmapRequest, mailboxSession)) - .responseName(method.responseName()) - .build(); + return method.process(jmapRequest, request.getClientId(), mailboxSession); } catch (IOException e) { if (e.getCause() instanceof NotImplementedException) { - return responseBuilder.error("Not yet implemented").build(); + return error(request, "Not yet implemented"); } - return responseBuilder.error("invalidArguments").build(); + return error(request, "invalidArguments"); } catch (NotImplementedException e) { - return responseBuilder.error("Not yet implemented").build(); + return error(request, "Not yet implemented"); } }; - + } + + private Stream<JmapResponse> error(AuthenticatedProtocolRequest request, String message) { + return Stream.of(JmapResponse.builder().clientId(request.getClientId()).error(message).build()); } } Modified: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java (original) +++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPServletTest.java Wed Jan 13 10:11:53 2016 @@ -44,6 +44,8 @@ import com.google.common.base.Charsets; import com.jayway.restassured.RestAssured; import com.jayway.restassured.http.ContentType; +import java.util.stream.Stream; + public class JMAPServletTest { private JettyHttpServer server; @@ -92,7 +94,7 @@ public class JMAPServletTest { json.put("type", "invalidArgument"); when(requestHandler.handle(any())) - .thenReturn(new ProtocolResponse(JmapResponse.ERROR_METHOD, json, ClientId.of("#0"))); + .thenReturn(Stream.of(new ProtocolResponse(JmapResponse.ERROR_METHOD, json, ClientId.of("#0")))); given() .accept(ContentType.JSON) @@ -116,7 +118,7 @@ public class JMAPServletTest { arrayNode.add(list); when(requestHandler.handle(any())) - .thenReturn(new ProtocolResponse(Method.Response.name("accounts"), json, ClientId.of("#0"))); + .thenReturn(Stream.of(new ProtocolResponse(Method.Response.name("accounts"), json, ClientId.of("#0")))); given() .accept(ContentType.JSON) @@ -136,5 +138,4 @@ public class JMAPServletTest { "]" + "},\"#0\"]]")); } - } Modified: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java (original) +++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java Wed Jan 13 10:11:53 2016 @@ -22,9 +22,12 @@ import static org.assertj.core.api.Asser import java.io.ByteArrayInputStream; import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; import javax.mail.Flags; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.GetMailboxesRequest; import org.apache.james.jmap.model.GetMailboxesResponse; import org.apache.james.jmap.model.mailbox.Mailbox; @@ -53,9 +56,11 @@ public class GetMailboxesMethodTest { private StoreMailboxManager<InMemoryId> mailboxManager; private GetMailboxesMethod<InMemoryId> getMailboxesMethod; - + private ClientId clientId; + @Before public void setup() throws Exception { + clientId = ClientId.of("#0"); InMemoryMailboxSessionMapperFactory mailboxMapperFactory = new InMemoryMailboxSessionMapperFactory(); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); @@ -71,8 +76,16 @@ public class GetMailboxesMethodTest { .build(); MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME, LOGGER); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()).isEmpty(); + + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) + .isEmpty(); } @Test @@ -87,8 +100,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getId, Mailbox::getName, Mailbox::getUnreadMessages) .containsOnly(Tuple.tuple("1", mailboxPath.getName(), 2L)); } @@ -102,9 +121,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getSortOrder) .containsOnly(10); } @@ -118,8 +142,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getSortOrder) .containsOnly(1000); } @@ -133,8 +163,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getSortOrder) .containsOnly(10); } @@ -154,8 +190,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getName, Mailbox::getSortOrder) .containsExactly( Tuple.tuple("INBOX", 10), @@ -177,8 +219,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getTotalMessages, Mailbox::getUnreadMessages) .containsOnly(Tuple.tuple(0L, 0L)); } @@ -195,8 +243,14 @@ public class GetMailboxesMethodTest { GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getTotalMessages) .containsExactly(2L); } @@ -215,9 +269,16 @@ public class GetMailboxesMethodTest { messageManager.appendMessage(new ByteArrayInputStream("Subject: test3\r\n\r\ntestmail".getBytes()), new Date(), mailboxSession, false, readMessageFlag); GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder() .build(); - GetMailboxesResponse getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, mailboxSession); - assertThat(getMailboxesResponse.getList()) + + List<JmapResponse> getMailboxesResponse = getMailboxesMethod.process(getMailboxesRequest, clientId, mailboxSession).collect(Collectors.toList()); + + assertThat(getMailboxesResponse) + .hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMailboxesResponse.class) + .extracting(GetMailboxesResponse.class::cast) + .flatExtracting(GetMailboxesResponse::getList) .extracting(Mailbox::getUnreadMessages) .containsExactly(2L); } -} \ No newline at end of file +} Modified: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java (original) +++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java Wed Jan 13 10:11:53 2016 @@ -26,8 +26,10 @@ import java.io.ByteArrayInputStream; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.stream.Collectors; import org.apache.commons.lang.NotImplementedException; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.GetMessagesRequest; import org.apache.james.jmap.model.GetMessagesResponse; import org.apache.james.jmap.model.Message; @@ -56,8 +58,6 @@ public class GetMessagesMethodTest { private static final Logger LOGGER = LoggerFactory.getLogger(GetMessagesMethodTest.class); - private StoreMailboxManager<InMemoryId> mailboxManager; - private static class User implements org.apache.james.mailbox.MailboxSession.User { final String username; final String password; @@ -85,14 +85,16 @@ public class GetMessagesMethodTest { private static final User ROBERT = new User("robert", "secret"); + private StoreMailboxManager<InMemoryId> mailboxManager; + private InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory; + private MailboxSession session; private MailboxPath inboxPath; + private ClientId clientId; - private InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory; - @Before public void setup() throws MailboxException { - + clientId = ClientId.of("#0"); mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory(); MockAuthenticator authenticator = new MockAuthenticator(); authenticator.addUser(ROBERT.username, ROBERT.password); @@ -111,22 +113,28 @@ public class GetMessagesMethodTest { public void processShouldThrowWhenNullRequest() { GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); GetMessagesRequest request = null; - assertThatThrownBy(() -> testee.process(request, mock(MailboxSession.class))).isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> testee.process(request, mock(ClientId.class), mock(MailboxSession.class))).isInstanceOf(NullPointerException.class); } @Test public void processShouldThrowWhenNullSession() { GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); MailboxSession mailboxSession = null; - assertThatThrownBy(() -> testee.process(mock(GetMessagesRequest.class), mailboxSession)).isInstanceOf(NullPointerException.class); + assertThatThrownBy(() -> testee.process(mock(GetMessagesRequest.class), mock(ClientId.class), mailboxSession)).isInstanceOf(NullPointerException.class); + } + + @Test + public void processShouldThrowWhenNullClientId() { + GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); + ClientId clientId = null; + assertThatThrownBy(() -> testee.process(mock(GetMessagesRequest.class), clientId, mock(MailboxSession.class))).isInstanceOf(NullPointerException.class); } - @Test public void processShouldThrowWhenRequestHasAccountId() { GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); assertThatThrownBy(() -> testee.process( - GetMessagesRequest.builder().accountId("abc").build(), mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class); + GetMessagesRequest.builder().accountId("abc").build(), mock(ClientId.class), mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class); } @Test @@ -147,9 +155,13 @@ public class GetMessagesMethodTest { .build(); GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); - GetMessagesResponse result = testee.process(request, session); + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); - assertThat(result.list()) + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) .extracting(message -> message.getId().getUid(), Message::getSubject) .containsOnly( Tuple.tuple(message1Uid, "message 1 subject"), @@ -170,11 +182,16 @@ public class GetMessagesMethodTest { .build(); GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); - GetMessagesResponse result = testee.process(request, session); - - assertThat(result.list()) + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) .extracting(message -> message.getId().getUid(), Message::getSubject) - .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); + .containsOnly( + Tuple.tuple(message1Uid, "message 1 subject")); } @Test @@ -190,11 +207,16 @@ public class GetMessagesMethodTest { .build(); GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); - GetMessagesResponse result = testee.process(request, session); - - assertThat(result.list()) + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) .extracting(message -> message.getId().getUid(), Message::getSubject) - .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); + .containsOnly( + Tuple.tuple(message1Uid, "message 1 subject")); } @Test @@ -209,11 +231,16 @@ public class GetMessagesMethodTest { .build(); GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory); - GetMessagesResponse result = testee.process(request, session); - - assertThat(result.list()) + List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); + + assertThat(result).hasSize(1) + .extracting(JmapResponse::getResponse) + .hasOnlyElementsOfType(GetMessagesResponse.class) + .extracting(GetMessagesResponse.class::cast) + .flatExtracting(GetMessagesResponse::list) .extracting(message -> message.getId().getUid(), Message::getSubject) - .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); + .containsOnly( + Tuple.tuple(message1Uid, "message 1 subject")); } } Modified: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java (original) +++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/JmapResponseWriterImplTest.java Wed Jan 13 10:11:53 2016 @@ -20,12 +20,19 @@ package org.apache.james.jmap.methods; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; +import static org.assertj.core.groups.Tuple.*; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import com.google.common.collect.Iterables; import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.ProtocolRequest; import org.apache.james.jmap.model.ProtocolResponse; +import org.assertj.core.groups.Tuple; import org.junit.Ignore; import org.junit.Test; @@ -47,15 +54,16 @@ public class JmapResponseWriterImplTest String expectedId = "myId"; JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); - ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse(JmapResponse + Stream<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse(Stream.of(JmapResponse .builder() .clientId(ClientId.of(expectedClientId)) .response(null) - .build()); + .build())); - assertThat(response.getResponseName()).isEqualTo(expectedMethod); - assertThat(response.getResults().findValue("id").asText()).isEqualTo(expectedId); - assertThat(response.getClientId()).isEqualTo(expectedClientId); + List<ProtocolResponse> responseList = response.collect(Collectors.toList()); + assertThat(responseList).hasSize(1) + .extracting(ProtocolResponse::getResponseName, x -> x.getResults().get("id").asText(), ProtocolResponse::getClientId) + .containsExactly(tuple(expectedMethod, expectedId, expectedClientId)); } @Test @@ -67,17 +75,18 @@ public class JmapResponseWriterImplTest responseClass.id = expectedId; JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); - ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse( - JmapResponse + List<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse .builder() .responseName(Method.Response.name("unknownMethod")) .clientId(ClientId.of(expectedClientId)) .response(responseClass) - .build()); + .build())) + .collect(Collectors.toList()); - assertThat(response.getResponseName()).isEqualTo(Method.Response.name("unknownMethod")); - assertThat(response.getResults().findValue("id").asText()).isEqualTo(expectedId); - assertThat(response.getClientId()).isEqualTo(ClientId.of(expectedClientId)); + assertThat(response).hasSize(1) + .extracting(ProtocolResponse::getResponseName, x -> x.getResults().get("id").asText(), ProtocolResponse::getClientId) + .containsExactly(tuple(Method.Response.name("unknownMethod"), expectedId, ClientId.of(expectedClientId))); } private static class ResponseClass implements Method.Response { @@ -86,56 +95,94 @@ public class JmapResponseWriterImplTest public String id; } - + @Test public void formatMethodResponseShouldFilterFieldsWhenProperties() { ObjectResponseClass responseClass = new ObjectResponseClass(); responseClass.list = ImmutableList.of(new ObjectResponseClass.Foo("id", "name")); JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); - ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse( - JmapResponse + List<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse .builder() .responseName(Method.Response.name("unknownMethod")) .clientId(ClientId.of("#1")) .properties(ImmutableSet.of("id")) .response(responseClass) - .build()); + .build())) + .collect(Collectors.toList()); - JsonNode firstObject = response.getResults().get("list").elements().next(); + assertThat(response).hasSize(1); + JsonNode firstObject = Iterables.getOnlyElement(response).getResults().get("list").elements().next(); assertThat(firstObject.get("id").asText()).isEqualTo("id"); assertThat(firstObject.get("name")).isNull(); } - + + @Test public void formatMethodResponseShouldNotFilterFieldsWhenSecondCallWithoutProperties() { ObjectResponseClass responseClass = new ObjectResponseClass(); responseClass.list = ImmutableList.of(new ObjectResponseClass.Foo("id", "name")); JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); - jmapResponseWriterImpl.formatMethodResponse( - JmapResponse - .builder() - .responseName(Method.Response.name("unknownMethod")) - .clientId(ClientId.of("#1")) - .properties(ImmutableSet.of("id")) - .response(responseClass) - .build()); + @SuppressWarnings("unused") + Stream<ProtocolResponse> ignoredResponse = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse + .builder() + .responseName(Method.Response.name("unknownMethod")) + .clientId(ClientId.of("#1")) + .properties(ImmutableSet.of("id")) + .response(responseClass) + .build())); - ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse( - JmapResponse + List<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse .builder() .responseName(Method.Response.name("unknownMethod")) .clientId(ClientId.of("#1")) .response(responseClass) - .build()); + .build())) + .collect(Collectors.toList()); - JsonNode firstObject = response.getResults().get("list").elements().next(); + assertThat(response).hasSize(1); + JsonNode firstObject = Iterables.getOnlyElement(response).getResults().get("list").elements().next(); assertThat(firstObject.get("id").asText()).isEqualTo("id"); assertThat(firstObject.get("name").asText()).isEqualTo("name"); } + @Test + public void formatMethodResponseShouldFilterRightFieldsForEachResponse() { + ObjectResponseClass responseClass = new ObjectResponseClass(); + responseClass.list = ImmutableList.of(new ObjectResponseClass.Foo("id", "name")); + + JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); + + List<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse + .builder() + .responseName(Method.Response.name("unknownMethod")) + .clientId(ClientId.of("#1")) + .properties(ImmutableSet.of("id", "name")) + .response(responseClass) + .build(), + JmapResponse + .builder() + .responseName(Method.Response.name("unknownMethod")) + .clientId(ClientId.of("#1")) + .properties(ImmutableSet.of("id")) + .response(responseClass) + .build())) + .collect(Collectors.toList()); + + assertThat(response).hasSize(2) + .extracting(x -> x.getResults().get("list").elements().next()) + .extracting( + x -> x.get("id").asText(), + x -> Optional.ofNullable(x.get("name")).map(JsonNode::asText).orElse(null)) + .containsExactly(tuple("id", "name"), tuple("id", null)); + } + @SuppressWarnings("unused") private static class ObjectResponseClass implements Method.Response { @JsonFilter("propertiesFilter") @@ -161,15 +208,17 @@ public class JmapResponseWriterImplTest new ObjectNode(new JsonNodeFactory(false)).textNode(expectedClientId)} ; JmapResponseWriterImpl jmapResponseWriterImpl = new JmapResponseWriterImpl(ImmutableSet.of(new Jdk8Module())); - ProtocolResponse response = jmapResponseWriterImpl.formatMethodResponse( - JmapResponse + List<ProtocolResponse> response = jmapResponseWriterImpl.formatMethodResponse( + Stream.of(JmapResponse .builder() .clientId(ProtocolRequest.deserialize(nodes).getClientId()) .error() - .build()); + .build())) + .collect(Collectors.toList()); - assertThat(response.getResponseName()).isEqualToComparingFieldByField(JmapResponse.ERROR_METHOD); - assertThat(response.getResults().findValue("type").asText()).isEqualTo(JmapResponse.DEFAULT_ERROR_MESSAGE); - assertThat(response.getClientId()).isEqualTo(ClientId.of(expectedClientId)); + assertThat(response).hasSize(1) + .extracting(ProtocolResponse::getResponseName, x -> x.getResults().get("type").asText(), ProtocolResponse::getClientId) + .containsExactly(tuple(JmapResponse.ERROR_METHOD, JmapResponse.DEFAULT_ERROR_MESSAGE, ClientId.of(expectedClientId))); } + } Modified: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java?rev=1724384&r1=1724383&r2=1724384&view=diff ============================================================================== --- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java (original) +++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/RequestHandlerTest.java Wed Jan 13 10:11:53 2016 @@ -19,14 +19,15 @@ package org.apache.james.jmap.methods; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.mock; import static org.assertj.core.api.Assertions.assertThat; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; -import org.apache.james.jmap.methods.Method.Response.Name; import org.apache.james.jmap.model.AuthenticatedProtocolRequest; +import org.apache.james.jmap.model.ClientId; import org.apache.james.jmap.model.ProtocolRequest; import org.apache.james.jmap.model.ProtocolResponse; import org.apache.james.mailbox.MailboxSession; @@ -41,6 +42,10 @@ import com.google.common.annotations.Vis import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + public class RequestHandlerTest { public static class TestJmapRequest implements JmapRequest { @@ -94,20 +99,20 @@ public class RequestHandlerTest { } @Override - public Method.Response.Name responseName() { - return Method.Response.name("testMethod"); - } - - @Override public Class<? extends JmapRequest> requestType() { return TestJmapRequest.class; } @Override - public TestJmapResponse process(JmapRequest request, MailboxSession mailboxSession) { + public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { Preconditions.checkArgument(request instanceof TestJmapRequest); TestJmapRequest typedRequest = (TestJmapRequest) request; - return new TestJmapResponse(typedRequest.getId(), typedRequest.getName(), "works"); + return Stream.of( + JmapResponse.builder() + .response(new TestJmapResponse(typedRequest.getId(), typedRequest.getName(), "works")) + .responseName(Response.name("test")) + .clientId(ClientId.of("#0")) + .build()); } } @@ -180,17 +185,12 @@ public class RequestHandlerTest { } @Override - public Name responseName() { - return null; - } - - @Override public Class<? extends JmapRequest> requestType() { return null; } @Override - public Method.Response process(JmapRequest request, MailboxSession mailboxSession) { + public Stream<JmapResponse> process(JmapRequest request, ClientId clientId, MailboxSession mailboxSession) { return null; } } @@ -205,10 +205,14 @@ public class RequestHandlerTest { parameters, new ObjectNode(new JsonNodeFactory(false)).textNode("#1")} ; - ProtocolResponse response = testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes), mockHttpServletRequest)); + List<ProtocolResponse> responses = testee.handle(AuthenticatedProtocolRequest.decorate(ProtocolRequest.deserialize(nodes), mockHttpServletRequest)) + .collect(Collectors.toList()); - assertThat(response.getResults().findValue("id").asText()).isEqualTo("testId"); - assertThat(response.getResults().findValue("name").asText()).isEqualTo("testName"); - assertThat(response.getResults().findValue("message").asText()).isEqualTo("works"); + assertThat(responses).hasSize(1) + .extracting( + x -> x.getResults().findValue("id").asText(), + x -> x.getResults().findValue("name").asText(), + x -> x.getResults().findValue("message").asText()) + .containsExactly(tuple("testId", "testName", "works")); } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org