Mholloway has uploaded a new change for review. https://gerrit.wikimedia.org/r/318561
Change subject: Handle error responses in EditPreviewClient ...................................................................... Handle error responses in EditPreviewClient As with EditClient, EditPreviewClient should handle API error responses that can be sent with a 200 response code. Errors are probably a little less likely here but still possible. Change-Id: I565cdbfc188c9037942e192ab016e5eaae6fdeff --- M app/src/androidTest/java/org/wikipedia/editing/preview/EditPreviewTest.java M app/src/main/java/org/wikipedia/editing/preview/EditPreview.java M app/src/main/java/org/wikipedia/editing/preview/EditPreviewClient.java 3 files changed, 68 insertions(+), 12 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/61/318561/1 diff --git a/app/src/androidTest/java/org/wikipedia/editing/preview/EditPreviewTest.java b/app/src/androidTest/java/org/wikipedia/editing/preview/EditPreviewTest.java index 84506cf..69efb54 100644 --- a/app/src/androidTest/java/org/wikipedia/editing/preview/EditPreviewTest.java +++ b/app/src/androidTest/java/org/wikipedia/editing/preview/EditPreviewTest.java @@ -11,20 +11,22 @@ import retrofit2.Call; import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; @SmallTest public class EditPreviewTest { + private static WikiSite TESTWIKI = WikiSite.forLanguageCode("test"); + @Test public void testPreview() throws Throwable { - final WikiSite wiki = WikiSite.forLanguageCode("test"); - final PageTitle title = new PageTitle(null, "Test_page_for_app_testing/Section1", wiki); + PageTitle title = new PageTitle(null, "Test_page_for_app_testing/Section1", TESTWIKI); final long randomTime = System.currentTimeMillis(); - final String wikiText = "== Section 2 ==\n\nEditing section INSERT RANDOM & HERE test at " + randomTime; + String wikiText = "== Section 2 ==\n\nEditing section INSERT RANDOM & HERE test at " + randomTime; final TestLatch latch = new TestLatch(); - new EditPreviewClient().request(wiki, title, wikiText, + new EditPreviewClient().request(TESTWIKI, title, wikiText, new EditPreviewClient.Callback() { @Override public void success(@NonNull Call<EditPreview> call, @NonNull String preview) { @@ -39,4 +41,27 @@ }); latch.await(); } + + @Test + public void testErrorResponse() throws Throwable { + PageTitle title = new PageTitle(null, "#[]", TESTWIKI); + String wikiText = "foo"; + + final TestLatch latch = new TestLatch(); + + new EditPreviewClient().request(TESTWIKI, title, wikiText, + new EditPreviewClient.Callback() { + @Override + public void success(@NonNull Call<EditPreview> call, @NonNull String preview) { + throw new RuntimeException("This should generate an error response!"); + } + + @Override + public void failure(@NonNull Call<EditPreview> call, @NonNull Throwable caught) { + assertNotNull(caught.getMessage()); + latch.countDown(); + } + }); + latch.await(); + } } diff --git a/app/src/main/java/org/wikipedia/editing/preview/EditPreview.java b/app/src/main/java/org/wikipedia/editing/preview/EditPreview.java index bf9ff45..093cc9a 100644 --- a/app/src/main/java/org/wikipedia/editing/preview/EditPreview.java +++ b/app/src/main/java/org/wikipedia/editing/preview/EditPreview.java @@ -1,28 +1,52 @@ package org.wikipedia.editing.preview; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.google.gson.annotations.SerializedName; import org.wikipedia.model.BaseModel; -public class EditPreview extends BaseModel { - @SuppressWarnings("unused,NullableProblems") @NonNull private Parse parse; - @NonNull protected String result() { - return parse.text().result(); +class EditPreview extends BaseModel { + @SuppressWarnings("unused") @Nullable private Parse parse; + @SuppressWarnings("unused") @Nullable private Error error; + + boolean hasPreviewResult() { + return parse != null; } - static class Parse { + boolean hasError() { + return error != null; + } + + @Nullable String result() { + return parse != null ? parse.text().result() : null; + } + + @Nullable String errorInfo() { + return error != null ? error.info() : null; + } + + private static class Parse { @SuppressWarnings("unused,NullableProblems") @NonNull private Text text; @NonNull Text text() { return text; } } - static class Text { + private static class Text { @SuppressWarnings("unused,NullableProblems") @SerializedName("*") @NonNull private String result; @NonNull String result() { return result; } } + + private static class Error { + @SuppressWarnings("unused") @Nullable private String code; + @SuppressWarnings("unused") @Nullable private String info; + + @Nullable String info() { + return info; + } + } } diff --git a/app/src/main/java/org/wikipedia/editing/preview/EditPreviewClient.java b/app/src/main/java/org/wikipedia/editing/preview/EditPreviewClient.java index c5ffc2b..96d0985 100644 --- a/app/src/main/java/org/wikipedia/editing/preview/EditPreviewClient.java +++ b/app/src/main/java/org/wikipedia/editing/preview/EditPreviewClient.java @@ -16,7 +16,7 @@ import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; -public class EditPreviewClient { +class EditPreviewClient { @NonNull private final MwCachedService<Service> cachedService = new MwCachedService<>(Service.class); @NonNull private final Retrofit retrofit = RbPageEndpointsCache.INSTANCE.getRetrofit(); @@ -35,7 +35,14 @@ @Override public void onResponse(Call<EditPreview> call, Response<EditPreview> response) { if (response.isSuccessful()) { - cb.success(call, response.body().result()); + EditPreview preview = response.body(); + if (preview.hasPreviewResult()) { + cb.success(call, preview.result()); + } else if (preview.hasError()) { + cb.failure(call, new RuntimeException(preview.errorInfo())); + } else { + cb.failure(call, new RuntimeException("Received unrecognized edit preview response")); + } } else { cb.failure(call, RetrofitException.httpError(response, retrofit)); } -- To view, visit https://gerrit.wikimedia.org/r/318561 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I565cdbfc188c9037942e192ab016e5eaae6fdeff Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Mholloway <mhollo...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits