1 /*
2  * Copyright (C) 2019 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 package com.android.settings.dashboard;
17 
18 import static com.android.settingslib.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
19 
20 import static org.mockito.ArgumentMatchers.any;
21 import static org.mockito.Mockito.never;
22 import static org.mockito.Mockito.spy;
23 import static org.mockito.Mockito.verify;
24 
25 import android.content.Context;
26 
27 import androidx.preference.Preference;
28 import androidx.preference.PreferenceManager;
29 import androidx.preference.PreferenceScreen;
30 
31 import com.android.settingslib.core.AbstractPreferenceController;
32 
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.robolectric.RobolectricTestRunner;
37 import org.robolectric.RuntimeEnvironment;
38 
39 @RunWith(RobolectricTestRunner.class)
40 public class ControllerTaskTest {
41     private static final String KEY = "my_key";
42 
43     private Context mContext;
44     private PreferenceScreen mScreen;
45     private TestPreferenceController mTestController;
46     private ControllerTask mControllerTask;
47 
48     @Before
setUp()49     public void setUp() {
50         mContext = RuntimeEnvironment.application;
51         final PreferenceManager preferenceManager = new PreferenceManager(mContext);
52         mScreen = preferenceManager.createPreferenceScreen(mContext);
53         mTestController = spy(new TestPreferenceController(mContext));
54         mControllerTask = new ControllerTask(mTestController, mScreen, null /* metricsFeature */,
55                 METRICS_CATEGORY_UNKNOWN);
56     }
57 
58     @Test
doRun_controlNotAvailable_noRunUpdateState()59     public void doRun_controlNotAvailable_noRunUpdateState() {
60         mTestController.setAvailable(false);
61 
62         mControllerTask.run();
63 
64         verify(mTestController, never()).updateState(any(Preference.class));
65     }
66 
67     @Test
doRun_emptyKey_noRunUpdateState()68     public void doRun_emptyKey_noRunUpdateState() {
69         mTestController.setKey("");
70 
71         mControllerTask.run();
72 
73         verify(mTestController, never()).updateState(any(Preference.class));
74     }
75 
76     @Test
doRun_preferenceNotExist_noRunUpdateState()77     public void doRun_preferenceNotExist_noRunUpdateState() {
78         mTestController.setKey(KEY);
79 
80         mControllerTask.run();
81 
82         verify(mTestController, never()).updateState(any(Preference.class));
83     }
84 
85     @Test
doRun_executeUpdateState()86     public void doRun_executeUpdateState() {
87         mTestController.setKey(KEY);
88         final Preference preference = new Preference(mContext);
89         preference.setKey(KEY);
90         mScreen.addPreference(preference);
91 
92         mControllerTask.run();
93 
94         verify(mTestController).updateState(any(Preference.class));
95     }
96 
97     static class TestPreferenceController extends AbstractPreferenceController {
98         private boolean mAvailable;
99         private String mKey;
100 
TestPreferenceController(Context context)101         TestPreferenceController(Context context) {
102             super(context);
103             mAvailable = true;
104         }
105 
106         @Override
isAvailable()107         public boolean isAvailable() {
108             return mAvailable;
109         }
110 
111         @Override
getPreferenceKey()112         public String getPreferenceKey() {
113             return mKey;
114         }
115 
setAvailable(boolean available)116         void setAvailable(boolean available) {
117             mAvailable = available;
118         }
119 
setKey(String key)120         void setKey(String key) {
121             mKey = key;
122         }
123     }
124 }
125