more tests for RecipientPresenter

This commit is contained in:
Vincent Breitmoser 2017-01-05 18:48:51 +01:00
parent 6beb9902da
commit 0644fa0481
4 changed files with 159 additions and 8 deletions

View file

@ -15,6 +15,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
@ -791,6 +792,12 @@ public class RecipientPresenter implements PermissionPingCallback {
} }
} }
@VisibleForTesting
void setOpenPgpServiceConnection(OpenPgpServiceConnection openPgpServiceConnection, String cryptoProvider) {
this.openPgpServiceConnection = openPgpServiceConnection;
this.cryptoProvider = cryptoProvider;
}
public enum CryptoProviderState { public enum CryptoProviderState {
UNCONFIGURED, UNCONFIGURED,
UNINITIALIZED, UNINITIALIZED,

View file

@ -6,8 +6,13 @@ import java.util.List;
import android.app.LoaderManager; import android.app.LoaderManager;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.os.ParcelFileDescriptor;
import com.fsck.k9.Account; import com.fsck.k9.Account;
import com.fsck.k9.activity.compose.RecipientMvpView.CryptoSpecialModeDisplayType;
import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType;
import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode;
import com.fsck.k9.helper.ReplyToParser; import com.fsck.k9.helper.ReplyToParser;
import com.fsck.k9.helper.ReplyToParser.ReplyToAddresses; import com.fsck.k9.helper.ReplyToParser.ReplyToAddresses;
import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Address;
@ -18,10 +23,19 @@ import com.fsck.k9.view.RecipientSelectView.Recipient;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.openintents.openpgp.IOpenPgpService2;
import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpServiceConnection;
import org.openintents.openpgp.util.ShadowOpenPgpAsyncTask;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ -30,19 +44,20 @@ import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(manifest = "src/main/AndroidManifest.xml", sdk = 21) @Config(manifest = "src/main/AndroidManifest.xml", sdk = 21, shadows={ShadowOpenPgpAsyncTask.class})
public class RecipientPresenterTest { public class RecipientPresenterTest {
public static final ReplyToAddresses TO_ADDRESSES = new ReplyToAddresses(Address.parse("to@example.org")); private static final ReplyToAddresses TO_ADDRESSES = new ReplyToAddresses(Address.parse("to@example.org"));
public static final List<Address> ALL_TO_ADDRESSES = Arrays.asList(Address.parse("allTo@example.org")); private static final List<Address> ALL_TO_ADDRESSES = Arrays.asList(Address.parse("allTo@example.org"));
public static final List<Address> ALL_CC_ADDRESSES = Arrays.asList(Address.parse("allCc@example.org")); private static final List<Address> ALL_CC_ADDRESSES = Arrays.asList(Address.parse("allCc@example.org"));
private static final String CRYPTO_PROVIDER = "crypto_provider";
private static final long CRYPTO_KEY_ID = 123L;
RecipientPresenter recipientPresenter; private RecipientPresenter recipientPresenter;
private ReplyToParser replyToParser; private ReplyToParser replyToParser;
private ComposePgpInlineDecider composePgpInlineDecider; private ComposePgpInlineDecider composePgpInlineDecider;
private Account account; private Account account;
private RecipientMvpView recipientMvpView; private RecipientMvpView recipientMvpView;
private LoaderManager loaderManager;
@Before @Before
@ -53,7 +68,7 @@ public class RecipientPresenterTest {
account = mock(Account.class); account = mock(Account.class);
composePgpInlineDecider = mock(ComposePgpInlineDecider.class); composePgpInlineDecider = mock(ComposePgpInlineDecider.class);
replyToParser = mock(ReplyToParser.class); replyToParser = mock(ReplyToParser.class);
loaderManager = mock(LoaderManager.class); LoaderManager loaderManager = mock(LoaderManager.class);
recipientPresenter = new RecipientPresenter( recipientPresenter = new RecipientPresenter(
context, loaderManager, recipientMvpView, account, composePgpInlineDecider, replyToParser); context, loaderManager, recipientMvpView, account, composePgpInlineDecider, replyToParser);
@ -92,4 +107,108 @@ public class RecipientPresenterTest {
verify(composePgpInlineDecider).shouldReplyInline(message); verify(composePgpInlineDecider).shouldReplyInline(message);
} }
@Test
public void getCurrentCryptoStatus_withoutCryptoProvider() throws Exception {
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.UNCONFIGURED, status.getCryptoStatusDisplayType());
assertEquals(CryptoSpecialModeDisplayType.NONE, status.getCryptoSpecialModeDisplayType());
assertNull(status.getAttachErrorStateOrNull());
assertFalse(status.isProviderStateOk());
assertFalse(status.shouldUsePgpMessageBuilder());
}
@Test
public void getCurrentCryptoStatus_withCryptoProvider() throws Exception {
setupCryptoProvider();
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.OPPORTUNISTIC_EMPTY, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertTrue(status.shouldUsePgpMessageBuilder());
}
@Test
public void getCurrentCryptoStatus_withOpportunistic() throws Exception {
setupCryptoProvider();
recipientPresenter.onCryptoModeChanged(CryptoMode.OPPORTUNISTIC);
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.OPPORTUNISTIC_EMPTY, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertTrue(status.shouldUsePgpMessageBuilder());
}
@Test
public void getCurrentCryptoStatus_withModeDisabled() throws Exception {
setupCryptoProvider();
recipientPresenter.onCryptoModeChanged(CryptoMode.DISABLE);
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.DISABLED, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertFalse(status.shouldUsePgpMessageBuilder());
}
@Test
public void getCurrentCryptoStatus_withModePrivate() throws Exception {
setupCryptoProvider();
recipientPresenter.onCryptoModeChanged(CryptoMode.PRIVATE);
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.PRIVATE_EMPTY, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertTrue(status.shouldUsePgpMessageBuilder());
}
@Test
public void getCurrentCryptoStatus_withModeSignOnly() throws Exception {
setupCryptoProvider();
recipientPresenter.onMenuSetSignOnly(true);
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.SIGN_ONLY, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertTrue(status.isSigningEnabled());
assertTrue(status.isSignOnly());
}
@Test
public void getCurrentCryptoStatus_withModeInline() throws Exception {
setupCryptoProvider();
recipientPresenter.onMenuSetPgpInline(true);
ComposeCryptoStatus status = recipientPresenter.getCurrentCryptoStatus();
assertEquals(CryptoStatusDisplayType.OPPORTUNISTIC_EMPTY, status.getCryptoStatusDisplayType());
assertTrue(status.isProviderStateOk());
assertTrue(status.isPgpInlineModeEnabled());
}
private void setupCryptoProvider() throws android.os.RemoteException {
Account account = mock(Account.class);
OpenPgpServiceConnection openPgpServiceConnection = mock(OpenPgpServiceConnection.class);
IOpenPgpService2 openPgpService2 = mock(IOpenPgpService2.class);
Intent permissionPingIntent = new Intent();
permissionPingIntent.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
when(account.getOpenPgpProvider()).thenReturn(CRYPTO_PROVIDER);
when(account.getCryptoKey()).thenReturn(CRYPTO_KEY_ID);
when(openPgpServiceConnection.isBound()).thenReturn(true);
when(openPgpServiceConnection.getService()).thenReturn(openPgpService2);
when(openPgpService2.execute(any(Intent.class), any(ParcelFileDescriptor.class), any(Integer.class)))
.thenReturn(permissionPingIntent);
Robolectric.getBackgroundThreadScheduler().pause();
recipientPresenter.setOpenPgpServiceConnection(openPgpServiceConnection, CRYPTO_PROVIDER);
recipientPresenter.onSwitchAccount(account);
recipientPresenter.updateCryptoStatus();
Robolectric.getBackgroundThreadScheduler().runOneTask();
}
} }

View file

@ -0,0 +1,25 @@
package org.openintents.openpgp.util;
import java.util.concurrent.Executor;
import android.content.Intent;
import android.os.AsyncTask;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.RealObject;
import org.robolectric.shadows.ShadowAsyncTask;
@Implements(OpenPgpApi.OpenPgpAsyncTask.class)
public class ShadowOpenPgpAsyncTask extends ShadowAsyncTask<Void, Integer, Intent> {
@RealObject
private OpenPgpApi.OpenPgpAsyncTask realAsyncTask;
@Implementation
public AsyncTask<Void, Integer, Intent> executeOnExecutor(Executor executor, Void... params) {
return super.execute(params);
}
}

View file

@ -328,7 +328,7 @@ public class OpenPgpApi {
} }
} }
private class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Intent> { class OpenPgpAsyncTask extends AsyncTask<Void, Integer, Intent> {
Intent data; Intent data;
InputStream is; InputStream is;
OutputStream os; OutputStream os;