summaryrefslogtreecommitdiff
path: root/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
diff options
context:
space:
mode:
authorMartin Trigaux <mat@odoo.com>2018-08-10 15:37:17 +0200
committerMartin Trigaux <mat@odoo.com>2018-08-10 16:32:50 +0200
commitf7130556bbcbc0a0b93ba07ef1da9c9d11b68b54 (patch)
tree33a455e6ad8219595b8fcb786e88d44cc1d60e75 /odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
parentb6f7ad3adb23fff1aa888d8315aca8157b555b03 (diff)
[REF] *: add support for RTL languages
מזל טוב The direction parameter will now have a real impact on the web interface and completly switch the direction of the interface. Add the dependency rtlcss to switch the direction with a css postprocessor. Two different assets will be generated for ltr or rtl /web/content/<...>/web.assets_backend.0.css and /web/content/<...>/rtl/web.assets_backend.0.css to be able to differentiate it easily Adapt the css and views to be easier to switch direction Render graph as it is, do not move y-axis right side, as per mathematical rule value goes left from origin are considered negative, so keep graph as it is for right to left language add test cases for language direction specific assets bundle if language direction is rtl then we also store css files in assets bundle now we store two assets bundle, one for ltr and one for rtl language direction test two assets bundles generated, also test two assets bundle generated for en_US and ar_SY
Diffstat (limited to 'odoo/addons/test_assetsbundle/tests/test_assetsbundle.py')
-rw-r--r--odoo/addons/test_assetsbundle/tests/test_assetsbundle.py211
1 files changed, 206 insertions, 5 deletions
diff --git a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
index 3f4e75b7b69..a2b03940e2b 100644
--- a/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
+++ b/odoo/addons/test_assetsbundle/tests/test_assetsbundle.py
@@ -34,18 +34,20 @@ class TestJavascriptAssetsBundle(TransactionCase):
super(TestJavascriptAssetsBundle, self).setUp()
self.jsbundle_xmlid = 'test_assetsbundle.bundle1'
self.cssbundle_xmlid = 'test_assetsbundle.bundle2'
+ self.env['res.lang'].load_lang('ar_SY')
def _get_asset(self, xmlid, env=None):
env = (env or self.env)
files, remains = env['ir.qweb']._get_asset_content(xmlid, env.context)
return AssetsBundle(xmlid, files, env=env)
- def _any_ira_for_bundle(self, type):
+ def _any_ira_for_bundle(self, type, lang=None):
""" Returns all ir.attachments associated to a bundle, regardless of the verion.
"""
+ user_direction = self.env['res.lang'].search([('code', '=', (lang or self.env.user.lang))]).direction
bundle = self.jsbundle_xmlid if type == 'js' else self.cssbundle_xmlid
return self.env['ir.attachment'].search([
- ('url', '=like', '/web/content/%-%/{0}%.{1}'.format(bundle, type))
+ ('url', '=like', '/web/content/%-%/{0}{1}%.{2}'.format(('rtl/' if type == 'css' and user_direction == 'rtl' else ''), bundle, type))
])
def test_01_generation(self):
@@ -312,7 +314,207 @@ class TestJavascriptAssetsBundle(TransactionCase):
content = bundle0.to_html()
self.assertEqual(content.count('test_assetsbundle.bundle2.0.css'), 1)
- def test_15_exteral_lib_assets(self):
+ # Language direction specific tests
+
+ def test_15_rtl_css_generation(self):
+ """ Checks that a bundle creates an ir.attachment record when its `css` method is called
+ for the first time for language with different direction and separate bundle is created for rtl direction.
+ """
+ self.bundle = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+
+ # there shouldn't be any attachment associated to this bundle
+ self.assertEquals(len(self._any_ira_for_bundle('css', lang='ar_SY')), 0)
+ self.assertEquals(len(self.bundle.get_attachments('css')), 0)
+
+ # trigger the first generation and, thus, the first save in database
+ self.bundle.css()
+
+ # there should be one attachment associated to this bundle
+ self.assertEquals(len(self._any_ira_for_bundle('css', lang='ar_SY')), 1)
+ self.assertEquals(len(self.bundle.get_attachments('css')), 1)
+
+ def test_16_ltr_and_rtl_css_access(self):
+ """ Checks that the bundle's cache is working, i.e. that the bundle creates only one
+ ir.attachment record when rendered multiple times for rtl direction also check we have two css bundles,
+ one for ltr and one for rtl.
+ """
+ # Assets access for en_US language
+ ltr_bundle0 = self._get_asset(self.cssbundle_xmlid)
+ ltr_bundle0.css()
+
+ self.assertEquals(len(self._any_ira_for_bundle('css')), 1)
+
+ ltr_version0 = ltr_bundle0.version
+ ltr_ira0 = self._any_ira_for_bundle('css')
+ ltr_date0 = ltr_ira0.create_date
+
+ ltr_bundle1 = self._get_asset(self.cssbundle_xmlid)
+ ltr_bundle1.css()
+
+ self.assertEquals(len(self._any_ira_for_bundle('css')), 1)
+
+ ltr_version1 = ltr_bundle1.version
+ ltr_ira1 = self._any_ira_for_bundle('css')
+ ltr_date1 = ltr_ira1.create_date
+
+ self.assertEquals(ltr_version0, ltr_version1)
+ self.assertEquals(ltr_date0, ltr_date1)
+
+ # Assets access for ar_SY language
+ rtl_bundle0 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+ rtl_bundle0.css()
+
+ self.assertEquals(len(self._any_ira_for_bundle('css', lang='ar_SY')), 1)
+
+ rtl_version0 = rtl_bundle0.version
+ rtl_ira0 = self._any_ira_for_bundle('css', lang='ar_SY')
+ rtl_date0 = rtl_ira0.create_date
+
+ rtl_bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+ rtl_bundle1.css()
+
+ self.assertEquals(len(self._any_ira_for_bundle('css', lang='ar_SY')), 1)
+
+ rtl_version1 = rtl_bundle1.version
+ rtl_ira1 = self._any_ira_for_bundle('css', lang='ar_SY')
+ rtl_date1 = rtl_ira1.create_date
+
+ self.assertEquals(rtl_version0, rtl_version1)
+ self.assertEquals(rtl_date0, rtl_date1)
+
+ # Checks rtl and ltr bundles are different
+ self.assertNotEquals(ltr_ira1.id, rtl_ira1.id)
+
+ # Check two bundles are available, one for ltr and one for rtl
+ css_bundles = self.env['ir.attachment'].search([
+ ('url', '=like', '/web/content/%-%/{0}%.{1}'.format(self.cssbundle_xmlid, 'css'))
+ ])
+ self.assertEquals(len(css_bundles), 2)
+
+ def test_17_css_bundle_date_invalidation(self):
+ """ Checks that both css bundles are invalidated when one of its assets' modification date is changed
+ """
+ # Assets access for en_US language
+ ltr_bundle0 = self._get_asset(self.cssbundle_xmlid)
+ ltr_bundle0.css()
+ ltr_last_modified0 = ltr_bundle0.last_modified
+ ltr_version0 = ltr_bundle0.version
+
+ # Assets access for ar_SY language
+ rtl_bundle0 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+ rtl_bundle0.css()
+ rtl_last_modified0 = rtl_bundle0.last_modified
+ rtl_version0 = rtl_bundle0.version
+
+ # Touch test_cssfile1.css
+ # Note: No lang specific context given while calling _get_asset so it will load assets for en_US
+ path = get_resource_path('test_assetsbundle', 'static', 'src', 'css', 'test_cssfile1.css')
+ ltr_bundle1 = self._get_asset(self.cssbundle_xmlid)
+ _touch(path, ltr_bundle1)
+
+ ltr_bundle1.css()
+ ltr_last_modified1 = ltr_bundle1.last_modified
+ ltr_version1 = ltr_bundle1.version
+ ltr_ira1 = self._any_ira_for_bundle('css')
+ self.assertNotEquals(ltr_last_modified0, ltr_last_modified1)
+ self.assertNotEquals(ltr_version0, ltr_version1)
+
+ rtl_bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+
+ rtl_bundle1.css()
+ rtl_last_modified1 = rtl_bundle1.last_modified
+ rtl_version1 = rtl_bundle1.version
+ rtl_ira1 = self._any_ira_for_bundle('css', lang='ar_SY')
+ self.assertNotEquals(rtl_last_modified0, rtl_last_modified1)
+ self.assertNotEquals(rtl_version0, rtl_version1)
+
+ # Checks rtl and ltr bundles are different
+ self.assertNotEquals(ltr_ira1.id, rtl_ira1.id)
+
+ # check if the previous attachment is correctly cleaned
+ css_bundles = self.env['ir.attachment'].search([
+ ('url', '=like', '/web/content/%-%/{0}%.{1}'.format(self.cssbundle_xmlid, 'css'))
+ ])
+ self.assertEquals(len(css_bundles), 2)
+
+ def test_18_css_bundle_content_invalidation(self):
+ """ Checks that a bundle is invalidated when its content is modified by adding a file to
+ source.
+ """
+ # Assets for en_US
+ ltr_bundle0 = self._get_asset(self.cssbundle_xmlid)
+ ltr_bundle0.css()
+ ltr_files0 = ltr_bundle0.files
+ ltr_version0 = ltr_bundle0.version
+
+ rtl_bundle0 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+ rtl_bundle0.css()
+ rtl_files0 = rtl_bundle0.files
+ rtl_version0 = rtl_bundle0.version
+
+ css_bundles = self.env['ir.attachment'].search([
+ ('url', '=like', '/web/content/%-%/{0}%.{1}'.format(self.cssbundle_xmlid, 'css'))
+ ])
+ self.assertEquals(len(css_bundles), 2)
+
+ view_arch = """
+ <data>
+ <xpath expr="." position="inside">
+ <script type="text/css" src="/test_assetsbundle/static/src/css/test_cssfile3.css"/>
+ </xpath>
+ </data>
+ """
+ bundle = self.browse_ref(self.cssbundle_xmlid)
+ view = self.env['ir.ui.view'].create({
+ 'name': 'test bundle inheritance',
+ 'type': 'qweb',
+ 'arch': view_arch,
+ 'inherit_id': bundle.id,
+ })
+
+ ltr_bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'check_view_ids': view.ids}))
+ ltr_bundle1.css()
+ ltr_files1 = ltr_bundle1.files
+ ltr_version1 = ltr_bundle1.version
+ ltr_ira1 = self._any_ira_for_bundle('css')
+
+ self.assertNotEquals(ltr_files0, ltr_files1)
+ self.assertNotEquals(ltr_version0, ltr_version1)
+
+ rtl_bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'check_view_ids': view.ids, 'lang': 'ar_SY'}))
+ rtl_bundle1.css()
+ rtl_files1 = rtl_bundle1.files
+ rtl_version1 = rtl_bundle1.version
+ rtl_ira1 = self._any_ira_for_bundle('css', lang='ar_SY')
+
+ self.assertNotEquals(rtl_files0, rtl_files1)
+ self.assertNotEquals(rtl_version0, rtl_version1)
+
+ # Checks rtl and ltr bundles are different
+ self.assertNotEquals(ltr_ira1.id, rtl_ira1.id)
+
+ # check if the previous attachment are correctly cleaned
+ css_bundles = self.env['ir.attachment'].search([
+ ('url', '=like', '/web/content/%-%/{0}%.{1}'.format(self.cssbundle_xmlid, 'css'))
+ ])
+ self.assertEquals(len(css_bundles), 2)
+
+ def test_19_css_in_debug_assets(self):
+ """ Checks that a bundle rendered in debug mode(assets) with right to left language direction stores css files in assets bundle.
+ """
+ debug_bundle = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'lang': 'ar_SY'}))
+ content = debug_bundle.to_html(debug='assets')
+
+ # css file should be available in assets bundle as user's lang direction is rtl
+ self.assertIn('/test_assetsbundle/static/src/css/test_cssfile1/rtl/{0}.css'.format(self.cssbundle_xmlid), content)
+
+ # there should be assets(css) created in debug mode as user's lang direction is rtl
+ css_bundle = self.env['ir.attachment'].search([
+ ('url', '=', '/test_assetsbundle/static/src/css/test_cssfile1/rtl/{0}.css'.format(self.cssbundle_xmlid))
+ ])
+ self.assertEquals(len(css_bundle), 1)
+
+ def test_20_exteral_lib_assets(self):
html = self.env['ir.ui.view'].render_template('test_assetsbundle.template2')
attachments = self.env['ir.attachment'].search([('url', '=like', '/web/content/%-%/test_assetsbundle.bundle4.%')])
self.assertEquals(len(attachments), 2)
@@ -331,7 +533,7 @@ class TestJavascriptAssetsBundle(TransactionCase):
</body>
</html>""" % {"js": attachments[0].url, "css": attachments[1].url}).encode('utf8'))
- def test_16_exteral_lib_assets_debug_mode(self):
+ def test_21_exteral_lib_assets_debug_mode(self):
html = self.env['ir.ui.view'].render_template('test_assetsbundle.template2', {"debug": "assets"})
attachments = self.env['ir.attachment'].search([('url', '=like', '/web/content/%-%/test_assetsbundle.bundle4.%')])
self.assertEquals(len(attachments), 0)
@@ -354,7 +556,6 @@ class TestJavascriptAssetsBundle(TransactionCase):
</html>""").encode('utf8'))
-
class TestAssetsBundleInBrowser(HttpCase):
def test_01_js_interpretation(self):
""" Checks that the javascript of a bundle is correctly interpreted.