107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from slack_mock.server import get_channel_history, list_workspaces, post_message, search_messages
|
|
from slack_mock.state import get_active_workspace_id, state_from_json, state_to_json
|
|
|
|
|
|
def _workspace_state(message_text: str) -> dict:
|
|
return {
|
|
"bot_user_id": "U_MOCK_BOT",
|
|
"users": {
|
|
"U_MOCK_BOT": {
|
|
"id": "U_MOCK_BOT",
|
|
"name": "bot",
|
|
"real_name": "Mock Bot",
|
|
"profile": {"display_name": "bot", "status_text": "", "status_emoji": ""},
|
|
"deleted": False,
|
|
}
|
|
},
|
|
"channels": {"C1": {"id": "C1", "name": "general", "context_team_id": "T_MOCK"}},
|
|
"messages": {"C1": [{"ts": "1700000001.000", "text": message_text, "user": "U_MOCK_BOT", "type": "message"}]},
|
|
}
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_workspace_selector_routes_reads_and_writes_independently() -> None:
|
|
state_from_json(
|
|
{
|
|
"workspaces": {
|
|
"default": _workspace_state("default workspace"),
|
|
"acme": _workspace_state("acme workspace"),
|
|
}
|
|
}
|
|
)
|
|
|
|
listed = await list_workspaces()
|
|
assert listed["ok"] is True
|
|
assert listed["total"] == 2
|
|
assert {workspace["workspace_id"] for workspace in listed["workspaces"]} == {"default", "acme"}
|
|
|
|
default_history = await get_channel_history("C1")
|
|
acme_history = await get_channel_history("C1", workspace_id="acme")
|
|
assert default_history["messages"][0]["text"] == "default workspace"
|
|
assert acme_history["messages"][0]["text"] == "acme workspace"
|
|
|
|
posted = await post_message("C1", "acme follow-up", workspace_id="acme")
|
|
assert posted["ok"] is True
|
|
|
|
exported = state_to_json()
|
|
assert len(exported["workspaces"]["default"]["messages"]["C1"]) == 1
|
|
assert len(exported["workspaces"]["acme"]["messages"]["C1"]) == 2
|
|
|
|
assert (await search_messages("acme", workspace_id="acme"))["messages"]["total"] == 2
|
|
assert (await search_messages("acme", workspace_id="default"))["messages"]["total"] == 0
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_failed_workspace_write_does_not_mutate_other_workspaces() -> None:
|
|
state_from_json(
|
|
{
|
|
"workspaces": {
|
|
"default": _workspace_state("default workspace"),
|
|
"acme": _workspace_state("acme workspace"),
|
|
}
|
|
}
|
|
)
|
|
|
|
before = state_to_json()
|
|
failed = await post_message("C_DOES_NOT_EXIST", "should not post", workspace_id="acme")
|
|
|
|
assert failed["ok"] is False
|
|
assert failed["error"] == "channel_not_found"
|
|
assert state_to_json() == before
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_state_import_resets_active_workspace() -> None:
|
|
state_from_json(
|
|
{
|
|
"workspaces": {
|
|
"default": _workspace_state("default workspace"),
|
|
"acme": _workspace_state("acme workspace"),
|
|
}
|
|
}
|
|
)
|
|
await get_channel_history("C1", workspace_id="acme")
|
|
assert get_active_workspace_id() == "acme"
|
|
|
|
state_from_json({"workspaces": {"default": _workspace_state("reset default workspace")}})
|
|
|
|
assert get_active_workspace_id() == "default"
|
|
assert (await get_channel_history("C1"))["messages"][0]["text"] == "reset default workspace"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_omitted_workspace_uses_active_non_default_workspace() -> None:
|
|
state_from_json({"workspaces": {"acme": _workspace_state("acme only workspace")}})
|
|
|
|
assert get_active_workspace_id() == "acme"
|
|
assert (await get_channel_history("C1"))["messages"][0]["text"] == "acme only workspace"
|
|
|
|
posted = await post_message("C1", "acme follow-up")
|
|
|
|
assert posted["ok"] is True
|
|
assert state_to_json()["workspaces"]["acme"]["messages"]["C1"][-1]["text"] == "acme follow-up"
|