Coverage for backend \ app \ Usuarios \ schemas \ usuarioSchemas.py: 90.74%

54 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-29 16:13 -0500

1from pydantic import BaseModel,Field,EmailStr,field_validator 

2from typing import Optional,Literal 

3from app.Usuarios.schemas.rolSchemas import RolSchema 

4# Esquema de Autenticación 

5class IniciarSesionRequest(BaseModel): 

6 username: str 

7 password: str 

8 

9 

10 

11 

12 

13# Esquema de Usuario 

14 

15def validarPassword(v: str) -> str: 

16 if len(v) < 8: 

17 raise ValueError("La contraseña debe tener al menos 8 caracteres") 

18 if not any(c.islower() for c in v): 

19 raise ValueError("Debe contener al menos una letra minúscula") 

20 if not any(c.isupper() for c in v): 

21 raise ValueError("Debe contener al menos una letra mayúscula") 

22 if not any(c.isdigit() for c in v): 

23 raise ValueError("Debe contener al menos un número") 

24 return v 

25 

26class UsuarioBaseSchema(BaseModel): 

27 nombreCompleto: str = Field(..., min_length=3, max_length=50,example="Juan Perez") 

28 cedulaUsuario: str = Field(..., min_length=10, max_length=10,example="1750834515") 

29 emailUsuario: EmailStr = Field(..., example="juan.perez@example.com") 

30 passwordUsuario: str = Field(..., min_length=8,example="Cl@veSegura123") 

31 

32 @field_validator("passwordUsuario") 

33 def validar_password(cls, v: str) -> str: 

34 return validarPassword(v) 

35 

36 

37class UsuarioCrearSchema(UsuarioBaseSchema): 

38 idRol: Literal[1, 2, 3] = Field(..., example=1) 

39 

40class UsuarioActualizarSchema(BaseModel): 

41 idRol: Optional[Literal[1, 2, 3]] = Field(None, example=1) 

42 nombreCompleto: Optional[str] = Field(None, min_length=3, max_length=50,example="Juan Perez") 

43 emailUsuario: Optional[EmailStr] = Field(None, example="juan.perez@example.com") 

44 passwordUsuario: Optional[str] = Field(None, min_length=8,example="Cl@veSegura123") 

45 activoUsuario: Optional[bool] = None 

46 @field_validator("passwordUsuario") 

47 def validar_password(cls, v: str) -> str: 

48 return validarPassword(v) 

49 

50 

51class UsuarioRespuestaSchema(BaseModel): 

52 idUsuario: int 

53 nombreCompleto: str 

54 cedulaUsuario: str 

55 emailUsuario: EmailStr 

56 passwordUsuario: str 

57 rol: RolSchema 

58 activoUsuario: bool 

59 class Config: 

60 from_attributes = True 

61 

62 

63# Schema público paralelo que NO devuelve la contraseña 

64class UsuarioPublicoSchema(BaseModel): 

65 idUsuario: int 

66 nombreCompleto: str 

67 cedulaUsuario: str 

68 emailUsuario: EmailStr 

69 rol: RolSchema 

70 activoUsuario: bool 

71 class Config: 

72 from_attributes = True 

73 

74 

75 

76 

77 

78