From d86a3da135f5048b25d0a5d93a0751c3b326c747 Mon Sep 17 00:00:00 2001 From: David Rodenkirchen Date: Fri, 24 Jan 2025 21:25:17 +0100 Subject: [PATCH] add unittests for accounting service --- testing/unittests/AccountingServiceTests.py | 113 ++++++++++++++++++++ testing/unittests/__init__.py | 0 2 files changed, 113 insertions(+) create mode 100644 testing/unittests/AccountingServiceTests.py create mode 100644 testing/unittests/__init__.py diff --git a/testing/unittests/AccountingServiceTests.py b/testing/unittests/AccountingServiceTests.py new file mode 100644 index 0000000..cc1a722 --- /dev/null +++ b/testing/unittests/AccountingServiceTests.py @@ -0,0 +1,113 @@ +import unittest +from datetime import datetime +from unittest.mock import MagicMock, AsyncMock + +from src.ez_lan_manager.services.AccountingService import AccountingService, InsufficientFundsError +from src.ez_lan_manager.types.Transaction import Transaction + + +class AccountingServiceTests(unittest.IsolatedAsyncioTestCase): + def setUp(self) -> None: + self.mock_database_service = MagicMock() + self.mock_database_service.add_transaction = AsyncMock() + self.accounting_service = AccountingService(self.mock_database_service) + + + def test_importing_unit_under_test_works(self) -> None: + """ + This test asserts that the object produced in setUp is AccountingService object, + if that fails, there is no reason to execute any other test. + """ + self.assertIsInstance(self.accounting_service, AccountingService) + + def test_making_string_from_euro_value_works_correctly(self) -> None: + test_value = 13466 + expected_result = "134.66 €" + self.assertEqual(expected_result, AccountingService.make_euro_string_from_int(test_value)) + + def test_making_euro_string_from_negative_value_works_correctly(self) -> None: + test_value = -99741 + expected_result = "-997.41 €" + self.assertEqual(expected_result, AccountingService.make_euro_string_from_int(test_value)) + + def test_making_euro_string_from_less_than_ten_cents_works_correctly(self) -> None: + test_value = 4 + expected_result = "0.04 €" + self.assertEqual(expected_result, AccountingService.make_euro_string_from_int(test_value)) + + async def test_get_balance_correctly_adds_up_transactions(self) -> None: + self.mock_database_service.get_all_transactions_for_user = AsyncMock(return_value=[ + Transaction( + user_id=0, + value=5, + is_debit=True, + reference="", + transaction_date=datetime.now() + ), + Transaction( + user_id=0, + value=99, + is_debit=False, + reference="", + transaction_date=datetime.now() + ), + Transaction( + user_id=0, + value=101, + is_debit=False, + reference="", + transaction_date=datetime.now() + ), + Transaction( + user_id=0, + value=77, + is_debit=True, + reference="", + transaction_date=datetime.now() + ), + ]) + expected_result = 118 + actual_result = await self.accounting_service.get_balance(0) + + self.assertEqual(expected_result, actual_result) + + async def test_trying_to_remove_more_than_is_on_account_balance_raises_exception(self) -> None: + user_balance = 100 + balance_to_remove = 101 + self.mock_database_service.get_all_transactions_for_user = AsyncMock(return_value=[ + Transaction( + user_id=0, + value=user_balance, + is_debit=False, + reference="", + transaction_date=datetime.now() + ) + ]) + + with self.assertRaises(InsufficientFundsError): + await self.accounting_service.remove_balance(0, balance_to_remove, "TestRef") + + async def test_trying_to_remove_less_than_is_on_account_balance_spawns_correct_transaction(self) -> None: + user_balance = 101 + balance_to_remove = 100 + reference = "Yey, a reference" + + self.mock_database_service.get_all_transactions_for_user = AsyncMock(return_value=[ + Transaction( + user_id=123, + value=user_balance, + is_debit=False, + reference="", + transaction_date=datetime.now() + ) + ]) + + await self.accounting_service.remove_balance(123, balance_to_remove, reference) + + # Async unittest API is still not perfect for retrieving a call value. So we force it to hand it over. + last_transaction: Transaction = self.mock_database_service.add_transaction.call_args_list[-1].args[-1] + + self.assertEqual(123, last_transaction.user_id) + self.assertEqual(balance_to_remove, last_transaction.value) + self.assertEqual(True, last_transaction.is_debit) + self.assertEqual(reference, last_transaction.reference) diff --git a/testing/unittests/__init__.py b/testing/unittests/__init__.py new file mode 100644 index 0000000..e69de29