| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- """Unit tests for 2FA helper functions in mfa.py."""
- import base64
- import string
- import pytest
- from passlib.context import CryptContext
- from backend.app.api.routes.mfa import _generate_backup_codes, _generate_totp_qr_b64
- class TestBackupCodeGeneration:
- """Tests for backup code helpers."""
- def test_generates_ten_codes(self):
- plain, hashed = _generate_backup_codes()
- assert len(plain) == 10
- assert len(hashed) == 10
- def test_codes_are_eight_chars(self):
- plain, _ = _generate_backup_codes()
- for code in plain:
- assert len(code) == 8
- def test_codes_are_alphanumeric(self):
- allowed = set(string.ascii_uppercase + string.digits)
- plain, _ = _generate_backup_codes()
- for code in plain:
- assert all(c in allowed for c in code)
- def test_hashes_verify_against_plain(self):
- ctx = CryptContext(schemes=["pbkdf2_sha256"], deprecated="auto")
- plain, hashed = _generate_backup_codes()
- for p, h in zip(plain, hashed, strict=True):
- assert ctx.verify(p, h)
- def test_codes_are_unique(self):
- plain, _ = _generate_backup_codes()
- assert len(set(plain)) == 10
- class TestTOTPQRCode:
- """Tests for QR code generation helper."""
- def test_generates_base64_png(self):
- uri = "otpauth://totp/Bambuddy:testuser?secret=BASE32SECRET&issuer=Bambuddy"
- result = _generate_totp_qr_b64(uri)
- decoded = base64.b64decode(result)
- assert decoded[:4] == b"\x89PNG"
|