Skip to content

Commit 39a223a

Browse files
committed
test(grants): cover voucher task and grant voucher email
Add tests for send_grant_voucher_email and create_and_send_voucher_to_grantee (not confirmed, no user, existing speaker/grant voucher, co-speaker upgrade, voucher on other conference), aligned with schedule voucher task tests.
1 parent e73df02 commit 39a223a

1 file changed

Lines changed: 193 additions & 4 deletions

File tree

backend/grants/tests/test_tasks.py

Lines changed: 193 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
from datetime import datetime, timezone
22
from decimal import Decimal
3-
43
import pytest
4+
import time_machine
55

6-
from conferences.tests.factories import ConferenceFactory, DeadlineFactory
6+
from conferences.models.conference_voucher import ConferenceVoucher
7+
from conferences.tests.factories import (
8+
ConferenceFactory,
9+
ConferenceVoucherFactory,
10+
DeadlineFactory,
11+
)
12+
from grants.models import Grant
713
from grants.tasks import (
14+
create_and_send_voucher_to_grantee,
815
send_grant_reply_approved_email,
916
send_grant_reply_rejected_email,
1017
send_grant_reply_waiting_list_email,
1118
send_grant_reply_waiting_list_update_email,
19+
send_grant_voucher_email,
1220
)
1321
from grants.tests.factories import GrantFactory, GrantReimbursementFactory
1422
from users.tests.factories import UserFactory
@@ -380,7 +388,6 @@ def test_handle_grant_approved_travel_reply_sent(settings, sent_emails):
380388

381389

382390
def test_send_grant_approved_email_raises_for_no_reimbursements(settings) -> None:
383-
"""Verify error is raised when grant has no valid reimbursements."""
384391
from notifications.models import EmailTemplateIdentifier
385392
from notifications.tests.factories import EmailTemplateFactory
386393

@@ -462,7 +469,189 @@ def test_send_grant_reply_waiting_list_update_email(settings, sent_emails):
462469

463470
def test_send_grant_waiting_list_email_missing_deadline():
464471
grant = GrantFactory()
465-
# No deadline created
466472

467473
with pytest.raises(ValueError, match="missing grants_waiting_list_update deadline"):
468474
send_grant_reply_waiting_list_email(grant_id=grant.id)
475+
476+
477+
def test_send_grant_voucher_email(settings, sent_emails):
478+
from notifications.models import EmailTemplateIdentifier
479+
from notifications.tests.factories import EmailTemplateFactory
480+
481+
settings.FRONTEND_URL = "https://pycon.it"
482+
user = UserFactory(
483+
full_name="Marco Acierno",
484+
email="marco@placeholder.it",
485+
name="Marco",
486+
username="marco",
487+
)
488+
grant = GrantFactory(user=user, status=Grant.Status.confirmed)
489+
ConferenceVoucherFactory(
490+
user=user,
491+
conference=grant.conference,
492+
voucher_type=ConferenceVoucher.VoucherType.GRANT,
493+
voucher_code="GRANT99",
494+
)
495+
496+
EmailTemplateFactory(
497+
conference=grant.conference,
498+
identifier=EmailTemplateIdentifier.grant_voucher_code,
499+
)
500+
501+
with time_machine.travel("2020-10-10 10:00:00Z", tick=False):
502+
send_grant_voucher_email(grant_id=grant.id)
503+
504+
emails_sent = sent_emails()
505+
assert emails_sent.count() == 1
506+
507+
sent_email = emails_sent.first()
508+
assert (
509+
sent_email.email_template.identifier
510+
== EmailTemplateIdentifier.grant_voucher_code
511+
)
512+
assert sent_email.email_template.conference == grant.conference
513+
assert sent_email.recipient == user
514+
assert sent_email.placeholders["user_name"] == "Marco Acierno"
515+
assert sent_email.placeholders["conference_name"] == grant.conference.name.localize(
516+
"en"
517+
)
518+
assert sent_email.placeholders["voucher_code"] == "GRANT99"
519+
assert sent_email.placeholders["has_approved_accommodation"] is False
520+
assert sent_email.placeholders["visa_page_link"] == "https://pycon.it/visa"
521+
522+
voucher = ConferenceVoucher.objects.get(
523+
conference=grant.conference,
524+
user=user,
525+
)
526+
assert voucher.voucher_email_sent_at == datetime(
527+
2020, 10, 10, 10, 0, 0, tzinfo=timezone.utc
528+
)
529+
530+
531+
def test_create_and_send_voucher_to_grantee(mocker):
532+
mock_create = mocker.patch(
533+
"conferences.vouchers.create_voucher", return_value={"id": 123}
534+
)
535+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
536+
537+
grant = GrantFactory(status=Grant.Status.confirmed)
538+
539+
create_and_send_voucher_to_grantee(grant_id=grant.id)
540+
541+
assert (
542+
ConferenceVoucher.objects.for_conference(grant.conference)
543+
.filter(
544+
user=grant.user,
545+
voucher_type=ConferenceVoucher.VoucherType.GRANT,
546+
)
547+
.exists()
548+
)
549+
550+
mock_create.assert_called_once()
551+
mock_send_email.delay.assert_called_once_with(grant_id=grant.id)
552+
553+
554+
def test_create_and_send_voucher_to_grantee_does_nothing_if_not_confirmed(mocker):
555+
mock_create = mocker.patch("conferences.vouchers.create_voucher")
556+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
557+
558+
grant = GrantFactory(status=Grant.Status.waiting_for_confirmation)
559+
560+
create_and_send_voucher_to_grantee(grant_id=grant.id)
561+
562+
mock_create.assert_not_called()
563+
mock_send_email.delay.assert_not_called()
564+
565+
566+
def test_create_and_send_voucher_to_grantee_does_nothing_if_no_user(mocker):
567+
mock_create = mocker.patch("conferences.vouchers.create_voucher")
568+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
569+
570+
grant = GrantFactory(status=Grant.Status.confirmed)
571+
Grant.objects.filter(pk=grant.pk).update(user_id=None)
572+
grant.refresh_from_db()
573+
574+
create_and_send_voucher_to_grantee(grant_id=grant.id)
575+
576+
mock_create.assert_not_called()
577+
mock_send_email.delay.assert_not_called()
578+
579+
580+
@pytest.mark.parametrize(
581+
"voucher_type",
582+
[
583+
ConferenceVoucher.VoucherType.SPEAKER,
584+
ConferenceVoucher.VoucherType.GRANT,
585+
],
586+
)
587+
def test_create_and_send_voucher_to_grantee_does_nothing_if_voucher_exists(
588+
mocker, voucher_type
589+
):
590+
mock_create = mocker.patch("conferences.vouchers.create_voucher")
591+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
592+
593+
grant = GrantFactory(status=Grant.Status.confirmed)
594+
ConferenceVoucherFactory(
595+
conference=grant.conference,
596+
user=grant.user,
597+
voucher_type=voucher_type,
598+
)
599+
600+
create_and_send_voucher_to_grantee(grant_id=grant.id)
601+
602+
mock_create.assert_not_called()
603+
mock_send_email.delay.assert_not_called()
604+
605+
606+
def test_create_and_send_voucher_to_grantee_upgrades_co_speaker(mocker):
607+
mock_create = mocker.patch("conferences.vouchers.create_voucher")
608+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
609+
610+
grant = GrantFactory(status=Grant.Status.confirmed)
611+
ConferenceVoucherFactory(
612+
conference=grant.conference,
613+
user=grant.user,
614+
voucher_type=ConferenceVoucher.VoucherType.CO_SPEAKER,
615+
)
616+
617+
create_and_send_voucher_to_grantee(grant_id=grant.id)
618+
619+
voucher = ConferenceVoucher.objects.get(
620+
conference=grant.conference,
621+
user=grant.user,
622+
)
623+
assert voucher.voucher_type == ConferenceVoucher.VoucherType.GRANT
624+
625+
mock_create.assert_not_called()
626+
mock_send_email.delay.assert_called_once_with(grant_id=grant.id)
627+
628+
629+
def test_create_and_send_voucher_to_grantee_creates_when_voucher_on_other_conference(
630+
mocker,
631+
):
632+
mock_create = mocker.patch(
633+
"conferences.vouchers.create_voucher", return_value={"id": 123}
634+
)
635+
mock_send_email = mocker.patch("grants.tasks.send_grant_voucher_email")
636+
637+
other_conference = ConferenceFactory()
638+
grant = GrantFactory(status=Grant.Status.confirmed)
639+
ConferenceVoucherFactory(
640+
conference=other_conference,
641+
user=grant.user,
642+
voucher_type=ConferenceVoucher.VoucherType.SPEAKER,
643+
)
644+
645+
create_and_send_voucher_to_grantee(grant_id=grant.id)
646+
647+
assert (
648+
ConferenceVoucher.objects.for_conference(grant.conference)
649+
.filter(
650+
user=grant.user,
651+
voucher_type=ConferenceVoucher.VoucherType.GRANT,
652+
)
653+
.exists()
654+
)
655+
656+
mock_create.assert_called_once()
657+
mock_send_email.delay.assert_called_once_with(grant_id=grant.id)

0 commit comments

Comments
 (0)