1/*
2 * Copyright (C) 2010 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
17package com.android.exchange.provider;
18
19import com.android.emailcommon.mail.PackedString;
20import com.android.emailcommon.provider.Account;
21import com.android.exchange.provider.GalResult.GalData;
22import com.android.exchange.utility.ExchangeTestCase;
23
24import android.content.Context;
25import android.database.Cursor;
26import android.database.MatrixCursor;
27import android.net.Uri;
28import android.provider.ContactsContract.CommonDataKinds;
29import android.provider.ContactsContract.Contacts;
30import android.test.suitebuilder.annotation.SmallTest;
31
32/**
33 * You can run this entire test case with:
34 *   runtest -c com.android.exchange.provider.ExchangeDirectoryProviderTests exchange
35 */
36@SmallTest
37public class ExchangeDirectoryProviderTests extends ExchangeTestCase {
38
39    public ExchangeDirectoryProviderTests() {
40    }
41
42    // Create a test projection; we should only get back values for display name and email address
43    private static final String[] GAL_RESULT_PROJECTION =
44        new String[] {Contacts.DISPLAY_NAME, CommonDataKinds.Email.ADDRESS, Contacts.CONTENT_TYPE,
45            Contacts.LOOKUP_KEY};
46    private static final int GAL_RESULT_COLUMN_DISPLAY_NAME = 0;
47    private static final int GAL_RESULT_COLUMN_EMAIL_ADDRESS = 1;
48    private static final int GAL_RESULT_COLUMN_CONTENT_TYPE = 2;
49    private static final int GAL_RESULT_COLUMN_LOOKUP_KEY = 3;
50
51    public void testBuildSimpleGalResultCursor() {
52        GalResult result = new GalResult();
53        result.addGalData(1, "Alice Aardvark", "alice@aardvark.com");
54        result.addGalData(2, "Bob Badger", "bob@badger.com");
55        result.addGalData(3, "Clark Cougar", "clark@cougar.com");
56        result.addGalData(4, "Dan Dolphin", "dan@dolphin.com");
57        // Make sure our returned cursor has the expected contents
58        ExchangeDirectoryProvider provider = new ExchangeDirectoryProvider();
59        Cursor c = provider.buildGalResultCursor(GAL_RESULT_PROJECTION, result);
60        assertNotNull(c);
61        assertEquals(MatrixCursor.class, c.getClass());
62        assertEquals(4, c.getCount());
63        for (int i = 0; i < 4; i++) {
64            GalData data = result.galData.get(i);
65            assertTrue(c.moveToNext());
66            assertEquals(data.displayName, c.getString(GAL_RESULT_COLUMN_DISPLAY_NAME));
67            assertEquals(data.emailAddress, c.getString(GAL_RESULT_COLUMN_EMAIL_ADDRESS));
68            assertNull(c.getString(GAL_RESULT_COLUMN_CONTENT_TYPE));
69        }
70    }
71
72    private static final String[][] DISPLAY_NAME_TEST_FIELDS = {
73        {"Alice", "Aardvark", "Another Name"},
74        {"Alice", "Aardvark", null},
75        {"Alice", null, null},
76        {null, "Aardvark", null},
77        {null, null, null}
78    };
79    private static final int TEST_FIELD_FIRST_NAME = 0;
80    private static final int TEST_FIELD_LAST_NAME = 1;
81    private static final int TEST_FIELD_DISPLAY_NAME = 2;
82    private static final String[] EXPECTED_DISPLAY_NAMES = new String[] {"Another Name",
83        "Alice Aardvark", "Alice", "Aardvark", null};
84
85    private GalResult getTestDisplayNameResult() {
86        GalResult result = new GalResult();
87        for (int i = 0; i < DISPLAY_NAME_TEST_FIELDS.length; i++) {
88            GalData galData = new GalData();
89            String[] names = DISPLAY_NAME_TEST_FIELDS[i];
90            galData.put(GalData.FIRST_NAME, names[TEST_FIELD_FIRST_NAME]);
91            galData.put(GalData.LAST_NAME, names[TEST_FIELD_LAST_NAME]);
92            galData.put(GalData.DISPLAY_NAME, names[TEST_FIELD_DISPLAY_NAME]);
93            result.addGalData(galData);
94        }
95        return result;
96    }
97
98    public void testDisplayNameLogic() {
99        GalResult result = getTestDisplayNameResult();
100        // Make sure our returned cursor has the expected contents
101        ExchangeDirectoryProvider provider = new ExchangeDirectoryProvider();
102        Cursor c = provider.buildGalResultCursor(GAL_RESULT_PROJECTION, result);
103        assertNotNull(c);
104        assertEquals(MatrixCursor.class, c.getClass());
105        assertEquals(DISPLAY_NAME_TEST_FIELDS.length, c.getCount());
106        for (int i = 0; i < EXPECTED_DISPLAY_NAMES.length; i++) {
107            assertTrue(c.moveToNext());
108            assertEquals(EXPECTED_DISPLAY_NAMES[i], c.getString(GAL_RESULT_COLUMN_DISPLAY_NAME));
109        }
110    }
111
112    public void testLookupKeyLogic() {
113        GalResult result = getTestDisplayNameResult();
114        // Make sure our returned cursor has the expected contents
115        ExchangeDirectoryProvider provider = new ExchangeDirectoryProvider();
116        Cursor c = provider.buildGalResultCursor(GAL_RESULT_PROJECTION, result);
117        assertNotNull(c);
118        assertEquals(MatrixCursor.class, c.getClass());
119        assertEquals(DISPLAY_NAME_TEST_FIELDS.length, c.getCount());
120        for (int i = 0; i < EXPECTED_DISPLAY_NAMES.length; i++) {
121            assertTrue(c.moveToNext());
122            PackedString ps =
123                new PackedString(Uri.decode(c.getString(GAL_RESULT_COLUMN_LOOKUP_KEY)));
124            String[] testFields = DISPLAY_NAME_TEST_FIELDS[i];
125            assertEquals(testFields[TEST_FIELD_FIRST_NAME], ps.get(GalData.FIRST_NAME));
126            assertEquals(testFields[TEST_FIELD_LAST_NAME], ps.get(GalData.LAST_NAME));
127            assertEquals(EXPECTED_DISPLAY_NAMES[i], ps.get(GalData.DISPLAY_NAME));
128        }
129    }
130
131    public void testGetAccountIdByName() {
132        Context context = getContext(); //getMockContext();
133        ExchangeDirectoryProvider provider = new ExchangeDirectoryProvider();
134        // Nothing up my sleeve
135        assertNull(provider.mAccountIdMap.get("foo@android.com"));
136        assertNull(provider.mAccountIdMap.get("bar@android.com"));
137        // Create accounts; the email addresses will be the first argument + "@android.com"
138        Account acctFoo = setupTestAccount("foo", true);
139        Account acctBar = setupTestAccount("bar", true);
140        // Make sure we can retrieve them, and that the map is populated
141        assertEquals(acctFoo.mId, provider.getAccountIdByName(context, "foo@android.com"));
142        assertEquals(acctBar.mId, provider.getAccountIdByName(context, "bar@android.com"));
143        assertEquals((Long)acctFoo.mId, provider.mAccountIdMap.get("foo@android.com"));
144        assertEquals((Long)acctBar.mId, provider.mAccountIdMap.get("bar@android.com"));
145    }
146}
147