diff options
Diffstat (limited to 'odoo/addons/test_assetsbundle/tests/test_assetsbundle.py')
| -rw-r--r-- | odoo/addons/test_assetsbundle/tests/test_assetsbundle.py | 211 |
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. |
