Commit [1] introduced a cron that disables outdated js and scss snippets assets. For example, if a new version of the masonry snippet is defined with new assets: data-vcss="001" and data-vjs="001", the previous assets have to be disabled (000.scss and 000.js). That cron was not handling the scss variables files at all, so when an outdated snippet was still used in the db and the cron was run, the 000.scss file was activated, but not the 000_variables.scss and it was crashing the assets. Now, the XXX_variables.scss assets files are handled alongside the XXX.scss files. Also, the regex used in the _is_snippet_used method was only returning the first match of a snippet in an html field. So if a view had a snippet up to date and then an outdated snippet of the same type, the old assets were not activated. The 'g' flag was added to return all the occurences of the snippet in an html field. [1]: https://github.com/odoo/odoo/commit/fa1c05e7bb2959c6025a806a4348f69ed225b4ec task-2775188 closes odoo/odoo#85360 X-original-commit: 644067e80d4ca3f41707cddd15ed8f2807a1e410 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
166 lines
7.7 KiB
Python
166 lines
7.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.tests import TransactionCase, tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestDisableSnippetsAssets(TransactionCase):
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.View = self.env['ir.ui.view']
|
|
self.WebsiteMenu = self.env['website.menu']
|
|
self.Website = self.env['website']
|
|
self.IrAsset = self.env['ir.asset']
|
|
|
|
self.homepage = self.View.create({
|
|
'name': 'Home',
|
|
'type': 'qweb',
|
|
'arch_db': HOMEPAGE_OUTDATED,
|
|
'key': 'website.homepage',
|
|
})
|
|
self.mega_menu = self.WebsiteMenu.create({
|
|
'name': 'Image Gallery V001',
|
|
'mega_menu_content': MEGA_MENU_UP_TO_DATE,
|
|
})
|
|
|
|
self.initial_active_snippets_assets = self._get_active_snippets_assets()
|
|
|
|
def test_homepage_outdated_and_mega_menu_up_to_date(self):
|
|
self.Website._disable_unused_snippets_assets()
|
|
# Old snippet with scss and js
|
|
s_website_form_000_scss = self._get_snippet_asset('s_website_form', '000', 'scss')
|
|
s_website_form_001_scss = self._get_snippet_asset('s_website_form', '001', 'scss')
|
|
s_website_form_000_js = self._get_snippet_asset('s_website_form', '000', 'js')
|
|
self.assertEqual(s_website_form_000_scss.active, True)
|
|
self.assertEqual(s_website_form_001_scss.active, True)
|
|
self.assertEqual(s_website_form_000_js.active, True)
|
|
|
|
# Old snippet with scss and scss variables
|
|
s_masonry_block_000_scss = self._get_snippet_asset('s_masonry_block', '000', 'scss')
|
|
s_masonry_block_000_variables_scss = self._get_snippet_asset('s_masonry_block', '000_variables', 'scss')
|
|
s_masonry_block_001_scss = self._get_snippet_asset('s_masonry_block', '001', 'scss')
|
|
self.assertEqual(s_masonry_block_000_scss.active, True)
|
|
self.assertEqual(s_masonry_block_000_variables_scss.active, True)
|
|
self.assertEqual(s_masonry_block_001_scss.active, True)
|
|
|
|
# New snippet
|
|
s_image_gallery_000 = self._get_snippet_asset('s_image_gallery', '000', 'scss')
|
|
s_image_gallery_001 = self._get_snippet_asset('s_image_gallery', '001', 'scss')
|
|
self.assertEqual(s_image_gallery_000.active, False)
|
|
self.assertEqual(s_image_gallery_001.active, True)
|
|
|
|
unwanted_snippets_assets_changes = set(self.initial_active_snippets_assets) - set(self._get_active_snippets_assets()) - set([s_image_gallery_000.path])
|
|
|
|
# The vaccuum should not have activated/deactivated any other snippet asset than the original ones
|
|
self.assertEqual(
|
|
len(unwanted_snippets_assets_changes),
|
|
0,
|
|
'Following snippets are not following the snippet versioning system structure, or their previous assets have not been deactivated:\n'
|
|
+ '\n'.join(unwanted_snippets_assets_changes))
|
|
|
|
def test_homepage_up_to_date_and_mega_menu_outdated(self):
|
|
self.homepage.write({
|
|
'arch_db': HOMEPAGE_UP_TO_DATE,
|
|
})
|
|
self.mega_menu.write({
|
|
'mega_menu_content': MEGA_MENU_OUTDATED,
|
|
})
|
|
self.Website._disable_unused_snippets_assets()
|
|
|
|
s_website_form_000_scss = self._get_snippet_asset('s_website_form', '000', 'scss')
|
|
s_website_form_001_scss = self._get_snippet_asset('s_website_form', '001', 'scss')
|
|
s_website_form_000_js = self._get_snippet_asset('s_website_form', '000', 'js')
|
|
self.assertEqual(s_website_form_000_scss.active, False)
|
|
self.assertEqual(s_website_form_001_scss.active, True)
|
|
self.assertEqual(s_website_form_000_js.active, True)
|
|
|
|
s_masonry_block_000_scss = self._get_snippet_asset('s_masonry_block', '000', 'scss')
|
|
s_masonry_block_000_variables_scss = self._get_snippet_asset('s_masonry_block', '000_variables', 'scss')
|
|
s_masonry_block_001_scss = self._get_snippet_asset('s_masonry_block', '001', 'scss')
|
|
self.assertEqual(s_masonry_block_000_scss.active, False)
|
|
self.assertEqual(s_masonry_block_000_variables_scss.active, False)
|
|
self.assertEqual(s_masonry_block_001_scss.active, True)
|
|
|
|
s_image_gallery_000 = self._get_snippet_asset('s_image_gallery', '000', 'scss')
|
|
s_image_gallery_001 = self._get_snippet_asset('s_image_gallery', '001', 'scss')
|
|
self.assertEqual(s_image_gallery_000.active, True)
|
|
self.assertEqual(s_image_gallery_001.active, True)
|
|
|
|
def _get_snippet_asset(self, snippet_id, asset_version, asset_type):
|
|
return self.IrAsset.search([('path', '=', 'website/static/src/snippets/' + snippet_id + '/' + asset_version + '.' + asset_type)], limit=1)
|
|
|
|
def _get_active_snippets_assets(self):
|
|
return self.IrAsset.search([('path', 'like', 'snippets'), ('active', '=', True)]).mapped('path')
|
|
|
|
HOMEPAGE_UP_TO_DATE = """
|
|
<t name="Homepage" t-name="website.homepage1">
|
|
<t t-call="website.layout">
|
|
<t t-set="pageName" t-value="'homepage'"/>
|
|
<div id="wrap" class="oe_structure oe_empty">
|
|
<section class="s_website_form pt16 pb16 o_colored_level" data-vcss="001" data-snippet="s_website_form" data-name="Form">
|
|
<div class="container">
|
|
<form action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-success-mode="redirect" data-success-page="/contactus-thank-you" data-model_name="mail.mail">
|
|
</form>
|
|
</div>
|
|
</section>
|
|
<section class="s_masonry_block" data-vcss="001" data-snippet="s_masonry_block" data-name="Masonry">
|
|
<div class="container-fluid"/>
|
|
</section>
|
|
<section class="s_showcase pt48 pb48 o_colored_level" data-vcss="002" data-snippet="s_showcase" data-name="Showcase">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</t>
|
|
</t>
|
|
"""
|
|
|
|
HOMEPAGE_OUTDATED = """
|
|
<t name="Homepage" t-name="website.homepage1">
|
|
<t t-call="website.layout">
|
|
<t t-set="pageName" t-value="'homepage'"/>
|
|
<div id="wrap" class="oe_structure oe_empty">
|
|
<form action="/website_form/" method="post" class="s_website_form container-fluid mt32 o_fake_not_editable" enctype="multipart/form-data" data-name="Form Builder" data-model_name="mail.mail" data-success_page="/contactus-thank-you" data-snippet="s_website_form">
|
|
<div class="container">
|
|
</div>
|
|
</form>
|
|
<section class="s_masonry_block" data-vcss="001" data-snippet="s_masonry_block" data-name="Masonry">
|
|
<div class="container-fluid"/>
|
|
</section>
|
|
<section class="s_masonry_block" data-snippet="s_masonry_block" data-name="Masonry">
|
|
<div class="container-fluid"/>
|
|
</section>
|
|
<section class="s_showcase pt48 pb48 o_colored_level" data-vcss="002" data-snippet="s_showcase" data-name="Showcase">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</t>
|
|
</t>
|
|
"""
|
|
|
|
MEGA_MENU_UP_TO_DATE = """
|
|
<section class="s_mega_menu_multi_menus py-4 o_colored_level" data-name="Multi-Menus">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
|
|
<section class="s_image_gallery o_slideshow s_image_gallery_show_indicators s_image_gallery_indicators_rounded pt24 o_colored_level" data-vcss="001" data-columns="3" style="height: 500px; overflow: hidden;" data-snippet="s_image_gallery" data-name="Image Gallery">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
"""
|
|
|
|
MEGA_MENU_OUTDATED = """
|
|
<section class="s_mega_menu_multi_menus py-4 o_colored_level" data-name="Multi-Menus">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
|
|
<section class="s_image_gallery o_slideshow s_image_gallery_show_indicators s_image_gallery_indicators_rounded pt24 o_colored_level" data-columns="3" style="height: 500px; overflow: hidden;" data-snippet="s_image_gallery" data-name="Image Gallery">
|
|
<div class="container">
|
|
</div>
|
|
</section>
|
|
"""
|