diff --git a/breathecode/authenticate/tests/urls/v1/tests_email_verification.py b/breathecode/authenticate/tests/urls/v1/tests_email_verification.py new file mode 100644 index 000000000..583ff2e89 --- /dev/null +++ b/breathecode/authenticate/tests/urls/v1/tests_email_verification.py @@ -0,0 +1,55 @@ +""" +Test cases for /emailvalidation +""" + +import pytest +from django.urls.base import reverse_lazy +from rest_framework import status +from rest_framework.test import APIClient +from linked_services.django.actions import reset_app_cache + +from breathecode.tests.mixins.breathecode_mixin.breathecode import Breathecode + + +@pytest.fixture(autouse=True) +def setup(db): + reset_app_cache() + yield + + +def test_email_verification_no_user(bc: Breathecode, client: APIClient): + email = "thanos@4geeks.com" + + url = reverse_lazy("authenticate:email_verification", kwargs={"email": email}) + response = client.get(url) + + json = response.json() + expected = {"detail": "email-not-found", "status_code": 400} + + assert json == expected + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_email_verification_not_validated(bc: Breathecode, client: APIClient): + email = "thanos@4geeks.com" + + model = bc.database.create(user={"email": email}, user_invite={"email": email, "is_email_validated": False}) + + url = reverse_lazy("authenticate:email_verification", kwargs={"email": email}) + response = client.get(url) + + json = response.json() + expected = {"detail": "email-not-validated", "status_code": 400} + + assert json == expected + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_email_verification(bc: Breathecode, client: APIClient): + email = "thanos@4geeks.com" + model = bc.database.create(user={"email": email}) + + url = reverse_lazy("authenticate:email_verification", kwargs={"email": email}) + response = client.get(url) + + assert response.status_code == status.HTTP_204_NO_CONTENT diff --git a/breathecode/authenticate/urls/v1.py b/breathecode/authenticate/urls/v1.py index 2e0b7d8a9..e97b9052e 100644 --- a/breathecode/authenticate/urls/v1.py +++ b/breathecode/authenticate/urls/v1.py @@ -51,6 +51,7 @@ UserMeView, UserSettingsView, WaitingListView, + EmailVerification, get_facebook_token, get_github_token, get_google_token, @@ -89,6 +90,7 @@ app_name = "authenticate" urlpatterns = [ + path("emailverification/", EmailVerification.as_view(), name="email_verification"), path("confirmation/", ConfirmEmailView.as_view(), name="confirmation_token"), path("invite/resend/", ResendInviteView.as_view(), name="invite_resend_id"), path("member/invite/resend/", AcademyInviteView.as_view(), name="member_invite_resend_id"), diff --git a/breathecode/authenticate/views.py b/breathecode/authenticate/views.py index 39b714274..ceadbcd10 100644 --- a/breathecode/authenticate/views.py +++ b/breathecode/authenticate/views.py @@ -530,6 +530,35 @@ def put(self, request, profile_academy_id=None, new_status=None): return Response(serializer.data) +class EmailVerification(APIView): + permission_classes = [AllowAny] + + def get(self, request, email=None): + get_user_language(request) + + invite = UserInvite.objects.filter(email=email).first() + user = User.objects.filter(email=email).first() + if user is None and invite is None: + raise ValidationException( + translation( + en="We could not find an account with this email", + es="No pudimos encontrar una dirección con este email", + ), + slug="email-not-found", + ) + + if invite is not None and not invite.is_email_validated: + raise ValidationException( + translation( + en="You need to validate your email first", + es="Debes validar tu email primero", + ), + slug="email-not-validated", + ) + + return Response(None, status=status.HTTP_204_NO_CONTENT) + + class ConfirmEmailView(APIView): permission_classes = [AllowAny]