package com.wealthfront.magellan.sample.advanced.tide;
import com.wealthfront.magellan.sample.advanced.NoaaApi;
import com.wealthfront.magellan.sample.advanced.model.Observation;
import com.wealthfront.magellan.sample.advanced.model.TideInfo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.math.BigDecimal;
import java.util.Collections;
import rx.Observable;
import static java.util.Arrays.asList;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.robolectric.RuntimeEnvironment.application;
import static org.robolectric.annotation.Config.NONE;
@Config(manifest = NONE)
@RunWith(RobolectricTestRunner.class)
public class TideDetailsScreenTest {
private static final int FAKE_NOAA_API_ID = 1;
@Mock NoaaApi noaaApi;
@Mock TideDetailsView view;
TideDetailsScreen screen;
@Before
public void setUp() {
initMocks(this);
screen = new TideDetailsScreen(FAKE_NOAA_API_ID, "San Francisco");
screen.noaaApi = noaaApi;
screen.setView(view);
}
@Test
public void onSubscribe_nullTideInfo() {
when(noaaApi.getTideInfo(FAKE_NOAA_API_ID)).thenReturn(Observable.just(
TideInfo.with()
.build()));
screen.onSubscribe(application);
verify(noaaApi).getTideInfo(FAKE_NOAA_API_ID);
verify(view, never()).setTideHeights(any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class));
}
@Test
public void onSubscribe_emptyTideInfo() {
when(noaaApi.getTideInfo(FAKE_NOAA_API_ID)).thenReturn(Observable.just(
TideInfo.with()
.data(Collections.<Observation>emptyList())
.build()));
screen.onSubscribe(application);
verify(noaaApi).getTideInfo(FAKE_NOAA_API_ID);
verify(view, never()).setTideHeights(any(BigDecimal.class), any(BigDecimal.class), any(BigDecimal.class));
}
@Test
public void onSubscribe_withTideInfo() {
TideInfo tideInfo = TideInfo.with()
.data(asList(
Observation.with().verifiedWaterLevel(BigDecimal.TEN).build(),
Observation.with().verifiedWaterLevel(BigDecimal.ZERO).build(),
Observation.with().verifiedWaterLevel(BigDecimal.ONE).build()
))
.build();
when(noaaApi.getTideInfo(FAKE_NOAA_API_ID)).thenReturn(Observable.just(tideInfo));
screen.onSubscribe(application);
verify(noaaApi).getTideInfo(FAKE_NOAA_API_ID);
verify(view).setTideHeights(BigDecimal.ONE, BigDecimal.ZERO, BigDecimal.TEN);
}
}