From 3b6c20805cd976db269cbb88e2c22c5ff4de37b1 Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Wed, 21 Sep 2022 15:29:13 +0000 Subject: [PATCH] [FIX] base: fix mock smtplib connection for server with 'starttls' encryption During tests, when matching ir.mail_server has `smtp_encryption` set to `starttls`, connect() will crash with an AttributeError as follows: 2022-09-22 07:04:27,882 20445 ERROR tests-150-starttls odoo.addons.base.tests.test_ir_mail_server: ERROR: TestIrMailServer.test_mail_server_send_email Traceback (most recent call last): File "/home/odoo/src/odoo/15.0/odoo/tools/misc.py", line 804, in deco return func(*args, **kwargs) File "/home/odoo/src/odoo/15.0/odoo/addons/base/tests/test_ir_mail_server.py", line 261, in test_mail_server_send_email IrMailServer.send_email(message, mail_server_id=self.server_domain.id) File "/home/odoo/src/odoo/15.0/odoo/addons/base/models/ir_mail_server.py", line 575, in send_email smtp = self.connect( File "/usr/lib/python3.8/unittest/mock.py", line 1081, in __call__ return self._mock_call(*args, **kwargs) File "/usr/lib/python3.8/unittest/mock.py", line 1085, in _mock_call return self._execute_mock_call(*args, **kwargs) File "/usr/lib/python3.8/unittest/mock.py", line 1146, in _execute_mock_call result = effect(*args, **kwargs) File "/home/odoo/src/odoo/15.0/odoo/addons/base/models/ir_mail_server.py", line 313, in connect connection.starttls(context=ssl_context) AttributeError: 'TestingSMTPSession' object has no attribute 'starttls' This commit adds a dummy `starttls()` method to `TestingSMTPSession` to gracefully handle such case. closes odoo/odoo#101962 X-original-commit: ec156901dd4db2fc7a2827b1eb78515f6259699e Signed-off-by: Julien Castiaux Signed-off-by: Xavier Alt (xal) --- odoo/addons/base/tests/common.py | 3 +++ odoo/addons/base/tests/test_ir_mail_server.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/odoo/addons/base/tests/common.py b/odoo/addons/base/tests/common.py index 67608368a7a..3f85b96944a 100644 --- a/odoo/addons/base/tests/common.py +++ b/odoo/addons/base/tests/common.py @@ -322,6 +322,9 @@ class MockSmtplibCase: def login(self, user, password): pass + def starttls(self, keyfile=None, certfile=None, context=None): + pass + self.testing_smtp_session = TestingSMTPSession() IrMailServer = self.env['ir.mail_server'] diff --git a/odoo/addons/base/tests/test_ir_mail_server.py b/odoo/addons/base/tests/test_ir_mail_server.py index c2a330067f9..46d832fa14a 100644 --- a/odoo/addons/base/tests/test_ir_mail_server.py +++ b/odoo/addons/base/tests/test_ir_mail_server.py @@ -254,6 +254,20 @@ class TestIrMailServer(TransactionCase, MockSmtplibCase): from_filter='custom_domain.com', ) + # Test when forcing the mail server and when smtp_encryption is "starttls" + self.server_domain.smtp_encryption = "starttls" + with self.mock_smtplib_connection(): + message = self._build_email(mail_from='specific_user@test.com') + IrMailServer.send_email(message, mail_server_id=self.server_domain.id) + + self.connect_mocked.assert_called_once() + self.assert_email_sent_smtp( + smtp_from='specific_user@test.com', + message_from='specific_user@test.com', + from_filter='test.com', + ) + + @mute_logger('odoo.models.unlink') def test_mail_server_send_email_smtp_session(self): """Test all the cases when we provide the SMTP session.