"""core_ro.sum_trades_on_date 单测(A2 · sqlite 内存库验证 SQL 逻辑,MySQL 对照留灌库后)。""" from datetime import date, datetime from decimal import Decimal import pytest from sqlalchemy import text from _ddl import create_sqlite_engine from app.repository.core_ro import CoreReadOnlyRepository @pytest.fixture() def repo(): engine = create_sqlite_engine() # DDL 单一事实源(B4 评审 P3-12) def insert(trade_id, amount, traded_at, trade_type="subscribe", status="confirmed", cid="C1"): with engine.begin() as conn: conn.execute( text( "INSERT INTO core_trade (trade_id, customer_id, product_id, trade_type," " amount, trade_status, traded_at)" " VALUES (:tid, :cid, 'P1', :tt, :amt, :st, :at)" ), { "tid": trade_id, "cid": cid, "tt": trade_type, "amt": amount, "st": status, "at": traded_at, }, ) yield CoreReadOnlyRepository(engine=engine), insert engine.dispose() DAY = date(2026, 9, 6) def _at(hour, minute=0): return datetime(2026, 9, 6, hour, minute) def test_sum_only_confirmed_subscribe_redeem(repo): r, insert = repo insert("T1", "600000", _at(9)) # subscribe 计入 insert("T2", "400000", _at(10), "redeem") # redeem 计入 insert("T3", "999999", _at(11), status="pending") # 未确认不计 insert("T4", "999999", _at(12), "convert") # convert 不计 assert r.sum_trades_on_date("C1", DAY) == Decimal("1000000") def test_sum_excludes_other_days(repo): r, insert = repo insert("T1", "500000", _at(9)) insert("T2", "500000", datetime(2026, 9, 5, 23)) # 前一日不计 insert("T3", "500000", datetime(2026, 9, 7, 0)) # 次日不计 assert r.sum_trades_on_date("C1", DAY) == Decimal("500000") def test_sum_empty_is_zero(repo): r, _ = repo assert r.sum_trades_on_date("C1", DAY) == Decimal(0) def test_sum_per_customer(repo): r, insert = repo insert("T1", "500000", _at(9), cid="C1") insert("T2", "500000", _at(9), cid="C2") assert r.sum_trades_on_date("C1", DAY) == Decimal("500000") assert r.sum_trades_on_date("C2", DAY) == Decimal("500000")