package com.fsck.k9.provider; import android.database.Cursor; import android.net.Uri; import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; import android.test.mock.MockContentResolver; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.Preferences; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.List; @RunWith(AndroidJUnit4.class) public class MessageProviderTest extends ProviderTestCase2 { private MockContentResolver mMockResolver; private Cursor cursor; public MessageProviderTest() { super(MessageProvider.class, MessageProvider.AUTHORITY); } @Before @Override public void setUp() throws Exception { super.setUp(); mMockResolver = getMockContentResolver(); mContext = K9.app; Preferences preferences = Preferences.getPreferences(getMockContext()); List<Account> accountList = preferences.getAccounts(); for (Account account: accountList) { preferences.deleteAccount(account); } } @After @Override public void tearDown() throws Exception { if (cursor != null) { cursor.close(); } super.tearDown(); } private void createAccount() { Preferences preferences = Preferences.getPreferences(getMockContext()); Account account = preferences.newAccount(); account.setDescription("TestAccount"); account.setChipColor(10); account.setStoreUri("imap://user@domain.com/"); account.save(preferences); } @Test public void query_forAccounts_withNoAccounts_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccounts_withAccount_returnsCursorWithData() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertTrue(isNotEmpty); } @Test public void query_forAccounts_withAccount_withNoProjection_returnsNumberAndName() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(0, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NUMBER)); assertEquals(1, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } @Test public void query_forInboxMessages_whenEmpty_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/inbox_messages/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoAccount_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoMessages_returns0Unread() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(1, cursor.getColumnIndex(MessageProvider.UnreadColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getColumnIndex(MessageProvider.UnreadColumns.UNREAD)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } }