blob: 1997a4d0e66b43490714e4663d3a8aa20d2d7497 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.messaging.ui.contact;
import android.content.Context;
import android.database.Cursor;
import androidx.viewpager.widget.ViewPager;
import android.test.suitebuilder.annotation.LargeTest;
import android.view.View;
import android.widget.ListView;
import com.android.messaging.FakeFactory;
import com.android.messaging.R;
import com.android.messaging.datamodel.FakeDataModel;
import com.android.messaging.datamodel.action.ActionTestHelpers;
import com.android.messaging.datamodel.action.ActionTestHelpers.StubActionService;
import com.android.messaging.datamodel.action.ActionTestHelpers.StubActionService.StubActionServiceCallLog;
import com.android.messaging.datamodel.action.GetOrCreateConversationAction;
import com.android.messaging.datamodel.data.ContactPickerData;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.datamodel.data.TestDataFactory;
import com.android.messaging.ui.CustomHeaderViewPagerAdapter;
import com.android.messaging.ui.FragmentTestCase;
import com.android.messaging.ui.UIIntents;
import com.android.messaging.ui.contact.ContactPickerFragment;
import com.android.messaging.ui.contact.ContactPickerFragment.ContactPickerFragmentHost;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.List;
/**
* Unit tests for {@link ContactPickerFragment}.
*/
@LargeTest
public class ContactPickerFragmentTest
extends FragmentTestCase<ContactPickerFragment> {
@Mock protected ContactPickerData mMockContactPickerData;
@Mock protected UIIntents mMockUIIntents;
@Mock protected ContactPickerFragmentHost mockHost;
protected FakeDataModel mFakeDataModel;
private ActionTestHelpers.StubActionService mService;
public ContactPickerFragmentTest() {
super(ContactPickerFragment.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
final Context context = getInstrumentation().getTargetContext();
mService = new StubActionService();
mFakeDataModel = new FakeDataModel(context)
.withContactPickerData(mMockContactPickerData)
.withActionService(mService);
FakeFactory.register(context)
.withDataModel(mFakeDataModel)
.withUIIntents(mMockUIIntents);
}
/**
* Helper method to initialize the ContactPickerFragment and its data.
*/
private ContactPickerFragmentTest initFragment(final int initialMode) {
Mockito.when(mMockContactPickerData.isBound(Matchers.anyString()))
.thenReturn(true);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
final ContactPickerFragment fragment = getFragment();
fragment.setHost(mockHost);
fragment.setContactPickingMode(initialMode, false);
getActivity().setFragment(fragment);
Mockito.verify(mMockContactPickerData).init(fragment.getLoaderManager(),
fragment.mBinding);
}
});
getInstrumentation().waitForIdleSync();
return this;
}
/**
* Bind the datamodel with all contacts cursor to populate the all contacts list in the
* fragment.
*/
private ContactPickerFragmentTest loadWithAllContactsCursor(final Cursor cursor) {
Mockito.when(mMockContactPickerData.isBound(Matchers.anyString()))
.thenReturn(true);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getFragment().onAllContactsCursorUpdated(cursor);
}
});
getInstrumentation().waitForIdleSync();
return this;
}
/**
* Bind the datamodel with frequent contacts cursor to populate the contacts list in the
* fragment.
*/
private ContactPickerFragmentTest loadWithFrequentContactsCursor(final Cursor cursor) {
Mockito.when(mMockContactPickerData.isBound(Matchers.anyString()))
.thenReturn(true);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
getFragment().onFrequentContactsCursorUpdated(cursor);
}
});
getInstrumentation().waitForIdleSync();
return this;
}
/**
* Test the initial state of the fragment before loading data.
*/
public void testInitialState() {
initFragment(ContactPickerFragment.MODE_PICK_INITIAL_CONTACT);
// Make sure that the frequent contacts view is shown by default.
final ViewPager pager = (ViewPager) getFragment().getView().findViewById(R.id.pager);
final View currentPagedView = pager.getChildAt(pager.getCurrentItem());
final View frequentContactsView = ((CustomHeaderViewPagerAdapter) pager.getAdapter())
.getViewHolder(0).getView(null);
assertEquals(frequentContactsView, currentPagedView);
}
/**
* Verifies that list view gets correctly populated given a cursor.
*/
public void testLoadAllContactsList() {
final Cursor cursor = TestDataFactory.getAllContactListCursor();
initFragment(ContactPickerFragment.MODE_PICK_INITIAL_CONTACT)
.loadWithAllContactsCursor(cursor);
final ListView listView = (ListView) getFragment().getView()
.findViewById(R.id.all_contacts_list);
assertEquals(cursor.getCount(), listView.getCount());
}
/**
* Verifies that list view gets correctly populated given a cursor.
*/
public void testLoadFrequentContactsList() {
final Cursor cursor = TestDataFactory.getFrequentContactListCursor();
initFragment(ContactPickerFragment.MODE_PICK_INITIAL_CONTACT)
.loadWithFrequentContactsCursor(cursor);
final ListView listView = (ListView) getFragment().getView()
.findViewById(R.id.frequent_contacts_list);
assertEquals(cursor.getCount(), listView.getCount());
}
public void testPickInitialContact() {
final Cursor cursor = TestDataFactory.getFrequentContactListCursor();
initFragment(ContactPickerFragment.MODE_PICK_INITIAL_CONTACT)
.loadWithFrequentContactsCursor(cursor);
final ListView listView = (ListView) getFragment().getView()
.findViewById(R.id.frequent_contacts_list);
// Click on the first contact to add it.
final ContactListItemView cliv = (ContactListItemView) listView.getChildAt(0);
clickButton(cliv);
final ContactRecipientAutoCompleteView chipsView = (ContactRecipientAutoCompleteView)
getFragment().getView()
.findViewById(R.id.recipient_text_view);
// Verify the contact is added to the chips view.
final List<ParticipantData> participants =
chipsView.getRecipientParticipantDataForConversationCreation();
assertEquals(1, participants.size());
assertEquals(cliv.mData.getDestination(), participants.get(0).getSendDestination());
assertTrue(mService.getCalls().get(0).action instanceof GetOrCreateConversationAction);
}
public void testLeaveChipsMode() {
final Cursor cursor = TestDataFactory.getFrequentContactListCursor();
initFragment(ContactPickerFragment.MODE_CHIPS_ONLY)
.loadWithFrequentContactsCursor(cursor);
// Click on the add more participants button
// TODO: Figure out a way to click on the add more participants button now that
// it's part of the menu.
// final ImageButton AddMoreParticipantsButton = (ImageButton) getFragment().getView()
// .findViewById(R.id.add_more_participants_button);
// clickButton(AddMoreParticipantsButton);
// Mockito.verify(mockHost).onInitiateAddMoreParticipants();
}
public void testPickMoreContacts() {
final Cursor cursor = TestDataFactory.getFrequentContactListCursor();
initFragment(ContactPickerFragment.MODE_PICK_MORE_CONTACTS)
.loadWithFrequentContactsCursor(cursor);
final ListView listView = (ListView) getFragment().getView()
.findViewById(R.id.frequent_contacts_list);
// Click on the first contact to add it.
final ContactListItemView cliv = (ContactListItemView) listView.getChildAt(0);
clickButton(cliv);
// Verify that we don't attempt to create a conversation right away.
assertEquals(0, mService.getCalls().size());
}
}