"""Tests for the tools module.""" from __future__ import annotations from unittest.mock import MagicMock from vibe_bot.tools import get_channel_members, get_channel_members_impl def test_get_channel_members_impl_returns_formatted_list() -> None: """Test get_channel_members_impl returns a formatted member list.""" mock_member1 = MagicMock() mock_member1.display_name = "Alice" mock_member1.name = "alice" mock_member1.nick = None mock_member1.global_name = None mock_member1.status = MagicMock(value="online") mock_member2 = MagicMock() mock_member2.display_name = "Bob" mock_member2.name = "bob" mock_member2.nick = "bobby" mock_member2.global_name = None mock_member2.status = MagicMock(value="idle") mock_channel = MagicMock() mock_channel.members = [mock_member1, mock_member2] result = get_channel_members_impl(mock_channel) assert "Members in this channel (2 total):" in result assert "Alice" in result assert "Bob (nickname: bobby)" in result assert "[online]" in result assert "[idle]" in result def test_get_channel_members_impl_empty() -> None: """Test get_channel_members_impl with no members.""" mock_channel = MagicMock() mock_channel.members = [] result = get_channel_members_impl(mock_channel) assert "No members found in this channel." in result def test_get_channel_members_impl_with_global_name() -> None: """Test get_channel_members_impl includes global name.""" mock_member = MagicMock() mock_member.display_name = "charlie" mock_member.name = "charlie" mock_member.nick = None mock_member.global_name = "Charlie Global" mock_member.status = MagicMock(value="dnd") mock_channel = MagicMock() mock_channel.members = [mock_member] result = get_channel_members_impl(mock_channel) assert "(global name: Charlie Global)" in result def test_get_channel_members_impl_no_status() -> None: """Test get_channel_members_impl when member has no status.""" mock_member = MagicMock() mock_member.display_name = "dave" mock_member.name = "dave" mock_member.nick = None mock_member.global_name = None mock_member.status = None mock_channel = MagicMock() mock_channel.members = [mock_member] result = get_channel_members_impl(mock_channel) assert "dave" in result assert "[]" not in result def test_get_channel_members_impl_exception() -> None: """Test get_channel_members_impl handles exceptions gracefully.""" mock_channel = MagicMock() mock_channel.members = None type(mock_channel).members = property( lambda self: (_ for _ in ()).throw(Exception("test")) ) result = get_channel_members_impl(mock_channel) assert "Failed to retrieve channel members." in result def test_get_channel_members_tool_schema() -> None: """Test that get_channel_members has a valid tool schema.""" assert get_channel_members.name == "get_channel_members" assert get_channel_members.description is not None schema = get_channel_members.args_schema.model_json_schema() # type: ignore assert "properties" in schema assert schema["properties"] == {} def test_get_channel_members_impl_sorted_by_display_name() -> None: """Test that members are sorted by display name.""" mock_member_z = MagicMock() mock_member_z.display_name = "Zara" mock_member_z.name = "zara" mock_member_z.nick = None mock_member_z.global_name = None mock_member_z.status = MagicMock(value="online") mock_member_a = MagicMock() mock_member_a.display_name = "Aaron" mock_member_a.name = "aaron" mock_member_a.nick = None mock_member_a.global_name = None mock_member_a.status = MagicMock(value="online") mock_channel = MagicMock() mock_channel.members = [mock_member_z, mock_member_a] result = get_channel_members_impl(mock_channel) lines = [l for l in result.split("\n") if l.strip().startswith("- ")] assert "Aaron" in lines[0] assert "Zara" in lines[1] def test_get_channel_members_impl_no_nick_when_same_as_display() -> None: """Test that nickname is not shown when same as display name.""" mock_member = MagicMock() mock_member.display_name = "same" mock_member.name = "same" mock_member.nick = "same" mock_member.global_name = None mock_member.status = MagicMock(value="online") mock_channel = MagicMock() mock_channel.members = [mock_member] result = get_channel_members_impl(mock_channel) assert "(nickname: same)" not in result assert "same" in result def test_format_member_minimal() -> None: """Test _format_member with minimal data.""" from vibe_bot.tools import _format_member mock_member = MagicMock() mock_member.display_name = None mock_member.name = "unknown_user" mock_member.nick = None mock_member.global_name = None mock_member.status = None result = _format_member(mock_member) assert "unknown_user" in result def test_format_member_with_all_fields() -> None: """Test _format_member with all fields populated.""" from vibe_bot.tools import _format_member mock_member = MagicMock() mock_member.display_name = "Alice" mock_member.name = "alice" mock_member.nick = "Al" mock_member.global_name = "Alice Global" mock_member.status = MagicMock(value="online") result = _format_member(mock_member) assert "Alice" in result assert "(nickname: Al)" in result assert "(global name: Alice Global)" in result assert "[online]" in result