class TestUseCaseDepositFundExistingAccount(unittest.TestCase):
    """Allow a customer to deposit funds into an existing account."""
    def setUp(self):
        self.accountRepository = AccountRepository()
        self.depositFundInAccount = DepositFundInAccount(
            self.accountRepository)

    def test_allow_customer_deposit_funds_an_existing_account(self):
        self._given_created_customer()
        self._given_an_existing_account()
        self._when_deposit_fund_into_account()
        self._then_verify_whether_account_has_balance()

    def _given_created_customer(self):
        idCustomer = 1
        fullName = Name.create("Andres", "Rodriguez")
        contactNumber = ContactNumber.create('3102434466')
        personNumber = PersonNumber.create('10888999602')
        self.customer = Customer.create(idCustomer, fullName, personNumber,
                                        contactNumber)

    def _given_an_existing_account(self):
        self.idAccount = 1
        idCustomer = 1
        self.account = Account.create(self.idAccount, idCustomer)
        self.accountRepository.save(self.account)

    def _when_deposit_fund_into_account(self):
        amount = 100
        description = 'A deposit of 100'
        self.depositFundInAccount.execute(self.idAccount, amount, description)

    def _then_verify_whether_account_has_balance(self):
        account = self.accountRepository.findById(self.account.id)
        self.assertEqual(account.balance, 100)
class TestUseCaseCustomerWithdrawFundsExistingAccount(unittest.TestCase):
    """Allow the customer to withdraw funds from an existing account."""
    def setUp(self):
        self.accountRepository = AccountRepository()
        self.withdrawFund = WithDrawFund(self.accountRepository)

    def test_allow_the_customer_to_withdraw_funds_from_an_existing_account(
            self):
        self._given_an_existing_account()
        self._when_customer_withdraw_from_existing_account()
        self._then_verify_whether_account_has_balance()

    def _given_an_existing_account(self):
        self.idAccount = 1
        idCustomer = 1
        account = Account.create(self.idAccount, idCustomer)
        account.makeCredit(300, 'A deposit of 300')
        self.accountRepository.save(account)

    def _when_customer_withdraw_from_existing_account(self):
        amount = 10
        description = 'A withdraw of 10 from ATM'
        self.withdrawFund.execute(self.idAccount, amount, description)

    def _then_verify_whether_account_has_balance(self):
        account = self.accountRepository.findById(self.idAccount)
        self.assertEqual(account.balance, 290)
class TestUseCaseRegisterNewAccount(unittest.TestCase):
    def setUp(self):
        self.accountRepository = AccountRepository()
        self.customerRepository = CustomerRepository()
        self.registerNewAccount = RegisterNewAccount(self.accountRepository,
                                                     self.customerRepository)
        self.registerNewCustomer = RegisterNewCustomer(self.customerRepository)
        self.idAccount = 1

    def test_customer_could_register_new_checking_account_with_personal_details(
            self):
        self._given_created_customer()
        self._when_customer_register_new_account()
        self._then_save_the_new_account_in_repository()

    def _given_created_customer(self):
        self.customer_id = 1
        self.registerNewCustomer.execute(customer_id=self.customer_id,
                                         first_name='Andres',
                                         last_name='Rodriguez',
                                         contact_number='3112673404',
                                         person_number='1088997602')

    def _when_customer_register_new_account(self):
        self.registerNewAccount.execute(self.idAccount, self.customer_id)

    def _then_save_the_new_account_in_repository(self):
        account = self.accountRepository.findById(self.idAccount)
        self.assertEqual(account.id, self.idAccount)