|
1 | 1 | from uuid import uuid4 |
2 | 2 | import requests |
3 | | -from visa.models import InvitationLetterRequestStatus |
| 3 | +from grants.tests.factories import GrantFactory |
| 4 | +from grants.models import Grant |
| 5 | +from visa.models import ( |
| 6 | + InvitationLetterDocumentInclusionPolicy, |
| 7 | + InvitationLetterRequestStatus, |
| 8 | +) |
4 | 9 | import pytest |
5 | 10 | from django.test import override_settings |
6 | 11 | from visa.tasks import ( |
|
18 | 23 | pytestmark = pytest.mark.django_db |
19 | 24 |
|
20 | 25 |
|
| 26 | +@pytest.fixture() |
| 27 | +def mock_ticket_present(requests_mock): |
| 28 | + def _mock_ticket_present(request): |
| 29 | + requests_mock.get( |
| 30 | + "https://example.com/ticket.pdf", |
| 31 | + content=open("visa/tests/fixtures/sample-ticket.pdf", "rb").read(), |
| 32 | + ) |
| 33 | + requests_mock.get( |
| 34 | + f"https://pretix/api/organizers/base-pretix-organizer-id/events/base-pretix-event-id/tickets/attendee-tickets/?attendee_email={request.requester.email}", |
| 35 | + json=[ |
| 36 | + { |
| 37 | + "item": { |
| 38 | + "admission": False, |
| 39 | + } |
| 40 | + }, |
| 41 | + { |
| 42 | + "item": { |
| 43 | + "admission": True, |
| 44 | + }, |
| 45 | + "downloads": [{"url": "https://example.com/ticket.pdf"}], |
| 46 | + }, |
| 47 | + ], |
| 48 | + ) |
| 49 | + |
| 50 | + return _mock_ticket_present |
| 51 | + |
| 52 | + |
21 | 53 | @override_settings(PRETIX_API="https://pretix/api/") |
22 | | -def test_process_invitation_letter_request(requests_mock): |
| 54 | +def test_process_invitation_letter_request(requests_mock, mock_ticket_present): |
23 | 55 | config = InvitationLetterConferenceConfigFactory() |
24 | 56 | InvitationLetterAssetFactory( |
25 | 57 | invitation_letter_conference_config=config, identifier="test" |
@@ -48,6 +80,7 @@ def test_process_invitation_letter_request(requests_mock): |
48 | 80 | request = InvitationLetterRequestFactory( |
49 | 81 | conference=config.conference, nationality="Italian" |
50 | 82 | ) |
| 83 | + mock_ticket_present(request) |
51 | 84 |
|
52 | 85 | requests_mock.get( |
53 | 86 | "https://example.com/ticket.pdf", |
@@ -85,6 +118,94 @@ def test_process_invitation_letter_request(requests_mock): |
85 | 118 | assert output.pages[3].extract_text() == "Thisisasampleticket pdf" |
86 | 119 |
|
87 | 120 |
|
| 121 | +@pytest.mark.parametrize( |
| 122 | + "grant_approved_type", |
| 123 | + [None, Grant.ApprovedType.ticket_only, Grant.ApprovedType.ticket_travel], |
| 124 | +) |
| 125 | +@override_settings(PRETIX_API="https://pretix/api/") |
| 126 | +def test_process_invitation_letter_request_skips_docs_with_no_accommodation( |
| 127 | + mock_ticket_present, grant_approved_type |
| 128 | +): |
| 129 | + config = InvitationLetterConferenceConfigFactory() |
| 130 | + InvitationLetterDocumentFactory( |
| 131 | + invitation_letter_conference_config=config, |
| 132 | + document=None, |
| 133 | + dynamic_document={ |
| 134 | + "header": {"content": "header", "margin": "0", "align": "top-left"}, |
| 135 | + "footer": {"content": "footer", "margin": "0", "align": "bottom-left"}, |
| 136 | + "page_layout": {"margin": "0"}, |
| 137 | + "pages": [ |
| 138 | + {"content": "accommodation details"}, |
| 139 | + ], |
| 140 | + }, |
| 141 | + inclusion_policy=InvitationLetterDocumentInclusionPolicy.GRANT_ACCOMMODATION, |
| 142 | + ) |
| 143 | + |
| 144 | + request = InvitationLetterRequestFactory( |
| 145 | + conference=config.conference, nationality="Italian" |
| 146 | + ) |
| 147 | + mock_ticket_present(request) |
| 148 | + |
| 149 | + if grant_approved_type: |
| 150 | + GrantFactory( |
| 151 | + conference=config.conference, |
| 152 | + user=request.requester, |
| 153 | + approved_type=grant_approved_type, |
| 154 | + ) |
| 155 | + |
| 156 | + process_invitation_letter_request(invitation_letter_request_id=request.id) |
| 157 | + |
| 158 | + request.refresh_from_db() |
| 159 | + |
| 160 | + assert request.status == InvitationLetterRequestStatus.PROCESSED |
| 161 | + |
| 162 | + output = PdfReader(request.invitation_letter.open()) |
| 163 | + assert output.get_num_pages() == 1 |
| 164 | + assert output.pages[0].extract_text() == "Thisisasampleticket pdf" |
| 165 | + |
| 166 | + |
| 167 | +@override_settings(PRETIX_API="https://pretix/api/") |
| 168 | +def test_process_invitation_letter_request_with_doc_only_for_accommodation( |
| 169 | + mock_ticket_present, |
| 170 | +): |
| 171 | + config = InvitationLetterConferenceConfigFactory() |
| 172 | + InvitationLetterDocumentFactory( |
| 173 | + invitation_letter_conference_config=config, |
| 174 | + document=None, |
| 175 | + dynamic_document={ |
| 176 | + "header": {"content": "header", "margin": "0", "align": "top-left"}, |
| 177 | + "footer": {"content": "footer", "margin": "0", "align": "bottom-left"}, |
| 178 | + "page_layout": {"margin": "0"}, |
| 179 | + "pages": [ |
| 180 | + {"content": "accommodation details"}, |
| 181 | + ], |
| 182 | + }, |
| 183 | + inclusion_policy=InvitationLetterDocumentInclusionPolicy.GRANT_ACCOMMODATION, |
| 184 | + ) |
| 185 | + |
| 186 | + request = InvitationLetterRequestFactory( |
| 187 | + conference=config.conference, nationality="Italian" |
| 188 | + ) |
| 189 | + mock_ticket_present(request) |
| 190 | + |
| 191 | + GrantFactory( |
| 192 | + conference=config.conference, |
| 193 | + user=request.requester, |
| 194 | + approved_type=Grant.ApprovedType.ticket_travel_accommodation, |
| 195 | + ) |
| 196 | + |
| 197 | + process_invitation_letter_request(invitation_letter_request_id=request.id) |
| 198 | + |
| 199 | + request.refresh_from_db() |
| 200 | + |
| 201 | + assert request.status == InvitationLetterRequestStatus.PROCESSED |
| 202 | + |
| 203 | + output = PdfReader(request.invitation_letter.open()) |
| 204 | + assert output.get_num_pages() == 2 |
| 205 | + assert output.pages[0].extract_text() == "accommodation details \nheader\nfooter" |
| 206 | + assert output.pages[1].extract_text() == "Thisisasampleticket pdf" |
| 207 | + |
| 208 | + |
88 | 209 | @override_settings(PRETIX_API="https://pretix/api/") |
89 | 210 | def test_process_invitation_letter_request_handles_generating_ticket_pdfs( |
90 | 211 | requests_mock, mocker |
|
0 commit comments