This is an automated email from the ASF dual-hosted git repository. jamesbognar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push: new c4716da RestClient tests. c4716da is described below commit c4716dacea9003e03390f71f5a56f48f8ea18270 Author: JamesBognar <james.bog...@salesforce.com> AuthorDate: Tue Jun 9 19:32:14 2020 -0400 RestClient tests. --- .../main/java/org/apache/juneau/Streamable.java | 4 +- .../org/apache/juneau/http/StreamResource.java | 2 +- .../java/org/apache/juneau/utils/ZipFileList.java | 2 +- .../main/ConfigurablePropertyCodeGenerator.java | 1 + .../juneau/rest/client2/EndToEndInterfaceTest.java | 4 +- .../apache/juneau/rest/client2/RestClientTest.java | 109 +++++++++++++++++++++ .../org/apache/juneau/rest/client2/RestClient.java | 31 +++++- .../apache/juneau/rest/client2/RestRequest.java | 2 +- .../apache/juneau/rest/mock2/MockRestClient.java | 4 +- 9 files changed, 145 insertions(+), 14 deletions(-) diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Streamable.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Streamable.java index 331a3fb..97a81d0 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Streamable.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Streamable.java @@ -20,7 +20,7 @@ import org.apache.juneau.http.*; * Interface that identifies that an object can be serialized directly to an output stream. * * <p> - * Instances must identify the media type of the content by implementing the {@link #getMediaType()} method. + * Instances must identify the media type of the content by implementing the {@link #getContentType()} method. */ public interface Streamable { @@ -37,5 +37,5 @@ public interface Streamable { * * @return The media type, or <jk>null</jk> if the media type is not known. */ - MediaType getMediaType(); + MediaType getContentType(); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StreamResource.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StreamResource.java index 8214f11..151bec6 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StreamResource.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/StreamResource.java @@ -237,7 +237,7 @@ public class StreamResource implements Streamable { @ResponseHeader("Content-Type") @Override /* Streamable */ - public MediaType getMediaType() { + public MediaType getContentType() { return mediaType; } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ZipFileList.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ZipFileList.java index 9818545..575eb1e 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ZipFileList.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ZipFileList.java @@ -40,7 +40,7 @@ public class ZipFileList extends LinkedList<ZipFileList.ZipFileEntry> implements @Header("Content-Type") @Override /* Streamable */ - public MediaType getMediaType() { + public MediaType getContentType() { return MediaType.forString("application/zip"); } diff --git a/juneau-releng/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java b/juneau-releng/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java index 8fbadb6..b2cbfa3 100644 --- a/juneau-releng/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java +++ b/juneau-releng/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java @@ -82,6 +82,7 @@ public class ConfigurablePropertyCodeGenerator { RdfSerializerBuilder.class, ReaderParserBuilder.class, RestClientBuilder.class, + MockRestClientBuilder.class, RestContextBuilder.class, RestMethodContextBuilder.class, SerializerBuilder.class, diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/EndToEndInterfaceTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/EndToEndInterfaceTest.java index 0500a10..d20fc85 100644 --- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/EndToEndInterfaceTest.java +++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/EndToEndInterfaceTest.java @@ -328,7 +328,7 @@ public class EndToEndInterfaceTest { assertEquals("foo", IOUtils.read(r.getContents())); assertEquals("foo", r.getHeaders().get("Foo")); assertEquals("bar", r.getHeaders().get("ETag")); - assertEquals("text/foo", r.getMediaType().toString()); + assertEquals("text/foo", r.getContentType().toString()); } @Test @@ -347,7 +347,7 @@ public class EndToEndInterfaceTest { StreamResource r = id2.streamResource(); assertEquals("foo", IOUtils.read(r.getContents())); assertEquals("foo", r.getHeaders().get("Foo")); - assertEquals("text/foo", r.getMediaType().toString()); + assertEquals("text/foo", r.getContentType().toString()); } @Test diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java index 7741ffb..d58b342 100644 --- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java +++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java @@ -18,6 +18,7 @@ import static org.apache.juneau.rest.client2.RestClient.*; import static org.apache.juneau.testutils.TestUtils.*; import java.io.*; +import java.net.*; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; @@ -29,6 +30,8 @@ import org.apache.http.HttpResponse; import org.apache.http.auth.*; import org.apache.http.client.*; import org.apache.http.client.methods.*; +import org.apache.http.client.utils.*; +import org.apache.http.entity.*; import org.apache.http.impl.client.*; import org.apache.http.message.*; import org.apache.http.protocol.*; @@ -42,6 +45,7 @@ import org.apache.juneau.http.annotation.*; import org.apache.juneau.http.annotation.Header; import org.apache.juneau.http.exception.*; import org.apache.juneau.http.header.*; +import org.apache.juneau.http.header.ContentType; import org.apache.juneau.http.response.*; import org.apache.juneau.httppart.*; import org.apache.juneau.json.*; @@ -100,6 +104,10 @@ public class RestClientTest { return b; } @RestMethod(path="/bean") + public Bean patchBean(@Body Bean b) { + return b; + } + @RestMethod(path="/bean") public Bean deleteBean() { return bean; } @@ -249,6 +257,55 @@ public class RestClientTest { .body(bean) .run() .assertBody().is("{f:1}"); + + // Different URL types. + for (Object url : AList.<Object>of(new URIBuilder("http://localhost/bean"), java.net.URI.create("http://localhost/bean"), new URL("http://localhost/bean"), "/bean", new StringBuilder("/bean"))) { + MockRestClient + .create(A.class) + .simpleJson() + .build() + .put(url, bean) + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .simpleJson() + .build() + .put(url, "{f:1}", "application/json") + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .simpleJson() + .build() + .put(url) + .body(bean) + .run() + .assertBody().is("{f:1}"); + } + + // Different body types. + List<Object> l = AList.<Object>of( + new StringReader("{f:1}"), + new ByteArrayInputStream("{f:1}".getBytes()), + ReaderResource.create().contents("{f:1}").build(), + StreamResource.create().contents("{f:1}").build(), + bean, + new StringEntity("{f:1}"), + NameValuePairs.of("f", 1) + ); + for (Object body : l) { + MockRestClient + .create(A.class) + .simpleJson() + .contentType(body instanceof NameValuePairs ? "application/x-www-form-urlencoded" : "application/json") + .build() + .put("/bean", body) + .run() + .assertBody().is("{f:1}"); + } } @Test @@ -342,6 +399,30 @@ public class RestClientTest { MockRestClient .create(A.class) .build() + .formPost("/bean", (Object)new NameValuePair[]{BasicNameValuePair.of("f","1")}) + .accept("application/json+simple") + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .build() + .formPost("/bean", new NameValuePair[]{BasicNameValuePair.of("f","1")}) + .accept("application/json+simple") + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .build() + .formPost("/bean", new StringEntity("{f:1}", org.apache.http.entity.ContentType.APPLICATION_JSON)) + .accept("application/json+simple") + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .build() .formPost("/bean", BasicNameValuePair.of("f","1")) .accept("application/json+simple") .run() @@ -356,6 +437,34 @@ public class RestClientTest { .assertBody().is("{f:1}"); } + @Test + public void a12_basicCalls_patch() throws Exception { + MockRestClient + .create(A.class) + .simpleJson() + .build() + .patch("/bean", bean) + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .simpleJson() + .build() + .patch("/bean", "{f:1}", "application/json") + .run() + .assertBody().is("{f:1}"); + + MockRestClient + .create(A.class) + .simpleJson() + .build() + .patch("/bean") + .body(bean) + .run() + .assertBody().is("{f:1}"); + } + //------------------------------------------------------------------------------------------------------------------ // Logging //------------------------------------------------------------------------------------------------------------------ diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java index 2de9827..60c35a9 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClient.java @@ -2406,10 +2406,11 @@ public class RestClient extends BeanContext implements HttpClient, Closeable, Re * @param body * The object to serialize and transmit to the URL as the body of the request. * <ul class='spaced-list'> - * <li class='jc'>{@link HttpEntity} - Serialized directly. * <li class='jc'>{@link NameValuePair} - URL-encoded as a single name-value pair. * <li class='jc'>{@link NameValuePair} array - URL-encoded as name value pairs. * <li class='jc'>{@link NameValuePairs} - URL-encoded as name value pairs. + * <li class='jc'>{@link Reader}/{@link InputStream}- Streamed directly and <l>Content-Type</l> set to <js>"application/x-www-form-urlencoded"</js> + * <li class='jc'>{@link ReaderResource}/{@link StreamResource}/{@link HttpEntity}- Streamed directly and <l>Content-Type</l> set to <js>"application/x-www-form-urlencoded"</js> if not already specified on the entity. * <li class='jc'>{@link Object} - Converted to a {@link SerializedHttpEntity} using {@link UrlEncodingSerializer} to serialize. * </ul> * @return @@ -2426,8 +2427,26 @@ public class RestClient extends BeanContext implements HttpClient, Closeable, Re return req.body(new UrlEncodedFormEntity(Arrays.asList((NameValuePair[])body))); if (body instanceof NameValuePairs) return req.body(new UrlEncodedFormEntity((NameValuePairs)body)); - if (body instanceof HttpEntity) - return req.body(body); + if (body instanceof HttpEntity) { + HttpEntity e = (HttpEntity)body; + if (e.getContentType() == null) + req.contentType("application/x-www-form-urlencoded"); + return req.body(e); + } + if (body instanceof Reader || body instanceof InputStream) + return req.contentType("application/x-www-form-urlencoded").body(body); + if (body instanceof ReaderResource) { + ReaderResource r = (ReaderResource)body; + if (r.getContentType() == null) + req.contentType("application/x-www-form-urlencoded"); + return req.body(r); + } + if (body instanceof StreamResource) { + StreamResource r = (StreamResource)body; + if (r.getContentType() == null) + req.contentType("application/x-www-form-urlencoded"); + return req.body(r); + } return req.body(new SerializedHttpEntity(body, urlEncodingSerializer, null, null)); } catch (UnsupportedEncodingException e) { // Should never happen. @@ -2566,13 +2585,15 @@ public class RestClient extends BeanContext implements HttpClient, Closeable, Re * </ul> * @param body * The object to serialize and transmit to the URL as the body of the request bypassing the serializer. + * @param contentType + * The content type of the request. * @return * A {@link RestRequest} object that can be further tailored before executing the request and getting the response * as a parsed object. * @throws RestCallException If any authentication errors occurred. */ - public RestRequest pathString(Object url, String body) throws RestCallException { - return request("PATCH", url, true).stringBody(body); + public RestRequest patch(Object url, String body, String contentType) throws RestCallException { + return request("PATCH", url, true).stringBody(body).contentType(contentType); } /** diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java index e4eed51..e8f1eb8 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestRequest.java @@ -3710,7 +3710,7 @@ public class RestRequest extends BeanSession implements HttpUriRequest, Configur } else if (input instanceof StreamResource) { StreamResource r = (StreamResource)input; - contentType(r.getMediaType()); + contentType(r.getContentType()); headers(r.getHeaders()); entity = new InputStreamEntity(r.getContents(), getRequestContentType(ContentType.APPLICATION_OCTET_STREAM)); } diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java index ee30667..be9d498 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java @@ -456,8 +456,8 @@ public class MockRestClient extends RestClient implements HttpClientConnection { } @Override /* RestClient */ - public MockRestRequest pathString(Object url, String body) throws RestCallException { - return (MockRestRequest)super.pathString(url, body); + public MockRestRequest patch(Object url, String body, String contentType) throws RestCallException { + return (MockRestRequest)super.patch(url, body, contentType); } @Override /* RestClient */