package com.code44.finance.data.providers;
import android.content.ContentValues;
import android.database.Cursor;
import com.code44.finance.common.model.ModelState;
import com.code44.finance.data.Query;
import com.code44.finance.data.db.Tables;
import com.code44.finance.data.model.Account;
import com.code44.finance.data.model.Currency;
import com.code44.finance.utils.IOUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import static org.junit.Assert.assertEquals;
@RunWith(RobolectricTestRunner.class)
public class CurrenciesProviderTest extends BaseContentProviderTestCase {
@Test
public void insert_leavesOnlyNewDefaultCurrencyAsDefault_whenInsertingNewDefaultCurrency() {
Cursor cursor = queryDefaultCurrencyCursor();
assertEquals(1, cursor.getCount());
assertEquals(Currency.getDefault().getId(), Currency.from(cursor).getId());
IOUtils.closeQuietly(cursor);
final Currency currency = insertCurrency(true);
cursor = queryDefaultCurrencyCursor();
assertEquals(1, cursor.getCount());
assertEquals(currency.getId(), Currency.from(cursor).getId());
assertEquals(currency.getId(), Currency.getDefault().getId());
IOUtils.closeQuietly(cursor);
}
@Test
public void insert_updatesCurrency_whenCurrencyWithSameCodeExists() {
final Currency currency = insertCurrency(false);
currency.setExchangeRate(1.2345);
insertCurrency(currency);
final Cursor cursor = queryCurrencyCursor(currency.getCode());
assertEquals(1, cursor.getCount());
assertEquals(currency.getExchangeRate(), Currency.from(cursor).getExchangeRate(), 0.0001);
IOUtils.closeQuietly(cursor);
}
@Test(expected = IllegalArgumentException.class)
public void update_throwsIllegalArgumentException() {
update(CurrenciesProvider.uriCurrencies(), new ContentValues(), null);
}
@Test
public void deleteDelete_setsItemStateDeletedUndoForAccounts() {
final Currency currency = insertCurrency(false);
insertAccount(currency);
deleteCurrency(currency);
final Cursor cursor = queryAccountsCursor();
assertEquals(1, cursor.getCount());
assertEquals(ModelState.DeletedUndo, Account.from(cursor).getModelState());
IOUtils.closeQuietly(cursor);
}
@Test(expected = IllegalArgumentException.class)
public void delete_throwsIllegalArgumentException_whenTryingToDeleteDefaultCurrency() {
delete("delete", CurrenciesProvider.uriCurrencies(), null);
}
private Cursor queryDefaultCurrencyCursor() {
final Query query = Query.create()
.projectionLocalId(Tables.Currencies.LOCAL_ID)
.projection(Tables.Currencies.PROJECTION)
.selection(Tables.Currencies.IS_DEFAULT + "=?", "1");
return query(CurrenciesProvider.uriCurrencies(), query);
}
private Cursor queryCurrencyCursor(String code) {
final Query query = Query.create()
.projectionLocalId(Tables.Currencies.LOCAL_ID)
.projection(Tables.Currencies.PROJECTION)
.selection(Tables.Currencies.CODE + "=?", code);
return query(CurrenciesProvider.uriCurrencies(), query);
}
private Currency insertCurrency(boolean isDefault) {
final Currency currency = new Currency();
currency.setCode("AAA");
currency.setDefault(isDefault);
return insertCurrency(currency);
}
private Currency insertCurrency(Currency currency) {
insert(CurrenciesProvider.uriCurrencies(), currency);
return currency;
}
private int deleteCurrency(Currency currency) {
return delete("delete", CurrenciesProvider.uriCurrencies(), Tables.Currencies.LOCAL_ID + "=?", String.valueOf(currency.getId()));
}
private Cursor queryAccountsCursor() {
final Query query = Query.create()
.projectionLocalId(Tables.Accounts.ID)
.projection(Tables.Accounts.PROJECTION)
.selection(Tables.Accounts.OWNER + "=?", AccountOwner.USER.asString());
return query(AccountsProvider.uriAccounts(), query);
}
private Account insertAccount(Currency currency) {
final Account account = new Account();
account.setTitle("a");
account.setCurrency(currency);
insert(AccountsProvider.uriAccounts(), account);
return account;
}
}