/*
* Copyright (C) 2015 Square, Inc.
*
* Licensed 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 retrofit2.converter.scalars;
import java.io.IOException;
import okhttp3.ResponseBody;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
public final class ScalarsConverterFactoryTest {
interface Service {
@POST("/") Call<ResponseBody> object(@Body Object body);
@POST("/") Call<ResponseBody> stringObject(@Body String body);
@POST("/") Call<ResponseBody> booleanPrimitive(@Body boolean body);
@POST("/") Call<ResponseBody> booleanObject(@Body Boolean body);
@POST("/") Call<ResponseBody> bytePrimitive(@Body byte body);
@POST("/") Call<ResponseBody> byteObject(@Body Byte body);
@POST("/") Call<ResponseBody> charPrimitive(@Body char body);
@POST("/") Call<ResponseBody> charObject(@Body Character body);
@POST("/") Call<ResponseBody> doublePrimitive(@Body double body);
@POST("/") Call<ResponseBody> doubleObject(@Body Double body);
@POST("/") Call<ResponseBody> floatPrimitive(@Body float body);
@POST("/") Call<ResponseBody> floatObject(@Body Float body);
@POST("/") Call<ResponseBody> integerPrimitive(@Body int body);
@POST("/") Call<ResponseBody> integerObject(@Body Integer body);
@POST("/") Call<ResponseBody> longPrimitive(@Body long body);
@POST("/") Call<ResponseBody> longObject(@Body Long body);
@POST("/") Call<ResponseBody> shortPrimitive(@Body short body);
@POST("/") Call<ResponseBody> shortObject(@Body Short body);
@GET("/") Call<Object> object();
@GET("/") Call<String> stringObject();
@GET("/") Call<Boolean> booleanObject();
@GET("/") Call<Byte> byteObject();
@GET("/") Call<Character> charObject();
@GET("/") Call<Double> doubleObject();
@GET("/") Call<Float> floatObject();
@GET("/") Call<Integer> integerObject();
@GET("/") Call<Long> longObject();
@GET("/") Call<Short> shortObject();
}
@Rule public final MockWebServer server = new MockWebServer();
private Service service;
@Before public void setUp() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(ScalarsConverterFactory.create())
.build();
service = retrofit.create(Service.class);
}
@Test public void unsupportedRequestTypesNotMatched() {
try {
service.object(null);
fail();
} catch (IllegalArgumentException e) {
assertThat(e).hasMessage(""
+ "Unable to create @Body converter for class java.lang.Object (parameter #1)\n"
+ " for method Service.object");
assertThat(e.getCause()).hasMessage(""
+ "Could not locate RequestBody converter for class java.lang.Object.\n"
+ " Tried:\n"
+ " * retrofit2.BuiltInConverters\n"
+ " * retrofit2.converter.scalars.ScalarsConverterFactory");
}
}
@Test public void supportedRequestTypes() throws IOException, InterruptedException {
RecordedRequest request;
server.enqueue(new MockResponse());
service.stringObject("string").execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("6");
assertThat(request.getBody().readUtf8()).isEqualTo("string");
server.enqueue(new MockResponse());
service.booleanPrimitive(true).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("4");
assertThat(request.getBody().readUtf8()).isEqualTo("true");
server.enqueue(new MockResponse());
service.booleanObject(false).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("5");
assertThat(request.getBody().readUtf8()).isEqualTo("false");
server.enqueue(new MockResponse());
service.bytePrimitive((byte) 0).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("0");
server.enqueue(new MockResponse());
service.byteObject((byte) 1).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("1");
server.enqueue(new MockResponse());
service.charPrimitive('a').execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("a");
server.enqueue(new MockResponse());
service.charObject('b').execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("b");
server.enqueue(new MockResponse());
service.doublePrimitive(2.2d).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("3");
assertThat(request.getBody().readUtf8()).isEqualTo("2.2");
server.enqueue(new MockResponse());
service.doubleObject(3.3d).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("3");
assertThat(request.getBody().readUtf8()).isEqualTo("3.3");
server.enqueue(new MockResponse());
service.floatPrimitive(4.4f).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("3");
assertThat(request.getBody().readUtf8()).isEqualTo("4.4");
server.enqueue(new MockResponse());
service.floatObject(5.5f).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("3");
assertThat(request.getBody().readUtf8()).isEqualTo("5.5");
server.enqueue(new MockResponse());
service.integerPrimitive(6).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("6");
server.enqueue(new MockResponse());
service.integerObject(7).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("7");
server.enqueue(new MockResponse());
service.longPrimitive(8L).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("8");
server.enqueue(new MockResponse());
service.longObject(9L).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("1");
assertThat(request.getBody().readUtf8()).isEqualTo("9");
server.enqueue(new MockResponse());
service.shortPrimitive((short) 10).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("2");
assertThat(request.getBody().readUtf8()).isEqualTo("10");
server.enqueue(new MockResponse());
service.shortObject((short) 11).execute();
request = server.takeRequest();
assertThat(request.getHeader("Content-Type")).isEqualTo("text/plain; charset=UTF-8");
assertThat(request.getHeader("Content-Length")).isEqualTo("2");
assertThat(request.getBody().readUtf8()).isEqualTo("11");
}
@Test public void unsupportedResponseTypesNotMatched() {
try {
service.object();
fail();
} catch (IllegalArgumentException e) {
assertThat(e).hasMessage(""
+ "Unable to create converter for class java.lang.Object\n"
+ " for method Service.object");
assertThat(e.getCause()).hasMessage(""
+ "Could not locate ResponseBody converter for class java.lang.Object.\n"
+ " Tried:\n"
+ " * retrofit2.BuiltInConverters\n"
+ " * retrofit2.converter.scalars.ScalarsConverterFactory");
}
}
@Test public void supportedResponseTypes() throws IOException, InterruptedException {
server.enqueue(new MockResponse().setBody("test"));
Response<String> stringResponse = service.stringObject().execute();
assertThat(stringResponse.body()).isEqualTo("test");
server.enqueue(new MockResponse().setBody("true"));
Response<Boolean> booleanResponse = service.booleanObject().execute();
assertThat(booleanResponse.body()).isTrue();
server.enqueue(new MockResponse().setBody("5"));
Response<Byte> byteResponse = service.byteObject().execute();
assertThat(byteResponse.body()).isEqualTo((byte) 5);
server.enqueue(new MockResponse().setBody("b"));
Response<Character> characterResponse = service.charObject().execute();
assertThat(characterResponse.body()).isEqualTo('b');
server.enqueue(new MockResponse().setBody(""));
try {
service.charObject().execute();
} catch (IOException e) {
assertThat(e).hasMessage("Expected body of length 1 for Character conversion but was 0");
}
server.enqueue(new MockResponse().setBody("bb"));
try {
service.charObject().execute();
} catch (IOException e) {
assertThat(e).hasMessage("Expected body of length 1 for Character conversion but was 2");
}
server.enqueue(new MockResponse().setBody("13.13"));
Response<Double> doubleResponse = service.doubleObject().execute();
assertThat(doubleResponse.body()).isEqualTo(13.13);
server.enqueue(new MockResponse().setBody("13.13"));
Response<Float> floatResponse = service.floatObject().execute();
assertThat(floatResponse.body()).isEqualTo(13.13f);
server.enqueue(new MockResponse().setBody("13"));
Response<Integer> integerResponse = service.integerObject().execute();
assertThat(integerResponse.body()).isEqualTo(13);
server.enqueue(new MockResponse().setBody("1347"));
Response<Long> longResponse = service.longObject().execute();
assertThat(longResponse.body()).isEqualTo(1347L);
server.enqueue(new MockResponse().setBody("134"));
Response<Short> shortResponse = service.shortObject().execute();
assertThat(shortResponse.body()).isEqualTo((short) 134);
}
}