File size: 1,639 Bytes
2f1e7ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
from types import SimpleNamespace
import pytest
from src.services.auth import AuthService, AuthError
from src.services.console_sessions import ConsoleSessions

class Redis:
    def __init__(self): self.values = {}
    def set(self, key, value, ex): self.values[key] = value
    def get(self, key): return self.values.get(key)
    def delete(self, key): self.values.pop(key, None)

@pytest.fixture
def service(monkeypatch):
    monkeypatch.setenv('SYSTEM_PAT', 'session-admin')
    monkeypatch.delenv('BRAINPAT_TOKEN', raising=False)
    return AuthService(SimpleNamespace(get_brain_by_pat=lambda _: None))

def test_session_identity_storage_and_logout(service):
    redis = Redis(); sessions = ConsoleSessions(redis)
    principal = service.authenticate_token('session-admin')
    cookie, csrf, ttl = sessions.create(principal)
    assert 'session-admin' not in json.dumps(redis.values)
    assert cookie not in json.dumps(redis.values)
    assert sessions.resolve(cookie, service)[0].brain_id is None
    assert sessions.resolve(cookie, service)[1] == csrf
    assert ttl == 28800
    sessions.revoke(cookie)
    with pytest.raises(AuthError): sessions.resolve(cookie, service)

def test_system_rotation_invalidates_sessions(service, monkeypatch):
    sessions = ConsoleSessions(Redis())
    cookie, _, _ = sessions.create(service.authenticate_token('session-admin'))
    monkeypatch.setenv('SYSTEM_PAT', 'replacement-admin')
    with pytest.raises(AuthError): sessions.resolve(cookie, service)

def test_invalid_credential_creates_no_session(service):
    with pytest.raises(AuthError): service.authenticate_token('unknown')