Unisender Go: new ESP

Add support for Unisender Go

---------

Co-authored-by: Mike Edmunds <medmunds@gmail.com>
This commit is contained in:
Arondit
2024-03-05 22:38:40 +03:00
committed by GitHub
parent a2c0ed6817
commit a71a0d9af8
15 changed files with 2477 additions and 20 deletions

View File

@@ -0,0 +1,299 @@
from __future__ import annotations
from email.headerregistry import Address
from django.test import SimpleTestCase, override_settings, tag
from requests.structures import CaseInsensitiveDict
from anymail.backends.unisender_go import EmailBackend, UnisenderGoPayload
from anymail.message import AnymailMessage
TEMPLATE_ID = "template_id"
FROM_EMAIL = "sender@test.test"
FROM_NAME = "test name"
TO_EMAIL = "receiver@test.test"
TO_NAME = "receiver"
OTHER_TO_EMAIL = "receiver1@test.test"
OTHER_TO_NAME = "receiver1"
SUBJECT = "subject"
GLOBAL_DATA = {"arg": "arg"}
SUBSTITUTION_ONE = {"arg1": "arg1"}
SUBSTITUTION_TWO = {"arg2": "arg2"}
@tag("unisender_go")
@override_settings(ANYMAIL_UNISENDER_GO_API_KEY=None, ANYMAIL_UNISENDER_GO_API_URL="")
class TestUnisenderGoPayload(SimpleTestCase):
def test_unisender_go_payload__full(self):
substitutions = {TO_EMAIL: SUBSTITUTION_ONE, OTHER_TO_EMAIL: SUBSTITUTION_TWO}
email = AnymailMessage(
template_id=TEMPLATE_ID,
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=str(Address(display_name=FROM_NAME, addr_spec=FROM_EMAIL)),
to=[
str(Address(display_name=TO_NAME, addr_spec=TO_EMAIL)),
str(Address(display_name=OTHER_TO_NAME, addr_spec=OTHER_TO_EMAIL)),
],
merge_data=substitutions,
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {
"to": ", ".join(email.to),
},
"recipients": [
{
"email": TO_EMAIL,
"substitutions": {**SUBSTITUTION_ONE, "to_name": TO_NAME},
},
{
"email": OTHER_TO_EMAIL,
"substitutions": {**SUBSTITUTION_TWO, "to_name": OTHER_TO_NAME},
},
],
"subject": SUBJECT,
"template_id": TEMPLATE_ID,
}
self.assertEqual(payload.data, expected_payload)
def test_unisender_go_payload__cc_bcc(self):
cc_to_email = "receiver_cc@test.test"
bcc_to_email = "receiver_bcc@test.test"
email = AnymailMessage(
template_id=TEMPLATE_ID,
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[
str(Address(display_name=TO_NAME, addr_spec=TO_EMAIL)),
str(Address(display_name=OTHER_TO_NAME, addr_spec=OTHER_TO_EMAIL)),
],
cc=[cc_to_email],
bcc=[bcc_to_email],
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_headers = {
"To": f"{TO_NAME} <{TO_EMAIL}>, {OTHER_TO_NAME} <{OTHER_TO_EMAIL}>",
"CC": cc_to_email,
}
expected_headers = CaseInsensitiveDict(expected_headers)
expected_recipients = [
{
"email": TO_EMAIL,
"substitutions": {"to_name": TO_NAME},
},
{
"email": OTHER_TO_EMAIL,
"substitutions": {"to_name": OTHER_TO_NAME},
},
{"email": cc_to_email},
{"email": bcc_to_email},
]
self.assertEqual(payload.data["headers"], expected_headers)
self.assertCountEqual(payload.data["recipients"], expected_recipients)
def test_unisender_go_payload__parse_from__with_name(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=str(Address(display_name=FROM_NAME, addr_spec=FROM_EMAIL)),
to=[TO_EMAIL],
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
}
self.assertEqual(payload.data, expected_payload)
def test_unisender_go_payload__parse_from__without_name(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=FROM_EMAIL,
to=[TO_EMAIL],
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
}
self.assertEqual(payload.data, expected_payload)
@override_settings(
ANYMAIL={"UNISENDER_GO_SEND_DEFAULTS": {"esp_extra": {"skip_unsubscribe": 1}}},
)
def test_unisender_go_payload__parse_from__with_unsub__in_settings(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[TO_EMAIL],
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
"skip_unsubscribe": 1,
}
self.assertEqual(payload.data, expected_payload)
@override_settings(
ANYMAIL={"UNISENDER_GO_SEND_DEFAULTS": {"esp_extra": {"skip_unsubscribe": 0}}},
)
def test_unisender_go_payload__parse_from__with_unsub__in_args(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[TO_EMAIL],
esp_extra={"skip_unsubscribe": 1},
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
"skip_unsubscribe": 1,
}
self.assertEqual(payload.data, expected_payload)
@override_settings(
ANYMAIL={
"UNISENDER_GO_SEND_DEFAULTS": {"esp_extra": {"global_language": "en"}}
},
)
def test_unisender_go_payload__parse_from__global_language__in_settings(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[TO_EMAIL],
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
"global_language": "en",
}
self.assertEqual(payload.data, expected_payload)
@override_settings(
ANYMAIL={
"UNISENDER_GO_SEND_DEFAULTS": {"esp_extra": {"global_language": "fr"}}
},
)
def test_unisender_go_payload__parse_from__global_language__in_args(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[TO_EMAIL],
esp_extra={"global_language": "en"},
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
"global_language": "en",
}
self.assertEqual(payload.data, expected_payload)
def test_unisender_go_payload__parse_from__bypass_esp_extra(self):
email = AnymailMessage(
subject=SUBJECT,
merge_global_data=GLOBAL_DATA,
from_email=f"{FROM_NAME} <{FROM_EMAIL}>",
to=[TO_EMAIL],
esp_extra={
"bypass_global": 1,
"bypass_unavailable": 1,
"bypass_unsubscribed": 1,
"bypass_complained": 1,
},
)
backend = EmailBackend()
payload = UnisenderGoPayload(
message=email, backend=backend, defaults=backend.send_defaults
)
expected_payload = {
"from_email": FROM_EMAIL,
"from_name": FROM_NAME,
"global_substitutions": GLOBAL_DATA,
"headers": {"to": TO_EMAIL},
"recipients": [{"email": TO_EMAIL}],
"subject": SUBJECT,
"bypass_global": 1,
"bypass_unavailable": 1,
"bypass_unsubscribed": 1,
"bypass_complained": 1,
}
self.assertEqual(payload.data, expected_payload)