From 4852b0d3dfdadf032de01521445bac78da7f2c54 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 3 Aug 2026 11:42:11 -0400 Subject: [PATCH] test(design): add the starter-roles endpoint to the URL enumeration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI caught it: tests/test_routes_design_systems.py enumerates every routed rule, and I added a handler without adding its rule. The guard doing exactly what its docstring says it is for. Two enumerations govern this blueprint and I had only extended one — the parity list (handlers exist on both surfaces) but not the URL list (handlers are actually routed). They catch different failures, which is why both exist. Noted in place: /api/design-systems/starter-roles is a static segment sharing a prefix with /api/design-systems/. That pairing is where a silently-shadowed route hides, so it is worth being explicit that the int converter cannot match "starter-roles" — verified rather than assumed. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01UaYUaouG9jjhATyuxCKrQs --- tests/test_routes_design_systems.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_routes_design_systems.py b/tests/test_routes_design_systems.py index eca7396..8ad2389 100644 --- a/tests/test_routes_design_systems.py +++ b/tests/test_routes_design_systems.py @@ -44,6 +44,11 @@ def test_every_endpoint_is_reachable_on_the_app(): } assert rules == { "/api/design-systems", + # Static segment, declared before the rule reads it — Quart's + # int converter will not match "starter-roles", so the two cannot + # collide. Worth stating: a static-vs-dynamic sibling on the same prefix + # is exactly where a silently-shadowed route hides. + "/api/design-systems/starter-roles", "/api/design-systems/", "/api/design-systems//resolved", "/api/design-systems//stylesheet",