package org.glucosio.android.presenter;
import org.glucosio.android.RobolectricTest;
import org.glucosio.android.db.DatabaseHandler;
import org.glucosio.android.db.User;
import org.glucosio.android.view.HelloView;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
//just because we use Tools from android it should be Robolectric test
public class HelloPresenterTest extends RobolectricTest {
@InjectMocks
private HelloPresenter presenter;
@Mock
private HelloView helloViewMock;
@Mock
private DatabaseHandler dbHandlerMock;
@Captor
private ArgumentCaptor<User> userCaptor;
@Before
public void setUp() throws Exception {
initMocks(this);
}
@Test
public void ShouldSetUserId_WhenLoadDBHappens() throws Exception {
presenter.loadDatabase();
//33 just to pass age check
presenter.onNextClicked("33", null, null, null, -1, null);
verify(dbHandlerMock).addUser(userCaptor.capture());
assertThat(userCaptor.getValue().getId()).isEqualTo(1);
}
@Test
public void ShouldAskForWarning_WhenAgeIsNegative() throws Exception {
presenter.onNextClicked("-1", null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldAskForWarning_WhenAgeIsZero() throws Exception {
presenter.onNextClicked("0", null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldAskForWarning_WhenAgeIsAbove120() throws Exception {
presenter.onNextClicked("121", null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldAskForWarning_WhenAgeIsNotNumber() throws Exception {
presenter.onNextClicked("12haha", null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldAskForWarning_WhenAgeIsEmpty() throws Exception {
presenter.onNextClicked("", null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldAskForWarning_WhenAgeIsNull() throws Exception {
presenter.onNextClicked(null, null, null, null, -1, null);
verify(helloViewMock).displayErrorWrongAge();
verify(dbHandlerMock, never()).addUser(any(User.class));
}
@Test
public void ShouldPropagateAllValues_WhenSavingUser() throws Exception {
final String gender = "male";
final String language = "ukrainian";
final String country = "ukraine";
final int type = 1;
final String unit = "mmol/l";
presenter.onNextClicked("35", gender, language, country, type, unit);
verify(dbHandlerMock).addUser(userCaptor.capture());
final User user = userCaptor.getValue();
assertThat(user.getAge()).isEqualTo(35);
assertThat(user.getGender()).isEqualTo(gender);
assertThat(user.getPreferred_language()).isEqualTo(language);
assertThat(user.getCountry()).isEqualTo(country);
assertThat(user.getD_type()).isEqualTo(type);
assertThat(user.getPreferred_unit()).isEqualTo(unit);
}
@Test
public void ShouldPutADAValuesAsDefault_WhenSavingUser() throws Exception {
presenter.onNextClicked("35", null, null, null, -1, null);
verify(dbHandlerMock).addUser(userCaptor.capture());
final User user = userCaptor.getValue();
assertThat(user.getPreferred_unit_a1c()).isEqualTo("percentage");
assertThat(user.getPreferred_unit_weight()).isEqualTo("kilograms");
assertThat(user.getPreferred_range()).isEqualTo("ADA");
assertThat(user.getCustom_range_max()).isEqualTo(180);
assertThat(user.getCustom_range_min()).isEqualTo(70);
}
}