import pytest from datetime import datetime, timedelta from app.session_store import create_session, get_session, delete_session, attach_worker, detach_worker from app.models import WorkerState, WorkerRuntimeType from app.security import generate_worker_id def test_create_session(): session = create_session(owner_label="test-owner") assert session.session_id.startswith("sess_") assert session.owner_label == "test-owner" assert session.status == "active" def test_session_expires(): from app.config import Settings session = create_session() ttl = Settings.get_session_ttl_seconds() assert session.expires_at > session.created_at assert (session.expires_at - session.created_at).total_seconds() == ttl def test_worker_attaches_to_session(): session = create_session() worker = WorkerState( worker_id=generate_worker_id(), session_id=session.session_id, runtime_type=WorkerRuntimeType.SAFARI_WASM, ) ok = attach_worker(session.session_id, worker) assert ok is True workers = [w for w in session.workers.values()] assert len(workers) == 1 def test_worker_detaches_from_session(): session = create_session() worker = WorkerState( worker_id=generate_worker_id(), session_id=session.session_id, runtime_type=WorkerRuntimeType.SAFARI_WASM, ) attach_worker(session.session_id, worker) ok = detach_worker(session.session_id, worker.worker_id) assert ok is True assert len(session.workers) == 0 def test_invalid_join_token_rejected(): from app.security import verify_worker_join_token assert verify_worker_join_token("sess_test", "bad") is False assert verify_worker_join_token("sess_test", "a" * 32) is True