Coverage for app / backend / src / couchers / helpers / strong_verification.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.13.2, created at 2026-02-03 06:18 +0000

1from typing import TypedDict 

2 

3from sqlalchemy import select 

4from sqlalchemy.orm import Session 

5 

6from couchers.models import StrongVerificationAttempt, User 

7from couchers.proto import api_pb2 

8from couchers.proto.api_pb2 import BirthdateVerificationStatus, GenderVerificationStatus 

9 

10 

11def has_strong_verification(session: Session, user: User) -> bool: 

12 attempt = session.execute( 

13 select(StrongVerificationAttempt) 

14 .where(StrongVerificationAttempt.user_id == user.id) 

15 .where(StrongVerificationAttempt.is_valid) 

16 .order_by(StrongVerificationAttempt.passport_expiry_datetime.desc()) 

17 .limit(1) 

18 ).scalar_one_or_none() 

19 if attempt: 

20 assert attempt.is_valid 

21 return bool(attempt.has_strong_verification(user)) 

22 return False 

23 

24 

25class StrongVerificationFields(TypedDict): 

26 birthdate_verification_status: BirthdateVerificationStatus.ValueType 

27 gender_verification_status: GenderVerificationStatus.ValueType 

28 has_strong_verification: bool 

29 

30 

31def get_strong_verification_fields(session: Session, db_user: User) -> StrongVerificationFields: 

32 out: StrongVerificationFields = dict( 

33 birthdate_verification_status=api_pb2.BIRTHDATE_VERIFICATION_STATUS_UNVERIFIED, 

34 gender_verification_status=api_pb2.GENDER_VERIFICATION_STATUS_UNVERIFIED, 

35 has_strong_verification=False, 

36 ) 

37 attempt = session.execute( 

38 select(StrongVerificationAttempt) 

39 .where(StrongVerificationAttempt.user_id == db_user.id) 

40 .where(StrongVerificationAttempt.is_valid) 

41 .order_by(StrongVerificationAttempt.passport_expiry_datetime.desc()) 

42 .limit(1) 

43 ).scalar_one_or_none() 

44 if attempt: 

45 assert attempt.is_valid 

46 if attempt.matches_birthdate(db_user): 

47 out["birthdate_verification_status"] = api_pb2.BIRTHDATE_VERIFICATION_STATUS_VERIFIED 

48 else: 

49 out["birthdate_verification_status"] = api_pb2.BIRTHDATE_VERIFICATION_STATUS_MISMATCH 

50 

51 if attempt.matches_gender(db_user): 

52 out["gender_verification_status"] = api_pb2.GENDER_VERIFICATION_STATUS_VERIFIED 

53 else: 

54 out["gender_verification_status"] = api_pb2.GENDER_VERIFICATION_STATUS_MISMATCH 

55 

56 out["has_strong_verification"] = attempt.has_strong_verification(db_user) 

57 

58 assert out["has_strong_verification"] == ( 

59 out["birthdate_verification_status"] == api_pb2.BIRTHDATE_VERIFICATION_STATUS_VERIFIED 

60 and out["gender_verification_status"] == api_pb2.GENDER_VERIFICATION_STATUS_VERIFIED 

61 ) 

62 return out