Home | History | Annotate | Download | only in preference
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.contacts.preference;
     18 
     19 import android.content.Context;
     20 import android.content.SharedPreferences;
     21 import android.content.res.Resources;
     22 import android.support.test.InstrumentationRegistry;
     23 import android.test.InstrumentationTestCase;
     24 import android.test.suitebuilder.annotation.SmallTest;
     25 
     26 import com.android.contacts.model.account.AccountWithDataSet;
     27 
     28 import junit.framework.Assert;
     29 
     30 import org.mockito.Mock;
     31 import org.mockito.Mockito;
     32 import org.mockito.MockitoAnnotations;
     33 
     34 import java.util.Arrays;
     35 
     36 @SmallTest
     37 public class ContactsPreferencesTest extends InstrumentationTestCase {
     38 
     39     private static final String ACCOUNT_KEY = "ACCOUNT_KEY";
     40 
     41     @Mock private Context mContext;
     42     @Mock private Resources mResources;
     43     @Mock private SharedPreferences mSharedPreferences;
     44 
     45     private ContactsPreferences mContactsPreferences;
     46 
     47     @Override
     48     public void setUp() throws Exception {
     49         super.setUp();
     50         System.setProperty("dexmaker.dexcache",
     51                 getInstrumentation().getTargetContext().getCacheDir().getPath());
     52         MockitoAnnotations.initMocks(this);
     53 
     54         Mockito.when(mContext.getResources()).thenReturn(mResources);
     55         Mockito.when(mResources.getString(Mockito.anyInt()))
     56                 .thenReturn(ACCOUNT_KEY); // contact_editor_default_account_key
     57 
     58         Mockito.when(mContext.getSharedPreferences(Mockito.anyString(), Mockito.anyInt()))
     59                 .thenReturn(mSharedPreferences);
     60         Mockito.when(mSharedPreferences.contains(ContactsPreferences.SORT_ORDER_KEY))
     61                 .thenReturn(true);
     62         Mockito.when(mSharedPreferences.contains(ContactsPreferences.DISPLAY_ORDER_KEY))
     63                 .thenReturn(true);
     64         Mockito.when(mSharedPreferences.contains(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY))
     65                 .thenReturn(true);
     66 
     67         InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
     68             @Override
     69             public void run() {
     70                 mContactsPreferences = new ContactsPreferences(mContext);
     71             }
     72         });
     73     }
     74 
     75     public void testGetSortOrderDefault() {
     76         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
     77                 false, // R.bool.config_sort_order_user_changeable
     78                 true // R.bool.config_default_sort_order_primary
     79         );
     80         Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY,
     81                 mContactsPreferences.getSortOrder());
     82     }
     83 
     84     public void testGetSortOrder() {
     85         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
     86                 true // R.bool.config_sort_order_user_changeable
     87         );
     88         Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.SORT_ORDER_KEY),
     89                 Mockito.anyInt())).thenReturn(ContactsPreferences.SORT_ORDER_PRIMARY);
     90         Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY,
     91                 mContactsPreferences.getSortOrder());
     92     }
     93 
     94     public void testGetDisplayOrderDefault() {
     95         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
     96                 false, // R.bool.config_display_order_user_changeable
     97                 true // R.bool.config_default_display_order_primary
     98         );
     99         Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
    100                 mContactsPreferences.getDisplayOrder());
    101     }
    102 
    103     public void testGetDisplayOrder() {
    104         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    105                 true // R.bool.config_display_order_user_changeable
    106         );
    107         Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.DISPLAY_ORDER_KEY),
    108                 Mockito.anyInt())).thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY);
    109         Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
    110                 mContactsPreferences.getDisplayOrder());
    111     }
    112 
    113     public void testGetPhoneticNameDisplayDefault() {
    114         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    115                 false, // R.bool.config_phonetic_name_display_user_changeable
    116                 true // R.bool.config_default_hide_phonetic_name_if_empty
    117         );
    118         Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY,
    119                 mContactsPreferences.getPhoneticNameDisplayPreference());
    120     }
    121 
    122     public void testGetPhoneticNameDisplay() {
    123         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    124                 true // R.bool.config_phonetic_name_display_user_changeable
    125         );
    126         Mockito.when(mSharedPreferences.getInt(
    127                 Mockito.eq(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY),
    128                 Mockito.anyInt())).thenReturn(PhoneticNameDisplayPreference.HIDE_IF_EMPTY);
    129         Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY,
    130                 mContactsPreferences.getPhoneticNameDisplayPreference());
    131     }
    132 
    133     public void testRefreshPhoneticNameDisplay() throws InterruptedException {
    134         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    135                 true // R.bool.config_phonetic_name_display_user_changeable
    136         );
    137         Mockito.when(mSharedPreferences.getInt(
    138                 Mockito.eq(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY),
    139                 Mockito.anyInt())).thenReturn(PhoneticNameDisplayPreference.HIDE_IF_EMPTY,
    140                 PhoneticNameDisplayPreference.SHOW_ALWAYS);
    141 
    142         Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY,
    143                 mContactsPreferences.getPhoneticNameDisplayPreference());
    144         mContactsPreferences.refreshValue(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY);
    145 
    146         Assert.assertEquals(PhoneticNameDisplayPreference.SHOW_ALWAYS,
    147                 mContactsPreferences.getPhoneticNameDisplayPreference());
    148     }
    149 
    150     public void testRefreshSortOrder() throws InterruptedException {
    151         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    152                 true // R.bool.config_sort_order_user_changeable
    153         );
    154         Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.SORT_ORDER_KEY),
    155                 Mockito.anyInt())).thenReturn(ContactsPreferences.SORT_ORDER_PRIMARY,
    156                 ContactsPreferences.SORT_ORDER_ALTERNATIVE);
    157 
    158         Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY,
    159                 mContactsPreferences.getSortOrder());
    160         mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
    161 
    162         Assert.assertEquals(ContactsPreferences.SORT_ORDER_ALTERNATIVE,
    163                 mContactsPreferences.getSortOrder());
    164     }
    165 
    166     public void testRefreshDisplayOrder() throws InterruptedException {
    167         Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn(
    168                 true // R.bool.config_display_order_user_changeable
    169         );
    170         Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.DISPLAY_ORDER_KEY),
    171                 Mockito.anyInt())).thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
    172                 ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
    173 
    174         Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
    175                 mContactsPreferences.getDisplayOrder());
    176         mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
    177 
    178         Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
    179                 mContactsPreferences.getDisplayOrder());
    180     }
    181 
    182     public void testRefreshDefaultAccount() throws InterruptedException {
    183         mContactsPreferences = new ContactsPreferences(mContext,
    184                 /* isDefaultAccountUserChangeable */ true);
    185 
    186         Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
    187                 .thenReturn(new AccountWithDataSet("name1", "type1", "dataset1").stringify(),
    188                         new AccountWithDataSet("name2", "type2", "dataset2").stringify());
    189 
    190         Assert.assertEquals(new AccountWithDataSet("name1", "type1", "dataset1"),
    191                 mContactsPreferences.getDefaultAccount());
    192         mContactsPreferences.refreshValue(ACCOUNT_KEY);
    193 
    194         Assert.assertEquals(new AccountWithDataSet("name2", "type2", "dataset2"),
    195                 mContactsPreferences.getDefaultAccount());
    196     }
    197 
    198     public void testShouldShowAccountChangedNotificationIfAccountNotSaved() {
    199         mContactsPreferences = new ContactsPreferences(mContext,
    200                 /* isDefaultAccountUserChangeable */ true);
    201         Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
    202                 .thenReturn(null);
    203 
    204         assertTrue("Should prompt to change default if no default is saved",
    205                 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
    206                         new AccountWithDataSet("name1", "type1", "dataset1"),
    207                         new AccountWithDataSet("name2", "type2", "dataset2"))));
    208     }
    209 
    210     public void testShouldShowAccountChangedNotification() {
    211         mContactsPreferences = new ContactsPreferences(mContext,
    212                 /* isDefaultAccountUserChangeable */ true);
    213         Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
    214                 .thenReturn(new AccountWithDataSet("name", "type", "dataset").stringify());
    215 
    216         assertFalse("Should not prompt to change default if current default exists",
    217                 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
    218                         new AccountWithDataSet("name", "type", "dataset"),
    219                         new AccountWithDataSet("name1", "type1", "dataset1"))));
    220 
    221         assertTrue("Should prompt to change default if current default does not exist",
    222                 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
    223                         new AccountWithDataSet("name1", "type1", "dataset1"),
    224                         new AccountWithDataSet("name2", "type2", "dataset2"))));
    225     }
    226 
    227     public void testShouldShowAccountChangedNotificationWhenThereIsOneAccount() {
    228         mContactsPreferences = new ContactsPreferences(mContext,
    229                 /* isDefaultAccountUserChangeable */ true);
    230         Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString()))
    231                 .thenReturn(null);
    232 
    233         // Normally we would prompt because there is no default set but if there is just one
    234         // account we should just use it.
    235         assertFalse("Should not prompt to change default if there is only one account available",
    236                 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList(
    237                         new AccountWithDataSet("name", "type", "dataset"))));
    238     }
    239 }
    240