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.

137 lines
5.1 KiB

  1. # -*- coding: utf-8 -*-
  2. #
  3. #
  4. # Authors: Guewen Baconnier
  5. # Copyright 2015 Camptocamp SA
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as
  9. # published by the Free Software Foundation, either version 3 of the
  10. # License, or (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. #
  21. from openerp.tests import common
  22. from .common import RevisionMixin
  23. class TestRevisionFlow(RevisionMixin, common.TransactionCase):
  24. """ Check how revision are generated and applied based on the rules.
  25. We do not really care about the types of the fields in this test suite,
  26. but we have to ensure that the general revision flows work as expected.
  27. """
  28. def _setup_behavior(self):
  29. RevisionBehavior = self.env['revision.behavior']
  30. partner_model_id = self.env.ref('base.model_res_partner').id
  31. self.field_name = self.env.ref('base.field_res_partner_name')
  32. self.field_street = self.env.ref('base.field_res_partner_street')
  33. self.field_street2 = self.env.ref('base.field_res_partner_street2')
  34. RevisionBehavior.create({
  35. 'model_id': partner_model_id,
  36. 'field_id': self.field_name.id,
  37. 'default_behavior': 'auto',
  38. })
  39. RevisionBehavior.create({
  40. 'model_id': partner_model_id,
  41. 'field_id': self.field_street.id,
  42. 'default_behavior': 'validate',
  43. })
  44. RevisionBehavior.create({
  45. 'model_id': partner_model_id,
  46. 'field_id': self.field_street2.id,
  47. 'default_behavior': 'never',
  48. })
  49. def setUp(self):
  50. super(TestRevisionFlow, self).setUp()
  51. self._setup_behavior()
  52. self.partner = self.env['res.partner'].create({
  53. 'name': 'X',
  54. 'street': 'street X',
  55. 'street2': 'street2 X',
  56. })
  57. def assert_revision(self, partner, expected_changes):
  58. """ Check if a revision has been created according to expected values
  59. The partner should have no prior revision than the one created in the
  60. test (so it has exactly 1 revision).
  61. The expected changes are tuples with (field, current_value,
  62. new_value, state)
  63. :param partner: record of partner having a revision
  64. :param expected_changes: contains tuples with the changes
  65. :type expected_changes: list(tuple))
  66. """
  67. revision = self.env['res.partner.revision'].search(
  68. [('partner_id', '=', partner.id)],
  69. )
  70. self.assertEqual(len(revision), 1,
  71. "1 revision expected, got %s" % (revision,))
  72. changes = revision.change_ids
  73. missing = []
  74. for expected_change in expected_changes:
  75. for change in changes:
  76. if (change.field_id, change.current_value, change.new_value,
  77. change.state) == expected_change:
  78. changes -= change
  79. break
  80. else:
  81. missing.append(expected_change)
  82. message = u''
  83. for field, current_value, new_value, state in missing:
  84. message += ("- field: '%s', current_value: '%s', "
  85. "new_value: '%s', state: '%s'\n" %
  86. (field.name, current_value, new_value, state))
  87. for change in changes:
  88. message += ("+ field: '%s', current_value: '%s', "
  89. "new_value: '%s', state: '%s'\n" %
  90. (change.field_id.name, change.current_value,
  91. change.new_value, change.state))
  92. if message:
  93. raise AssertionError('Changes do not match\n\n:%s' % message)
  94. def test_new_revision(self):
  95. """ Add a new revision on a partner """
  96. self.partner.with_context(__revision_rules=True).write({
  97. 'name': 'Y',
  98. 'street': 'street Y',
  99. 'street2': 'street2 Y',
  100. })
  101. self.assert_revision(
  102. self.partner,
  103. [(self.field_name, 'X', 'Y', 'done'),
  104. (self.field_street, 'street X', 'street Y', 'draft'),
  105. (self.field_street2, 'street2 X', 'street2 Y', 'cancel'),
  106. ],
  107. )
  108. def test_manual_edition(self):
  109. """ A manual edition of a partner should always be applied
  110. But should create a 'done' revision
  111. """
  112. self.partner.write({
  113. 'name': 'Y',
  114. 'street': 'street Y',
  115. 'street2': 'street2 Y',
  116. })
  117. self.assert_revision(
  118. self.partner,
  119. [(self.field_name, 'X', 'Y', 'done'),
  120. (self.field_street, 'street X', 'street Y', 'done'),
  121. (self.field_street2, 'street2 X', 'street2 Y', 'done'),
  122. ],
  123. )