diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py index dcbf11d1b5e..e521171ff35 100644 --- a/odoo/addons/base/tests/test_api.py +++ b/odoo/addons/base/tests/test_api.py @@ -3,7 +3,7 @@ from odoo import api, models, Command from odoo.addons.base.tests.common import SavepointCaseWithUserDemo -from odoo.tools import mute_logger +from odoo.tools import mute_logger, unique from odoo.exceptions import AccessError @@ -382,6 +382,56 @@ class TestAPI(SavepointCaseWithUserDemo): self.assertIn('company_type', partner1._cache) self.assertNotIn('company_type', partner2._cache) + def test_60_reversed(self): + records = self.partners + self.assertGreater(len(records), 1) + + # check order + self.assertEqual(list(reversed(records)), list(reversed(list(records)))) + + first = next(iter(records)) + last = next(reversed(records)) + self.assertEqual(first, records[0]) + self.assertEqual(last, records[-1]) + + # check prefetching + prefetch_ids = records.ids + reversed_ids = [record.id for record in reversed(records)] + + self.assertEqual(list(first._prefetch_ids), prefetch_ids) + self.assertEqual(list(last._prefetch_ids), reversed_ids) + + self.assertEqual(list(reversed(first._prefetch_ids)), reversed_ids) + self.assertEqual(list(reversed(last._prefetch_ids)), prefetch_ids) + + # check prefetching across many2one field + prefetch_ids = records.state_id.ids + reversed_ids = list(unique( + record.state_id.id + for record in reversed(records) + if record.state_id + )) + + self.assertEqual(list(first.state_id._prefetch_ids), prefetch_ids) + self.assertEqual(list(last.state_id._prefetch_ids), reversed_ids) + + self.assertEqual(list(reversed(first.state_id._prefetch_ids)), reversed_ids) + self.assertEqual(list(reversed(last.state_id._prefetch_ids)), prefetch_ids) + + # check prefetching across x2many field + prefetch_ids = records.child_ids.ids + reversed_ids = list(unique( + child.id + for record in reversed(records) + for child in record.child_ids + )) + + self.assertEqual(list(first.child_ids._prefetch_ids), prefetch_ids) + self.assertEqual(list(last.child_ids._prefetch_ids), reversed_ids) + + self.assertEqual(list(reversed(first.child_ids._prefetch_ids)), reversed_ids) + self.assertEqual(list(reversed(last.child_ids._prefetch_ids)), prefetch_ids) + @mute_logger('odoo.models') def test_70_one(self): """ Check method one(). """ diff --git a/odoo/addons/test_performance/tests/test_performance.py b/odoo/addons/test_performance/tests/test_performance.py index f67a3378a55..ea3b5ba7a4c 100644 --- a/odoo/addons/test_performance/tests/test_performance.py +++ b/odoo/addons/test_performance/tests/test_performance.py @@ -66,6 +66,21 @@ class TestPerformance(SavepointCaseWithUserDemo): for record in records: record.value_pc + @users('__system__', 'demo') + @warmup + def test_reversed_read_base(self): + records = self.env['test_performance.base'].search([]) + self.assertEqual(len(records), 5) + with self.assertQueryCount(__system__=5, demo=5): + # without cache + for record in reversed(records): + record.partner_id + + with self.assertQueryCount(__system__=5, demo=5): + # without cache + for record in reversed(records): + record.value_ctx + @warmup def test_read_base_depends_context(self): """ Compute in batch even when in cache in another context. """