package org.wikipedia.feed.announcement; import android.support.annotation.NonNull; import org.junit.Before; import org.junit.Test; import org.wikipedia.feed.dataclient.FeedClient.Callback; import org.wikipedia.feed.model.Card; import org.wikipedia.json.GsonUnmarshaller; import org.wikipedia.test.MockWebServerTest; import org.wikipedia.test.TestFileUtil; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import retrofit2.Call; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyListOf; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; public class AnnouncementClientTest extends MockWebServerTest { private static final int ANNOUNCEMENT_IOS = 0; private static final int ANNOUNCEMENT_SURVEY_ANDROID = 1; private static final int ANNOUNCEMENT_FUNDRAISING_ANDROID = 2; private static final int ANNOUNCEMENT_INVALID_DATES = 3; private static final int ANNOUNCEMENT_NO_DATES = 4; private static final int ANNOUNCEMENT_NO_COUNTRIES = 5; @NonNull private AnnouncementClient client = new AnnouncementClient(); private AnnouncementList announcementList; private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT); @Before @Override public void setUp() throws Throwable { super.setUp(); String json = TestFileUtil.readRawFile("announce_2016_11_21.json"); announcementList = GsonUnmarshaller.unmarshal(AnnouncementList.class, json); } @Test public void testRequestSuccess() throws Throwable { enqueueFromFile("announce_2016_11_21.json"); Callback cb = mock(Callback.class); request(cb); server().takeRequest(); verify(cb).success(anyListOf(Card.class)); //noinspection unchecked verify(cb, never()).error(any(Throwable.class)); } @Test public void testRequestMalformed() throws Throwable { server().enqueue("Jimmy crack corn, and I don't care."); Callback cb = mock(Callback.class); request(cb); server().takeRequest(); verify(cb, never()).success(anyListOf(Card.class)); verify(cb).error(any(Throwable.class)); } @Test public void testRequestNotFound() throws Throwable { enqueue404(); Callback cb = mock(Callback.class); request(cb); server().takeRequest(); verify(cb, never()).success(anyListOf(Card.class)); verify(cb).error(any(Throwable.class)); } @Test public void testFundraisingParams() throws Throwable { Announcement announcement = announcementList.items().get(ANNOUNCEMENT_FUNDRAISING_ANDROID); assertThat(announcement.hasAction(), is(true)); assertThat(announcement.hasFooterCaption(), is(true)); assertThat(announcement.hasImageUrl(), is(true)); } @Test public void testShouldShowByCountry() throws Throwable { Announcement announcement = announcementList.items().get(ANNOUNCEMENT_SURVEY_ANDROID); Date dateDuring = dateFormat.parse("2016-11-20"); assertThat(AnnouncementClient.shouldShow(announcement, "US", dateDuring), is(true)); assertThat(AnnouncementClient.shouldShow(announcement, "FI", dateDuring), is(false)); assertThat(AnnouncementClient.shouldShow(announcement, null, dateDuring), is(false)); } @Test public void testShouldShowByDate() throws Throwable { Announcement announcement = announcementList.items().get(ANNOUNCEMENT_SURVEY_ANDROID); Date dateBefore = dateFormat.parse("2016-08-01"); Date dateAfter = dateFormat.parse("2017-01-05"); assertThat(AnnouncementClient.shouldShow(announcement, "US", dateBefore), is(false)); assertThat(AnnouncementClient.shouldShow(announcement, "US", dateAfter), is(false)); } @Test public void testShouldShowByPlatform() throws Throwable { Announcement announcementIOS = announcementList.items().get(ANNOUNCEMENT_IOS); Date dateDuring = dateFormat.parse("2016-11-20"); assertThat(AnnouncementClient.shouldShow(announcementIOS, "US", dateDuring), is(false)); } @Test public void testShouldShowForInvalidDates() throws Throwable { assertThat(announcementList.items().get(ANNOUNCEMENT_INVALID_DATES), is(nullValue())); assertThat(announcementList.items().get(ANNOUNCEMENT_NO_DATES), is(nullValue())); } @Test public void testShouldShowForInvalidCountries() throws Throwable { Announcement announcement = announcementList.items().get(ANNOUNCEMENT_NO_COUNTRIES); Date dateDuring = dateFormat.parse("2016-11-20"); assertThat(AnnouncementClient.shouldShow(announcement, "US", dateDuring), is(false)); assertThat(AnnouncementClient.shouldShow(announcement, "FI", dateDuring), is(false)); assertThat(AnnouncementClient.shouldShow(announcement, "", dateDuring), is(false)); } private void request(@NonNull Callback cb) { Call<AnnouncementList> call = client.request(service(AnnouncementClient.Service.class)); call.enqueue(new AnnouncementClient.CallbackAdapter(cb)); } }