Files
Cédric Krier 74ee169c54 Refactor of trytond.config to add cache
This removes the need to store configuration in global variable and so make it
easier to update for example for testing.

Closes #14249
2025-10-07 08:19:57 +02: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