Files
tradon/modules/marketing_email/tests/test_module.py
2026-03-14 09:42:12 +00:00

160 lines
5.4 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from unittest.mock import ANY, Mock, patch
import trytond.config as config
from trytond.modules.marketing_email import marketing as marketing_module
from trytond.pool import Pool
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
from trytond.transaction import inactive_records
SUBSCRIBE_URL = 'http://www.example.com/subscribe'
UNSUBSCRIBE_URL = 'http://www.example.com/unsubscribe'
FROM = 'marketing@example.com'
class MarketingEmailTestCase(ModuleTestCase):
'Test Marketing Email module'
module = 'marketing_email'
def setUp(self):
super().setUp()
if not config.has_section('marketing'):
config.add_section('marketing')
subscribe_url = config.get(
'marketing', 'email_subscribe_url', default='')
config.set('marketing', 'email_subscribe_url', SUBSCRIBE_URL)
self.addCleanup(
config.set, 'marketing', 'email_subscribe_url', subscribe_url)
unsubscribe_url = config.get(
'marketing', 'email_unsubscribe_url', default='')
config.set('marketing', 'email_unsubscribe_url', UNSUBSCRIBE_URL)
self.addCleanup(
config.set, 'marketing', 'email_unsubscribe_url', unsubscribe_url)
spy_pixel = config.get('marketing', 'email_spy_pixel', default='')
config.set('marketing', 'email_spy_pixel', 'true')
self.addCleanup(
config.set, 'marketing', 'email_spy_pixel', spy_pixel)
from_ = config.get('email', 'from', default='')
config.set('email', 'from', FROM)
self.addCleanup(config.set, 'email', 'from', from_)
@with_transaction()
def test_subscribe(self):
"Test subscribe"
pool = Pool()
Email = pool.get('marketing.email')
EmailList = pool.get('marketing.email.list')
email_list = EmailList(name="Test")
email_list.save()
with patch.object(
marketing_module,
'send_message_transactional') as send_message:
email_list.request_subscribe('user@example.com')
send_message.assert_called_once()
with inactive_records():
email, = Email.search([
('list_', '=', email_list.id),
])
token = email.email_token
self.assertTrue(token)
self.assertFalse(email.active)
self.assertEqual(email_list.subscribed, 0)
self.assertEqual(
email.get_email_subscribe_url(),
'%s?token=%s' % (SUBSCRIBE_URL, token))
Email.subscribe_url(SUBSCRIBE_URL)
self.assertFalse(email.active)
Email.subscribe_url('%s?token=12345' % SUBSCRIBE_URL)
self.assertFalse(email.active)
Email.subscribe_url(email.get_email_subscribe_url())
self.assertTrue(email.active)
self.assertEqual(email_list.subscribed, 1)
@with_transaction()
def test_unsubscribe(self):
"Test unsubscribe"
pool = Pool()
Email = pool.get('marketing.email')
EmailList = pool.get('marketing.email.list')
email_list = EmailList(name="Test")
email_list.save()
email = Email(email='user@example.com', list_=email_list.id)
email.save()
token = email.email_token
self.assertTrue(token)
self.assertTrue(email.active)
with patch.object(
marketing_module,
'send_message_transactional') as send_message:
email_list.request_unsubscribe('user@example.com')
send_message.assert_called_once()
self.assertEqual(
email.get_email_unsubscribe_url(),
'%s?token=%s' % (UNSUBSCRIBE_URL, token))
Email.unsubscribe_url(UNSUBSCRIBE_URL)
self.assertTrue(email.active)
Email.unsubscribe_url('%s?token=12345' % UNSUBSCRIBE_URL)
self.assertTrue(email.active)
Email.unsubscribe_url(email.get_email_unsubscribe_url())
self.assertFalse(email.active)
@with_transaction()
def test_send_messages(self):
"Test messages are sent to the list"
pool = Pool()
Email = pool.get('marketing.email')
EmailList = pool.get('marketing.email.list')
Message = pool.get('marketing.email.message')
ShortenedURL = pool.get('web.shortened_url')
email_list = EmailList(name="Test")
email_list.save()
email = Email(email='user@example.com', list_=email_list)
email.save()
message = Message(list_=email_list)
message.title = 'Test'
message.content = (
'<html>'
'<body>'
'<a href="http://www.example.com/">Content</a>'
'</body>'
'</html>')
message.save()
Message.send([message])
with patch.object(
marketing_module,
'send_message_transactional') as send_message:
smtpd_datamanager = Mock()
Message.process(smtpd_datamanager=smtpd_datamanager)
send_message.assert_called_once_with(
ANY, datamanager=smtpd_datamanager)
urls = ShortenedURL.search([
('record', '=', str(message)),
])
self.assertEqual(message.state, 'sent')
self.assertEqual(len(urls), 2)
del ModuleTestCase