ContactLoaderTest.java revision 5ade0bb1757b216ace2f50d2357409bf9876a07a
15ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/*
25ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Copyright (C) 2010 The Android Open Source Project
35ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
45ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
55ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * you may not use this file except in compliance with the License.
65ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * You may obtain a copy of the License at
75ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
85ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
95ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee *
105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Unless required by applicable law or agreed to in writing, software
115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * See the License for the specific language governing permissions and
145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * limitations under the License.
155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepackage com.android.contacts.common.model;
185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.content.ContentUris;
205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.net.Uri;
215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.GroupMembership;
225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Contacts;
245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.Data;
255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.DisplayNameSources;
265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.RawContacts;
275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.provider.ContactsContract.StatusUpdates;
285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.LoaderTestCase;
295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport android.test.suitebuilder.annotation.LargeTest;
305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.AccountTypeManager;
325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.ContactsMockContext;
335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockContentProvider;
345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountType;
355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.AccountWithDataSet;
365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.model.account.BaseAccountType;
375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.InjectedServices;
385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leeimport com.android.contacts.common.test.mocks.MockAccountTypeManager;
395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee/**
415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee * Runs ContactLoader tests for the the contact-detail and editor view.
425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee */
435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee@LargeTest
445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Leepublic class ContactLoaderTest extends LoaderTestCase {
455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private ContactsMockContext mMockContext;
465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private MockContentProvider mContactsProvider;
475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void setUp() throws Exception {
505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        super.setUp();
515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mMockContext = new ContactsMockContext(getContext());
525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider = mMockContext.getContactsProvider();
535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        InjectedServices services = new InjectedServices();
555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountType accountType = new BaseAccountType() {
565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            @Override
575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            public boolean areContactsWritable() {
585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                return false;
595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            }
605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        };
615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        accountType.accountType = "mockAccountType";
625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountWithDataSet account =
645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new AccountWithDataSet("mockAccountName", "mockAccountType", null);
655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        AccountTypeManager.setInstanceForTest(
675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                new MockAccountTypeManager(
685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        new AccountType[]{accountType}, new AccountWithDataSet[]{account}));
695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    @Override
725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    protected void tearDown() throws Exception {
735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mMockContext = null;
745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider = null;
755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        super.tearDown();
765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    private Contact assertLoadContact(Uri uri) {
795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final ContactLoader loader = new ContactLoader(mMockContext, uri, true);
805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        return getLoaderResultSynchronously(loader);
815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testNullUri() {
845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(null);
855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testEmptyUri() {
895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(Uri.EMPTY);
905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testInvalidUri() {
945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact result = assertLoadContact(Uri.parse("content://wtf"));
955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertTrue(result.isError());
965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactIdUri() {
995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID
1005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
1015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
1025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
1035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
1055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
1065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(baseUri, Contacts.Entity.CONTENT_DIRECTORY);
1075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
1085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
1095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                contactId);
1105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(baseUri, Contacts.CONTENT_ITEM_TYPE);
1135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
1145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(baseUri);
1165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
1185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
1195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
1205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
1215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithOldStyleUri() {
1285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID but use the format used in Donut
1295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
1305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
1315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
1325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
1345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri legacyUri = ContentUris.withAppendedId(
1355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.parse("content://contacts"), rawContactId);
1365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
1375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
1385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
1395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
1405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                contactId);
1415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
1425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchContactIdAndLookupFromRawContactUri(rawContactUri, contactId, lookupKey);
1455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
1465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(legacyUri);
1485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
1505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
1515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
1525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
1535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithRawContactIdUri() {
1605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use content Uris that only contain the ID but use the format used in Donut
1615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
1625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
1635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
1645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
1665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
1675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
1685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
1695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
1705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                contactId);
1715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
1725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
1745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(rawContactUri, RawContacts.CONTENT_ITEM_TYPE);
1755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchContactIdAndLookupFromRawContactUri(rawContactUri, contactId, lookupKey);
1765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
1775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(rawContactUri);
1795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
1815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
1825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
1835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
1845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
1855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
1865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
1875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
1885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
1895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupUri() {
1915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that do not contain the Contact-ID
1925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
1945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
1955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
1965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
1975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
1985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
1995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupNoIdUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey);
2005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(lookupNoIdUri, contactId);
2015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupNoIdUri, Contacts.Entity.CONTENT_DIRECTORY);
2025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
2045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupNoIdUri, Contacts.CONTENT_ITEM_TYPE);
2055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
2065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupNoIdUri);
2085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
2105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
2115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
2125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
2135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupAndIdUri() {
2205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that also contain the Contact-ID
2215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
2225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
2235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
2245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
2265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
2275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
2285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
2295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                contactId);
2305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupUri, Contacts.Entity.CONTENT_DIRECTORY);
2315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
2335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupUri, Contacts.CONTENT_ITEM_TYPE);
2345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
2355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupUri);
2375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
2395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
2405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
2415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
2425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    public void testLoadContactWithContactLookupWithIncorrectIdUri() {
2495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // Use lookup-style Uris that contain incorrect Contact-ID
2505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        // (we want to ensure that still the correct contact is chosen)
2515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long contactId = 1;
2535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long wrongContactId = 2;
2545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long rawContactId = 11;
2555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long wrongRawContactId = 12;
2565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final long dataId = 21;
2575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String lookupKey = "aa%12%@!";
2595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final String wrongLookupKey = "ab%12%@!";
2605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
2615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri wrongBaseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, wrongContactId);
2625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupUri = ContentUris.withAppendedId(
2635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
2645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                contactId);
2655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri lookupWithWrongIdUri = ContentUris.withAppendedId(
2665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey),
2675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                wrongContactId);
2685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        final Uri entityUri = Uri.withAppendedPath(lookupWithWrongIdUri,
2695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Contacts.Entity.CONTENT_DIRECTORY);
2705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        ContactQueries queries = new ContactQueries();
2725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.expectTypeQuery(lookupWithWrongIdUri, Contacts.CONTENT_ITEM_TYPE);
2735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        queries.fetchAllData(entityUri, contactId, rawContactId, dataId, lookupKey);
2745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        Contact contact = assertLoadContact(lookupWithWrongIdUri);
2765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(contactId, contact.getId());
2785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(rawContactId, contact.getNameRawContactId());
2795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(DisplayNameSources.STRUCTURED_NAME, contact.getDisplayNameSource());
2805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupKey, contact.getLookupKey());
2815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(lookupUri, contact.getLookupUri());
2825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getRawContacts().size());
2835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        assertEquals(1, contact.getStatuses().size());
2845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        mContactsProvider.verify();
2865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
2875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
2885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    class ContactQueries {
2895ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        public void fetchAllData(
2905ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                Uri baseUri, long contactId, long rawContactId, long dataId, String encodedLookup) {
2915ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(baseUri)
2925ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(new String[] {
2935ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.NAME_RAW_CONTACT_ID, Contacts.DISPLAY_NAME_SOURCE,
2945ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.LOOKUP_KEY, Contacts.DISPLAY_NAME,
2955ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.DISPLAY_NAME_ALTERNATIVE, Contacts.PHONETIC_NAME,
2965ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.PHOTO_ID, Contacts.STARRED, Contacts.CONTACT_PRESENCE,
2975ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CONTACT_STATUS, Contacts.CONTACT_STATUS_TIMESTAMP,
2985ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CONTACT_STATUS_RES_PACKAGE, Contacts.CONTACT_STATUS_LABEL,
2995ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3005ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.CONTACT_ID,
3015ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.RAW_CONTACT_ID,
3025ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3035ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE,
3045ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.DATA_SET, RawContacts.ACCOUNT_TYPE_AND_DATA_SET,
3055ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.DIRTY, RawContacts.VERSION, RawContacts.SOURCE_ID,
3065ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.SYNC1, RawContacts.SYNC2, RawContacts.SYNC3, RawContacts.SYNC4,
3075ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        RawContacts.DELETED, RawContacts.NAME_VERIFIED,
3085ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3095ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.Entity.DATA_ID,
3105ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3115ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA1, Data.DATA2, Data.DATA3, Data.DATA4, Data.DATA5,
3125ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA6, Data.DATA7, Data.DATA8, Data.DATA9, Data.DATA10,
3135ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA11, Data.DATA12, Data.DATA13, Data.DATA14, Data.DATA15,
3145ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.SYNC1, Data.SYNC2, Data.SYNC3, Data.SYNC4,
3155ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.DATA_VERSION, Data.IS_PRIMARY,
3165ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.IS_SUPER_PRIMARY, Data.MIMETYPE, Data.RES_PACKAGE,
3175ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3185ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        GroupMembership.GROUP_SOURCE_ID,
3195ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3205ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.PRESENCE, Data.CHAT_CAPABILITY,
3215ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.STATUS, Data.STATUS_RES_PACKAGE, Data.STATUS_ICON,
3225ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Data.STATUS_LABEL, Data.STATUS_TIMESTAMP,
3235ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3245ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.PHOTO_URI,
3255ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3265ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.SEND_TO_VOICEMAIL,
3275ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.CUSTOM_RINGTONE,
3285ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        Contacts.IS_USER_PROFILE,
3295ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    })
3305ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withSortOrder(Contacts.Entity.RAW_CONTACT_ID)
3315ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(
3325ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        rawContactId, 40,
3335ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "aa%12%@!", "John Doe", "Doe, John", "jdo",
3345ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 0, StatusUpdates.AVAILABLE,
3355ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "Having lunch", 0,
3365ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "mockPkg1", 10,
3375ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3385ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        contactId,
3395ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        rawContactId,
3405ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3415ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "mockAccountName", "mockAccountType", null, "mockAccountType",
3425ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 1, 0,
3435ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "sync1", "sync2", "sync3", "sync4",
3445ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 0,
3455ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3465ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        dataId,
3475ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3485ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat1", "dat2", "dat3", "dat4", "dat5",
3495ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat6", "dat7", "dat8", "dat9", "dat10",
3505ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "dat11", "dat12", "dat13", "dat14", "dat15",
3515ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "syn1", "syn2", "syn3", "syn4",
3525ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3535ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, 0,
3545ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0, StructuredName.CONTENT_ITEM_TYPE, "mockPkg2",
3555ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3565ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "groupId",
3575ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3585ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        StatusUpdates.INVISIBLE, null,
3595ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "Having dinner", "mockPkg3", 0,
3605ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        20, 0,
3615ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3625ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        "content:some.photo.uri",
3635ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3645ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0,
3655ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        null,
3665ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                        0
3675ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    );
3685ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3695ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3705ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        void fetchLookupAndId(final Uri sourceUri, final long expectedContactId,
3715ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final String expectedEncodedLookup) {
3725ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(sourceUri)
3735ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(Contacts.LOOKUP_KEY, Contacts._ID)
3745ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(expectedEncodedLookup, expectedContactId);
3755ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3765ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee
3775ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        void fetchContactIdAndLookupFromRawContactUri(final Uri rawContactUri,
3785ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                final long expectedContactId, final String expectedEncodedLookup) {
3795ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            // TODO: use a lighter query by joining rawcontacts with contacts in provider
3805ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            // (See ContactContracts.java)
3815ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            final Uri dataUri = Uri.withAppendedPath(rawContactUri,
3825ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    RawContacts.Data.CONTENT_DIRECTORY);
3835ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee            mContactsProvider.expectQuery(dataUri)
3845ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .withProjection(RawContacts.CONTACT_ID, Contacts.LOOKUP_KEY)
3855ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee                    .returnRow(expectedContactId, expectedEncodedLookup);
3865ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee        }
3875ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee    }
3885ade0bb1757b216ace2f50d2357409bf9876a07aYorke Lee}
389