Desi-Clans/backend/tests/test_digital_tickets.py
2026-10-08 02:52:58 +05:30

61 lines
2.3 KiB
Python

import json
from tests.helpers import auth_headers, client, create_pending_order
from app.core.config import get_settings
from app.services.payments.gateway import MockPaymentGateway, get_payment_gateway
def _pay_and_get_ticket():
token, checkout = create_pending_order()
gateway = get_payment_gateway()
assert isinstance(gateway, MockPaymentGateway)
payment = checkout["payment"]
payment_id = f"mock_pay_{checkout['id']}"
signature = gateway.build_mock_checkout_signature(payment["provider_order_id"], payment_id)
client.post(
f"/api/orders/{checkout['id']}/payment/verify",
headers=auth_headers(token),
json={
"provider_order_id": payment["provider_order_id"],
"provider_payment_id": payment_id,
"signature": signature,
},
)
tickets = client.get("/api/tickets/my", headers=auth_headers(token)).json()
ticket_id = tickets[0]["id"]
return token, ticket_id
def test_ticket_detail_includes_qr() -> None:
token, ticket_id = _pay_and_get_ticket()
response = client.get(f"/api/tickets/{ticket_id}", headers=auth_headers(token))
assert response.status_code == 200
body = response.json()
assert body["qr_image_base64"]
assert body["event_title"]
assert body["venue_name"]
assert body["ticket_type_name"]
assert body["code"].startswith("DC-")
payload = json.loads(body["qr_payload"])
assert payload["token"] == body["qr_token"]
def test_verify_marks_ticket_used_and_prevents_reuse() -> None:
token, ticket_id = _pay_and_get_ticket()
detail = client.get(f"/api/tickets/{ticket_id}", headers=auth_headers(token)).json()
qr_token = detail["qr_token"]
settings = get_settings()
headers = {}
if settings.ticket_verify_api_key:
headers["X-Check-In-Key"] = settings.ticket_verify_api_key
first = client.post("/api/tickets/verify", json={"qr_token": qr_token}, headers=headers)
assert first.status_code == 200
assert first.json()["valid"] is True
assert first.json()["status"] == "used"
second = client.post("/api/tickets/verify", json={"qr_token": qr_token}, headers=headers)
assert second.status_code == 200
assert second.json()["valid"] is False
assert "already used" in second.json()["message"].lower()