from solution import Order, OrderItem, Payment
def test_partial_payment_flow():
print("Running partial payment tests...")
order = Order("O_EXT_1")
order.add_item(OrderItem("I1", 100, 2)) # total = 200
assert order.get_total_amount() == 200
assert order.get_status() == "CREATED"
assert order.make_payment(Payment(50)) is True
assert order.get_status() == "PARTIALLY_PAID"
assert order.make_payment(Payment(100)) is True
assert order.get_status() == "PARTIALLY_PAID"
assert order.make_payment(Payment(50)) is True
assert order.get_status() == "PAID"
print("✅ Partial payment flow tests passed")
def test_overpayment_not_allowed():
print("Running overpayment tests...")
order = Order("O_EXT_2")
order.add_item(OrderItem("I2", 100, 1)) # total = 100
assert order.make_payment(Payment(70)) is True
assert order.make_payment(Payment(40)) is False # exceeds total
print("✅ Overpayment tests passed")
def test_cancel_after_partial_payment():
print("Running cancel after partial payment tests...")
order = Order("O_EXT_3")
order.add_item(OrderItem("I3", 100, 1))
assert order.make_payment(Payment(30)) is True
assert order.get_status() == "PARTIALLY_PAID"
assert order.cancel() is True
assert order.get_status() == "CANCELLED"
assert order.make_payment(Payment(70)) is False
print("✅ Cancel after partial payment tests passed")
def test_no_payment_after_paid():
print("Running no payment after PAID tests...")
order = Order("O_EXT_4")
order.add_item(OrderItem("I4", 50, 2)) # total = 100
assert order.make_payment(Payment(100)) is True
assert order.get_status() == "PAID"
assert order.make_payment(Payment(10)) is False
print("✅ No payment after PAID tests passed")
if __name__ == "__main__":
test_partial_payment_flow()
test_overpayment_not_allowed()
test_cancel_after_partial_payment()
test_no_payment_after_paid()
print("\n🎉 ALL DAY 8 EXTENSION TESTS PASSED SUCCESSFULLY")