import pytest from core.oauth.pkce import generate_code_challenge, generate_code_verifier, validate_code_challenge def test_code_verifier_generation(): """Test code verifier generation""" verifier = generate_code_verifier() # Length check assert 43 <= len(verifier) <= 128 # Character set check import re assert re.match(r"^[A-Za-z0-9_-]+$", verifier) # Uniqueness assert verifier != generate_code_verifier() def test_code_challenge_s256(): """Test S256 code challenge generation""" # RFC 7636 Appendix B example verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk" expected = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" challenge = generate_code_challenge(verifier, "S256") assert challenge == expected def test_code_challenge_validation(): """Test PKCE validation""" verifier = generate_code_verifier() challenge = generate_code_challenge(verifier) # Valid assert validate_code_challenge(verifier, challenge, "S256") # Invalid verifier assert not validate_code_challenge("wrong", challenge, "S256") # Invalid challenge assert not validate_code_challenge(verifier, "wrong", "S256") def test_plain_method_not_allowed(): """Test that plain method is not allowed (OAuth 2.1)""" with pytest.raises(ValueError, match="S256"): generate_code_challenge("verifier", "plain")