OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
diff --git a/mail_tracking/tests/__init__.py b/mail_tracking/tests/__init__.py
index d40d444b6..76c005840 100644
--- a/mail_tracking/tests/__init__.py
+++ b/mail_tracking/tests/__init__.py
@@ -2,3 +2,4 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import test_mail_tracking
+from . import test_gc_mail_tracking_email
diff --git a/mail_tracking/tests/test_gc_mail_tracking_email.py b/mail_tracking/tests/test_gc_mail_tracking_email.py
new file mode 100644
index 000000000..74f32cefe
--- /dev/null
+++ b/mail_tracking/tests/test_gc_mail_tracking_email.py
@@ -0,0 +1,88 @@
+# Copyright 2024 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+
+from odoo import fields
+
+from odoo.addons.base.tests.common import SavepointCaseWithUserDemo
+
+
+class TestMailTrackingEmailCleanUp(SavepointCaseWithUserDemo):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
+ cls.settings = cls.env["res.config.settings"].create(
+ {"mail_tracking_email_max_age_days": 365}
+ )
+ cls.settings.set_values()
+ cls.partner = cls.env.ref("base.res_partner_address_28")
+ cls.message = cls.env["mail.message"].create(
+ {
+ "model": "res.partner",
+ "res_id": cls.partner.id,
+ "body": "TEST",
+ "message_type": "email",
+ "subtype_id": cls.env.ref("mail.mt_comment").id,
+ "author_id": cls.partner.id,
+ "date": "2024-03-26",
+ }
+ )
+ cls.recent_mail_tracking_email = cls.env["mail.tracking.email"].create(
+ {"mail_message_id": cls.message.id}
+ )
+ # Can't set the write_date directly as it gets overwritten by the ORM
+ cls.old_mail_tracking_email = cls.env["mail.tracking.email"].create(
+ {"mail_message_id": cls.message.id}
+ )
+ cls.total_count = 2
+ cls.recent_count = 1
+ cls.domain = [
+ ("mail_message_id", "=", cls.message.id),
+ ]
+
+ def _set_write_date(self):
+ # Set the write_date of the old record to be older than the max_age_days
+ # Update DB directly to avoid ORM overwriting the write_date
+ old_write_date = fields.Datetime.subtract(fields.Datetime.now(), days=400)
+ self.env.cr.execute(
+ "UPDATE mail_tracking_email SET write_date = %s WHERE id = %s",
+ (old_write_date, self.old_mail_tracking_email.id),
+ )
+
+ def test_deletion_of_mail_tracking_email(self):
+ self._set_write_date()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.total_count
+ )
+ self.env["mail.tracking.email"]._gc_mail_tracking_email()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.recent_count
+ )
+ self.assertTrue(self.recent_mail_tracking_email.exists())
+
+ def test_deletion_follows_configuration_variable(self):
+ self._set_write_date()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.total_count
+ )
+ # when disabled, no deletions should happen
+ self.settings.mail_tracking_email_max_age_days = 0
+ self.settings.set_values()
+ self.env["mail.tracking.email"]._gc_mail_tracking_email()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.total_count
+ )
+ # when disabled, no deletions should happen
+ self.settings.mail_tracking_email_max_age_days = -1
+ self.settings.set_values()
+ self.env["mail.tracking.email"]._gc_mail_tracking_email()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.total_count
+ )
+ # when enabled, deletions should happen
+ self.settings.mail_tracking_email_max_age_days = 365
+ self.settings.set_values()
+ self.env["mail.tracking.email"]._gc_mail_tracking_email()
+ self.assertEqual(
+ len(self.env["mail.tracking.email"].search(self.domain)), self.recent_count
+ )
diff --git a/mail_tracking/tests/test_mail_tracking.py b/mail_tracking/tests/test_mail_tracking.py
index 99d525f77..e07a873f8 100644
--- a/mail_tracking/tests/test_mail_tracking.py
+++ b/mail_tracking/tests/test_mail_tracking.py
@@ -158,6 +158,36 @@ class TestMailTracking(TransactionCase):
self.assertEqual(tracking_email.error_type, "no_recipient")
self.assertFalse(self.recipient.email_bounced)
+ def test_message_post_show_aliases(self):
+ # Create message with show aliases setup
+ self.env.company.mail_tracking_show_aliases = True
+ # Setup catchall domain
+ IrConfigParamObj = self.env["ir.config_parameter"].sudo()
+ IrConfigParamObj.set_param("mail.catchall.domain", "test.com")
+ # pylint: disable=C8107
+ message = self.env["mail.message"].create(
+ {
+ "subject": "Message test",
+ "author_id": self.sender.id,
+ "email_from": self.sender.email,
+ "message_type": "comment",
+ "model": "res.partner",
+ "res_id": self.recipient.id,
+ "partner_ids": [(4, self.recipient.id)],
+ "email_cc": "Dominique Pinon , customer-invoices@test.com", # noqa E501
+ "body": "