You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.6 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2018 Akretion (http://www.akretion.com).
  3. # Copyright 2019 ACSONE SA/NV
  4. # @author Sébastien BEAU <sebastien.beau@akretion.com>
  5. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  6. import mock
  7. import odoo.tests.common as common
  8. from odoo import api, models
  9. class ResPartnerTester(models.Model):
  10. _inherit = "res.partner"
  11. _name = "res.partner"
  12. @api.onchange("name")
  13. def _onchange_name_test(self):
  14. """
  15. When the name change, assign every existing partner category
  16. on the partner.
  17. This onchange is used to test behavior of this module for M2M fields.
  18. :return:
  19. """
  20. self.category_id = self.env['res.partner.category'].search([], limit=2)
  21. class TestOnchange(common.TransactionCase):
  22. def _init_test_model(self, model_cls):
  23. model_cls._build_model(self.registry, self.cr)
  24. model = self.env[model_cls._name].with_context(todo=[])
  25. model._prepare_setup()
  26. model._setup_base(partial=False)
  27. model._setup_fields(partial=False)
  28. model._setup_complete()
  29. model._auto_init()
  30. model.init()
  31. model._auto_end()
  32. return model
  33. def setUp(self):
  34. super(TestOnchange, self).setUp()
  35. self.registry.enter_test_mode()
  36. self.old_cursor = self.cr
  37. self.cr = self.registry.cursor()
  38. self.env = api.Environment(self.cr, self.uid, {})
  39. self.test_model = self._init_test_model(ResPartnerTester)
  40. def tearDown(self):
  41. self.registry.leave_test_mode()
  42. self.cr = self.old_cursor
  43. self.env = api.Environment(self.cr, self.uid, {})
  44. super(TestOnchange, self).tearDown()
  45. def test_playing_onchange_m2m(self):
  46. """
  47. Test if the onchange fill correctly M2M fields.
  48. :return:
  49. """
  50. values = {
  51. "name": "Balthazar Melchior Gaspard",
  52. }
  53. expected_categs = self.env['res.partner.category'].search([], limit=2)
  54. # We should have some categs for this test
  55. self.assertTrue(expected_categs)
  56. # We have to ensure categs are into cache. So just load the name.
  57. expected_categs.mapped("name")
  58. expected_result = [(5,)]
  59. expected_result.extend([(4, c.id) for c in expected_categs])
  60. result = self.env['res.partner'].play_onchanges(values, values.keys())
  61. self.assertEqual(result["category_id"], expected_result)
  62. def test_playing_onchange_on_model(self):
  63. res_partner = self.env["res.partner"]
  64. with mock.patch.object(
  65. res_partner.__class__, "write"
  66. ) as patched_write:
  67. result = self.env["res.partner"].play_onchanges(
  68. {"company_type": "company"}, ["company_type"]
  69. )
  70. patched_write.assert_not_called()
  71. self.assertEqual(result["is_company"], True)
  72. def test_playing_onchange_on_record(self):
  73. company = self.env.ref("base.main_company")
  74. with mock.patch.object(company.__class__, "write") as patched_write:
  75. result = company.play_onchanges(
  76. {"email": "contact@akretion.com"}, ["email"]
  77. )
  78. patched_write.assert_not_called()
  79. modified_fields = set(result.keys())
  80. self.assertSetEqual(
  81. modified_fields, {"rml_footer", "rml_footer_readonly"}
  82. )
  83. self.assertEqual(
  84. result["rml_footer"],
  85. u"Phone: +1 555 123 8069 | Email: contact@akretion.com | "
  86. u"Website: http://www.example.com",
  87. )
  88. self.assertEqual(result["rml_footer_readonly"], result["rml_footer"])
  89. # check that the original record is not modified
  90. self.assertFalse(company._get_dirty())
  91. self.assertEqual(company.email, u"info@yourcompany.example.com")
  92. def test_onchange_record_with_dirty_field(self):
  93. company = self.env.ref("base.main_company")
  94. company._set_dirty("name")
  95. self.assertListEqual(company._get_dirty(), ["name"])
  96. company.play_onchanges({"email": "contact@akretion.com"}, ["email"])
  97. self.assertListEqual(company._get_dirty(), ["name"])
  98. def test_onchange_wrong_key(self):
  99. res_partner = self.env["res.partner"]
  100. with mock.patch.object(
  101. res_partner.__class__, "write"
  102. ) as patched_write:
  103. # we specify a wrong field name... This field should be
  104. # ignored
  105. result = self.env["res.partner"].play_onchanges(
  106. {"company_type": "company"}, ["company_type", "wrong_key"]
  107. )
  108. patched_write.assert_not_called()
  109. self.assertEqual(result["is_company"], True)