from rest_framework.test import APITestCase from rest_framework import status from rest_framework.test import APIClient from labs.models import ( CertificateType, CertificateIssuance, CertificateRecipient, ) class CertificatePublicEndpointsTests(APITestCase): fixtures = [ "labs/tests/fixtures/cert0.json", ] CERTIFICATE_TYPE_LIST_URL = "/api/certificate-types" TLMST_TO_CERTIFICATE_NUMBER_URL = "/api/certificates/tlms-to-cert-number" SEARCH_CERTIFICATE_NUMBER_URL = "/api/certificates/search-cert-number" CERTIFICATE_ISSUANCE_DETAIL_URL = "/api/certificates/{certificate_id}" def setUp(self): self.client = APIClient() def test_get_certificate_type_list(self): response = self.client.get(self.CERTIFICATE_TYPE_LIST_URL) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data), 4) self.assertEqual( set(response.data[0].keys()), {"name", "short_name", "description", "issuer_name", "issuer_website"}, ) def test_get_tlms_to_certificate_number_success(self): response = self.client.get( self.TLMST_TO_CERTIFICATE_NUMBER_URL, {"user_gid": "e2631f42d5b93a768552", "course_id": "288"}, ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["cert_number"], "0000-1111-2222-3333") def test_get_tlms_to_certificate_number_bad_request(self): cases = [ { "name": "missing user_gid", "data": {"course_id": "288"}, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "missing course_id", "data": {"user_gid": "e2631f42d5b93a768552"}, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "both user_gid and course_id are missing", "data": {}, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "not found", "data": {"user_gid": "e2631f42d5b93a768552", "course_id": "289"}, "expected_status": status.HTTP_404_NOT_FOUND, }, ] for case in cases: with self.subTest(case=case): response = self.client.get( self.TLMST_TO_CERTIFICATE_NUMBER_URL, case["data"] ) self.assertEqual(response.status_code, case["expected_status"]) def test_get_search_certificate_number_success(self): response = self.client.get( self.SEARCH_CERTIFICATE_NUMBER_URL, { "email": "test.user1@example.com", "first_name": "Test", "last_name": "User1", "cert_short_name": "Practitioner", }, ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["cert_number"], "0000-1111-2222-3333") def test_get_search_certificate_number_bad_request(self): cases = [ { "name": "missing email", "data": { "first_name": "Test", "last_name": "User1", "cert_short_name": "Practitioner", }, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "missing first_name", "data": { "email": "test.user1@example.com", "last_name": "User1", "cert_short_name": "Practitioner", }, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "missing last_name", "data": { "email": "test.user1@example.com", "first_name": "Test", "cert_short_name": "Practitioner", }, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "missing cert_short_name", "data": { "email": "test.user1@example.com", "first_name": "Test", "last_name": "User1", }, "expected_status": status.HTTP_400_BAD_REQUEST, }, { "name": "not found", "data": { "email": "test.user1@example.com", "first_name": "Test", "last_name": "User1", "cert_short_name": "PCTA_v6", }, "expected_status": status.HTTP_404_NOT_FOUND, }, ] for case in cases: with self.subTest(case=case): response = self.client.get( self.SEARCH_CERTIFICATE_NUMBER_URL, case["data"] ) self.assertEqual(response.status_code, case["expected_status"]) def test_get_certificate_issuance_detail_success(self): response = self.client.get( self.CERTIFICATE_ISSUANCE_DETAIL_URL.format( certificate_id="0000-1111-2222-3333" ) ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["cert_number"], "0000-1111-2222-3333") self.assertEqual(response.data["issued_at"], "16/07/2025") self.assertEqual( response.data["cert_type"], { "name": "TiDB Practitioner", "short_name": "Practitioner", "description": None, "issuer_name": "PingCAP", "issuer_website": "https://www.pingcap.com/education/", }, ) self.assertEqual( response.data["recipient"], { "first_name": "Test", "last_name": "User1", }, ) def test_get_certificate_issuance_detail_not_found(self): response = self.client.get( self.CERTIFICATE_ISSUANCE_DETAIL_URL.format( certificate_id="0000-1111-2222-3334" ) ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)