from datetime import timedelta from rest_framework import status from rest_framework.test import APITestCase, APIClient from django.utils import timezone from labs.models import Exam, ExamVariant, ExamVoucher, User, UserExamRedemption class RedeemEventExamVoucherTests(APITestCase): def setUp(self): self.client = APIClient() self.user = User.objects.create_user(email="redeem-event@test.com") self.client.force_login(self.user) def test_redeem_event_accepts_exam_voucher(self): exam = Exam.objects.create(code="exam_paid", credits=1, published=True) ExamVariant.objects.create(exam=exam, language_code="en", title="Exam Paid (EN)") voucher_code = "EXAM-AAAAA-BBBBB-CCCCC-DDDDD-EEEEE" voucher = ExamVoucher.objects.create( unique_code=voucher_code, exam=exam, valid_before=(timezone.now() + timedelta(days=30)).date(), used=ExamVoucher.UsedChoices.N, marketing_code="test", ) resp = self.client.post( "/api/labs/redeem_event", data={"event_voucher_code": voucher_code.lower()}, ) self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual( resp.data["message"], "Redeem success! You can now start the exam exam_paid.", ) voucher.refresh_from_db() self.assertEqual(voucher.used, ExamVoucher.UsedChoices.Y) self.assertEqual(voucher.redeem_by_id, self.user.id) redemption = UserExamRedemption.objects.get( user=self.user, exam=exam, exam_attempt__isnull=True, ) self.assertEqual(redemption.redeem_type, UserExamRedemption.RedeemType.VOUCHER) self.assertEqual( redemption.redeem_detail, { "voucher_code": voucher_code, "marketing_code": "test", }, )