File size: 1,780 Bytes
531624f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import pytest
from unittest.mock import Mock, patch
from backend.src.services.auth import AuthService, AuthError, StaticTokenValidator, JWTValidator
from backend.src.services.config import AppConfig
from backend.src.models.auth import JWTPayload

# Mock config
@pytest.fixture
def mock_config():
    config = Mock(spec=AppConfig)
    config.enable_local_mode = True
    config.local_dev_token = "local-test"
    config.chatgpt_service_token = "gpt-secret"
    config.jwt_secret_key = "secret"
    return config

def test_static_token_validator():
    validator = StaticTokenValidator("my-secret", "test-user")
    
    # Valid token
    payload = validator.validate("my-secret")
    assert payload is not None
    assert payload.sub == "test-user"
    
    # Invalid token
    assert validator.validate("wrong") is None
    assert validator.validate("") is None

def test_auth_service_strategies(mock_config):
    auth = AuthService(config=mock_config)
    
    # Test Local Dev
    payload = auth.validate_jwt("local-test")
    assert payload.sub == "local-dev"
    
    # Test ChatGPT Service Token
    payload = auth.validate_jwt("gpt-secret")
    assert payload.sub == "demo-user"
    
    # Test Invalid
    with pytest.raises(AuthError, match="Invalid authentication credentials"):
        auth.validate_jwt("invalid-token")

def test_auth_service_priority(mock_config):
    # If both match (unlikely but possible config), first strategy wins
    # Order is Local -> ChatGPT -> JWT
    auth = AuthService(config=mock_config)
    # Strategies are added in order in __init__
    assert isinstance(auth.validators[0], StaticTokenValidator) # Local
    assert auth.validators[0].static_token == "local-test"
    assert isinstance(auth.validators[1], StaticTokenValidator) # GPT