Skip to content

Commit 0de1790

Browse files
authored
Merge pull request #40 from Point72/tkp/tests
Add more test coverage
2 parents a54dad2 + eb2067b commit 0de1790

5 files changed

Lines changed: 1415 additions & 17 deletions

File tree

csp_bot/tests/conftest.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
from csp_adapter_slack import SlackAdapterConfig
88

99
from csp_bot import Bot, BotCommand, BotConfig, Channels, DiscordConfig, Message, SlackConfig
10+
from csp_bot.commands import (
11+
EchoCommandModel,
12+
HelpCommandModel,
13+
ScheduleCommandModel,
14+
StatusCommandModel,
15+
)
1016

1117

1218
@pytest.fixture(scope="session")
@@ -39,6 +45,13 @@ def side_effect(name):
3945
raise Exception(name)
4046

4147
channels_mock.get_channel.side_effect = side_effect
48+
49+
# Create a mock adapter that returns a known bot tag
50+
mock_slack_adapter = MagicMock()
51+
mock_slack_adapter._get_user_from_name.return_value = "UBOT123"
52+
53+
mock_discord_adapter = MagicMock()
54+
4255
with (
4356
patch("csp.unroll", return_value=Edge(ts[Message], None, 0)),
4457
patch("csp.flatten", return_value=Edge(ts[Message], None, 0)),
@@ -47,4 +60,19 @@ def side_effect(name):
4760
patch("csp_adapter_slack.adapter.SlackAdapterManager.publish"),
4861
):
4962
bot.connect(channels=channels_mock)
63+
64+
# Patch adapters after connect to provide bot tag support
65+
bot._adapters["slack"] = mock_slack_adapter
66+
bot._adapters["discord"] = mock_discord_adapter
67+
68+
# Load default commands
69+
bot.load_commands(
70+
[
71+
HelpCommandModel(),
72+
EchoCommandModel(),
73+
StatusCommandModel(),
74+
ScheduleCommandModel(),
75+
]
76+
)
77+
5078
yield bot

csp_bot/tests/test_backends.py

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
"""Tests for backend module imports and fallbacks."""
2+
3+
4+
class TestBackendImports:
5+
"""Tests for backend module import behavior."""
6+
7+
def test_discord_module_imports(self):
8+
"""Test that discord module exports expected symbols."""
9+
from csp_bot.backends import discord
10+
11+
# These should always be available
12+
assert hasattr(discord, "DiscordAdapterConfig")
13+
assert hasattr(discord, "DiscordAdapterManager")
14+
assert hasattr(discord, "DiscordMessage")
15+
assert hasattr(discord, "mention_user_discord")
16+
17+
# Check __all__ exports
18+
assert "DiscordAdapterConfig" in discord.__all__
19+
assert "DiscordAdapterManager" in discord.__all__
20+
assert "DiscordMessage" in discord.__all__
21+
assert "mention_user_discord" in discord.__all__
22+
23+
def test_slack_module_imports(self):
24+
"""Test that slack module exports expected symbols."""
25+
from csp_bot.backends import slack
26+
27+
# These should always be available
28+
assert hasattr(slack, "SlackAdapterConfig")
29+
assert hasattr(slack, "SlackAdapterManager")
30+
assert hasattr(slack, "SlackMessage")
31+
assert hasattr(slack, "mention_user_slack")
32+
33+
# Check __all__ exports
34+
assert "SlackAdapterConfig" in slack.__all__
35+
assert "SlackAdapterManager" in slack.__all__
36+
assert "SlackMessage" in slack.__all__
37+
assert "mention_user_slack" in slack.__all__
38+
39+
def test_symphony_module_imports(self):
40+
"""Test that symphony module exports expected symbols."""
41+
from csp_bot.backends import symphony
42+
43+
# These should always be available
44+
assert hasattr(symphony, "SymphonyAdapterConfig")
45+
assert hasattr(symphony, "SymphonyAdapter")
46+
assert hasattr(symphony, "SymphonyMessage")
47+
assert hasattr(symphony, "Presence")
48+
assert hasattr(symphony, "mention_user_symphony")
49+
50+
# Check __all__ exports
51+
assert "SymphonyAdapterConfig" in symphony.__all__
52+
assert "SymphonyAdapter" in symphony.__all__
53+
assert "SymphonyMessage" in symphony.__all__
54+
assert "Presence" in symphony.__all__
55+
assert "mention_user_symphony" in symphony.__all__
56+
57+
def test_backends_package_imports(self):
58+
"""Test that backends package exports all modules."""
59+
from csp_bot import backends
60+
61+
# Check that we can import from the package
62+
assert hasattr(backends, "DiscordAdapterManager")
63+
assert hasattr(backends, "SlackAdapterManager")
64+
assert hasattr(backends, "SymphonyAdapter")
65+
66+
assert hasattr(backends, "DiscordMessage")
67+
assert hasattr(backends, "SlackMessage")
68+
assert hasattr(backends, "SymphonyMessage")
69+
70+
71+
class TestDiscordMessageStruct:
72+
"""Tests for DiscordMessage structure."""
73+
74+
def test_discord_message_fields(self):
75+
"""Test DiscordMessage has expected fields."""
76+
from csp_bot.backends.discord import DiscordMessage
77+
78+
# Create a message to verify fields work
79+
msg = DiscordMessage(
80+
user="testuser",
81+
user_email="test@example.com",
82+
user_id="123456789012345678",
83+
tags=["111111111111111111"],
84+
channel="general",
85+
channel_id="222222222222222222",
86+
channel_type="public",
87+
msg="Hello world!",
88+
reaction="",
89+
thread="",
90+
)
91+
92+
assert msg.user == "testuser"
93+
assert msg.user_email == "test@example.com"
94+
assert msg.user_id == "123456789012345678"
95+
assert msg.tags == ["111111111111111111"]
96+
assert msg.channel == "general"
97+
assert msg.channel_id == "222222222222222222"
98+
assert msg.msg == "Hello world!"
99+
100+
101+
class TestSlackMessageStruct:
102+
"""Tests for SlackMessage structure."""
103+
104+
def test_slack_message_fields(self):
105+
"""Test SlackMessage has expected fields."""
106+
from csp_bot.backends.slack import SlackMessage
107+
108+
# Create a message to verify fields work
109+
msg = SlackMessage(
110+
user="testuser",
111+
user_email="test@example.com",
112+
user_id="U123456789",
113+
tags=["U987654321"],
114+
channel="general",
115+
channel_id="C123456789",
116+
channel_type="public",
117+
msg="Hello <@U987654321>!",
118+
reaction="",
119+
thread="",
120+
payload={},
121+
)
122+
123+
assert msg.user == "testuser"
124+
assert msg.user_email == "test@example.com"
125+
assert msg.user_id == "U123456789"
126+
assert msg.tags == ["U987654321"]
127+
assert msg.channel == "general"
128+
assert msg.channel_id == "C123456789"
129+
assert msg.msg == "Hello <@U987654321>!"
130+
131+
132+
class TestSymphonyMessageStruct:
133+
"""Tests for SymphonyMessage structure."""
134+
135+
def test_symphony_message_fields(self):
136+
"""Test SymphonyMessage has expected fields."""
137+
from csp_bot.backends.symphony import SymphonyMessage
138+
139+
# Create a message to verify fields work
140+
msg = SymphonyMessage(
141+
user="John Doe",
142+
user_email="john@example.com",
143+
user_id="123456789",
144+
tags=["987654321"],
145+
room="Test Room",
146+
msg="Hello world!",
147+
form_id="",
148+
form_values={},
149+
)
150+
151+
assert msg.user == "John Doe"
152+
assert msg.user_email == "john@example.com"
153+
assert msg.user_id == "123456789"
154+
assert msg.tags == ["987654321"]
155+
assert msg.room == "Test Room"
156+
assert msg.msg == "Hello world!"
157+
158+
159+
class TestMentionFunctions:
160+
"""Tests for mention helper functions."""
161+
162+
def test_mention_user_discord_available(self):
163+
"""Test mention_user_discord function availability."""
164+
165+
# Function should exist (may be None if adapter not installed)
166+
# Just verify it's exported
167+
assert "mention_user_discord" in dir(__import__("csp_bot.backends.discord", fromlist=["mention_user_discord"]))
168+
169+
def test_mention_user_slack_available(self):
170+
"""Test mention_user_slack function availability."""
171+
172+
assert "mention_user_slack" in dir(__import__("csp_bot.backends.slack", fromlist=["mention_user_slack"]))
173+
174+
def test_mention_user_symphony_available(self):
175+
"""Test mention_user_symphony function availability."""
176+
177+
assert "mention_user_symphony" in dir(__import__("csp_bot.backends.symphony", fromlist=["mention_user_symphony"]))

0 commit comments

Comments
 (0)