test_payment_finance_status_regression.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """两类缴费的财务确认/退回成功路径与重复操作拒绝,纯内存数据库。"""
  2. import pytest
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.orm import sessionmaker
  5. from app.crud import presign_order, protocol_sample_payment
  6. from app.models.base import Base
  7. from app.models.models import (
  8. BizCollectionProtocol, BizPresignOrder, BizPresignTransfer,
  9. BizProtocolSamplePayment, BizProtocolPaymentSchedule, BizProtocolPaymentTransfer,
  10. )
  11. @pytest.mark.parametrize('kind', ['presign', 'sample'])
  12. @pytest.mark.parametrize('operation,expected', [('confirm', 'yjf'), ('reject', 'dfj')])
  13. def test_finance_transition_succeeds_once_and_rejects_duplicate(kind, operation, expected):
  14. engine = create_engine('sqlite:///:memory:')
  15. Base.metadata.create_all(engine)
  16. with sessionmaker(bind=engine)() as db:
  17. common = dict(tenant_no='tenant-a', create_dept_id='', del_flag=0)
  18. if kind == 'presign':
  19. db.add(BizPresignOrder(id='p', order_status='active', protocol_no='P', **common))
  20. db.add(BizPresignTransfer(id='t', presign_order_id='p', pay_status='jfqrz', transfer_amount=100, **common))
  21. crud, model = presign_order, BizPresignTransfer
  22. else:
  23. db.add_all([
  24. BizCollectionProtocol(id='p', protocol_no='P', **common),
  25. BizProtocolSamplePayment(id='pay', collection_protocol_id='p', sample_code='S', pay_mode='dj', contract_amount=100, **common),
  26. BizProtocolPaymentSchedule(id='sch', sample_payment_id='pay', collection_protocol_id='p', sample_code='S', schedule_no=1, due_amount=100, schedule_status='open', **common),
  27. BizProtocolPaymentTransfer(id='t', schedule_id='sch', sample_payment_id='pay', collection_protocol_id='p', sample_code='S', transfer_amount=100, pay_status='jfqrz', **common),
  28. ])
  29. crud, model = protocol_sample_payment, BizProtocolPaymentTransfer
  30. db.commit()
  31. function = crud.confirm_receipt if operation == 'confirm' else crud.reject_receipt
  32. result = function(db, transfer_id='t', tenant_no='tenant-a', user_id='finance')
  33. assert result.pay_status == expected
  34. with pytest.raises(ValueError):
  35. function(db, transfer_id='t', tenant_no='tenant-a', user_id='finance')
  36. assert db.query(model).filter_by(id='t').one().pay_status == expected
  37. if kind == 'sample' and operation == 'confirm':
  38. assert (
  39. db.query(BizProtocolPaymentSchedule).filter_by(id='sch').one().schedule_status
  40. == 'cleared'
  41. )
  42. engine.dispose()