package org.wikipedia.language;
import android.support.annotation.NonNull;
import com.google.gson.stream.MalformedJsonException;
import org.junit.Test;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.mwapi.MwException;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import org.wikipedia.dataclient.okhttp.HttpStatusException;
import org.wikipedia.page.PageTitle;
import org.wikipedia.test.MockWebServerTest;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
public class LangLinksClientTest extends MockWebServerTest {
@NonNull private final LangLinksClient subject = new LangLinksClient();
@Test public void testRequestSuccessHasResults() throws Throwable {
List<PageTitle> expected = getExpectedResults();
enqueueFromFile("lang_links.json");
LangLinksClient.Callback cb = mock(LangLinksClient.Callback.class);
Call<MwQueryResponse<LangLinks>> call = request(cb);
server().takeRequest();
assertCallbackSuccess(call, cb, expected);
}
@Test public void testRequestSuccessNoResults() throws Throwable {
List<PageTitle> expected = new ArrayList<>();
enqueueFromFile("lang_links_empty.json");
LangLinksClient.Callback cb = mock(LangLinksClient.Callback.class);
Call<MwQueryResponse<LangLinks>> call = request(cb);
server().takeRequest();
assertCallbackSuccess(call, cb, expected);
}
@Test public void testRequestResponseApiError() throws Throwable {
enqueueFromFile("api_error.json");
LangLinksClient.Callback cb = mock(LangLinksClient.Callback.class);
Call<MwQueryResponse<LangLinks>> call = request(cb);
server().takeRequest();
assertCallbackFailure(call, cb, MwException.class);
}
@Test public void testRequestResponseFailure() throws Throwable {
enqueue404();
LangLinksClient.Callback cb = mock(LangLinksClient.Callback.class);
Call<MwQueryResponse<LangLinks>> call = request(cb);
server().takeRequest();
assertCallbackFailure(call, cb, HttpStatusException.class);
}
@Test public void testRequestResponseMalformed() throws Throwable {
server().enqueue("⨌⨀_⨀⨌");
LangLinksClient.Callback cb = mock(LangLinksClient.Callback.class);
Call<MwQueryResponse<LangLinks>> call = request(cb);
server().takeRequest();
assertCallbackFailure(call, cb, MalformedJsonException.class);
}
private void assertCallbackSuccess(@NonNull Call<MwQueryResponse<LangLinks>> call,
@NonNull LangLinksClient.Callback cb,
@NonNull List<PageTitle> expected) {
verify(cb).success(eq(call), eq(expected));
//noinspection unchecked
verify(cb, never()).failure(any(Call.class), any(Throwable.class));
}
private void assertCallbackFailure(@NonNull Call<MwQueryResponse<LangLinks>> call,
@NonNull LangLinksClient.Callback cb,
@NonNull Class<? extends Throwable> throwable) {
//noinspection unchecked
verify(cb, never()).success(any(Call.class), any(List.class));
verify(cb).failure(eq(call), isA(throwable));
}
private List<PageTitle> getExpectedResults() {
List<PageTitle> result = new ArrayList<>();
result.add(new PageTitle("Sciëntologie", WikiSite.forLanguageCode("af")));
result.add(new PageTitle("سينتولوجيا", WikiSite.forLanguageCode("ar")));
result.add(new PageTitle("سيينتولوجيا", WikiSite.forLanguageCode("arz")));
return result;
}
private Call<MwQueryResponse<LangLinks>> request(@NonNull LangLinksClient.Callback cb) {
PageTitle title = new PageTitle(null, "Scientology", WikiSite.forLanguageCode("en"));
return subject.request(service(LangLinksClient.Service.class), title, cb);
}
}