Odoo18-Base/odoo/addons/test_lint/tests/test_routes.py
2025-01-06 10:57:38 +07:00

49 lines
1.9 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from pprint import pformat
from unittest.mock import patch
from odoo import http
from odoo.tests import tagged, TransactionCase
_logger = logging.getLogger(__name__)
@tagged('post_install', '-at_install')
class RoutesLinter(TransactionCase):
def test_routes_definition(self):
"""Forbid redefinition of same-value attributes in an inherited route.
Makes it easier to know what an inherited route really modifies and
investigate unexpected behavior.
"""
_check_and_complete_route_definition = http._check_and_complete_route_definition
def extended_check(controller_cls, submethod, merged_routing):
if 'type' in merged_routing:
# merged_routing contains non default 'type' value
# => current method is an inherited route.
useless_overrides = {
key: value
for key, value in submethod.original_routing.items()
if key not in ('routes', 'type')
if merged_routing.get(key) == value
}
if useless_overrides:
_logger.warning(
"The endpoint %s is duplicating the existing routing configuration : %s",
f'{controller_cls.__module__}.{controller_cls.__name__}.{submethod.__name__}',
pformat(useless_overrides),
)
_check_and_complete_route_definition(controller_cls, submethod, merged_routing)
installed_modules = set(self.env['ir.module.module'].search([
('state', '=', 'installed'),
]).mapped('name'))
with patch('odoo.http._check_and_complete_route_definition', extended_check):
for _ in http._generate_routing_rules(installed_modules, nodb_only=False):
pass