-
-
Notifications
You must be signed in to change notification settings - Fork 731
Expand file tree
/
Copy pathtest_mail_cc_bcc.py
More file actions
198 lines (182 loc) · 8.03 KB
/
Copy pathtest_mail_cc_bcc.py
File metadata and controls
198 lines (182 loc) · 8.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# Copyright 2023 Camptocamp
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import hashlib
import inspect
import logging
from odoo import tools
from odoo.tests import Form
from odoo.addons.mail.models.mail_mail import MailMail as upstream
from odoo.addons.mail.tests.test_mail_composer import TestMailComposer
# When Odoo upstream function _send in the mail.mail model, that has been fully
# overwritten in this module changes, we might have to reflect those changes
# in our version. The change is detected by computing the hash on the upstream code.
# To check what needs to be done, look at the commits in Odoo:
# git log --oneline -- addons/mail/models/mail_mail.py
VALID_HASHES = [
"d52cb36b88b33abc9556f7be6718d93f",
"461467cd5b356072fc054468c75f6e26",
"5d1ab352416f5074e131f35f20098d5b",
"46172c91183f2cb50b22a6b3b5e3869b",
"8f26c4084cc7fc300e64d19ccdc944fe",
"db6cc0d3513a0c85bd716e4cb0a4d09c",
"458982c6cb3a347b13008f7d8130f633", # odoo commit 3af276804101
"2e0c730330ae3bdf00c6bfd956b0527b",
"172e9656a6089deab948fe43d4bb31de", # odoo commit 465f907835be
]
class TestMailCcBcc(TestMailComposer):
@classmethod
def setUpClass(cls):
super().setUpClass()
env = cls.env
cls.partner = env.ref("base.res_partner_address_31")
cls.partner_cc = env.ref("base.partner_demo")
cls.partner_cc2 = env.ref("base.partner_demo_portal")
cls.partner_cc3 = env.ref("base.res_partner_main1")
cls.partner_bcc = env.ref("base.res_partner_main2")
def open_mail_composer_form(self):
# Use form to populate data
test_record = self.test_record.with_env(self.env)
ctx = {
"default_partner_ids": test_record.ids,
"default_model": test_record._name,
"default_res_id": test_record.id,
# to ensure consistent test results even when mail_post_defer is installed
"mail_notify_force_send": True,
}
form = Form(self.env["mail.compose.message"].with_context(**ctx))
form.body = "<p>Hello</p>"
return form
def test_upstream_file_hash(self):
"""Test that copied upstream function hasn't received fixes"""
func = inspect.getsource(upstream._send).encode()
func_hash = hashlib.md5(func).hexdigest()
if func_hash not in VALID_HASHES: # pragma: no cover
logging.info("New hash: %(hash)s", func_hash)
logging.error(
"mail.mail#_send has changed in upstream, "
"please adapt the override and add the new hash above",
)
def test_email_cc_bcc(self):
form = self.open_mail_composer_form()
composer = form.save()
# Use object to update Many2many fields (form can't do like this)
composer.partner_cc_ids = self.partner_cc
composer.partner_cc_ids |= self.partner_cc2
composer.partner_cc_ids |= self.partner_cc3
composer.partner_bcc_ids = self.partner_bcc
with self.mock_mail_gateway():
composer._action_send_mail()
# Verify recipients of mail.message
message = self.test_record.message_ids[0]
self.assertEqual(len(message.recipient_cc_ids), 3)
self.assertEqual(len(message.recipient_bcc_ids), 1)
# Verify notification
for_message = [
("mail_message_id", "=", message.id),
("notification_type", "=", "email"),
]
notif = self.env["mail.notification"].search(for_message)
self.assertEqual(len(notif), 5)
# Verify data of mail.mail
mail = message.mail_ids
expecting = ", ".join(
[
'"Marc Demo" <mark.brown23@example.com>',
'"Joel Willis" <joel.willis63@example.com>',
'"Chester Reed" <chester.reed79@example.com>',
]
)
self.assertEqual(mail.email_cc, expecting)
expecting = '"Dwayne Newman" <dwayne.newman28@example.com>'
self.assertEqual(mail.email_bcc, expecting)
def test_template_cc_bcc(self):
env = self.env
# Company default values
env.company.default_partner_cc_ids = self.partner_cc3
env.company.default_partner_bcc_ids = self.partner_cc2
# Res Partner values
res_partner_model = env["ir.model"].search([("model", "=", "res.partner")])
partner_cc = self.partner_cc
partner_bcc = self.partner_bcc
vals = {
"name": "Contact: New Contact",
"model_id": res_partner_model.id,
"subject": "Re: New Contact",
"body_html": """<p style="margin:0px 0 12px 0;box-sizing:border-box;">
New Contact<br></p>""",
"email_cc": tools.formataddr(
(partner_cc.name or "False", partner_cc.email or "False")
),
"email_bcc": tools.formataddr(
(partner_bcc.name or "False", partner_bcc.email or "False")
),
}
mail_tmpl = env["mail.template"].create(vals)
# Open mail composer form and check for default values from company
form = self.open_mail_composer_form()
composer = form.save()
self.assertEqual(composer.partner_cc_ids, self.partner_cc3)
self.assertEqual(composer.partner_bcc_ids, self.partner_cc2)
# Change email template and check for values from it
form.template_id = mail_tmpl
composer = form.save()
# Beside existing Cc and Bcc, add template's ones
form = Form(composer)
form.template_id = mail_tmpl
composer = form.save()
expecting = self.partner_cc3 + self.partner_cc
self.assertEqual(composer.partner_cc_ids, expecting)
expecting = self.partner_cc2 + self.partner_bcc
self.assertEqual(composer.partner_bcc_ids, expecting)
# But not add Marc Demo from cc field to partner_ids field
self.assertEqual(len(composer.partner_ids), 1)
self.assertEqual(composer.partner_ids.display_name, "Test")
# Selecting the template again doesn't add as the partners already
# in the list
form = Form(composer)
form.template_id = env["mail.template"]
form.save()
self.assertFalse(form.template_id)
form.template_id = mail_tmpl
composer = form.save()
expecting = self.partner_cc3 + self.partner_cc
self.assertEqual(composer.partner_cc_ids, expecting)
expecting = self.partner_cc2 + self.partner_bcc
self.assertEqual(composer.partner_bcc_ids, expecting)
def set_company(self):
company = self.env.company
# Company default values
company.default_partner_cc_ids = self.partner_cc3
company.default_partner_bcc_ids = self.partner_cc2
def test_recipient_ids_and_cc_bcc(self):
self.set_company()
form = self.open_mail_composer_form()
composer = form.save()
composer.partner_ids = self.partner + self.partner_cc
with self.mock_mail_gateway():
composer._action_send_mail()
message = self.test_record.message_ids[0]
self.assertEqual(len(message.mail_ids), 1)
# Only 4 partners notified
self.assertEqual(len(message.notified_partner_ids), 4)
self.assertEqual(len(message.notification_ids), 4)
def test_mail_without_cc_bcc(self):
# Test without any partner in cc/bcc -> only 1 mail should be sent
self.set_company()
form = self.open_mail_composer_form()
subject = "Testing without cc/bcc single mail"
form.subject = subject
composer = form.save()
composer.partner_cc_ids = None
composer.partner_bcc_ids = None
composer.partner_ids = self.partner + self.partner_cc
ctx = {"mail_notify_force_send": True}
ctx.update(composer.env.context)
composer = composer.with_context(**ctx)
with self.mock_mail_gateway():
composer._action_send_mail()
sent_mails = 0
for mail in self._mails:
if subject == mail.get("subject"):
sent_mails += 1
self.assertEqual(sent_mails, 1)