package org.moneymanagerex.android.tests;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.TextView;
import com.money.manager.ex.BuildConfig;
import com.money.manager.ex.R;
import com.money.manager.ex.transactions.SplitCategoriesActivity;
import com.money.manager.ex.core.TransactionTypes;
import com.money.manager.ex.database.ITransactionEntity;
import com.money.manager.ex.domainmodel.SplitCategory;
import com.money.manager.ex.view.RobotoTextView;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.moneymanagerex.android.testhelpers.UnitTestHelper;
import org.parceler.Parcels;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
import java.util.ArrayList;
import info.javaperformance.money.Money;
import info.javaperformance.money.MoneyFactory;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Unit tests for Split Categories activity.
*/
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class SplitCategoriesActivityTests {
private ActivityController<SplitCategoriesActivity> controller;
// private SplitCategoriesActivity activity;
@BeforeClass
public static void suiteSetup() {
// can't initialize content provider here as the static context does not have an application.
}
@Before
public void setUp() {
// set up the content provider
UnitTestHelper.setupContentProvider();
// todo: insert any data here, if needed.
this.controller = UnitTestHelper.getController(SplitCategoriesActivity.class);
}
@After
public void tearDown() {
this.controller.destroy();
// destroy db helper
UnitTestHelper.teardownDatabase();
}
@Test
public void activityRunsStandalone() {
SplitCategoriesActivity activity = UnitTestHelper.getActivity(this.controller);
assertThat(activity).isNotNull();
}
/**
* Confirm that the displayed amount after entry contains the correctly formatted currency,
* and the correct currency.
*/
@Test
public void displayCurrencyMatchesTheAccount() {
// set up
Intent intent = createIntent();
Money enteredAmount = MoneyFactory.fromString("5.38");
// run
SplitCategoriesActivity activity = this.controller
.withIntent(intent)
.create().visible().start().get();
assertThat(activity).isNotNull();
assertThat(activity.getIntent().getStringExtra(SplitCategoriesActivity.KEY_DATASET_TYPE))
.isEqualTo(SplitCategory.class.getSimpleName());
// enter number
Fragment fragment = activity.getSupportFragmentManager().getFragments().get(0);
assertThat(fragment).isNotNull();
// get amount text box.
View view = fragment.getView().findViewById(R.id.editTextTotAmount);
assertThat(view).isNotNull();
// click to open input binaryDialog here
// receive amount back
// todo: replace this with EventBus
// ((IInputAmountDialogListener) fragment).onFinishedInputAmountDialog(
// view.getId(), enteredAmount);
// view must be text view.
assertThat(view.getClass()).isEqualTo(RobotoTextView.class);
assertThat((String) view.getTag()).isEqualTo(enteredAmount.toString());
String actualAmountText = ((TextView) view).getText().toString();
assertThat(actualAmountText).isNotEqualTo(enteredAmount.toString());
assertThat(actualAmountText).isEqualTo("€ 5.38");
}
private Intent createIntent() {
// Recurring transactions
// TableBudgetSplitTransactions.class.getSimpleName()
// Account Transactions
String datasetName = SplitCategory.class.getSimpleName();
TransactionTypes transactionType = TransactionTypes.Withdrawal;
ArrayList<ITransactionEntity> mSplitTransactions = null;
ArrayList<ITransactionEntity> mSplitTransactionsDeleted = null;
int currencyId = 2;
Context context = UnitTestHelper.getContext();
// this is a copy of production intent code
Intent intent = new Intent(context, SplitCategoriesActivity.class);
intent.putExtra(SplitCategoriesActivity.KEY_DATASET_TYPE, datasetName);
intent.putExtra(SplitCategoriesActivity.KEY_TRANSACTION_TYPE, transactionType.getCode());
intent.putExtra(SplitCategoriesActivity.KEY_SPLIT_TRANSACTION, Parcels.wrap(mSplitTransactions));
intent.putExtra(SplitCategoriesActivity.KEY_SPLIT_TRANSACTION_DELETED, Parcels.wrap(mSplitTransactionsDeleted));
intent.putExtra(SplitCategoriesActivity.KEY_CURRENCY_ID, currencyId);
// mParent.startActivityForResult(intent, REQUEST_PICK_SPLIT_TRANSACTION);
return intent;
}
}