package com.liato.bankdroid; import com.liato.bankdroid.banking.Bank; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import android.app.ProgressDialog; import android.content.Context; import android.support.annotation.NonNull; import java.util.Arrays; import java.util.List; public class DataRetrieverTaskTest { // Any positive number would do here private static final int BANK_ID = 5; private static class TestableDataRetrieverTask extends DataRetrieverTask { private final Bank[] banks; private final ProgressDialog dialog; @Override protected void publishProgress(int zeroBasedBankNumber, Bank bank) { // This method intentionally left blank } @Override protected Bank getBankFromDb(long bankId, Context parent) { Assert.assertEquals(BANK_ID, bankId); return banks[0]; } @Override protected List<Bank> getBanksFromDb(Context parent) { return Arrays.asList(banks); } @Override protected void saveBank(Bank bank, Context context) { // This method intentionally left blank } @Override protected boolean isContentProviderEnabled() { return false; } @NonNull @Override protected ProgressDialog getDialog() { return dialog; } /** * Constructor for testing a specific bank */ public TestableDataRetrieverTask(Bank bank) { super(Mockito.mock(MainActivity.class), BANK_ID); this.banks = new Bank[] { bank }; this.dialog = Mockito.mock(ProgressDialog.class); } /** * Constructor for testing all banks */ public TestableDataRetrieverTask(Bank[] allBanks) { super(Mockito.mock(MainActivity.class)); this.banks = allBanks; this.dialog = Mockito.mock(ProgressDialog.class); } } @Test public void testUpdateSingleDisabledBank() throws Exception { Bank bank = Mockito.mock(Bank.class); Mockito.when(bank.isDisabled()).thenReturn(true); TestableDataRetrieverTask testMe = new TestableDataRetrieverTask(bank); testMe.doInBackground(); // Single disabled bank should be updated Mockito.verify(bank, Mockito.atLeastOnce()).update(); // At least at the time of writing this (2016oct2) updating the bank // implicitly enables it. Of course having a test for that would be // better than not having one, but we don't right now. } @Test public void testUpdateSingleEnabledBank() throws Exception { Bank bank = Mockito.mock(Bank.class); Mockito.when(bank.isDisabled()).thenReturn(false); TestableDataRetrieverTask testMe = new TestableDataRetrieverTask(bank); testMe.doInBackground(); // Single enabled bank should be updated Mockito.verify(bank, Mockito.atLeastOnce()).update(); } @Test public void testUpdateMultiDisabledBank() throws Exception { Bank bank = Mockito.mock(Bank.class); Mockito.when(bank.isDisabled()).thenReturn(true); TestableDataRetrieverTask testMe = new TestableDataRetrieverTask(new Bank[]{bank}); testMe.doInBackground(); // When doing all banks, disabled ones shouldn't update Mockito.verify(bank, Mockito.never()).update(); } @Test public void testUpdateMultiEnabledBank() throws Exception { Bank bank = Mockito.mock(Bank.class); Mockito.when(bank.isDisabled()).thenReturn(false); TestableDataRetrieverTask testMe = new TestableDataRetrieverTask(new Bank[]{bank}); testMe.doInBackground(); // When doing all banks, enabled ones should update Mockito.verify(bank, Mockito.atLeastOnce()).update(); } }