package de.geeksfactory.opacclient.reminder; import android.content.SharedPreferences; import org.json.JSONException; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.List; import de.geeksfactory.opacclient.OpacClient; import de.geeksfactory.opacclient.apis.OpacApi; import de.geeksfactory.opacclient.objects.Account; import de.geeksfactory.opacclient.objects.AccountData; import de.geeksfactory.opacclient.objects.Library; import de.geeksfactory.opacclient.storage.AccountDataSource; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; public class SyncAccountServiceTest { private SyncAccountService service; // mocks private OpacClient app; private SharedPreferences sp; private AccountDataSource data; private ReminderHelper helper; private OpacApi api1; private OpacApi api2; // example data private List<Account> accounts; private Account account1; private Account account2; private Library library; @Before public void setUp() throws Exception { app = mock(OpacClient.class); sp = mock(SharedPreferences.class); data = mock(AccountDataSource.class); helper = mock(ReminderHelper.class); api1 = mock(OpacApi.class); api2 = mock(OpacApi.class); service = new SyncAccountService(); when(sp.contains("update_151_clear_cache")).thenReturn(true); accounts = new ArrayList<>(); account1 = new Account(); account1.setId(0); account2 = new Account(); account2.setId(1); accounts.add(account1); accounts.add(account2); library = new Library(); library.setAccountSupported(true); } @Test public void shouldDoNothingWithoutAccounts() { when(data.getAccountsWithPassword()).thenReturn(new ArrayList<Account>()); assertFalse(service.syncAccounts(app, data, sp, helper)); verify(data).getAccountsWithPassword(); verifyNoMoreInteractions(data); } @Test public void exceptionShouldNotAffectOtherAccounts() throws IOException, JSONException, OpacApi.OpacErrorException, OpacClient.LibraryRemovedException { setUpAccountsAndTwoApis(); when(api1.account(any(Account.class))).thenThrow(new OpacApi.OpacErrorException("error")); when(api2.account(any(Account.class))).thenReturn(mock(AccountData.class)); verifyErrorShouldNotAffectOtherAccounts(); } @Test public void nullShouldNotAffectOtherAccounts() throws IOException, JSONException, OpacApi.OpacErrorException, OpacClient.LibraryRemovedException { setUpAccountsAndTwoApis(); when(api1.account(any(Account.class))).thenReturn(null); when(api2.account(any(Account.class))).thenReturn(mock(AccountData.class)); verifyErrorShouldNotAffectOtherAccounts(); } private void verifyErrorShouldNotAffectOtherAccounts() throws IOException, JSONException, OpacApi.OpacErrorException { assertTrue(service.syncAccounts(app, data, sp, helper)); verify(api1).account(account1); verify(api2).account(account2); verify(data, never()).storeCachedAccountData(eq(account1), any(AccountData.class)); verify(data).storeCachedAccountData(eq(account2), any(AccountData.class)); verify(helper).generateAlarms(); } private void setUpAccountsAndTwoApis() throws IOException, JSONException, OpacClient.LibraryRemovedException { when(data.getAccountsWithPassword()).thenReturn(accounts); when(app.getLibrary(anyString())).thenReturn(library); when(app.getNewApi(library)).thenReturn(api1, api2); } }