add tool calling
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user