package com.artemzin.qualitymatters.developer_settings;
import com.artemzin.qualitymatters.QualityMattersApp;
import org.junit.Before;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import hu.supercluster.paperwork.Paperwork;
import okhttp3.logging.HttpLoggingInterceptor;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
public class DeveloperSettingsModelImplTest {
private DeveloperSettingsModelImpl developerSettingsModel;
private DeveloperSettings developerSettings;
private Paperwork paperwork;
@Before
public void beforeEachTest() {
developerSettings = mock(DeveloperSettings.class);
paperwork = mock(Paperwork.class);
developerSettingsModel = new DeveloperSettingsModelImpl(
mock(QualityMattersApp.class),
developerSettings,
new HttpLoggingInterceptor(),
mock(LeakCanaryProxy.class),
paperwork
);
}
@Test
public void testGetGitSha() {
when(paperwork.get("gitSha")).thenReturn("abc123");
assertThat(developerSettingsModel.getGitSha()).isEqualTo("abc123");
verify(paperwork).get("gitSha");
verifyNoMoreInteractions(paperwork);
}
@Test
public void getGitSha_shouldReturnSameResultForSeveralCalls() {
when(paperwork.get("gitSha")).thenReturn("abc123");
String sha1 = developerSettingsModel.getGitSha();
String sha2 = developerSettingsModel.getGitSha();
String sha3 = developerSettingsModel.getGitSha();
assertThat(sha1).isEqualTo(sha2).isEqualTo(sha3).isEqualTo("abc123");
}
@Test
public void testGetBuildDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = dateFormat.format(new Date());
when(paperwork.get("buildDate")).thenReturn(date);
assertThat(developerSettingsModel.getBuildDate()).isEqualTo(date);
verify(paperwork).get("buildDate");
verifyNoMoreInteractions(paperwork);
}
@Test
public void getBuildDate_shouldReturnSameResultForSeveralCalls() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = dateFormat.format(new Date());
when(paperwork.get("buildDate")).thenReturn(date);
String buildDate1 = developerSettingsModel.getBuildDate();
String buildDate2 = developerSettingsModel.getBuildDate();
String buildDate3 = developerSettingsModel.getBuildDate();
assertThat(buildDate1).isEqualTo(buildDate2).isEqualTo(buildDate3).isEqualTo(date);
}
@Test
public void getBuildVersionCode_shouldNotBeNull() {
assertThat(developerSettingsModel.getBuildVersionCode()).isNotNull();
}
@Test
public void getBuildVersionCode_shouldReturnSameResultForSeveralCalls() {
String buildVersionCode1 = developerSettingsModel.getBuildVersionCode();
String buildVersionCode2 = developerSettingsModel.getBuildVersionCode();
String buildVersionCode3 = developerSettingsModel.getBuildVersionCode();
assertThat(buildVersionCode1).isEqualTo(buildVersionCode2).isEqualTo(buildVersionCode3);
}
@Test
public void getBuildVersionName_shouldNotBeNull() {
assertThat(developerSettingsModel.getBuildVersionName()).isNotNull();
}
@Test
public void getBuildVersionName_shouldReturnSameResultForSeveralCalls() {
String buildVersionName1 = developerSettingsModel.getBuildVersionName();
String buildVersionName2 = developerSettingsModel.getBuildVersionName();
String buildVersionName3 = developerSettingsModel.getBuildVersionName();
assertThat(buildVersionName1).isEqualTo(buildVersionName2).isEqualTo(buildVersionName3);
}
@Test
public void isStethoEnabled_shouldReturnValueFromDeveloperSettings() {
when(developerSettings.isStethoEnabled()).thenReturn(true);
assertThat(developerSettingsModel.isStethoEnabled()).isTrue();
verify(developerSettings).isStethoEnabled();
when(developerSettings.isStethoEnabled()).thenReturn(false);
assertThat(developerSettingsModel.isStethoEnabled()).isFalse();
verify(developerSettings, times(2)).isStethoEnabled();
}
@Test
public void isLeakCanaryEnabled_shouldReturnValueFromDeveloperSettings() {
when(developerSettings.isLeakCanaryEnabled()).thenReturn(true);
assertThat(developerSettingsModel.isLeakCanaryEnabled()).isTrue();
verify(developerSettings).isLeakCanaryEnabled();
when(developerSettings.isLeakCanaryEnabled()).thenReturn(false);
assertThat(developerSettingsModel.isLeakCanaryEnabled()).isFalse();
verify(developerSettings, times(2)).isLeakCanaryEnabled();
}
@Test
public void isTinyDancerEnabled_shouldReturnValueFromDeveloperSettings() {
when(developerSettings.isTinyDancerEnabled()).thenReturn(true);
assertThat(developerSettingsModel.isTinyDancerEnabled()).isTrue();
verify(developerSettings).isTinyDancerEnabled();
when(developerSettings.isTinyDancerEnabled()).thenReturn(false);
assertThat(developerSettingsModel.isTinyDancerEnabled()).isFalse();
verify(developerSettings, times(2)).isTinyDancerEnabled();
}
@Test
public void getHttpLoggingInterceptor_shouldReturnValueFromDeveloperSettings() {
for (HttpLoggingInterceptor.Level loggingLevel : HttpLoggingInterceptor.Level.values()) {
when(developerSettings.getHttpLoggingLevel()).thenReturn(loggingLevel);
assertThat(developerSettingsModel.getHttpLoggingLevel()).isEqualTo(loggingLevel);
}
}
// To test apply() method we will need a lof of abstractions over the libraries used
// for Developer Settings, because most of them initialized statically and hardly mockable/verifiable :(
// So, sorry, no tests for apply(). But, feel free to PR!
}