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 
18 package com.android.settings.nfc;
19 
20 import static com.google.common.truth.Truth.assertThat;
21 
22 import static org.mockito.Mockito.doReturn;
23 import static org.mockito.Mockito.spy;
24 import static org.mockito.Mockito.when;
25 
26 import android.content.Context;
27 import android.content.pm.PackageManager;
28 import android.content.pm.UserInfo;
29 import android.os.UserHandle;
30 import android.os.UserManager;
31 
32 import androidx.preference.Preference;
33 import androidx.preference.PreferenceManager;
34 import androidx.preference.PreferenceScreen;
35 
36 import com.android.settings.testutils.shadow.ShadowNfcAdapter;
37 
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.mockito.Mock;
42 import org.mockito.MockitoAnnotations;
43 import org.robolectric.RobolectricTestRunner;
44 import org.robolectric.RuntimeEnvironment;
45 import org.robolectric.annotation.Config;
46 import org.robolectric.annotation.Implementation;
47 import org.robolectric.annotation.Implements;
48 
49 import java.util.ArrayList;
50 import java.util.List;
51 
52 @RunWith(RobolectricTestRunner.class)
53 @Config(shadows = {PaymentSettingsTest.ShadowPaymentBackend.class, ShadowNfcAdapter.class})
54 public class PaymentSettingsTest {
55 
56     static final String PAYMENT_KEY = "nfc_payment_app";
57     static final String FOREGROUND_KEY = "nfc_foreground";
58 
59     private Context mContext;
60 
61     @Mock
62     private PackageManager mPackageManager;
63 
64     @Mock
65     private UserManager mUserManager;
66 
67     @Mock
68     private UserInfo mUserInfo;
69 
70     @Before
setUp()71     public void setUp() {
72         MockitoAnnotations.initMocks(this);
73         mContext = spy(RuntimeEnvironment.application);
74         when(mContext.getPackageManager()).thenReturn(mPackageManager);
75         doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
76         when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mUserInfo);
77     }
78 
79     @Test
getNonIndexableKey_noNFC_allKeysAdded()80     public void getNonIndexableKey_noNFC_allKeysAdded() {
81         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
82 
83         final List<String> niks =
84                 PaymentSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
85 
86         assertThat(niks).contains(PAYMENT_KEY);
87         assertThat(niks).contains(FOREGROUND_KEY);
88     }
89 
90     @Test
getNonIndexableKey_NFC_foregroundKeyAdded()91     public void getNonIndexableKey_NFC_foregroundKeyAdded() {
92         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
93 
94         final List<String> niks =
95                 PaymentSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
96 
97         assertThat(niks).contains(FOREGROUND_KEY);
98     }
99 
100     @Test
getNonIndexableKey_primaryUser_returnsTrue()101     public void getNonIndexableKey_primaryUser_returnsTrue() {
102         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
103 
104         final List<String> niks =
105                 PaymentSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
106 
107         assertThat(niks).containsExactly(FOREGROUND_KEY);
108     }
109 
110     @Test
getNonIndexableKey_guestUser_returnsFalse()111     public void getNonIndexableKey_guestUser_returnsFalse() {
112         when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
113         when(mUserInfo.isGuest()).thenReturn(true);
114 
115         final List<String> niks =
116                 PaymentSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
117 
118         assertThat(niks).containsAtLeast(FOREGROUND_KEY, PAYMENT_KEY);
119     }
120 
121     @Test
isShowEmptyImage_hasVisiblePreference_returnFalse()122     public void isShowEmptyImage_hasVisiblePreference_returnFalse() {
123         final PaymentSettings paymentSettings = new PaymentSettings();
124         final PreferenceManager preferenceManager = new PreferenceManager(mContext);
125         final PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
126         final Preference preference1 = new Preference(mContext);
127         screen.addPreference(preference1);
128         final Preference preference2 = new Preference(mContext);
129         screen.addPreference(preference2);
130 
131         assertThat(paymentSettings.isShowEmptyImage(screen)).isFalse();
132     }
133 
134     @Test
isShowEmptyImage_hasNoVisiblePreference_returnTrue()135     public void isShowEmptyImage_hasNoVisiblePreference_returnTrue() {
136         final PaymentSettings paymentSettings = new PaymentSettings();
137         final PreferenceManager preferenceManager = new PreferenceManager(mContext);
138         final PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
139         final Preference preference1 = new Preference(mContext);
140         preference1.setVisible(false);
141         screen.addPreference(preference1);
142         final Preference preference2 = new Preference(mContext);
143         screen.addPreference(preference2);
144         preference2.setVisible(false);
145 
146         assertThat(paymentSettings.isShowEmptyImage(screen)).isTrue();
147     }
148 
149     @Implements(PaymentBackend.class)
150     public static class ShadowPaymentBackend {
151         private ArrayList<PaymentBackend.PaymentAppInfo> mAppInfos;
152 
__constructor__(Context context)153         public void __constructor__(Context context) {
154             mAppInfos = new ArrayList<>();
155             mAppInfos.add(new PaymentBackend.PaymentAppInfo());
156         }
157 
158         @Implementation
getPaymentAppInfos()159         protected List<PaymentBackend.PaymentAppInfo> getPaymentAppInfos() {
160             return mAppInfos;
161         }
162     }
163 }
164