package com.nilhcem.bblfr.core.prefs;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.util.Pair;
import com.nilhcem.bblfr.BuildConfig;
import com.nilhcem.bblfr.model.baggers.City;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.Date;
import static com.google.common.truth.Truth.assertThat;
import static com.nilhcem.bblfr.core.prefs.Preferences.KEY_FAV_CITY_LAT;
import static com.nilhcem.bblfr.core.prefs.Preferences.KEY_FAV_CITY_LNG;
import static com.nilhcem.bblfr.core.prefs.Preferences.KEY_HR_MODE;
import static com.nilhcem.bblfr.core.prefs.Preferences.KEY_LAST_DOWNLOAD;
import static com.nilhcem.bblfr.core.prefs.Preferences.KEY_RESET_DB;
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M)
public class PreferencesTest {
private Preferences prefs;
private SharedPreferences sharedPrefs;
@Before
public void setup() {
prefs = new Preferences(RuntimeEnvironment.application);
sharedPrefs = RuntimeEnvironment.application.getSharedPreferences(Preferences.PREFS_NAME, Context.MODE_PRIVATE);
}
@Test
public void should_return_0_as_last_download_date_at_first_launch_if_none() {
// Given
sharedPrefs.edit().remove(KEY_LAST_DOWNLOAD).commit();
// When
long lastDownloadDate = prefs.getLastDownloadDate();
// Then
assertThat(lastDownloadDate).isEqualTo(0L);
}
@Test
public void should_return_last_download_date_if_set() {
// Given
long firstTime = new Date().getTime();
sharedPrefs.edit().remove(KEY_LAST_DOWNLOAD).commit();
// When
prefs.setDownloadDate();
long lastDownloadDate = prefs.getLastDownloadDate();
long lastTime = new Date().getTime();
// Then
assertThat(lastDownloadDate).isAtLeast(firstTime);
assertThat(lastDownloadDate).isAtMost(lastTime);
}
@Test
public void should_remove_reset_database_flag_when_setting_a_download_date() {
// Given
sharedPrefs.edit().putBoolean(KEY_RESET_DB, true).commit();
// When
prefs.setDownloadDate();
// Then
assertThat(sharedPrefs.contains(KEY_RESET_DB)).isFalse();
}
@Test
public void should_create_a_pair_of_lat_lng_when_getting_favorite_city() {
// Given
sharedPrefs.edit().putString(KEY_FAV_CITY_LAT, "42").putString(KEY_FAV_CITY_LNG, "24").commit();
// When
Pair<String, String> result = prefs.getFavoriteCityLatLng();
// Then
assertThat(result.first).isEqualTo("42");
assertThat(result.second).isEqualTo("24");
}
@Test
public void should_return_null_if_lat_or_lng_is_missing() {
// Given
sharedPrefs.edit().remove(KEY_FAV_CITY_LAT).putString(KEY_FAV_CITY_LNG, "24").commit();
// When
Pair<String, String> result = prefs.getFavoriteCityLatLng();
// Then
assertThat(result).isNull();
}
@Test
public void should_save_favorite_city_coordinates_in_prefs_and_object_in_memory() {
// Given
City city = new City();
city.lat = 10.5d;
city.lng = 20.4d;
// When
prefs.setFavoriteCity(city);
// Then
assertThat(prefs.mCity).isSameAs(city);
assertThat(sharedPrefs.getString(KEY_FAV_CITY_LAT, null)).isEqualTo("10.5");
assertThat(sharedPrefs.getString(KEY_FAV_CITY_LNG, null)).isEqualTo("20.4");
}
@Test
public void reset_should_remove_all_keys_except_hr_mode_and_should_set_reset_flag_to_true() {
// Given
sharedPrefs.edit().remove(KEY_RESET_DB).putBoolean(KEY_HR_MODE, true).putString(KEY_FAV_CITY_LAT, "10").putLong(KEY_LAST_DOWNLOAD, 10L).commit();
// When
prefs.reset();
boolean shouldResetData = prefs.shouldResetData();
// Then
assertThat(shouldResetData).isTrue();
assertThat(sharedPrefs.getBoolean(KEY_RESET_DB, false)).isTrue();
assertThat(sharedPrefs.getBoolean(KEY_HR_MODE, false)).isTrue();
assertThat(sharedPrefs.contains(KEY_FAV_CITY_LAT)).isFalse();
assertThat(sharedPrefs.contains(KEY_LAST_DOWNLOAD)).isFalse();
}
@Test
public void should_toggle_hr_mode_in_shared_prefs() {
// Given
sharedPrefs.edit().remove(KEY_HR_MODE);
// When
prefs.toggleMode();
boolean res1 = prefs.isUsingHrMode();
prefs.toggleMode();
boolean res2 = !prefs.isUsingHrMode();
// Then
assertThat(res1).isEqualTo(res2);
assertThat(res1).isTrue();
}
}