Skip to content

Commit

Permalink
Store privacy policy in newsletter
Browse files Browse the repository at this point in the history
  • Loading branch information
marcoacierno committed Oct 4, 2024
1 parent a63f6fb commit 49fb21e
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 20 deletions.
12 changes: 11 additions & 1 deletion backend/api/newsletters/mutations/subscribe_to_newsletter.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from api.utils import get_ip
import requests
import logging
from privacy_policy.record import record_privacy_policy_acceptance
from conferences.models.conference import Conference
from integrations.flodesk import SubscriptionResult, subscribe
from typing import Annotated, Union
from api.context import Info
Expand Down Expand Up @@ -28,6 +30,7 @@ class SubscribeToNewsletterErrors(BaseErrorType):
@strawberry.type
class _SubscribeToNewsletterErrors:
email: list[str] = strawberry.field(default_factory=list)
conference_code: list[str] = strawberry.field(default_factory=list)
non_field_errors: list[str] = strawberry.field(default_factory=list)

errors: _SubscribeToNewsletterErrors = None
Expand All @@ -36,6 +39,7 @@ class _SubscribeToNewsletterErrors:
@strawberry.input
class SubscribeToNewsletterInput:
email: str
conference_code: str

def validate(self) -> SubscribeToNewsletterErrors:
errors = SubscribeToNewsletterErrors()
Expand All @@ -48,6 +52,9 @@ def validate(self) -> SubscribeToNewsletterErrors:
except ValidationError:
errors.add_error("email", "Invalid email address")

if not Conference.objects.filter(code=self.conference_code).exists():
errors.add_error("conference_code", "Invalid conference code")

return errors.if_has_errors


Expand All @@ -64,11 +71,14 @@ def subscribe_to_newsletter(
if errors := input.validate():
return errors

conference = Conference.objects.get(code=input.conference_code)
email = input.email
request = info.context.request

try:
return NewsletterSubscribeResult(status=subscribe(email, ip=get_ip(request)))
result = NewsletterSubscribeResult(status=subscribe(email, ip=get_ip(request)))
record_privacy_policy_acceptance(info.context.request, conference, "newsletter")
return result
except requests.exceptions.HTTPError as e:
logger.error(
"Unable to subscribe the user due to flodesk API error %s %s",
Expand Down
73 changes: 54 additions & 19 deletions backend/api/tests/schema/test_newsletter.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from unittest.mock import patch

from conferences.tests.factories import ConferenceFactory
from users.tests.factories import UserFactory
import pytest
from pytest import mark
Expand All @@ -10,14 +11,13 @@


def test_subscribe_to_newsletter(graphql_client):
conference = ConferenceFactory()
email = "me@example.it"
variables = {"email": email}
variables = {"email": email, "conferenceCode": conference.code}

query = """
mutation($email: String!) {
subscribeToNewsletter(input: {
email: $email
}) {
mutation($input: SubscribeToNewsletterInput!) {
subscribeToNewsletter(input: $input) {
__typename
... on NewsletterSubscribeResult {
Expand All @@ -32,7 +32,7 @@ def test_subscribe_to_newsletter(graphql_client):
) as mock_subscription:
mock_subscription.return_value = SubscriptionResult.SUBSCRIBED

resp = graphql_client.query(query, variables=variables)
resp = graphql_client.query(query, variables={"input": {variables}})

assert (
resp["data"]["subscribeToNewsletter"]["__typename"]
Expand All @@ -49,14 +49,13 @@ def test_subscribe_to_newsletter(graphql_client):
],
)
def test_subscribe_to_newsletter_fails_on_api_side(graphql_client, exception):
conference = ConferenceFactory()
email = "me@example.it"
variables = {"email": email}
variables = {"email": email, "conferenceCode": conference.code}

query = """
mutation($email: String!) {
subscribeToNewsletter(input: {
email: $email
}) {
mutation($input: SubscribeToNewsletterInput!) {
subscribeToNewsletter(input: $input) {
__typename
... on NewsletterSubscribeResult {
Expand All @@ -71,7 +70,7 @@ def test_subscribe_to_newsletter_fails_on_api_side(graphql_client, exception):
) as mock_subscription:
mock_subscription.side_effect = exception

resp = graphql_client.query(query, variables=variables)
resp = graphql_client.query(query, variables={"input": variables})

assert (
resp["data"]["subscribeToNewsletter"]["__typename"]
Expand All @@ -82,13 +81,12 @@ def test_subscribe_to_newsletter_fails_on_api_side(graphql_client, exception):

@pytest.mark.parametrize("email", ["", "me-invalid"])
def test_subscribe_to_newsletter_with_invalid_email_fails(graphql_client, email):
variables = {"email": email}
conference = ConferenceFactory()
variables = {"email": email, "conferenceCode": conference.code}

query = """
mutation($email: String!) {
subscribeToNewsletter(input: {
email: $email
}) {
mutation($input: SubscribeToNewsletterInput!) {
subscribeToNewsletter(input: $input) {
__typename
... on SubscribeToNewsletterErrors {
Expand All @@ -105,7 +103,7 @@ def test_subscribe_to_newsletter_with_invalid_email_fails(graphql_client, email)
) as mock_subscription:
mock_subscription.return_value = SubscriptionResult.SUBSCRIBED

resp = graphql_client.query(query, variables=variables)
resp = graphql_client.query(query, variables={"input": variables})

assert (
resp["data"]["subscribeToNewsletter"]["__typename"]
Expand All @@ -116,9 +114,46 @@ def test_subscribe_to_newsletter_with_invalid_email_fails(graphql_client, email)
]


@pytest.mark.parametrize("conference_code", ["", "invalid-conf"])
def test_subscribe_to_newsletter_with_invalid_conference_code(
graphql_client, conference_code
):
ConferenceFactory(code="valid")
variables = {"email": "example@example.com", "conferenceCode": conference_code}

query = """
mutation($input: SubscribeToNewsletterInput!) {
subscribeToNewsletter(input: $input) {
__typename
... on SubscribeToNewsletterErrors {
errors {
email
conferenceCode
}
}
}
}
"""

with patch(
"api.newsletters.mutations.subscribe_to_newsletter.subscribe"
) as mock_subscription:
mock_subscription.return_value = SubscriptionResult.SUBSCRIBED
resp = graphql_client.query(query, variables={"input": variables})

assert (
resp["data"]["subscribeToNewsletter"]["__typename"]
== "SubscribeToNewsletterErrors"
)
assert resp["data"]["subscribeToNewsletter"]["errors"]["conferenceCode"] == [
"Invalid conference code"
]


def _update_user_newsletter(graphql_client, user, open_to_newsletter):
query = """
mutation(
mutation(
$open_to_newsletter: Boolean!,
$open_to_recruiting: Boolean!,
$date_birth: String
Expand Down

0 comments on commit 49fb21e

Please sign in to comment.