Coverage for src/lexigram/auth/di/sub_providers/passkey_provider.py: 79%

19 statements  

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

1# lexigram/auth/providers/passkey_provider.py 

2"""Passkey provider - handles WebAuthn/Passkey support only.""" 

3 

4from __future__ import annotations 

5 

6from typing import TYPE_CHECKING, Any 

7 

8from lexigram.contracts.core import HealthCheckResult, HealthStatus, ProviderPriority 

9from lexigram.di.decorators import inject 

10from lexigram.di.provider import Provider 

11from lexigram.logging import get_logger 

12 

13if TYPE_CHECKING: 

14 from lexigram.contracts.core.di import ( 

15 ContainerRegistrarProtocol, 

16 ContainerResolverProtocol, 

17 ) 

18 

19logger = get_logger(__name__) 

20 

21 

22@inject 

23class PasskeyProvider(Provider): 

24 """WebAuthn/Passkey support ONLY.""" 

25 

26 def __init__(self, **kwargs: Any) -> None: 

27 super().__init__(name="passkeys", priority=ProviderPriority.SECURITY) 

28 # Passkey-specific configuration would go here 

29 # For now, this is a placeholder structure 

30 

31 async def register(self, container: ContainerRegistrarProtocol) -> None: 

32 """Register passkey services with the container.""" 

33 # Passkey services would be registered here 

34 # This is a simplified version - in practice you'd have PasskeyManager, WebAuthnService, etc. 

35 

36 async def boot(self, container: ContainerResolverProtocol) -> None: 

37 """Initialize passkey provider.""" 

38 logger.info("PasskeyProvider started") 

39 

40 async def shutdown(self) -> None: 

41 """Shutdown passkey provider.""" 

42 logger.info("PasskeyProvider shutdown") 

43 

44 async def health_check(self, timeout: float = 5.0) -> HealthCheckResult: 

45 """Check passkey provider health.""" 

46 return HealthCheckResult( 

47 component=self.name, 

48 status=HealthStatus.HEALTHY, 

49 details={ 

50 "service": "passkeys", 

51 "message": "Passkey provider placeholder - implement WebAuthn and FIDO2 support", 

52 }, 

53 ) 

54 

55 

56__all__ = [ 

57 "PasskeyProvider", 

58 "logger", 

59]