odoo18/addons_extensions/documents/tests/test_mail_gateway.py

259 lines
13 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from dateutil.relativedelta import relativedelta
from freezegun import freeze_time
import ast
from odoo import Command, fields, tools
from odoo.addons.mail.tests.common import MailCommon
from odoo.addons.test_mail.data.test_mail_data import MAIL_EML_ATTACHMENT, MAIL_NO_BODY
from odoo.exceptions import AccessError, ValidationError
from odoo.tests import new_test_user
from odoo.tools import mute_logger
class TestMailGateway(MailCommon):
"""Test document creation on incoming mail.
Especially that the partner_id is correctly set on the created document.
"""
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.tag = cls.env['documents.tag'].create({'name': 'Tag alias'})
cls.folder = cls.env['documents.document'].create({
'name': 'folder',
'type': 'folder',
'alias_tag_ids': False,
'alias_name': 'inbox-test',
})
# edit the alias tags after the alias has been created
cls.folder.alias_tag_ids = cls.tag.ids
cls.email_with_no_partner = tools.email_normalize('non-existing@test.com')
cls.pre_existing_partner = cls.env['res.partner'].find_or_create('existing@test.com')
cls.email_filenames = ['attachment', 'original_msg.eml']
cls.other_tag = cls.env['documents.tag'].create({'name': 'new tag'})
cls.non_existing_tag_id = cls.env['documents.document'].with_context(active_test=False).search([], order='id DESC', limit=1).id + 1
cls.test_activity_type = cls.env['mail.activity.type'].create({'name': 'Test Activity Type'})
cls.test_activity_type2 = cls.env['mail.activity.type'].create({'name': 'Test Activity Type2'})
def send_test_mail_with_attachment(self, email_from):
with self.mock_mail_gateway():
self.format_and_process(
MAIL_EML_ATTACHMENT,
email_from,
f'inbox-test@{self.alias_domain}',
subject='Test document creation on incoming mail',
target_model='documents.document',
)
documents = self.env['documents.document'].search([('name', 'in', self.email_filenames)])
self.assertEqual(len(documents), len(self.email_filenames))
return documents
def test_initial_values(self):
self.assertFalse(self.env['res.partner'].search([('email', '=', self.email_with_no_partner)]))
self.assertFalse(self.env['documents.document'].search([('name', 'in', self.email_filenames)]))
def test_constrains(self):
with self.assertRaises(ValidationError):
self.env['documents.document'].create({
'name': 'file',
'type': 'binary',
'alias_name': 'test',
})
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_set_contact_non_existing_partner(self):
documents_count = self.env['documents.document'].with_context(active_test=False).search_count([])
for document in self.send_test_mail_with_attachment(self.email_with_no_partner):
self.assertFalse(document.partner_id)
self.assertEqual(document.owner_id, self.folder.owner_id)
self.assertEqual(document.attachment_id.res_model, 'documents.document')
self.assertEqual(document.attachment_id.res_id, document.id)
self.assertEqual(document.folder_id, self.folder)
self.assertEqual(document.tag_ids, self.tag)
self.assertEqual(
self.env['documents.document'].with_context(active_test=False).search_count([]),
documents_count + 3,
"2 attachments in the email, so 2 documents are created, and 1 archived with the default values",
)
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_set_contact_existing_partner(self):
documents_count = self.env['documents.document'].with_context(active_test=False).search_count([])
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertFalse(document.partner_id)
self.assertEqual(document.owner_id, self.folder.owner_id)
self.assertEqual(document.attachment_id.res_model, 'documents.document')
self.assertEqual(document.attachment_id.res_id, document.id)
self.assertEqual(document.folder_id, self.folder)
self.assertEqual(document.tag_ids, self.tag)
self.assertEqual(
self.env['documents.document'].with_context(active_test=False).search_count([]),
documents_count + 3,
"2 attachments in the email, so 2 documents are created, and 1 archived with the default values",
)
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_no_attachment(self):
"""Test the behavior when we send an email without attachment on the mail alias."""
documents_count = self.env['documents.document'].with_context(active_test=False).search_count([])
with self.mock_mail_gateway():
self.format_and_process(
MAIL_NO_BODY,
self.pre_existing_partner.email,
f'inbox-test@{self.alias_domain}',
email_to=f'inbox-test@{self.alias_domain}',
subject='Test document creation on incoming mail',
target_model='documents.document',
)
self.assertEqual(
self.env['documents.document'].with_context(active_test=False).search_count([]),
documents_count + 1,
"No attachment, so only the template document, archived should be created",
)
@freeze_time('2022-07-24 08:00:00')
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_create_activity(self):
"""Test that an activity is created on the document if enabled on the folder. """
self.folder.write({
'create_activity_option': True,
'create_activity_type_id': self.test_activity_type.id,
'create_activity_summary': 'TODO summary',
'create_activity_note': 'TODO note',
'create_activity_user_id': self.user_admin.id,
'create_activity_date_deadline_range_type': 'days',
'create_activity_date_deadline_range': 5,
})
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
activity_ids = self.env['mail.activity'].search(
[('res_model', '=', 'documents.document'), ('res_id', '=', document.id)])
self.assertEqual(len(activity_ids), 1)
self.assertEqual(activity_ids.activity_type_id, self.test_activity_type)
self.assertEqual(activity_ids.summary, 'TODO summary')
self.assertEqual(activity_ids.note, '<p>TODO note</p>')
self.assertEqual(activity_ids.user_id, self.user_admin)
self.assertEqual(activity_ids.date_deadline, fields.Date.today() + relativedelta(days=5))
@freeze_time('2022-07-24 08:00:00')
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_create_activity_with_alias_defaults(self):
""" Test that alias_defaults activity creation settings has precedence over the folder's ones. """
defaults = ast.literal_eval(self.folder.alias_id.alias_defaults)
defaults.update({
'create_activity_option': True,
'create_activity_type_id': self.test_activity_type2.id,
'create_activity_summary': 'TODO summary defaults',
'create_activity_note': 'TODO note defaults',
'create_activity_user_id': self.user_employee.id,
'create_activity_date_deadline_range_type': 'months',
'create_activity_date_deadline_range': 1,
})
self.folder.alias_defaults = repr(defaults)
self.folder.write({
'create_activity_option': True,
'create_activity_type_id': self.test_activity_type.id,
'create_activity_summary': 'TODO summary',
'create_activity_note': 'TODO note',
'create_activity_user_id': self.user_admin.id,
'create_activity_date_deadline_range_type': 'days',
'create_activity_date_deadline_range': 5,
})
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
activity_ids = self.env['mail.activity'].search(
[('res_model', '=', 'documents.document'), ('res_id', '=', document.id)])
self.assertEqual(len(activity_ids), 1)
self.assertEqual(activity_ids.activity_type_id, self.test_activity_type2)
self.assertEqual(activity_ids.summary, 'TODO summary defaults')
self.assertEqual(activity_ids.note, '<p>TODO note defaults</p>')
self.assertEqual(activity_ids.user_id, self.user_employee)
self.assertEqual(activity_ids.date_deadline, fields.Date.today() + relativedelta(months=1))
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_create_activity_disabled(self):
"""Test that no activity is created on the document if not enabled on the folder. """
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertFalse(self.env['mail.activity'].search(
[('res_model', '=', 'documents.document'), ('res_id', '=', document.id)]))
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_custom_tags_list(self):
"""Test that the custom tags have the priority over `alias_tag_ids`."""
defaults = ast.literal_eval(self.folder.alias_id.alias_defaults)
defaults['tag_ids'] = [self.other_tag.id, self.non_existing_tag_id]
self.folder.alias_defaults = repr(defaults)
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertFalse(document.partner_id)
self.assertEqual(document.attachment_id.res_model, 'documents.document')
self.assertEqual(document.attachment_id.res_id, document.id)
self.assertEqual(document.folder_id, self.folder)
self.assertEqual(document.tag_ids, self.other_tag)
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_custom_tags_command_1(self):
defaults = ast.literal_eval(self.folder.alias_id.alias_defaults)
defaults['tag_ids'] = [(Command.LINK.value, self.other_tag.id), (Command.LINK.value, self.non_existing_tag_id)]
self.folder.alias_id.alias_defaults = repr(defaults)
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertEqual(document.tag_ids, self.other_tag)
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_custom_tags_command_2(self):
defaults = ast.literal_eval(self.folder.alias_id.alias_defaults)
defaults['tag_ids'] = [(Command.SET.value, 0, [self.other_tag.id, self.non_existing_tag_id])]
self.folder.alias_id.alias_defaults = repr(defaults)
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertEqual(document.tag_ids, self.other_tag)
@mute_logger('odoo.addons.mail.models.mail_thread')
def test_custom_tags_false(self):
defaults = ast.literal_eval(self.folder.alias_id.alias_defaults)
defaults['tag_ids'] = False
self.folder.alias_id.alias_defaults = repr(defaults)
for document in self.send_test_mail_with_attachment(self.pre_existing_partner.email):
self.assertFalse(document.tag_ids)
def test_alias_access(self):
"""Test that only the documents manager can set an alias."""
Doc = self.env['documents.document'].with_context(default_access_internal='edit')
user = new_test_user(self.env, login='documents_user', groups='base.group_user,documents.group_documents_user')
manager = new_test_user(self.env, login='documents_manager', groups='base.group_user,documents.group_documents_manager')
with self.assertRaises(AccessError):
Doc.with_user(user).create({'name': 'Test', 'alias_name': 'doc_test_1', 'type': 'folder'})
# in SUDO, the user can set the alias
document = Doc.with_user(user).sudo().create({'name': 'Test', 'alias_name': 'doc_test_2', 'type': 'folder'})
self.assertEqual(document.alias_name, 'doc_test_2')
# the manager can set the alias
document = Doc.with_user(manager).create({'name': 'Test', 'alias_name': 'doc_test_3', 'type': 'folder'})
self.assertEqual(document.alias_name, 'doc_test_3')
document.with_user(user).name = 'test write'
with self.assertRaises(AccessError):
document.with_user(user).alias_name = 'doc_test_4'
document.with_user(manager).alias_name = 'doc_test_5'
self.assertEqual(document.alias_name, 'doc_test_5')
alias = self.env['mail.alias'].create({'alias_name': 'doc_test_6', 'alias_model_id': self.env['ir.model']._get('documents.document').id})
with self.assertRaises(AccessError):
Doc.with_user(user).create({'name': 'Test', 'alias_id': alias.id, 'type': 'folder'})
with self.assertRaises(AccessError):
document.with_user(user).alias_id = alias.id
alias.alias_name = False
Doc.with_user(user).create({'name': 'Test', 'alias_id': alias.id, 'type': 'folder'})