From 6da546801d25125753b4477256cb944d1f2c6f69 Mon Sep 17 00:00:00 2001 From: Andrei Aleksandrovich Ovcharenko Date: Thu, 25 Jun 2026 08:27:36 +0300 Subject: [PATCH] Restrict route keyword matching to building field --- src/telegram_resender/service.py | 2 +- tests/unit/test_service.py | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/telegram_resender/service.py b/src/telegram_resender/service.py index 79cbc32..88b567b 100644 --- a/src/telegram_resender/service.py +++ b/src/telegram_resender/service.py @@ -95,7 +95,7 @@ def handle_text(self, message: IncomingMessage) -> ForwardingDecision: matching_routes = tuple( route for route in self._routes - if route.matches(username=message.user.username, text=message.text) + if route.matches(username=message.user.username, text=parsed_request.fields["building"]) ) if not matching_routes: return ForwardingDecision( diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index 56f4172..86d71dc 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -152,6 +152,51 @@ def test_service_routes_request_to_matching_destinations() -> None: assert service.render_forward_text_for_target(300, decision.forward_text).startswith("[all]") +def test_service_matches_route_keywords_only_against_building_field() -> None: + """Keywords in free-form fields must not add unintended destinations.""" + + service = ResenderService( + whitelist=Whitelist(["alice"]), + formatter=MessageFormatter(), + request_accepted_message="ok", + access_denied_message="deny", + missing_username_message=RU_MESSAGES.access_denied_missing_username, + invalid_request_message=RU_MESSAGES.invalid_request, + missing_fields_message=RU_MESSAGES.missing_fields, + no_route_matched_message=RU_MESSAGES.no_route_matched, + locale="ru", + routes=( + RouteRule( + name="tower-a", + target_chat_id=200, + allowed_usernames=frozenset(), + keywords_any=("башня а",), + keywords_none=(), + template=None, + ), + RouteRule( + name="tower-b", + target_chat_id=300, + allowed_usernames=frozenset(), + keywords_any=("башня б",), + keywords_none=(), + template=None, + ), + ), + ) + + decision = service.handle_text( + IncomingMessage( + chat_id=1, + text=f"{VALID_REQUEST}\nКомментарий: пожалуйста не отправляйте в Башня Б", + user=UserProfile(username="alice"), + ) + ) + + assert decision.should_forward is True + assert decision.target_chat_ids == (200,) + + def test_service_rejects_complete_request_when_no_route_matches() -> None: """A complete request should not be forwarded if all route filters reject it."""