feat: add avatar payments and finance management
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.services.finance_service import FinanceService
|
||||
|
||||
|
||||
def _db():
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
db = Session(engine)
|
||||
db.execute(text("""
|
||||
CREATE TABLE users (id TEXT PRIMARY KEY, nickname TEXT, phone TEXT)
|
||||
"""))
|
||||
db.execute(text("""
|
||||
CREATE TABLE token_payment_orders (
|
||||
id TEXT, order_no TEXT PRIMARY KEY, user_id TEXT, plan_id TEXT,
|
||||
payment_method TEXT, pay_type TEXT, pay_way TEXT, points_amount INTEGER,
|
||||
price_cents INTEGER, status TEXT, provider TEXT, provider_order_id TEXT,
|
||||
provider_order_no TEXT, provider_status TEXT, pay_message TEXT,
|
||||
failure_reason TEXT, refund_status TEXT, created_at TEXT, updated_at TEXT,
|
||||
paid_at TEXT, refunded_at TEXT
|
||||
)
|
||||
"""))
|
||||
db.execute(text("""
|
||||
CREATE TABLE payment_refunds (
|
||||
id TEXT, refund_no TEXT, order_no TEXT, amount_cents INTEGER,
|
||||
points_amount INTEGER, reason TEXT, status TEXT, provider_refund_no TEXT,
|
||||
requested_by TEXT, failure_reason TEXT, created_at TEXT, updated_at TEXT,
|
||||
completed_at TEXT
|
||||
)
|
||||
"""))
|
||||
db.execute(text("""
|
||||
CREATE TABLE invoice_applications (
|
||||
id TEXT, order_no TEXT, user_id TEXT, amount_cents INTEGER, title TEXT,
|
||||
invoice_type TEXT, tax_number TEXT, email TEXT, status TEXT,
|
||||
invoice_no TEXT, invoice_url TEXT, remark TEXT, created_at TEXT,
|
||||
updated_at TEXT, issued_at TEXT
|
||||
)
|
||||
"""))
|
||||
db.execute(text("INSERT INTO users VALUES ('u1','测试用户','13800000000')"))
|
||||
db.execute(text("""
|
||||
INSERT INTO token_payment_orders VALUES (
|
||||
'o1','AV1','u1','1','wechat','WECHAT','APP',2000000,1000,'paid','huihui',
|
||||
'','','SUCCESS','secret-payment-message','','none','2026-09-08 12:00:00',
|
||||
'2026-09-08 12:01:00','2026-09-08 12:01:00',NULL
|
||||
)
|
||||
"""))
|
||||
db.execute(text("""
|
||||
INSERT INTO invoice_applications VALUES (
|
||||
'i1','AV1','u1',1000,'测试用户','personal','','u@example.com','pending',
|
||||
'','','','2026-09-08 12:02:00','2026-09-08 12:02:00',NULL
|
||||
)
|
||||
"""))
|
||||
db.commit()
|
||||
return db
|
||||
|
||||
|
||||
def test_finance_summary_and_orders_hide_provider_payment_payload():
|
||||
db = _db()
|
||||
try:
|
||||
summary = FinanceService.summary(db)
|
||||
assert summary == {
|
||||
"paid_revenue": 10.0,
|
||||
"paid_orders": 1,
|
||||
"pending_orders": 0,
|
||||
"processing_refunds": 0,
|
||||
"pending_invoices": 1,
|
||||
}
|
||||
total, orders = FinanceService.list_orders(db, keyword="测试用户")
|
||||
assert total == 1
|
||||
assert orders[0]["price"] == 10.0
|
||||
assert orders[0]["invoice_status"] == "pending"
|
||||
assert "pay_message" not in orders[0]
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
def test_invoice_can_be_issued_and_pending_order_can_be_closed():
|
||||
db = _db()
|
||||
try:
|
||||
FinanceService.update_invoice(db, "i1", status="issued", invoice_no="FP-001", invoice_url="", remark="")
|
||||
assert db.execute(text("SELECT status, invoice_no FROM invoice_applications WHERE id='i1'" )).fetchone() == ("issued", "FP-001")
|
||||
db.execute(text("""
|
||||
INSERT INTO token_payment_orders
|
||||
(id,order_no,user_id,plan_id,payment_method,pay_type,pay_way,points_amount,price_cents,status,provider,refund_status)
|
||||
VALUES ('o2','AV2','u1','1','alipay','ALIPAY','H5',1,100,'pending','huihui','none')
|
||||
"""))
|
||||
db.commit()
|
||||
FinanceService.close_order(db, "AV2", status="closed", reason="超时")
|
||||
assert db.execute(text("SELECT status FROM token_payment_orders WHERE order_no='AV2'" )).scalar() == "closed"
|
||||
finally:
|
||||
db.close()
|
||||
Reference in New Issue
Block a user