Home | History | Annotate | Download | only in settings
      1 /*
      2  * Copyright (C) 2017 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.settings;
     18 
     19 import static com.google.common.truth.Truth.assertThat;
     20 import static org.mockito.Mockito.doReturn;
     21 import static org.mockito.Mockito.mock;
     22 import static org.mockito.Mockito.spy;
     23 import static org.mockito.Mockito.verify;
     24 import static org.mockito.Mockito.when;
     25 
     26 import android.app.Activity;
     27 import android.content.Context;
     28 import android.os.Bundle;
     29 import android.support.v7.preference.Preference;
     30 import android.support.v7.preference.PreferenceCategory;
     31 import android.support.v7.preference.PreferenceManager;
     32 import android.support.v7.preference.PreferenceScreen;
     33 import android.view.View;
     34 
     35 import com.android.settings.testutils.FakeFeatureFactory;
     36 import com.android.settings.testutils.SettingsRobolectricTestRunner;
     37 import com.android.settings.testutils.shadow.SettingsShadowResources;
     38 
     39 import org.junit.Before;
     40 import org.junit.Test;
     41 import org.junit.runner.RunWith;
     42 import org.mockito.Mock;
     43 import org.mockito.MockitoAnnotations;
     44 import org.robolectric.RuntimeEnvironment;
     45 import org.robolectric.annotation.Config;
     46 import org.robolectric.util.ReflectionHelpers;
     47 
     48 @RunWith(SettingsRobolectricTestRunner.class)
     49 public class SettingsPreferenceFragmentTest {
     50 
     51     private static final int ITEM_COUNT = 5;
     52 
     53     @Mock
     54     private Activity mActivity;
     55     @Mock
     56     private View mListContainer;
     57     @Mock
     58     private PreferenceScreen mPreferenceScreen;
     59     private Context mContext;
     60     private TestFragment mFragment;
     61     private View mEmptyView;
     62 
     63     @Before
     64     public void setUp() {
     65         MockitoAnnotations.initMocks(this);
     66         FakeFeatureFactory.setupForTest();
     67         mContext = RuntimeEnvironment.application;
     68         mFragment = spy(new TestFragment());
     69         doReturn(mActivity).when(mFragment).getActivity();
     70 
     71         mEmptyView = new View(mContext);
     72         ReflectionHelpers.setField(mFragment, "mEmptyView", mEmptyView);
     73 
     74         doReturn(ITEM_COUNT).when(mPreferenceScreen).getPreferenceCount();
     75     }
     76 
     77     @Test
     78     public void removePreference_nested_shouldRemove() {
     79         final String key = "test_key";
     80         final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null));
     81         when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
     82 
     83         final PreferenceCategory nestedCategory = new ProgressCategory(mContext);
     84         final Preference preference = new Preference(mContext);
     85         preference.setKey(key);
     86         preference.setPersistent(false);
     87 
     88         mScreen.addPreference(nestedCategory);
     89         nestedCategory.addPreference(preference);
     90 
     91         assertThat(mFragment.removePreference(mScreen, key)).isTrue();
     92         assertThat(nestedCategory.getPreferenceCount()).isEqualTo(0);
     93     }
     94 
     95     @Test
     96     public void removePreference_flat_shouldRemove() {
     97         final String key = "test_key";
     98         final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null));
     99         when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
    100 
    101         final Preference preference = mock(Preference.class);
    102         when(preference.getKey()).thenReturn(key);
    103 
    104         mScreen.addPreference(preference);
    105 
    106         assertThat(mFragment.removePreference(mScreen, key)).isTrue();
    107         assertThat(mScreen.getPreferenceCount()).isEqualTo(0);
    108     }
    109 
    110     @Test
    111     public void removePreference_doNotExist_shouldNotRemove() {
    112         final String key = "test_key";
    113         final PreferenceScreen mScreen = spy(new PreferenceScreen(mContext, null));
    114         when(mScreen.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
    115 
    116         final Preference preference = mock(Preference.class);
    117         when(preference.getKey()).thenReturn(key);
    118 
    119         mScreen.addPreference(preference);
    120 
    121         assertThat(mFragment.removePreference(mScreen, "not" + key)).isFalse();
    122         assertThat(mScreen.getPreferenceCount()).isEqualTo(1);
    123     }
    124 
    125     @Test
    126     public void testUpdateEmptyView_containerInvisible_emptyViewVisible() {
    127         doReturn(View.INVISIBLE).when(mListContainer).getVisibility();
    128         doReturn(mListContainer).when(mActivity).findViewById(android.R.id.list_container);
    129         doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
    130 
    131         mFragment.updateEmptyView();
    132 
    133         assertThat(mEmptyView.getVisibility()).isEqualTo(View.VISIBLE);
    134     }
    135 
    136     @Test
    137     public void testUpdateEmptyView_containerNull_emptyViewGone() {
    138         doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
    139 
    140         mFragment.updateEmptyView();
    141 
    142         assertThat(mEmptyView.getVisibility()).isEqualTo(View.GONE);
    143     }
    144 
    145     @Test
    146     @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class)
    147     public void onCreate_hasExtraFragmentKey_shouldExpandPreferences() {
    148         doReturn(mContext.getTheme()).when(mActivity).getTheme();
    149         doReturn(mContext.getResources()).when(mFragment).getResources();
    150         doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
    151         final Bundle bundle = new Bundle();
    152         bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, "test_key");
    153         when(mFragment.getArguments()).thenReturn(bundle);
    154 
    155         mFragment.onCreate(null /* icicle */);
    156 
    157         verify(mPreferenceScreen).setInitialExpandedChildrenCount(Integer.MAX_VALUE);
    158     }
    159 
    160     @Test
    161     @Config(shadows = SettingsShadowResources.SettingsShadowTheme.class)
    162     public void onCreate_noPreferenceScreen_shouldNotCrash() {
    163         doReturn(mContext.getTheme()).when(mActivity).getTheme();
    164         doReturn(mContext.getResources()).when(mFragment).getResources();
    165         doReturn(null).when(mFragment).getPreferenceScreen();
    166         final Bundle bundle = new Bundle();
    167         bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, "test_key");
    168         when(mFragment.getArguments()).thenReturn(bundle);
    169 
    170         mFragment.onCreate(null /* icicle */);
    171         // no crash
    172     }
    173 
    174     public static class TestFragment extends SettingsPreferenceFragment {
    175 
    176         @Override
    177         public int getMetricsCategory() {
    178             return 0;
    179         }
    180     }
    181 }
    182