Coverage for payment\views.py: 37%

38 statements  

« 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 

7 

8from api.serializers import TicketSerializer 

9from .serializers import MockPaymentRequestSerializer, MockPaymentResponseSerializer 

10from .services.payment_service import PaymentService 

11from .services.ticket_service import TicketService 

12 

13 

14class MockPaymentView(APIView): 

15 """ 

16 Endpoint POST /api/payments/check/ 

17 Simule un appel a un service de paiement. 

18 """ 

19 permission_classes = [IsAuthenticated] 

20 

21 @extend_schema( 

22 request=MockPaymentRequestSerializer, 

23 responses=MockPaymentResponseSerializer, 

24 tags=['Paiement'] 

25 ) 

26 

27 def post(self, request): 

28 serializer = MockPaymentRequestSerializer(data=request.data) 

29 serializer.is_valid(raise_exception=True) 

30 data = serializer.validated_data 

31 

32 amount = data["amount"] 

33 force_failed = data.get("force_failed", False) 

34 items = data.get("items", []) 

35 

36 payment_service = PaymentService() 

37 

38 payment_intent = payment_service.create_payment_intent(amount, force_failed) 

39 

40 response_data = { 

41 "success": False, 

42 "gateway_response": payment_intent, 

43 "tickets": [], 

44 "errors": [] 

45 } 

46 

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 ) 

55 

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 

60 

61 

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 

66 

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)