/*
* Copyright (C) 2017 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.mock;
import java.io.IOException;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Test;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public final class CallsTest {
@Test public void bodyExecute() throws IOException {
Call<String> taco = Calls.response("Taco");
assertEquals("Taco", taco.execute().body());
}
@Test public void bodyEnqueue() throws IOException {
Call<String> taco = Calls.response("Taco");
final AtomicReference<Response<String>> responseRef = new AtomicReference<>();
taco.enqueue(new Callback<String>() {
@Override public void onResponse(Call<String> call, Response<String> response) {
responseRef.set(response);
}
@Override public void onFailure(Call<String> call, Throwable t) {
fail();
}
});
assertThat(responseRef.get().body()).isEqualTo("Taco");
}
@Test public void responseExecute() throws IOException {
Response<String> response = Response.success("Taco");
Call<String> taco = Calls.response(response);
assertFalse(taco.isExecuted());
assertSame(response, taco.execute());
assertTrue(taco.isExecuted());
try {
taco.execute();
fail();
} catch (IllegalStateException e) {
assertThat(e).hasMessage("Already executed");
}
}
@Test public void responseEnqueue() {
Response<String> response = Response.success("Taco");
Call<String> taco = Calls.response(response);
assertFalse(taco.isExecuted());
final AtomicReference<Response<String>> responseRef = new AtomicReference<>();
taco.enqueue(new Callback<String>() {
@Override public void onResponse(Call<String> call, Response<String> response) {
responseRef.set(response);
}
@Override public void onFailure(Call<String> call, Throwable t) {
fail();
}
});
assertSame(response, responseRef.get());
assertTrue(taco.isExecuted());
try {
taco.enqueue(new Callback<String>() {
@Override public void onResponse(Call<String> call, Response<String> response) {
fail();
}
@Override public void onFailure(Call<String> call, Throwable t) {
fail();
}
});
fail();
} catch (IllegalStateException e) {
assertThat(e).hasMessage("Already executed");
}
}
@Test public void enqueueNullThrows() {
Call<String> taco = Calls.response("Taco");
try {
taco.enqueue(null);
fail();
} catch (NullPointerException e) {
assertThat(e).hasMessage("callback == null");
}
}
@Test public void responseCancelExecute() {
Call<String> taco = Calls.response(Response.success("Taco"));
assertFalse(taco.isCanceled());
taco.cancel();
assertTrue(taco.isCanceled());
try {
taco.execute();
fail();
} catch (IOException e) {
assertThat(e).hasMessage("canceled");
}
}
@Test public void responseCancelEnqueue() throws IOException {
Call<String> taco = Calls.response(Response.success("Taco"));
assertFalse(taco.isCanceled());
taco.cancel();
assertTrue(taco.isCanceled());
final AtomicReference<Throwable> failureRef = new AtomicReference<>();
taco.enqueue(new Callback<String>() {
@Override public void onResponse(Call<String> call, Response<String> response) {
fail();
}
@Override public void onFailure(Call<String> call, Throwable t) {
failureRef.set(t);
}
});
assertThat(failureRef.get()).isInstanceOf(IOException.class).hasMessage("canceled");
}
@Test public void failureExecute() {
IOException failure = new IOException("Hey");
Call<Object> taco = Calls.failure(failure);
assertFalse(taco.isExecuted());
try {
taco.execute();
fail();
} catch (IOException e) {
assertSame(failure, e);
}
assertTrue(taco.isExecuted());
}
@Test public void failureEnqueue() {
IOException failure = new IOException("Hey");
Call<Object> taco = Calls.failure(failure);
assertFalse(taco.isExecuted());
final AtomicReference<Throwable> failureRef = new AtomicReference<>();
taco.enqueue(new Callback<Object>() {
@Override public void onResponse(Call<Object> call, Response<Object> response) {
fail();
}
@Override public void onFailure(Call<Object> call, Throwable t) {
failureRef.set(t);
}
});
assertSame(failure, failureRef.get());
assertTrue(taco.isExecuted());
}
@Test public void cloneHasOwnState() throws IOException {
Call<String> taco = Calls.response("Taco");
assertEquals("Taco", taco.execute().body());
Call<String> anotherTaco = taco.clone();
assertFalse(anotherTaco.isExecuted());
assertEquals("Taco", anotherTaco.execute().body());
assertTrue(anotherTaco.isExecuted());
}
@Test public void deferredReturnExecute() throws IOException {
Call<Integer> counts = Calls.defer(new Callable<Call<Integer>>() {
private int count = 0;
@Override public Call<Integer> call() throws Exception {
return Calls.response(++count);
}
});
Call<Integer> a = counts.clone();
Call<Integer> b = counts.clone();
assertEquals(1, b.execute().body().intValue());
assertEquals(2, a.execute().body().intValue());
}
@Test public void deferredReturnEnqueue() {
Call<Integer> counts = Calls.defer(new Callable<Call<Integer>>() {
private int count = 0;
@Override public Call<Integer> call() throws Exception {
return Calls.response(++count);
}
});
Call<Integer> a = counts.clone();
Call<Integer> b = counts.clone();
final AtomicReference<Response<Integer>> responseRef = new AtomicReference<>();
Callback<Integer> callback = new Callback<Integer>() {
@Override public void onResponse(Call<Integer> call, Response<Integer> response) {
responseRef.set(response);
}
@Override public void onFailure(Call<Integer> call, Throwable t) {
fail();
}
};
b.enqueue(callback);
assertEquals(1, responseRef.get().body().intValue());
a.enqueue(callback);
assertEquals(2, responseRef.get().body().intValue());
}
@Test public void deferredThrowExecute() throws IOException {
final IOException failure = new IOException("Hey");
Call<Object> failing = Calls.defer(new Callable<Call<Object>>() {
@Override public Call<Object> call() throws Exception {
throw failure;
}
});
try {
failing.execute();
fail();
} catch (IOException e) {
assertSame(failure, e);
}
}
@Test public void deferredThrowEnqueue() {
final IOException failure = new IOException("Hey");
Call<Object> failing = Calls.defer(new Callable<Call<Object>>() {
@Override public Call<Object> call() throws Exception {
throw failure;
}
});
final AtomicReference<Throwable> failureRef = new AtomicReference<>();
failing.enqueue(new Callback<Object>() {
@Override public void onResponse(Call<Object> call, Response<Object> response) {
fail();
}
@Override public void onFailure(Call<Object> call, Throwable t) {
failureRef.set(t);
}
});
assertSame(failure, failureRef.get());
}
}