Skip to content

Commit

Permalink
Merge pull request #2176 from philipwhiuk/messageProviderFixAndTest
Browse files Browse the repository at this point in the history
MessageProvider related fixes and testing
  • Loading branch information
philipwhiuk committed Feb 10, 2017
2 parents 1be97b8 + 4cd7fd6 commit 5104278
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 15 deletions.
2 changes: 1 addition & 1 deletion k9mail/build.gradle
Expand Up @@ -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}"
Expand Down
@@ -0,0 +1,138 @@
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));
}
}
2 changes: 1 addition & 1 deletion k9mail/src/main/java/com/fsck/k9/Account.java
Expand Up @@ -1840,7 +1840,7 @@ public void excludeUnwantedFolders(LocalSearch search) {
}

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);
}
}
Expand Down
54 changes: 41 additions & 13 deletions k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java
Expand Up @@ -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);
Expand Down Expand Up @@ -316,6 +324,32 @@ public interface MessageColumns extends BaseColumns {
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.
Expand Down Expand Up @@ -581,10 +615,6 @@ protected MatrixCursor getMessages(String[] projection) throws InterruptedExcept
* 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
Expand All @@ -600,7 +630,7 @@ public Cursor query(Uri uri, String[] projection, String selection, String[] sel

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);
Expand All @@ -610,13 +640,13 @@ public Cursor getAllAccounts(String[] projection) {

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;
Expand Down Expand Up @@ -662,9 +692,8 @@ public Cursor query(Uri uri, String[] projection, String selection, String[] sel
}

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;
Expand All @@ -682,13 +711,12 @@ private Cursor getAccountUnread(int accountNumber) {
} 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);
}
}

Expand Down

0 comments on commit 5104278

Please sign in to comment.