From b5c55a9331056afb1c21f685c523b425310130fa Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Wed, 27 Sep 2017 01:56:04 +0200 Subject: [PATCH 1/2] [FIX] base: tests, reflect unaccent behavior of 5e3de76f363d5effb426e3a14e84a3b8e53681b4 Since the revision 5e3de76f363d5effb426e3a14e84a3b8e53681b4 The `::text` is included within the `unaccent` call The expession tests have never been changed according to this change of behavior in the building of the unaccented queries. This has never been detected by runbot because you need to start the Odoo server with the option `--unaccent` and to create the database with the unaccent extension `CREATE EXTENSION unaccent` to be able to fail the former tests, and this is not the case on runbot. --- odoo/addons/base/tests/test_expression.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index 104c4a6dfe1..365876a9e16 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -689,7 +689,7 @@ class TestAutoJoin(TransactionCase): self.assertIn('res_partner_bank', sql_query[0], "_auto_join off: ('bank_ids.sanitized_acc_number', 'like', '..') first query incorrect main table") - expected = "%s::text like %s" % (unaccent('"res_partner_bank"."sanitized_acc_number"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_partner_bank"."sanitized_acc_number"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join off: ('bank_ids.sanitized_acc_number', 'like', '..') first query incorrect where condition") @@ -729,7 +729,7 @@ class TestAutoJoin(TransactionCase): self.assertIn('"res_partner_bank" as "res_partner__bank_ids"', sql_query[0], "_auto_join on: ('bank_ids.sanitized_acc_number', 'like', '..') query incorrect join") - expected = "%s::text like %s" % (unaccent('"res_partner__bank_ids"."sanitized_acc_number"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_partner__bank_ids"."sanitized_acc_number"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join on: ('bank_ids.sanitized_acc_number', 'like', '..') query incorrect where condition") @@ -812,7 +812,7 @@ class TestAutoJoin(TransactionCase): self.assertIn('"res_country"', sql_query[0], "_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect main table") - expected = "%s::text like %s" % (unaccent('"res_country"."code"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_country"."code"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition") @@ -846,7 +846,7 @@ class TestAutoJoin(TransactionCase): self.assertIn('"res_country" as "res_country_state__country_id"', sql_query[0], "_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect join") - expected = "%s::text like %s" % (unaccent('"res_country_state__country_id"."code"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_country_state__country_id"."code"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition") @@ -880,7 +880,7 @@ class TestAutoJoin(TransactionCase): self.assertIn('"res_country" as "res_partner__state_id__country_id"', sql_query[0], "_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect join") - expected = "%s::text like %s" % (unaccent('"res_partner__state_id__country_id"."code"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_partner__state_id__country_id"."code"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect where condition") @@ -910,7 +910,7 @@ class TestAutoJoin(TransactionCase): # Test produced queries that domains effectively present sql_query = self.query_list[0].get_sql() - expected = "%s::text like %s" % (unaccent('"res_partner__child_ids__bank_ids"."sanitized_acc_number"'), unaccent('%s')) + expected = "%s like %s" % (unaccent('"res_partner__child_ids__bank_ids"."sanitized_acc_number"::text'), unaccent('%s')) self.assertIn(expected, sql_query[1], "_auto_join on one2many with domains incorrect result") # TDE TODO: check first domain has a correct table name From 808c0e5dde61027241ff59b1674b159067da0d7e Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 10 Aug 2017 13:13:49 +0200 Subject: [PATCH 2/2] [FIX] test_assetsbundle: handle readonly files If the Odoo server runs with its sources read-only for itself, this is not possible for the server to touch the files contained in the assets. In such a case, instead of touching the file, we alter the attachment checksum, to simulate a change within the modified date. However, in such a case, we can only test that the bundle is well generated again. We can no longer check the change of version and modified date, since the modified date of the files have not changed, and therefore the checksum (which is based on the files modified date, among others) neither. --- .../tests/test_assetsbundle.py | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py index c8ed48a33b1..86c878b35e2 100644 --- a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py +++ b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py @@ -2,6 +2,8 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from collections import Counter +import datetime +import errno from os import utime import time @@ -12,6 +14,21 @@ from odoo.tests import HttpCase from odoo.tests.common import TransactionCase +def _touch(filepath, asset, t=None): + try: + utime(filepath, (t, t) if t else None) + except OSError as e: + if e.errno in [errno.EPERM, errno.EACCES, errno.EROFS]: + # Permission denied when touching the asset file, possibly read-only filesystem. + # We alter the asset last modified time to simulate a change in the file + now = datetime.datetime.now() + asset.last_modified = now + for sheet in asset.stylesheets: + sheet.last_modified = now + else: + raise + + class TestJavascriptAssetsBundle(TransactionCase): def setUp(self): super(TestJavascriptAssetsBundle, self).setUp() @@ -82,9 +99,9 @@ class TestJavascriptAssetsBundle(TransactionCase): version0 = bundle0.version path = get_resource_path('test_assetsbundle', 'static', 'src', 'js', 'test_jsfile1.js') - utime(path, None) # touch - bundle1 = self._get_asset(self.jsbundle_xmlid) + _touch(path, bundle1) + bundle1.js() last_modified1 = bundle1.last_modified version1 = bundle1.version @@ -210,9 +227,9 @@ class TestJavascriptAssetsBundle(TransactionCase): version0 = bundle0.version path = get_resource_path('test_assetsbundle', 'static', 'src', 'css', 'test_cssfile1.css') - utime(path, None) # touch - bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'max_css_rules': 1})) + _touch(path, bundle1) + bundle1.css() last_modified1 = bundle1.last_modified version1 = bundle1.version @@ -362,10 +379,12 @@ class TestAssetsBundleWithIRAMock(TransactionCase): self.env['ir.attachment']._patch_method('unlink', unlink) self.addCleanup(self.env['ir.attachment']._revert_method, 'unlink') - def _bundle(self, should_create, should_unlink): - self.counter.clear() + def _get_asset(self): files, remains = self.env['ir.qweb']._get_asset_content(self.lessbundle_xmlid, {}) - asset = AssetsBundle(self.lessbundle_xmlid, files, remains, env=self.env) + return AssetsBundle(self.lessbundle_xmlid, files, remains, env=self.env) + + def _bundle(self, asset, should_create, should_unlink): + self.counter.clear() asset.to_html(debug='assets') self.assertEquals(self.counter['create'], int(should_create)) self.assertEquals(self.counter['unlink'], int(should_unlink)) @@ -375,16 +394,17 @@ class TestAssetsBundleWithIRAMock(TransactionCase): are correctly invalidated. """ # Compile for the first time - self._bundle(True, False) + self._bundle(self._get_asset(), True, False) # Compile a second time, without changes - self._bundle(False, False) + self._bundle(self._get_asset(), False, False) # Touch the file and compile a third time path = get_resource_path('test_assetsbundle', 'static', 'src', 'less', 'test_lessfile1.less') t = time.time() + 5 - utime(path, (t, t)) # touch - self._bundle(True, True) + asset = self._get_asset() + _touch(path, asset, t=t) + self._bundle(asset, True, True) # Because we are in the same transaction since the beginning of the test, the first asset # created and the second one have the same write_date, but the file's last modified date @@ -394,4 +414,4 @@ class TestAssetsBundleWithIRAMock(TransactionCase): self.cr.execute("update ir_attachment set write_date=clock_timestamp() + interval '10 seconds' where id = (select max(id) from ir_attachment)") # Compile a fourth time, without changes - self._bundle(False, False) + self._bundle(self._get_asset(), False, False)