import datetime import uuid from agentmsgs.core.types import Agent, Message, Thread, ThreadInfo, ThreadReadState def test_agent_identity_on_id_not_name(): a1 = Agent(id=uuid.uuid4(), name="Alice") a2 = Agent(id=uuid.uuid4(), name="Alice") assert a1 != a2 # different id => not equal even though name same assert hash(a1) != hash(a2) def test_agent_hash_on_id(): uid = uuid.uuid4() a1 = Agent(id=uid, name="Alice") a2 = Agent( id=uid, name="Bob" ) # same id, different name => equal per design (id is identity) assert a1 == a2 assert hash(a1) == hash(a2) def test_thread_multiple_with_same_participants_allowed(): a = Agent(id=uuid.uuid4(), name="A") b = Agent(id=uuid.uuid4(), name="B") t1 = Thread( id=uuid.uuid4(), participants=frozenset({a, b}), created_at=datetime.datetime.now(datetime.UTC), ) t2 = Thread( id=uuid.uuid4(), participants=frozenset({a, b}), created_at=datetime.datetime.now(datetime.UTC), ) assert t1 != t2 assert t1.participants == t2.participants def test_thread_info_and_read_state_hold_derived_data(): now = datetime.datetime.now(datetime.UTC) alice = Agent(id=uuid.uuid4(), name="Alice") bob = Agent(id=uuid.uuid4(), name="Bob") thread = Thread( id=uuid.uuid4(), participants=frozenset({alice, bob}), created_at=now ) latest = Message( id=uuid.uuid4(), sender=bob, content="hello", seq=1, ts=now ) info = ThreadInfo(thread=thread, message_count=1, latest_message=latest) state = ThreadReadState( agent=alice, cursor_seq=0, latest_seq=1, unread_count=1, unread_from_others_count=1, ) assert info.thread == thread assert info.latest_message == latest assert state.agent == alice assert state.unread_from_others_count == 1