package org.wikipedia.edit; import android.support.annotation.NonNull; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.wikipedia.dataclient.WikiSite; import org.wikipedia.edit.EditClient.Callback; import org.wikipedia.edit.EditClient.Service; import org.wikipedia.page.PageTitle; import org.wikipedia.test.MockWebServerTest; import retrofit2.Call; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; 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 EditUnitTest extends MockWebServerTest { @NonNull private EditClient client = new EditClient(); @Test public void testAbuseFilterResult() throws Throwable { enqueueFromFile("edit_abuse_filter_result.json"); Callback cb = mock(Callback.class); Call<Edit> call = request(cb); server().takeRequest(); assertAbuseFilterEditResult(call, cb); } @Test public void testBadToken() throws Throwable { enqueueFromFile("edit_error_bad_token.json"); Callback cb = mock(Callback.class); Call<Edit> call = request(cb); server().takeRequest(); assertExpectedEditError(call, cb, "Invalid token"); } @Test public void testRequestUserNotLoggedIn() throws Throwable { enqueueFromFile("edit_user_not_logged_in.json"); Callback cb = mock(Callback.class); Call<Edit> call = request(cb); server().takeRequest(); assertExpectedEditError(call, cb, "User not logged in."); } @NonNull private Call<Edit> request(@NonNull Callback cb) { return client.request(service(Service.class), new PageTitle("FAKE TITLE", WikiSite.forLanguageCode("test")), 0, "FAKE EDIT TEXT", "+/", "FAKE SUMMARY", false, null, null, cb); } private void assertAbuseFilterEditResult(@NonNull Call<Edit> call, @NonNull Callback cb) { verify(cb).success(eq(call), isA(EditAbuseFilterResult.class)); //noinspection unchecked verify(cb, never()).failure(any(Call.class), any(Throwable.class)); } private void assertExpectedEditError(@NonNull Call<Edit> call, @NonNull Callback cb, @NonNull String expectedCode) { ArgumentCaptor<Throwable> captor = ArgumentCaptor.forClass(Throwable.class); //noinspection unchecked verify(cb, never()).success(any(Call.class), any(EditSuccessResult.class)); verify(cb).failure(eq(call), captor.capture()); Throwable t = captor.getValue(); assertThat(t.getMessage(), is(expectedCode)); } }