Coverage for payment\views.py: 37%
38 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 15:18 +0200
1from django.db import transaction
2from drf_spectacular.utils import extend_schema
3from rest_framework.views import APIView
4from rest_framework.response import Response
5from rest_framework import status
6from rest_framework.permissions import IsAuthenticated
8from api.serializers import TicketSerializer
9from .serializers import MockPaymentRequestSerializer, MockPaymentResponseSerializer
10from .services.payment_service import PaymentService
11from .services.ticket_service import TicketService
14class MockPaymentView(APIView):
15 """
16 Endpoint POST /api/payments/check/
17 Simule un appel a un service de paiement.
18 """
19 permission_classes = [IsAuthenticated]
21 @extend_schema(
22 request=MockPaymentRequestSerializer,
23 responses=MockPaymentResponseSerializer,
24 tags=['Paiement']
25 )
27 def post(self, request):
28 serializer = MockPaymentRequestSerializer(data=request.data)
29 serializer.is_valid(raise_exception=True)
30 data = serializer.validated_data
32 amount = data["amount"]
33 force_failed = data.get("force_failed", False)
34 items = data.get("items", [])
36 payment_service = PaymentService()
38 payment_intent = payment_service.create_payment_intent(amount, force_failed)
40 response_data = {
41 "success": False,
42 "gateway_response": payment_intent,
43 "tickets": [],
44 "errors": []
45 }
47 tickets = []
48 if payment_intent["status"] == "requires_confirmation" and items:
49 try:
50 with transaction.atomic():
51 tickets = TicketService.create_tickets_from_items(
52 request.user.client_profile,
53 items
54 )
56 # Confirmation du paiement
57 confirmed = payment_service.confirm_payment(payment_intent["transaction_id"])
58 response_data["success"] = True
59 response_data["gateway_response"] = confirmed
62 except ValueError as e:
63 refund = payment_service.refund(payment_intent["transaction_id"])
64 response_data["errors"].append({"reason": str(e)})
65 response_data["gateway_response"] = refund
67 response_data["tickets"] = TicketSerializer(tickets, many=True).data
68 response_serializer = MockPaymentResponseSerializer(response_data)
69 return Response(response_serializer.data, status=status.HTTP_200_OK)