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