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.

121 lines
4.5 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2017 LasLabs Inc.
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import fields, models
  5. from odoo.tests import common
  6. from odoo.exceptions import ValidationError
  7. # pylint: disable=consider-merging-classes-inherited
  8. class ResPartner(models.Model):
  9. _inherit = 'res.partner'
  10. social_security = fields.Char(
  11. compute=lambda s: s._compute_identification(
  12. 'social_security', 'SSN',
  13. ),
  14. inverse=lambda s: s._inverse_identification(
  15. 'social_security', 'SSN',
  16. ),
  17. search=lambda s, *a: s._search_identification(
  18. 'SSN', *a
  19. ),
  20. )
  21. class TestResPartner(common.TransactionCase):
  22. def _init_test_model(self, model_cls):
  23. """ Build a model from model_cls in order to test abstract models.
  24. Note that this does not actually create a table in the database, so
  25. there may be some unidentified edge cases.
  26. Args:
  27. model_cls (openerp.models.BaseModel): Class of model to initialize
  28. Returns:
  29. model_cls: Instance
  30. """
  31. registry = self.env.registry
  32. cr = self.env.cr
  33. inst = model_cls._build_model(registry, cr)
  34. model = self.env[model_cls._inherit].with_context(todo=[])
  35. model._prepare_setup()
  36. model._setup_base(partial=False)
  37. model._setup_fields(partial=False)
  38. model._setup_complete()
  39. model._auto_init()
  40. model.init()
  41. model._auto_end()
  42. return inst
  43. def setUp(self):
  44. super(TestResPartner, self).setUp()
  45. self._init_test_model(ResPartner)
  46. bad_cat = self.env['res.partner.id_category'].create({
  47. 'code': 'another_code',
  48. 'name': 'another_name',
  49. })
  50. self.env['res.partner.id_number'].create({
  51. 'name': 'Bad ID',
  52. 'category_id': bad_cat.id,
  53. 'partner_id': self.env.user.partner_id.id,
  54. })
  55. self.partner_id_category = self.env['res.partner.id_category'].create({
  56. 'code': 'id_code',
  57. 'name': 'id_name',
  58. })
  59. self.partner = self.env.user.partner_id
  60. self.partner_id = self.env['res.partner.id_number'].create({
  61. 'name': 'Good ID',
  62. 'category_id': self.partner_id_category.id,
  63. 'partner_id': self.partner.id,
  64. })
  65. def test_compute_identification(self):
  66. """ It should set the proper field to the proper ID name. """
  67. self.partner._compute_identification('name', 'id_code')
  68. self.assertEqual(self.partner.name, self.partner_id.name)
  69. def test_inverse_identification_saves(self):
  70. """ It should set the ID name to the proper field value. """
  71. self.partner._inverse_identification('name', 'id_code')
  72. self.assertEqual(self.partner_id.name, self.partner.name)
  73. def test_inverse_identification_creates_new_category(self):
  74. """ It should create a new category of the type if non-existent. """
  75. self.partner._inverse_identification('name', 'new_code_type')
  76. category = self.env['res.partner.id_category'].search([
  77. ('code', '=', 'new_code_type'),
  78. ])
  79. self.assertTrue(category)
  80. def test_inverse_identification_creates_new_id(self):
  81. """ It should create a new ID of the type if non-existent. """
  82. category = self.env['res.partner.id_category'].create({
  83. 'code': 'new_code_type',
  84. 'name': 'new_code_type',
  85. })
  86. self.partner._inverse_identification('name', 'new_code_type')
  87. identification = self.env['res.partner.id_number'].search([
  88. ('category_id', '=', category.id),
  89. ('partner_id', '=', self.partner.id),
  90. ])
  91. self.assertEqual(identification.name, self.partner.name)
  92. def test_inverse_identification_multi_exception(self):
  93. """ It should not allow a write when multiple IDs of same type. """
  94. self.env['res.partner.id_number'].create({
  95. 'name': 'Another ID',
  96. 'category_id': self.partner_id_category.id,
  97. 'partner_id': self.partner.id,
  98. })
  99. with self.assertRaises(ValidationError):
  100. self.partner._inverse_identification('name', 'id_code')
  101. def test_search_identification(self):
  102. """ It should return the right record when searched by ID. """
  103. self.partner.social_security = 'Test'
  104. partner = self.env['res.partner'].search([
  105. ('social_security', '=', 'Test'),
  106. ])
  107. self.assertEqual(partner, self.partner)