DatabaseResultLoaderTest.java revision a96b11f65d9f29dd4037da85e12f5cf9dcfa0176
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
18package com.android.settings.search;
19
20import android.content.ContentValues;
21import android.content.Context;
22import android.database.sqlite.SQLiteDatabase;
23
24import com.android.settings.SettingsRobolectricTestRunner;
25import com.android.settings.TestConfig;
26import com.android.settings.dashboard.SiteMapManager;
27import com.android.settings.search2.DatabaseIndexingUtils;
28import com.android.settings.search2.DatabaseResultLoader;
29import com.android.settings.testutils.DatabaseTestUtils;
30import com.android.settings.testutils.FakeFeatureFactory;
31
32import org.junit.After;
33import org.junit.Before;
34import org.junit.Test;
35import org.junit.runner.RunWith;
36import org.mockito.Answers;
37import org.mockito.Mock;
38import org.mockito.MockitoAnnotations;
39import org.robolectric.RuntimeEnvironment;
40import org.robolectric.annotation.Config;
41
42import static com.google.common.truth.Truth.assertThat;
43import static org.mockito.Matchers.anyString;
44import static org.mockito.Matchers.eq;
45import static org.mockito.Mockito.times;
46import static org.mockito.Mockito.verify;
47import static org.mockito.Mockito.when;
48
49@RunWith(SettingsRobolectricTestRunner.class)
50@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
51public class DatabaseResultLoaderTest {
52
53    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
54    private Context mMockContext;
55    @Mock
56    private SiteMapManager mSiteMapManager;
57    private Context mContext;
58    private DatabaseResultLoader loader;
59
60    SQLiteDatabase mDb;
61
62    @Before
63    public void setUp() {
64        MockitoAnnotations.initMocks(this);
65        mContext = RuntimeEnvironment.application;
66        FakeFeatureFactory.setupForTest(mMockContext);
67        FakeFeatureFactory factory =
68                (FakeFeatureFactory) FakeFeatureFactory.getFactory(mMockContext);
69        when(factory.searchFeatureProvider.getSiteMapManager())
70                .thenReturn(mSiteMapManager);
71        mDb = IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
72        setUpDb();
73    }
74
75    @After
76    public void cleanUp() {
77        DatabaseTestUtils.clearDb();
78    }
79
80    @Test
81    public void testMatchTitle() {
82        loader = new DatabaseResultLoader(mContext, "title");
83        assertThat(loader.loadInBackground().size()).isEqualTo(3);
84        verify(mSiteMapManager, times(3)).buildBreadCrumb(eq(mContext), anyString(), anyString());
85    }
86
87    @Test
88    public void testMatchSummary() {
89        loader = new DatabaseResultLoader(mContext, "summary");
90        assertThat(loader.loadInBackground().size()).isEqualTo(3);
91    }
92
93    @Test
94    public void testMatchKeywords() {
95        loader = new DatabaseResultLoader(mContext, "keywords");
96        assertThat(loader.loadInBackground().size()).isEqualTo(3);
97    }
98
99    @Test
100    public void testMatchEntries() {
101        loader = new DatabaseResultLoader(mContext, "entries");
102        assertThat(loader.loadInBackground().size()).isEqualTo(3);
103    }
104
105    @Test
106    public void testSpecialCaseWord_MatchesNonPrefix() {
107        insertSpecialCase("Data usage");
108        loader = new DatabaseResultLoader(mContext, "usage");
109        assertThat(loader.loadInBackground().size()).isEqualTo(1);
110    }
111
112    @Test
113    public void testSpecialCaseSpace_Matches() {
114        insertSpecialCase("space");
115        loader = new DatabaseResultLoader(mContext, " space ");
116        assertThat(loader.loadInBackground().size()).isEqualTo(1);
117    }
118
119    @Test
120    public void testSpecialCaseDash_MatchesWordNoDash() {
121        insertSpecialCase("wi-fi calling");
122        loader = new DatabaseResultLoader(mContext, "wifi");
123        assertThat(loader.loadInBackground().size()).isEqualTo(1);
124    }
125
126    @Test
127    public void testSpecialCaseDash_MatchesWordWithDash() {
128        insertSpecialCase("priorités seulment");
129        loader = new DatabaseResultLoader(mContext, "priorités");
130        assertThat(loader.loadInBackground().size()).isEqualTo(1);
131    }
132
133    @Test
134    public void testSpecialCaseDash_MatchesWordWithoutDash() {
135        insertSpecialCase("priorités seulment");
136        loader = new DatabaseResultLoader(mContext, "priorites");
137        assertThat(loader.loadInBackground().size()).isEqualTo(1);
138    }
139
140    @Test
141    public void testSpecialCaseDash_MatchesEntireQueryWithoutDash() {
142        insertSpecialCase("wi-fi calling");
143        loader = new DatabaseResultLoader(mContext, "wifi calling");
144        assertThat(loader.loadInBackground().size()).isEqualTo(1);
145    }
146
147    private void insertSpecialCase(String specialCase) {
148        String normalized = DatabaseIndexingUtils.normalizeHyphen(specialCase);
149        normalized = DatabaseIndexingUtils.normalizeString(normalized);
150
151        ContentValues values = new ContentValues();
152        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 0);
153        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
154        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
155        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, specialCase);
156        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, normalized);
157        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "");
158        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "");
159        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "");
160        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "");
161        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "");
162        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "");
163        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
164                "com.android.settings.gestures.GestureSettings");
165        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
166        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
167        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
168        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
169        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
170        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, "");
171        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
172        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
173        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
174        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
175
176        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
177    }
178
179    private void setUpDb() {
180        ContentValues values = new ContentValues();
181        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 0);
182        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
183        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
184        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "alpha_title");
185        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "alpha title");
186        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "alpha_summary");
187        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "alpha_summary");
188        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "alpha_summary");
189        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "alpha_summary");
190        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "alpha_entries");
191        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "alpha_keywords");
192        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
193                "com.android.settings.gestures.GestureSettings");
194        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
195        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
196        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
197        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
198        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
199        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, "");
200        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
201        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
202        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
203        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
204
205        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
206
207        values = new ContentValues();
208        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 1);
209        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
210        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
211        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "bravo_title");
212        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "bravo title");
213        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "bravo_summary");
214        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "bravo_summary");
215        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "bravo_summary");
216        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "bravo_summary");
217        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "bravo_entries");
218        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "bravo_keywords");
219        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
220                "com.android.settings.gestures.GestureSettings");
221        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
222        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
223        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
224        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
225        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
226        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, "");
227        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
228        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
229        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
230        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
231        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
232
233        values = new ContentValues();
234        values.put(IndexDatabaseHelper.IndexColumns.DOCID, 2);
235        values.put(IndexDatabaseHelper.IndexColumns.LOCALE, "en-us");
236        values.put(IndexDatabaseHelper.IndexColumns.DATA_RANK, 1);
237        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE, "charlie_title");
238        values.put(IndexDatabaseHelper.IndexColumns.DATA_TITLE_NORMALIZED, "charlie title");
239        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON, "charlie_summary");
240        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_ON_NORMALIZED, "charlie_summary");
241        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF, "charlie_summary");
242        values.put(IndexDatabaseHelper.IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, "charlie_summary");
243        values.put(IndexDatabaseHelper.IndexColumns.DATA_ENTRIES, "charlie_entries");
244        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEYWORDS, "charlie_keywords");
245        values.put(IndexDatabaseHelper.IndexColumns.CLASS_NAME,
246                "com.android.settings.gestures.GestureSettings");
247        values.put(IndexDatabaseHelper.IndexColumns.SCREEN_TITLE, "Moves");
248        values.put(IndexDatabaseHelper.IndexColumns.INTENT_ACTION, "");
249        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_PACKAGE, "");
250        values.put(IndexDatabaseHelper.IndexColumns.INTENT_TARGET_CLASS, "");
251        values.put(IndexDatabaseHelper.IndexColumns.ICON, "");
252        values.put(IndexDatabaseHelper.IndexColumns.ENABLED, "");
253        values.put(IndexDatabaseHelper.IndexColumns.DATA_KEY_REF, "gesture_double_tap_power");
254        values.put(IndexDatabaseHelper.IndexColumns.USER_ID, 0);
255        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD_TYPE, 0);
256        values.put(IndexDatabaseHelper.IndexColumns.PAYLOAD, (String) null);
257
258        mDb.replaceOrThrow(IndexDatabaseHelper.Tables.TABLE_PREFS_INDEX, null, values);
259    }
260}
261