"""Tests for SAM session registry (SessionsDB).""" import asyncio from unittest.mock import MagicMock import pytest from i2p_sam.sessions_db import SessionRecord, SessionsDB def _make_record(nickname="test", style="STREAM"): return SessionRecord( nickname=nickname, style=style, destination=b"\x00" * 32, destination_b64="AAAA", handler=MagicMock(), ) class TestSessionRecord: def test_creation(self): handler = MagicMock() r = SessionRecord( nickname="mysession", style="STREAM", destination=b"\x01" * 32, destination_b64="AQEB", handler=handler, ) assert r.nickname == "mysession" assert r.style == "STREAM" assert r.destination == b"\x01" * 32 assert r.destination_b64 == "AQEB" assert r.handler is handler assert r.subsessions == {} def test_subsessions_default(self): r = _make_record() assert r.subsessions == {} def test_subsessions_isolated(self): r1 = _make_record("s1") r2 = _make_record("s2") r1.subsessions["sub"] = r2 assert "sub" not in _make_record("s3").subsessions class TestSessionsDB: @pytest.mark.asyncio async def test_add_and_get(self): db = SessionsDB() r = _make_record("test1") assert await db.add(r) is True found = await db.get("test1") assert found is r @pytest.mark.asyncio async def test_add_duplicate(self): db = SessionsDB() r1 = _make_record("dup") r2 = _make_record("dup") assert await db.add(r1) is True assert await db.add(r2) is False @pytest.mark.asyncio async def test_get_missing(self): db = SessionsDB() assert await db.get("nope") is None @pytest.mark.asyncio async def test_remove(self): db = SessionsDB() r = _make_record("rem") await db.add(r) removed = await db.remove("rem") assert removed is r assert await db.get("rem") is None @pytest.mark.asyncio async def test_remove_missing(self): db = SessionsDB() assert await db.remove("nope") is None @pytest.mark.asyncio async def test_has(self): db = SessionsDB() r = _make_record("check") await db.add(r) assert await db.has("check") is True assert await db.has("nope") is False @pytest.mark.asyncio async def test_count(self): db = SessionsDB() assert db.count == 0 await db.add(_make_record("a")) assert db.count == 1 await db.add(_make_record("b")) assert db.count == 2 await db.remove("a") assert db.count == 1 @pytest.mark.asyncio async def test_multiple_styles(self): db = SessionsDB() await db.add(_make_record("stream", "STREAM")) await db.add(_make_record("dgram", "DATAGRAM")) await db.add(_make_record("raw", "RAW")) assert db.count == 3 s = await db.get("dgram") assert s.style == "DATAGRAM"