Coverage for src/lexigram/auth/admin/pages/users.py: 0%

22 statements  

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

1"""Auth users management page — list registered users.""" 

2 

3from __future__ import annotations 

4 

5from typing import Any 

6 

7from lexigram.contracts.admin import PageContent 

8from lexigram.contracts.admin.widget_content import ( 

9 EmptyContent, 

10 TableCell, 

11 TableContent, 

12) 

13from lexigram.contracts.auth.store import UserStoreProtocol 

14from lexigram.logging import get_logger 

15 

16logger = get_logger(__name__) 

17 

18 

19class AuthUsersPage: 

20 """Admin page listing registered auth users.""" 

21 

22 def __init__( 

23 self, 

24 user_store: UserStoreProtocol | None = None, 

25 ) -> None: 

26 self._user_store = user_store 

27 

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

29 if self._user_store is None: 

30 return PageContent( 

31 title="Users", 

32 body=EmptyContent( 

33 title="User Store Unavailable", 

34 message="No user store is configured.", 

35 icon="users", 

36 ), 

37 ) 

38 

39 try: 

40 users = await self._user_store.list_users() 

41 except Exception: 

42 logger.warning("auth_users.list_users_failed") 

43 return PageContent( 

44 title="Users", 

45 body=EmptyContent( 

46 title="User Store Error", 

47 message="Failed to retrieve users from the store.", 

48 icon="alert-triangle", 

49 ), 

50 ) 

51 

52 if not users: 

53 return PageContent( 

54 title="Users", 

55 body=EmptyContent( 

56 title="No Users Found", 

57 message="There are no registered users yet.", 

58 icon="users", 

59 ), 

60 ) 

61 

62 rows = tuple( 

63 ( 

64 TableCell(str(u.user_id)), 

65 TableCell(str(getattr(u, "email", "-"))), 

66 TableCell("Active" if getattr(u, "is_active", True) else "Inactive"), 

67 ) 

68 for u in users 

69 ) 

70 

71 return PageContent( 

72 title="Users", 

73 body=TableContent(columns=("ID", "Email", "Status"), rows=rows), 

74 )