package org.kidinov.just_weather.weather.presentation; import org.junit.Before; import org.junit.Test; import org.kidinov.just_weather.WeatherTestUtil; import org.kidinov.just_weather.util.TestUtil; import org.kidinov.just_weather.weather.WeatherContract; import org.kidinov.just_weather.weather.model.WeatherRepository; import org.kidinov.just_weather.weather.model.local.City; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.List; import io.reactivex.Maybe; import io.reactivex.Single; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.internal.verification.VerificationModeFactory.times; public class WeatherPresenterTest { private WeatherPresenter presenter; @Mock WeatherRepository repository; @Mock WeatherContract.View view; @Before public void setup() { MockitoAnnotations.initMocks(this); presenter = new WeatherPresenter(repository, view); } @Test public void updateDataShouldShowProgressIfNotRefresh() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); when(repository.updateWeatherInfo()).thenReturn(Single.just(cities)); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.just(cities)); presenter.updateData(false); verify(view, times(1)).showProgress(); } @Test public void updateDataShouldShowDataFromRepository() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); when(repository.updateWeatherInfo()).thenReturn(Single.just(cities)); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.just(cities)); presenter.updateData(true); verify(view, never()).showProgress(); verify(view, times(1)).showData(cities); } @Test public void addCityByCoordinatesShouldShowThatCity() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); double lan = TestUtil.generateDouble(); double lon = TestUtil.generateDouble(); when(repository.addCity(lan, lon)).thenReturn(Single.just(city)); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.just(cities)); presenter.addCityByCoordinates(lan, lon); verify(view, times(1)).showData(cities); } @Test public void addCityByCoordinatesShouldShowErrorIfNoLocalDataAndError() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); double lan = TestUtil.generateDouble(); double lon = TestUtil.generateDouble(); when(repository.addCity(lan, lon)).thenReturn(Single.error(new Exception())); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.empty()); presenter.addCityByCoordinates(lan, lon); verify(view, times(1)).showError(); verify(view, never()).showData(cities); } @Test public void addCityByNameShouldShowThatCity() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); when(repository.addCity(city.getName())).thenReturn(Single.just(city)); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.just(cities)); presenter.addCityByName(city.getName()); verify(view, times(1)).showData(cities); } @Test public void addCityByNameShouldShowErrorIfNoLocalDataAndError() { City city = WeatherTestUtil.generateCity(); List<City> cities = Arrays.asList(city); when(repository.addCity(city.getName())).thenReturn(Single.error(new Exception())); when(repository.getAddedCitiesWeather()).thenReturn(Maybe.empty()); presenter.addCityByName(city.getName()); verify(view, never()).showData(cities); } }