IntentSearchViewHolderTest.java revision 9615f82abf4164e153fe45cc5e4b0be306c59200
1/*
2 * Copyright (C) 2016 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.ComponentName;
21import android.content.Context;
22import android.content.Intent;
23import android.graphics.drawable.Drawable;
24import android.util.Pair;
25import android.view.LayoutInflater;
26import android.view.View;
27
28import com.android.internal.logging.nano.MetricsProto;
29import com.android.settings.R;
30import com.android.settings.SettingsRobolectricTestRunner;
31import com.android.settings.TestConfig;
32import com.android.settings.search2.IntentPayload;
33import com.android.settings.search2.IntentSearchViewHolder;
34import com.android.settings.search2.SearchFragment;
35import com.android.settings.search2.SearchResult;
36import com.android.settings.search2.SearchResult.Builder;
37import com.android.settings.testutils.FakeFeatureFactory;
38
39import org.junit.Before;
40import org.junit.Test;
41import org.junit.runner.RunWith;
42import org.mockito.Answers;
43import org.mockito.Mock;
44import org.mockito.MockitoAnnotations;
45import org.robolectric.RuntimeEnvironment;
46import org.robolectric.annotation.Config;
47
48import java.util.ArrayList;
49import java.util.List;
50
51import static com.google.common.truth.Truth.assertThat;
52import static org.mockito.Matchers.any;
53import static org.mockito.Matchers.eq;
54import static org.mockito.Mockito.verify;
55
56@RunWith(SettingsRobolectricTestRunner.class)
57@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
58public class IntentSearchViewHolderTest {
59
60    private static final String TITLE = "title";
61    private static final String SUMMARY = "summary";
62
63    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
64    private Context mContext;
65    @Mock
66    private SearchFragment mFragment;
67    private FakeFeatureFactory mFeatureFactory;
68    private IntentSearchViewHolder mHolder;
69    private Drawable mIcon;
70
71    @Before
72    public void setUp() {
73        MockitoAnnotations.initMocks(this);
74        FakeFeatureFactory.setupForTest(mContext);
75        mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
76
77        final Context context = RuntimeEnvironment.application;
78        View view = LayoutInflater.from(context).inflate(R.layout.search_intent_item, null);
79        mHolder = new IntentSearchViewHolder(view);
80
81        mIcon = context.getDrawable(R.drawable.ic_search_history);
82    }
83
84    @Test
85    public void testConstructor_MembersNotNull() {
86        assertThat(mHolder.titleView).isNotNull();
87        assertThat(mHolder.summaryView).isNotNull();
88        assertThat(mHolder.iconView).isNotNull();
89        assertThat(mHolder.breadcrumbView).isNotNull();
90    }
91
92    @Test
93    public void testBindViewElements_AllUpdated() {
94        SearchResult result = getSearchResult();
95        mHolder.onBind(mFragment, result);
96        mHolder.itemView.performClick();
97
98        assertThat(mHolder.titleView.getText()).isEqualTo(TITLE);
99        assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY);
100        assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon);
101        assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.VISIBLE);
102        assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.GONE);
103
104        verify(mFragment).onSearchResultClicked();
105        verify(mFragment).startActivity(any(Intent.class));
106        verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
107                eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT),
108                eq(((IntentPayload)result.payload).intent.getComponent().flattenToString()),
109                any(Pair.class));
110    }
111
112    @Test
113    public void testBindViewElements_emptySummary_hideSummaryView() {
114        final SearchResult result = new Builder()
115                .addTitle(TITLE)
116                .addRank(1)
117                .addPayload(new IntentPayload(null))
118                .addIcon(mIcon)
119                .build();
120
121        mHolder.onBind(mFragment, result);
122        assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE);
123    }
124
125    @Test
126    public void testBindViewElements_withBreadcrumb_shouldFormatBreadcrumb() {
127        final List<String> breadcrumbs = new ArrayList<>();
128        breadcrumbs.add("a");
129        breadcrumbs.add("b");
130        breadcrumbs.add("c");
131        final SearchResult result = new Builder()
132                .addTitle(TITLE)
133                .addRank(1)
134                .addPayload(new IntentPayload(null))
135                .addBreadcrumbs(breadcrumbs)
136                .addIcon(mIcon)
137                .build();
138
139        mHolder.onBind(mFragment, result);
140        assertThat(mHolder.breadcrumbView.getVisibility()).isEqualTo(View.VISIBLE);
141        assertThat(mHolder.breadcrumbView.getText()).isEqualTo("a > b > c");
142    }
143
144    @Test
145    public void testBindElements_placeholderSummary_visibilityIsGone() {
146        String nonBreakingSpace = mContext.getString(R.string.summary_placeholder);
147        SearchResult result = new Builder()
148                .addTitle(TITLE)
149                .addSummary(nonBreakingSpace)
150                .addPayload(new IntentPayload(null))
151                .build();
152
153        mHolder.onBind(mFragment, result);
154
155        assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE);
156    }
157
158    private SearchResult getSearchResult() {
159        Builder builder = new Builder();
160        builder.addTitle(TITLE)
161                .addSummary(SUMMARY)
162                .addRank(1)
163                .addPayload(new IntentPayload(
164                        new Intent().setComponent(new ComponentName("pkg", "class"))))
165                .addBreadcrumbs(new ArrayList<>())
166                .addIcon(mIcon);
167
168        return builder.build();
169    }
170}
171