import unittest
from payment_lab import Lab

class PaymentLabTest(unittest.TestCase):
    def test_success_and_delivery_failure(self):
        lab = Lab()
        self.assertEqual(lab.pay('order-1', 'data.example', 100), '成功')
        self.assertEqual(lab.record_delivery('order-1', '交付失败'), '交付失败')
        self.assertEqual(lab.payments['order-1']['status'], '成功')

    def test_budget_and_approval(self):
        lab = Lab()
        self.assertEqual(lab.pay('order-1', 'data.example', 1100), '预算不足')
        self.assertEqual(lab.pay('order-2', 'data.example', 500), '需要审批')
        self.assertEqual(lab.pay('order-2', 'data.example', 500, approved=True), '成功')

    def test_expired_and_merchant(self):
        lab = Lab(active=False)
        self.assertEqual(lab.pay('order-1', 'data.example', 100), '授权失效')
        lab.active = True
        self.assertEqual(lab.pay('order-1', 'other.example', 100), '商家不允许')

    def test_timeout_replay_and_conflict(self):
        lab = Lab()
        self.assertEqual(lab.pay('order-1', 'data.example', 100, outcome='timeout'), '状态未知')
        self.assertEqual(lab.pay('order-1', 'data.example', 100), '状态未知')
        self.assertEqual(lab.pay('order-1', 'data.example', 200), '订单标识冲突')
        self.assertEqual(lab.record_delivery('order-1', '已交付'), '不能记录交付')

    def test_reserves_unknown(self):
        lab = Lab(budget=150)
        lab.pay('order-1', 'data.example', 100, outcome='timeout')
        self.assertEqual(lab.pay('order-2', 'data.example', 100), '预算不足')

if __name__ == '__main__':
    unittest.main(verbosity=2)
