package bf.io.openshop;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import bf.io.openshop.entities.Shop;
import bf.io.openshop.entities.User;
import bf.io.openshop.utils.MsgUtils;
import bf.io.openshop.utils.Utils;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.powermock.api.mockito.PowerMockito.doNothing;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import static org.powermock.api.mockito.PowerMockito.when;
/**
* Simple unit tests for {@link SettingsMy} class.
* <p/>
* Careful: Because it is testing static class with static methods and static fields.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({SettingsMy.class, MsgUtils.class})
public class SettingsMyUnitTest {
@Mock
SharedPreferences mockSharedPreferences;
@Mock
SharedPreferences.Editor mockEditor;
@Mock
Activity mockActivity;
@Mock
Context mockContext;
@Before
public void preparation() throws Exception {
MockitoAnnotations.initMocks(this); // for case them used another runner
PowerMockito.spy(SettingsMy.class);
PowerMockito.doReturn(mockSharedPreferences).when(SettingsMy.class, "getSettings");
Whitebox.setInternalState(SettingsMy.class, "actualShop", (Object[]) null);
Whitebox.setInternalState(SettingsMy.class, "activeUser", (Object[]) null);
}
@Test
public void getActualShopTest() throws Exception {
// Mock persistence response from shared preferences
Shop testShop = new Shop();
testShop.setName("testShop");
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTUAL_SHOP, "")).thenReturn(Utils.getGsonParser().toJson(testShop));
// Check if value is returned
assertEquals(SettingsMy.getActualShop(), testShop);
}
@Test
public void getActualShopNullTest() throws Exception {
// Mock persistence response from shared preferences
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTUAL_SHOP, "")).thenReturn("");
// Check if value is returned
assertEquals(SettingsMy.getActualShop(), null);
}
@Test
public void setAndGetActualShopTest() throws Exception {
// Sample object
Shop testShop = new Shop();
testShop.setName("testShop");
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Set actual shop and check method calls
SettingsMy.setActualShop(testShop);
verify(mockEditor, times(1)).putString(SettingsMy.PREF_ACTUAL_SHOP, Utils.getGsonParser().toJson(testShop));
verify(mockEditor, times(1)).apply();
// Check returned value and loading that value from filed not a shared preferences.
assertEquals(SettingsMy.getActualShop(), testShop);
verify(mockSharedPreferences, never()).getString(anyString(), anyString());
}
@Test
public void setAndGetActualShopNullTest() throws Exception {
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Set actual shop and check method calls
SettingsMy.setActualShop(null);
verify(mockSharedPreferences, times(1)).edit();
verify(mockEditor, times(1)).putString(SettingsMy.PREF_ACTUAL_SHOP, Utils.getGsonParser().toJson(null));
verify(mockEditor, times(1)).apply();
// Check returned value and loading that value from filed not a shared preferences.
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTUAL_SHOP, "")).thenReturn("null");
assertEquals(SettingsMy.getActualShop(), null);
verify(mockSharedPreferences, times(1)).getString(anyString(), anyString());
verifyNoMoreInteractions(mockSharedPreferences);
}
@Test
public void getActualNonNullShopErrorTest() throws Exception {
// Mock static methods
PowerMockito.mockStatic(MsgUtils.class);
// Two line mocking.
doNothing().when(MsgUtils.class);
MsgUtils.showToast(eq(mockActivity), anyInt(), anyString(), eq(MsgUtils.ToastLength.LONG));
// Prepare responses
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTUAL_SHOP, "")).thenReturn("");
when(mockActivity.getApplicationContext()).thenReturn(mockContext);
// Check return value
assertEquals(SettingsMy.getActualNonNullShop(mockActivity), new Shop());
// Verify calls
verify(mockSharedPreferences, times(1)).getString(anyString(), anyString());
verify(mockActivity, times(1)).startActivity((Intent) anyObject());
// Verify static void methods. Two line verifying.
verifyStatic(times(1));
MsgUtils.showToast(mockActivity, MsgUtils.TOAST_TYPE_INTERNAL_ERROR, null, MsgUtils.ToastLength.LONG);
}
@Test
public void getActualNonNullShopOkTest() throws Exception {
// Sample object
Shop testShop = new Shop();
testShop.setName("testShop");
// Prepare responses
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTUAL_SHOP, "")).thenReturn(Utils.getGsonParser().toJson(testShop));
// Check return value
assertEquals(SettingsMy.getActualNonNullShop(mockActivity), testShop);
// Verify calls
verify(mockActivity, never()).startActivity((Intent) anyObject());
}
@Test
public void getActiveUserTest() throws Exception {
// Mock persistence response from shared preferences
User testUser = new User();
testUser.setName("testUser");
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTIVE_USER, "")).thenReturn(Utils.getGsonParser().toJson(testUser));
// Check if value is returned
assertEquals(SettingsMy.getActiveUser(), testUser);
}
@Test
public void getActiveUserNullTest() throws Exception {
// Mock persistence response from shared preferences
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTIVE_USER, "")).thenReturn("");
// Check if value is returned
assertEquals(SettingsMy.getActiveUser(), null);
}
@Test
public void setAndGetActiveUserTest() throws Exception {
// Sample object
User testUser = new User();
testUser.setName("testUser");
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Invoke test method and check method calls
SettingsMy.setActiveUser(testUser);
verify(mockEditor, times(1)).putString(SettingsMy.PREF_ACTIVE_USER, Utils.getGsonParser().toJson(testUser));
verify(mockEditor, times(1)).apply();
// Check returned value and loading that value from filed not a shared preferences.
assertEquals(SettingsMy.getActiveUser(), testUser);
verify(mockSharedPreferences, never()).getString(anyString(), anyString());
}
@Test
public void setAndGetActiveUserNullTest() throws Exception {
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Invoke test method and check method call
SettingsMy.setActiveUser(null);
verify(mockSharedPreferences, times(1)).edit();
verify(mockEditor, times(1)).putString(SettingsMy.PREF_ACTIVE_USER, Utils.getGsonParser().toJson(null));
verify(mockEditor, times(1)).apply();
// Check returned value
when(mockSharedPreferences.getString(SettingsMy.PREF_ACTIVE_USER, "")).thenReturn("null");
assertEquals(SettingsMy.getActiveUser(), null);
verify(mockSharedPreferences, times(1)).getString(anyString(), anyString());
verifyNoMoreInteractions(mockSharedPreferences);
}
@Test
public void getUserEmailHintTest() throws Exception {
// Mock persistence response from shared preferences
String testEmailHint = "test.email@gmail.com";
when(mockSharedPreferences.getString(SettingsMy.PREF_USER_EMAIL, "")).thenReturn(testEmailHint);
// Check if value is returned
assertEquals(SettingsMy.getUserEmailHint(), testEmailHint);
}
@Test
public void setUserEmailHintTest() throws Exception {
// Sample object
String testEmailHint = "test.email@gmail.com";
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Invoke test method and check method call
SettingsMy.setUserEmailHint(testEmailHint);
verify(mockEditor, times(1)).putString(SettingsMy.PREF_USER_EMAIL, testEmailHint);
verify(mockEditor, times(1)).commit();
}
@Test
public void getTokenSentToServerTest() throws Exception {
// Mock persistence response from shared preferences
when(mockSharedPreferences.getBoolean(SettingsMy.SENT_TOKEN_TO_SERVER, false)).thenReturn(true);
// Check if value is returned
assertEquals(SettingsMy.getTokenSentToServer(), true);
}
@Test
public void setTokenSentToServerTest() throws Exception {
// Mock preferences editor
when(mockSharedPreferences.edit()).thenReturn(mockEditor);
// Invoke test method and check method call
SettingsMy.setTokenSentToServer(true);
verify(mockEditor, times(1)).putBoolean(SettingsMy.SENT_TOKEN_TO_SERVER, true);
SettingsMy.setTokenSentToServer(false);
verify(mockEditor, times(1)).putBoolean(SettingsMy.SENT_TOKEN_TO_SERVER, false);
verify(mockEditor, times(2)).commit();
}
}