summaryrefslogtreecommitdiff
path: root/odoo/addons/base/tests/test_expression.py
diff options
context:
space:
mode:
authorNicolas Lempereur <nle@odoo.com>2019-12-16 17:22:07 +0000
committerNicolas Lempereur <nle@odoo.com>2019-12-19 20:35:08 +0000
commitadc49e76fcec6490e321d87657eda5cea0293da7 (patch)
tree8cd1639a214e24985a603d94d8a7d80e6c4e8735 /odoo/addons/base/tests/test_expression.py
parent705b2faa695a42071fea4124aa9ac320ac0839df (diff)
[FIX] expression.py: avoid using TRUE_DOMAIN/FALSE_DOMAIN
Ensure that expression.OR and expression.AND and some other expression.py methods do not propagate or rely on TRUE_DOMAIN and FALSE_DOMAIN that may be muted on some instance. For example, if we did: self.search(expression.OR([])) then in the search method we do something like: received_domain.append(('res_field', '=', False)) before this commit, FALSE_DOMAIN would be altered for any succeeding code that try to use it in `[(0, '=', 1), ('res_field', '=', 'False')]`. Without the changeset, the added test would fail with: [(1, '=', 1), ('id', '=', 1)] != [(1, '=', 1)] [(0, '=', 1), ('id', '=', 1)] != [(0, '=', 1)] [(0, '=', 1), ('id', '=', 1)] != [(0, '=', 1)] [(1, '=', 1), ('id', '=', 1)] != [(1, '=', 1)] [(1, '=', 1), ('id', '=', 1)] != [(1, '=', 1)] note: another commit referenced in #41968 should make the TRUE_DOMAIN and FALSE_DOMAIN immutable. related to work on opw-2154448 closes #42107 closes odoo/odoo#42222 X-original-commit: 303ce32e6ccd7432b96ffae545e4a6eced68ae84 Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
Diffstat (limited to 'odoo/addons/base/tests/test_expression.py')
-rw-r--r--odoo/addons/base/tests/test_expression.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py
index e8cf33ef24c..2a7df364cc6 100644
--- a/odoo/addons/base/tests/test_expression.py
+++ b/odoo/addons/base/tests/test_expression.py
@@ -604,6 +604,37 @@ class TestExpression(SavepointCaseWithUserDemo):
self.assertNotIn(helene, Company.search([('name','not ilike','Helene')]))
self.assertNotIn(helene, Company.search([('name','not ilike','hélène')]))
+ def test_pure_function(self):
+ orig_false = expression.FALSE_DOMAIN.copy()
+ orig_true = expression.TRUE_DOMAIN.copy()
+ false = orig_false.copy()
+ true = orig_true.copy()
+
+ domain = expression.AND([])
+ domain += [('id', '=', 1)]
+ domain = expression.AND([])
+ self.assertEqual(domain, orig_true)
+
+ domain = expression.AND([false])
+ domain += [('id', '=', 1)]
+ domain = expression.AND([false])
+ self.assertEqual(domain, orig_false)
+
+ domain = expression.OR([])
+ domain += [('id', '=', 1)]
+ domain = expression.OR([])
+ self.assertEqual(domain, orig_false)
+
+ domain = expression.OR([true])
+ domain += [('id', '=', 1)]
+ domain = expression.OR([true])
+ self.assertEqual(domain, orig_true)
+
+ domain = expression.normalize_domain([])
+ domain += [('id', '=', 1)]
+ domain = expression.normalize_domain([])
+ self.assertEqual(domain, orig_true)
+
def test_like_wildcards(self):
# check that =like/=ilike expressions are working on an untranslated field
Partner = self.env['res.partner']