Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5104278c authored by Philip's avatar Philip Committed by GitHub
Browse files

Merge pull request #2176 from philipwhiuk/messageProviderFixAndTest

MessageProvider related fixes and testing
parents 1be97b85 4cd7fd6e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ dependencies {
    compile 'com.github.amlcurran.showcaseview:library:5.4.1'
    compile 'com.squareup.moshi:moshi:1.2.0'

    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'

    testCompile "org.robolectric:robolectric:${robolectricVersion}"
    testCompile "junit:junit:${junitVersion}"
+138 −0
Original line number Diff line number Diff line
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));
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -1840,7 +1840,7 @@ public class Account implements BaseAccount, StoreConfig {
    }

    private void excludeSpecialFolder(LocalSearch search, String folderName) {
        if (!K9.FOLDER_NONE.equals(folderName)) {
        if (folderName != null && !K9.FOLDER_NONE.equals(folderName)) {
            search.and(SearchField.FOLDER, folderName, Attribute.NOT_EQUALS);
        }
    }
+41 −13
Original line number Diff line number Diff line
@@ -70,6 +70,14 @@ public class MessageProvider extends ContentProvider {
            MessageColumns.DELETE_URI,
            MessageColumns.SENDER_ADDRESS
    };
    private static final String[] DEFAULT_ACCOUNT_PROJECTION = new String[] {
            AccountColumns.ACCOUNT_NUMBER,
            AccountColumns.ACCOUNT_NAME,
    };
    private static final String[] UNREAD_PROJECTION = new String[] {
            UnreadColumns.ACCOUNT_NAME,
            UnreadColumns.UNREAD
    };

    
    private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
@@ -316,6 +324,32 @@ public class MessageProvider extends ContentProvider {
        String INCREMENT = "id";
    }

    public interface AccountColumns {
        /**
         * <P>Type: INTEGER</P>
         */
        String ACCOUNT_NUMBER = "accountNumber";
        /**
         * <P>Type: String</P>
         */
        String ACCOUNT_NAME = "accountName";


        String ACCOUNT_UUID = "accountUuid";
        String ACCOUNT_COLOR = "accountColor";
    }

    public interface UnreadColumns {
        /**
         * <P>Type: String</P>
         */
        String ACCOUNT_NAME = "accountName";
        /**
         * <P>Type: INTEGER</P>
         */
        String UNREAD = "unread";
    }

    protected interface QueryHandler {
        /**
         * The path this instance is able to respond to.
@@ -581,10 +615,6 @@ public class MessageProvider extends ContentProvider {
     * Retrieve the account list.
     */
    protected class AccountsQueryHandler implements QueryHandler {
        private static final String FIELD_ACCOUNT_NUMBER = "accountNumber";
        private static final String FIELD_ACCOUNT_NAME = "accountName";
        private static final String FIELD_ACCOUNT_UUID = "accountUuid";
        private static final String FIELD_ACCOUNT_COLOR = "accountColor";


        @Override
@@ -600,7 +630,7 @@ public class MessageProvider extends ContentProvider {

        public Cursor getAllAccounts(String[] projection) {
            if (projection == null) {
                projection = new String[] { FIELD_ACCOUNT_NUMBER, FIELD_ACCOUNT_NAME };
                projection = DEFAULT_ACCOUNT_PROJECTION;
            }

            MatrixCursor cursor = new MatrixCursor(projection);
@@ -610,13 +640,13 @@ public class MessageProvider extends ContentProvider {

                int fieldIndex = 0;
                for (String field : projection) {
                    if (FIELD_ACCOUNT_NUMBER.equals(field)) {
                    if (AccountColumns.ACCOUNT_NUMBER.equals(field)) {
                        values[fieldIndex] = account.getAccountNumber();
                    } else if (FIELD_ACCOUNT_NAME.equals(field)) {
                    } else if (AccountColumns.ACCOUNT_NAME.equals(field)) {
                        values[fieldIndex] = account.getDescription();
                    } else if (FIELD_ACCOUNT_UUID.equals(field)) {
                    } else if (AccountColumns.ACCOUNT_UUID.equals(field)) {
                        values[fieldIndex] = account.getUuid();
                    } else if (FIELD_ACCOUNT_COLOR.equals(field)) {
                    } else if (AccountColumns.ACCOUNT_COLOR.equals(field)) {
                        values[fieldIndex] = account.getChipColor();
                    } else {
                        values[fieldIndex] = null;
@@ -662,9 +692,8 @@ public class MessageProvider extends ContentProvider {
        }

        private Cursor getAccountUnread(int accountNumber) {
            String[] projection = new String[] { "accountName", "unread" };

            MatrixCursor cursor = new MatrixCursor(projection);
            MatrixCursor cursor = new MatrixCursor(UNREAD_PROJECTION);

            Account myAccount;
            AccountStats myAccountStats;
@@ -682,13 +711,12 @@ public class MessageProvider extends ContentProvider {
                        } else {
                            values[1] = myAccountStats.unreadMessageCount;
                        }

                        cursor.addRow(values);
                    } catch (MessagingException e) {
                        Log.e(K9.LOG_TAG, e.getMessage());
                        values[0] = "Unknown";
                        values[1] = 0;
                    }
                    cursor.addRow(values);
                }
            }