Skip to Content

Contributors

Re: Odoo Test framework and rollback issue

It's just a problem with how Odoo handles rollbacks and savepoints in tests. The thumb rule is to not do anything more after testing a raise. Do it in another test method.

Regards.

by Pedro M. Baeza - 07:47 - 15 Nov 2023

Reference

  • Odoo Test framework and rollback issue
    Hi everyone,

    I'm currently developing on 14.0 a test for one of my module and I'm having a headache trying to understand why an action is not properly rolled back after the exception is raised.

    My code sample:
    class TestSoftwareLicensePass(TransactionCase):
        def test_activation(self):
            ...
            self.assertEqual(pass_lic1.get_remaining_activation(), 1)
            with self.assertRaisesRegex(ValidationError, r"Max activation reached"):
                pass_lic1.activate("device_uuid_4/3")
            self.assertEqual(pass_lic1.get_remaining_activation(), 1)
            with self.assertRaisesRegex(ValidationError, r"Max activation reached"):
                pass_lic1.activate("device_uuid_4/3")

    The second assertEqual statement FAILS because get_remaining_activation() returns 0, but since the exception has been correctly captured by the  with self.assertRaisesRegex statement, this part should have been rolled back by the odoo framework.
    (and no cr.commit in the activate function)

    Looking in other tests, I can see that a lot of with self.assert statements have a self.cr.savepoint() at their side (like this code sample in odoo/odoo/addons/base/tests/test_views.py):

    class TestViewInheritance(ViewCase):   
        def test_no_recursion(self):
            r1 = self.makeView('R1')
            with self.assertRaises(ValidationError), self.cr.savepoint():
                r1.write({'inherit_id': r1.id})

    Is this related to the TransactionCase class ? (Probably not, I made a test with SavepointCase and same issue)
    Should I always append self.cr.savepoint() ?

    Yann.

    by Yann Papouin - 06:16 - 15 Nov 2023