# 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.http.routing_map import (
    _check_and_complete_route_definition,
    _generate_routing_rules,
)
from odoo.tests import TransactionCase, tagged

_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.
        """

        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.routing_map._check_and_complete_route_definition', extended_check):
            for _ in _generate_routing_rules(installed_modules, nodb_only=False):
                pass
