summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ledger_process.py16
-rw-r--r--test_ledger_process.py68
2 files changed, 70 insertions, 14 deletions
diff --git a/ledger_process.py b/ledger_process.py
index 24a6aca..dd82877 100644
--- a/ledger_process.py
+++ b/ledger_process.py
@@ -37,25 +37,11 @@ class LedgerProcess:
# Group trades by refid
if action.type == "trade":
- assert len(actions) == 2
self._process_trade(refid, actions)
elif action.type == "deposit" and action.asset != "EUR":
assert len(actions) == 1
logger.error("Don't know how do handle deposits yet.")
- # currency = action.asset
- # fifo_queues.setdefault(currency, FIFOQueue())
- # amount = Decimal(action.amount)
- # price = 0
- # current = fifo_queues[currency]
-
- # # remove transaction fees
- # # (but only if it has a previous withdraw, or rather, if these are coins from a previous purchase...
- # # but I can't check that...)
- # if len(current):
- # current.remove_coins(action.fee)
-
- # current.add(amount, price, action.date)
elif action.type == "withdrawal" and action.asset != "EUR":
assert len(actions) == 1
@@ -111,6 +97,8 @@ class LedgerProcess:
Trade(crypto_amount, -proceeds, date_sold, refid=refid)
)
else:
+ logger.error(f"Trade group doesn't have expected currencies.")
raise ValueError(f"Unexpected trade grouping for refid {refid}")
else:
+ logger.error(f"Trade group has {len(trades)} trades, expected 2.")
raise ValueError(f"Unexpected number of trades for refid {refid}")
diff --git a/test_ledger_process.py b/test_ledger_process.py
new file mode 100644
index 0000000..092619a
--- /dev/null
+++ b/test_ledger_process.py
@@ -0,0 +1,68 @@
+import unittest
+from decimal import Decimal
+from ledger_action import LedgerAction
+from ledger_process import LedgerProcess
+
+
+class TestLedgerProcess(unittest.TestCase):
+ def setUp(self):
+ """Set up a LedgerProcess instance for testing."""
+ self.lp = LedgerProcess()
+
+ def test_process_trade_valid(self):
+ """Test valid processing of a trade with both EUR and crypto assets."""
+ eur_trade = LedgerAction(
+ type="trade",
+ asset="EUR",
+ amount=Decimal("-500.00"),
+ fee=Decimal("2.00"),
+ timestamp="2025-04-17 10:00:00",
+ refid="12345",
+ )
+ crypto_trade = LedgerAction(
+ type="trade",
+ asset="BTC",
+ amount=Decimal("0.1"),
+ fee=Decimal("0.001"),
+ timestamp="2025-04-17 10:00:00",
+ refid="12345",
+ )
+ self.lp.process_ledger([eur_trade, crypto_trade])
+ # Assert the remaining balance in the FIFO queue
+ self.assertEqual(
+ self.lp.fifo_queues["BTC"].get_remaining_amount(), Decimal("0.099")
+ )
+
+ def test_empty_actions(self):
+ """Test processing with no actions."""
+ self.lp.process_ledger([])
+ # with self.assertRaises(ValueError):
+
+ def test_missing_trade_rows(self):
+ """Test processing a trade with missing EUR or crypto rows."""
+ crypto_trade = LedgerAction(
+ type="trade",
+ asset="BTC",
+ amount=Decimal("0.1"),
+ fee=Decimal("0.001"),
+ timestamp="2025-04-17 10:00:00",
+ refid="12345",
+ )
+ with self.assertRaises(ValueError):
+ self.lp.process_ledger([crypto_trade]) # EUR row missing
+
+ def test_unsupported_deposit(self):
+ """Test handling unsupported deposits."""
+ deposit = LedgerAction(
+ type="deposit",
+ asset="BTC",
+ amount=Decimal("1.00"),
+ fee=Decimal("0.00"),
+ timestamp="2025-04-17 10:00:00",
+ refid="67890",
+ )
+ self.lp.process_ledger([deposit])
+
+
+if __name__ == "__main__":
+ unittest.main()