Files
tryton/trytond/tests/test_ir.py
T
2020-10-11 13:32:18 +02:00

291 lines
9.6 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.
import datetime
import unittest
from decimal import Decimal
from unittest.mock import Mock, patch, ANY
from dateutil.relativedelta import relativedelta
from trytond.config import config
from trytond.pool import Pool
from trytond.pyson import Eval, If, PYSONEncoder
from trytond.transaction import Transaction
from .test_tryton import ModuleTestCase, with_transaction
class IrTestCase(ModuleTestCase):
'Test ir module'
module = 'ir'
@with_transaction()
def test_sequence_substitutions(self):
'Test Sequence Substitutions'
pool = Pool()
Sequence = pool.get('ir.sequence')
SequenceType = pool.get('ir.sequence.type')
Date = pool.get('ir.date')
try:
Group = pool.get('res.group')
groups = Group.search([])
except KeyError:
groups = []
sequence_type = SequenceType(name='Test', code='test', groups=groups)
sequence_type.save()
sequence = Sequence(name='Test Sequence', code='test')
sequence.save()
self.assertEqual(Sequence.get_id(sequence.id), '1')
today = Date.today()
sequence.prefix = '${year}'
sequence.save()
self.assertEqual(Sequence.get_id(sequence.id),
'%s2' % str(today.year))
next_year = today + relativedelta(years=1)
with Transaction().set_context(date=next_year):
self.assertEqual(Sequence.get_id(sequence.id),
'%s3' % str(next_year.year))
@with_transaction()
def test_global_search(self):
'Test Global Search'
pool = Pool()
Model = pool.get('ir.model')
Model.global_search('User', 10)
@with_transaction()
def test_lang_currency(self):
"Test Lang.currency"
pool = Pool()
Lang = pool.get('ir.lang')
lang = Lang.get('en')
currency = Mock()
currency.digits = 2
currency.symbol = '$'
test_data = [
(Decimal('10.50'), True, False, None, '$10.50'),
(Decimal('10.50'), True, False, 4, '$10.5000'),
]
for value, symbol, grouping, digits, result in test_data:
self.assertEqual(
lang.currency(value, currency, symbol, grouping, digits),
result)
@with_transaction()
def test_lang_format(self):
"Test Lang.format"
pool = Pool()
Lang = pool.get('ir.lang')
lang = Lang.get('en')
test_data = [
('%i', 42, False, False, [], "42"),
]
for percent, value, grouping, monetary, add, result in test_data:
self.assertEqual(
lang.format(percent, value, grouping, monetary, *add), result)
@with_transaction()
def test_lang_strftime(self):
"Test Lang.strftime"
pool = Pool()
Lang = pool.get('ir.lang')
lang = Lang.get('en')
test_data = [
(datetime.date(2016, 8, 3), '%d %B %Y', "03 August 2016"),
(datetime.time(8, 20), '%I:%M %p', "08:20 AM"),
(datetime.datetime(2018, 11, 1, 14, 30), '%a %d %b %Y %I:%M %p',
"Thu 01 Nov 2018 02:30 PM"),
(datetime.date(2018, 11, 1), '%x', "11/01/2018"),
(datetime.datetime(2018, 11, 1, 14, 30, 12),
'%x %X', "11/01/2018 14:30:12"),
(datetime.datetime(2018, 11, 1, 14, 30, 12),
'%H:%M:%S', "14:30:12"),
(datetime.datetime(2018, 11, 1, 14, 30, 12), None,
"11/01/2018 14:30:12"),
]
for date, format_, result in test_data:
self.assertEqual(lang.strftime(date, format_), result)
@with_transaction()
def test_model_data_get_id(self):
"Test ModelData.get_id"
pool = Pool()
ModelData = pool.get('ir.model.data')
User = pool.get('res.user')
admin_id = ModelData.get_id('res', 'user_admin')
admin, = User.search([('login', '=', 'admin')])
self.assertEqual(admin_id, admin.id)
@with_transaction()
def test_model_data_get_id_dot(self):
"Test ModelData.get_id with dot"
pool = Pool()
ModelData = pool.get('ir.model.data')
User = pool.get('res.user')
admin_id = ModelData.get_id('res.user_admin')
admin, = User.search([('login', '=', 'admin')])
self.assertEqual(admin_id, admin.id)
@with_transaction()
def test_email_send(self):
"Test sending email"
pool = Pool()
Email = pool.get('ir.email')
Report = pool.get('ir.action.report')
Attachment = pool.get('ir.attachment')
report = Report(
name="Test Email",
model='res.user',
report_name='tests.email_send',
report_content=b'report',
template_extension='txt',
)
report.save()
with patch('trytond.ir.email_.sendmail_transactional') as sendmail:
email = Email.send(
to='"John Doe" <john@example.com>, Jane <jane@example.com>',
cc='User <user@example.com>',
bcc='me@example.com',
subject="Email subject",
body='<p>Hello</p>',
attachments=[('file.txt', b'data')],
record=('res.user', 1),
reports=[report.id])
attachments = Attachment.search([
('resource', '=', str(email)),
])
addresses = [
'john@example.com',
'jane@example.com',
'user@example.com',
'me@example.com']
sendmail.assert_called_once_with(
config.get('email', 'from'), addresses, ANY, datamanager=ANY)
self.assertEqual(
email.recipients,
'"John Doe" <john@example.com>, Jane <jane@example.com>')
self.assertEqual(email.recipients_secondary, 'User <user@example.com>')
self.assertEqual(email.recipients_hidden, 'me@example.com')
self.assertEqual(
[a.address for a in email.addresses],
addresses)
self.assertEqual(email.subject, "Email subject")
self.assertEqual(email.body, '<p>Hello</p>')
self.assertEqual(len(attachments), 2)
self.assertEqual(
{a.name for a in attachments},
{'file.txt', 'Test Email-Administrator.txt'})
self.assertEqual(
{a.data for a in attachments}, {b'data', b'report'})
@with_transaction()
def test_email_template_get(self):
"Test email template get"
pool = Pool()
Template = pool.get('ir.email.template')
IrModel = pool.get('ir.model')
IrModelField = pool.get('ir.model.field')
User = pool.get('res.user')
admin = User(1)
admin.email = 'admin@example.com'
admin.save()
model, = IrModel.search([('model', '=', 'res.user')])
field, = IrModelField.search([
('model', '=', model.id),
('name', '=', 'id'),
])
template = Template(
model=model,
name="Test",
recipients=field,
subject="Subject: ${record.login}",
body="<p>Hello, ${record.name}</p>")
template.save()
values = template.get(admin)
self.assertEqual(
values, {
'to': ['Administrator <admin@example.com>'],
'subject': "Subject: admin",
'body': '<p>Hello, Administrator</p>',
})
@with_transaction()
def test_email_template_get_default(self):
"Test email template get default"
pool = Pool()
Template = pool.get('ir.email.template')
IrModel = pool.get('ir.model')
IrModelField = pool.get('ir.model.field')
User = pool.get('res.user')
admin = User(1)
admin.email = 'admin@example.com'
admin.save()
model, = IrModel.search([('model', '=', 'res.user')])
field, = IrModelField.search([
('model', '=', model.id),
('name', '=', 'id'),
])
values = Template.get_default(User.__name__, admin.id)
self.assertEqual(
values, {
'to': ['Administrator <admin@example.com>'],
'subject': "User: Administrator",
})
@with_transaction()
def test_email_template_get_pyson(self):
"Test email template get with pyson"
pool = Pool()
Template = pool.get('ir.email.template')
IrModel = pool.get('ir.model')
IrModelField = pool.get('ir.model.field')
User = pool.get('res.user')
admin = User(1)
admin.email = 'admin@example.com'
admin.save()
model, = IrModel.search([('model', '=', 'res.user')])
field, = IrModelField.search([
('model', '=', model.id),
('name', '=', 'id'),
])
template = Template(
model=model,
name="Test",
recipients_pyson=PYSONEncoder().encode(
[Eval('self.email')]),
recipients_secondary_pyson=PYSONEncoder().encode(
If(Eval('self.email'),
['fallback@example.com'],
[])),
)
template.save()
values = template.get(admin)
self.assertEqual(
values, {
'to': ['admin@example.com'],
'cc': ['fallback@example.com'],
})
def suite():
return unittest.TestLoader().loadTestsFromTestCase(IrTestCase)