Coverage for src/lexigram/web/admin/pages/routes.py: 0%

22 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 04:37 +0800

1from __future__ import annotations 

2 

3from typing import Any 

4 

5from lexigram.contracts.admin import PageContent 

6from lexigram.contracts.admin.widget_content import ( 

7 EmptyContent, 

8 TableCell, 

9 TableContent, 

10) 

11from lexigram.logging import get_logger 

12from lexigram.web.routing.registry import RouteRegistry 

13 

14logger = get_logger(__name__) 

15 

16 

17class WebRoutesPage: 

18 """Route listing page for /admin/web/routes.""" 

19 

20 def __init__(self, route_registry: RouteRegistry | None = None) -> None: 

21 self._route_registry = route_registry 

22 

23 async def handle(self, request: Any) -> PageContent: 

24 if self._route_registry is None: 

25 return PageContent( 

26 title="Routes", 

27 body=EmptyContent( 

28 title="Route Registry Unavailable", 

29 message="The route registry could not be resolved. No routes to display.", 

30 icon="map", 

31 ), 

32 ) 

33 

34 try: 

35 routes = self._route_registry.get_all_routes() 

36 except Exception as exc: 

37 logger.warning("web_routes.fetch_failed", error=str(exc)) 

38 return PageContent( 

39 title="Routes", 

40 body=EmptyContent( 

41 title="Route Registry Unavailable", 

42 message=f"Failed to fetch routes: {exc}", 

43 icon="alert-triangle", 

44 ), 

45 ) 

46 

47 rows = tuple( 

48 ( 

49 TableCell(method), 

50 TableCell(path), 

51 TableCell(info.get("summary") or info.get("handler_name", "")), 

52 TableCell( 

53 f"{info.get('controller').__name__}.{info.get('handler_name', '')}" 

54 if info.get("controller") 

55 else info.get("handler_name", "") 

56 ), 

57 ) 

58 for path, methods in routes.items() 

59 for method, info in methods.items() 

60 ) 

61 

62 if not rows: 

63 return PageContent( 

64 title="Routes", 

65 body=EmptyContent( 

66 title="No Routes Registered", 

67 message="No routes have been registered yet.", 

68 icon="map", 

69 ), 

70 ) 

71 

72 return PageContent( 

73 title="Routes", 

74 body=TableContent( 

75 columns=("Method", "Path", "Name", "Handler"), 

76 rows=rows, 

77 ), 

78 )