Skip to content

Commit 18ddd8b

Browse files
committed
Tests
1 parent ba1882e commit 18ddd8b

File tree

7 files changed

+785
-29
lines changed

7 files changed

+785
-29
lines changed
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
from api.visa.types import (
2+
InvitationLetterRequestStatus as InvitationLetterRequestStatusAPI,
3+
)
4+
from visa.models import InvitationLetterRequestStatus as InvitationLetterRequestStatusDB
5+
from users.tests.factories import UserFactory
6+
from visa.models import InvitationLetterRequestOnBehalfOf
7+
from visa.tests.factories import InvitationLetterRequestFactory
8+
from conferences.tests.factories import ConferenceFactory
9+
import pytest
10+
11+
pytestmark = pytest.mark.django_db
12+
13+
14+
def _query_invitation_letter_request(client, conference):
15+
return client.query(
16+
"""query($conference: String!) {
17+
me {
18+
invitationLetterRequest(conference: $conference) {
19+
id
20+
status
21+
}
22+
}
23+
}""",
24+
variables={
25+
"conference": conference.code,
26+
},
27+
)
28+
29+
30+
def test_get_user_invitation_letter_request_with_none_present(graphql_client, user):
31+
graphql_client.force_login(user)
32+
33+
conference = ConferenceFactory()
34+
response = _query_invitation_letter_request(graphql_client, conference)
35+
36+
me = response["data"]["me"]
37+
assert me["invitationLetterRequest"] is None
38+
39+
40+
def test_get_user_invitation_letter_request(graphql_client, user):
41+
graphql_client.force_login(user)
42+
43+
conference = ConferenceFactory()
44+
invitation_letter_request = InvitationLetterRequestFactory(
45+
requester=user,
46+
conference=conference,
47+
)
48+
49+
response = _query_invitation_letter_request(graphql_client, conference)
50+
51+
me = response["data"]["me"]
52+
assert me["invitationLetterRequest"]["id"] == str(invitation_letter_request.id)
53+
assert me["invitationLetterRequest"]["status"] == invitation_letter_request.status
54+
55+
56+
@pytest.mark.parametrize(
57+
"actual_status,expected_status",
58+
[
59+
(
60+
InvitationLetterRequestStatusDB.PENDING,
61+
InvitationLetterRequestStatusAPI.PENDING,
62+
),
63+
(
64+
InvitationLetterRequestStatusDB.PROCESSING,
65+
InvitationLetterRequestStatusAPI.PENDING,
66+
),
67+
(
68+
InvitationLetterRequestStatusDB.FAILED_TO_GENERATE,
69+
InvitationLetterRequestStatusAPI.PENDING,
70+
),
71+
(
72+
InvitationLetterRequestStatusDB.PROCESSED,
73+
InvitationLetterRequestStatusAPI.PENDING,
74+
),
75+
(InvitationLetterRequestStatusDB.SENT, InvitationLetterRequestStatusAPI.SENT),
76+
(
77+
InvitationLetterRequestStatusDB.REJECTED,
78+
InvitationLetterRequestStatusAPI.REJECTED,
79+
),
80+
],
81+
)
82+
def test_user_invitation_letter_request_has_user_friendly_status(
83+
graphql_client, user, actual_status, expected_status
84+
):
85+
graphql_client.force_login(user)
86+
87+
conference = ConferenceFactory()
88+
invitation_letter_request = InvitationLetterRequestFactory(
89+
requester=user, conference=conference, status=actual_status
90+
)
91+
92+
response = _query_invitation_letter_request(graphql_client, conference)
93+
94+
me = response["data"]["me"]
95+
assert me["invitationLetterRequest"]["id"] == str(invitation_letter_request.id)
96+
assert me["invitationLetterRequest"]["status"] == expected_status.name
97+
98+
99+
def test_on_behalf_of_others_invitation_letter_request_are_excluded(
100+
graphql_client, user
101+
):
102+
graphql_client.force_login(user)
103+
104+
conference = ConferenceFactory()
105+
106+
InvitationLetterRequestFactory(
107+
requester=user,
108+
conference=conference,
109+
on_behalf_of=InvitationLetterRequestOnBehalfOf.OTHER,
110+
)
111+
112+
InvitationLetterRequestFactory(
113+
requester=user,
114+
conference=conference,
115+
on_behalf_of=InvitationLetterRequestOnBehalfOf.OTHER,
116+
)
117+
118+
response = _query_invitation_letter_request(graphql_client, conference)
119+
120+
me = response["data"]["me"]
121+
assert me["invitationLetterRequest"] is None
122+
123+
124+
def test_other_users_invitation_letter_requests_are_excluded(graphql_client, user):
125+
graphql_client.force_login(user)
126+
127+
conference = ConferenceFactory()
128+
129+
InvitationLetterRequestFactory(
130+
requester=UserFactory(),
131+
conference=conference,
132+
on_behalf_of=InvitationLetterRequestOnBehalfOf.SELF,
133+
)
134+
135+
response = _query_invitation_letter_request(graphql_client, conference)
136+
137+
me = response["data"]["me"]
138+
assert me["invitationLetterRequest"] is None
139+
140+
141+
def test_other_conferences_invitation_letter_request_are_excluded(graphql_client, user):
142+
graphql_client.force_login(user)
143+
144+
conference = ConferenceFactory()
145+
146+
InvitationLetterRequestFactory(
147+
requester=user,
148+
conference=ConferenceFactory(),
149+
on_behalf_of=InvitationLetterRequestOnBehalfOf.SELF,
150+
)
151+
152+
response = _query_invitation_letter_request(graphql_client, conference)
153+
154+
me = response["data"]["me"]
155+
assert me["invitationLetterRequest"] is None

backend/api/users/tests/test_me.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,49 @@ def test_is_python_italia_member_with_expired_membership(graphql_client, user, s
9595

9696
me = response["data"]["me"]
9797
assert me["isPythonItaliaMember"] is False
98+
99+
100+
@pytest.mark.parametrize("has_ticket", [True, False])
101+
def test_has_admission_ticket(mock_has_ticket, has_ticket, graphql_client, user):
102+
graphql_client.force_login(user)
103+
104+
conference = ConferenceFactory()
105+
mock_has_ticket(conference, has_ticket=has_ticket, user=user)
106+
107+
response = graphql_client.query(
108+
"""query($conference: String!) {
109+
me {
110+
hasAdmissionTicket(conference: $conference)
111+
}
112+
}""",
113+
variables={
114+
"conference": conference.code,
115+
},
116+
)
117+
118+
me = response["data"]["me"]
119+
assert me["hasAdmissionTicket"] == has_ticket
120+
121+
122+
@pytest.mark.parametrize("has_ticket", [True, False])
123+
def test_has_admission_ticket_with_non_existent_conference(
124+
mock_has_ticket, has_ticket, graphql_client, user
125+
):
126+
graphql_client.force_login(user)
127+
128+
conference = ConferenceFactory()
129+
mock_has_ticket(conference, has_ticket=has_ticket, user=user)
130+
131+
response = graphql_client.query(
132+
"""query($conference: String!) {
133+
me {
134+
hasAdmissionTicket(conference: $conference)
135+
}
136+
}""",
137+
variables={
138+
"conference": "invalid",
139+
},
140+
)
141+
142+
me = response["data"]["me"]
143+
assert me["hasAdmissionTicket"] is False

backend/api/visa/mutations/request_invitation_letter.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@
1717
from pretix import user_has_admission_ticket
1818
import strawberry
1919

20+
MAX_LENGTH_FIELDS = {
21+
"email": 254,
22+
"full_name": 300,
23+
"nationality": 100,
24+
"address": 300,
25+
"passport_number": 20,
26+
"embassy_name": 300,
27+
}
28+
2029

2130
@strawberry.type
2231
class InvitationLetterAlreadyRequested:
@@ -73,6 +82,15 @@ def validate(self, conference: Conference) -> RequestInvitationLetterErrors | No
7382
if not getattr(self, field_name):
7483
errors.add_error(field_name, "This field is required")
7584

85+
for field_name, max_length in MAX_LENGTH_FIELDS.items():
86+
value = getattr(self, field_name)
87+
88+
if value and len(value) > max_length:
89+
errors.add_error(
90+
field_name,
91+
f"Ensure this field has no more than {max_length} characters",
92+
)
93+
7694
if self.email and not validate_email(self.email):
7795
errors.add_error("email", "Invalid email address")
7896

@@ -126,7 +144,7 @@ def request_invitation_letter(
126144
return InvitationLetterAlreadyRequested()
127145

128146
with transaction.atomic():
129-
invitation_letter, _ = InvitationLetterRequestModel.objects.get_or_create(
147+
invitation_letter, created = InvitationLetterRequestModel.objects.get_or_create(
130148
conference=conference,
131149
requester=user,
132150
on_behalf_of=InvitationLetterRequestOnBehalfOf(input.on_behalf_of.name),
@@ -139,10 +157,11 @@ def request_invitation_letter(
139157
embassy_name=input.embassy_name,
140158
)
141159

142-
record_privacy_policy_acceptance(
143-
info.context.request,
144-
conference,
145-
"invitation_letter",
146-
)
160+
if created:
161+
record_privacy_policy_acceptance(
162+
info.context.request,
163+
conference,
164+
"invitation_letter",
165+
)
147166

148167
return InvitationLetterRequest.from_model(invitation_letter)

0 commit comments

Comments
 (0)