Writing Reusable and Testable Code

# test_atm.py
# importing withdrawal function from atm.py
import unittest
from atm import withdrawal

class TestATMWithdrawal(unittest.TestCase):

    def test_insufficient_funds(self):
        message, new_balance = withdrawal(100,150)
        self.assertEqual(message, "Insufficient funds")
        self.assertEqual(new_balance, 100)

    def test_invalid_amount(self):
        message, new_balance = withdrawal(100,-20)
        self.assertEqual(message, "Invalid amount")
        self.assertEqual(new_balance, 100)

    def test_successful_transaction(self):
        message, new_balance = withdrawal(100,50)
        self.assertEqual(message, "Transaction successful")
        self.assertEqual(new_balance, 50)

if __name__ == "__main__":
    unittest.main()
# From a different file
# atm.py
def withdrawal(balance,amount):
    if amount > balance: 
        return "Insufficient funds", balance
    elif amount <= 0:
        return "Invalid amount", balance
    else:
        balance -= amount
        return "Transaction successful", balance
    
print(withdrawal(100,150))

Last updated