# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.tests import TransactionCase, tagged from unittest.mock import patch @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.homepage.flush_recordset() self.mega_menu.write({ 'mega_menu_content': MEGA_MENU_OUTDATED, }) self.mega_menu.flush_recordset() cache_clears = [] init_clear_cache = self.env.registry.clear_cache def patched_clear_cache(*cache_names): for cache_name in cache_names: cache_clears.append(cache_name) init_clear_cache(*cache_names) with patch.object(self.env.registry, 'clear_cache', patched_clear_cache): self.Website._disable_unused_snippets_assets() self.assertIn('assets', cache_clears, 'Assets cache should have been invalidated when updating ir_assets') cache_clears.clear() self.Website._disable_unused_snippets_assets() self.assertNotIn('assets', cache_clears, 'No update on ir_assets expected, no invalidation should be triggered') 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 = """
""" HOMEPAGE_OUTDATED = """
""" MEGA_MENU_UP_TO_DATE = """
""" MEGA_MENU_OUTDATED = """
"""