This commit is contained in:
SowinskiBraeden committed 2026-06-22 00:25:57 -07:00
1 parent 7e7b3a7011
commit 77198e5b47
19 files changed
+2920 -2656

No files matched your search

+1
View File
@@ -0,0 +1 @@
Binary file not shown.
Binary file not shown.
Binary file not shown.
+118
View File
@@ -0,0 +1,118 @@
import unittest
from stats import build_session_summaries
def cents(amount: float) -> int:
return int(round(amount * 100))
def event(
session_id: str,
session_date: str,
player_name: str,
event_type: str,
amount: float,
index: int,
):
return {
"id": f"{session_id}-{index}",
"created_at": f"2026-01-01T00:00:{index:02d}+00:00",
"session_id": session_id,
"session_date": session_date,
"player_name": player_name,
"event_type": event_type,
"amount_cents": cents(amount),
"note": "",
"actor": "test",
}
class AccountingTests(unittest.TestCase):
def entry_for(self, rows, session_id="s1", player_name="A"):
sessions = build_session_summaries(rows)
session = next(s for s in sessions if s.session_id == session_id)
entry = next(e for e in session.entries if e.player_name == player_name)
return session, entry
def test_buyin_cashout_and_paid_are_distinct(self):
session, entry = self.entry_for(
[
event("s1", "2026-01-01", "A", "buyin", 10, 1),
event("s1", "2026-01-01", "A", "cashout", 20, 2),
event("s1", "2026-01-01", "A", "paid", 20, 3),
]
)
self.assertEqual(entry.invested_cents, cents(10))
self.assertEqual(entry.net_cents, cents(10))
self.assertEqual(session.total_cash_in_cents, cents(10))
self.assertEqual(session.total_paid_out_cents, cents(20))
self.assertEqual(entry.current_due_to_player_cents, 0)
self.assertEqual(entry.current_due_to_house_cents, 0)
def test_front_is_invested_but_not_cash_in_until_collected(self):
session, entry = self.entry_for(
[
event("s1", "2026-01-01", "A", "front", 5, 1),
event("s1", "2026-01-01", "A", "cashout", 8, 2),
event("s1", "2026-01-01", "A", "paid", 3, 3),
]
)
self.assertEqual(entry.invested_cents, cents(5))
self.assertEqual(entry.net_cents, cents(3))
self.assertEqual(entry.gross_payout_cents, cents(3))
self.assertEqual(entry.current_due_to_player_cents, 0)
self.assertEqual(session.total_cash_in_cents, 0)
self.assertEqual(session.total_paid_out_cents, cents(3))
def test_rollover_out_reduces_source_session_payable_without_cash_out(self):
session, entry = self.entry_for(
[
event("s1", "2026-01-01", "A", "buyin", 10, 1),
event("s1", "2026-01-01", "A", "cashout", 19.50, 2),
event("s1", "2026-01-01", "A", "rollover_out", 10, 3),
]
)
self.assertEqual(entry.net_cents, cents(9.50))
self.assertEqual(entry.gross_payout_cents, cents(19.50))
self.assertEqual(entry.current_due_to_player_cents, cents(9.50))
self.assertEqual(session.total_paid_out_cents, 0)
def test_rollover_in_is_invested_without_new_cash_in(self):
rows = [
event("s1", "2026-01-01", "A", "buyin", 10, 1),
event("s1", "2026-01-01", "A", "cashout", 19.50, 2),
event("s1", "2026-01-01", "A", "rollover_out", 10, 3),
event("s2", "2026-01-02", "A", "rollover_in", 10, 4),
]
sessions = build_session_summaries(rows)
source = next(s for s in sessions if s.session_id == "s1")
dest = next(s for s in sessions if s.session_id == "s2")
dest_entry = dest.entries[0]
self.assertEqual(sum(s.total_cash_in_cents for s in sessions), cents(10))
self.assertEqual(source.total_current_due_to_player_cents, cents(9.50))
self.assertEqual(dest_entry.invested_cents, cents(10))
self.assertEqual(dest.total_cash_in_cents, 0)
def test_debt_repayment_and_writeoff_resolve_front_without_inflating_cash(self):
session, entry = self.entry_for(
[
event("s1", "2026-01-01", "A", "front", 10, 1),
event("s1", "2026-01-01", "A", "cashout", 0, 2),
event("s1", "2026-01-01", "A", "front_collected", 6, 3),
event("s1", "2026-01-01", "A", "front_writeoff", 4, 4),
]
)
self.assertEqual(entry.player_owes_gross_cents, cents(10))
self.assertEqual(entry.current_due_to_house_cents, 0)
self.assertEqual(session.total_cash_in_cents, cents(6))
self.assertEqual(session.total_front_writeoff_cents, cents(4))
if __name__ == "__main__":
unittest.main()