95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from yuxi.channels.adapters.imessage.commands import (
|
||
|
|
get_command_help,
|
||
|
|
is_authorized_for_commands,
|
||
|
|
parse_command,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TestParseCommand:
|
||
|
|
def test_valid_command_without_args(self):
|
||
|
|
result = parse_command("/status")
|
||
|
|
assert result == {"action": "status", "args": []}
|
||
|
|
|
||
|
|
def test_valid_command_with_args(self):
|
||
|
|
result = parse_command("/poll create Question Option1 Option2")
|
||
|
|
assert result["action"] == "poll"
|
||
|
|
assert result["args"] == ["create", "Question", "Option1", "Option2"]
|
||
|
|
|
||
|
|
def test_command_extra_spaces(self):
|
||
|
|
result = parse_command("/help ")
|
||
|
|
assert result == {"action": "help", "args": []}
|
||
|
|
|
||
|
|
def test_non_command_returns_none(self):
|
||
|
|
assert parse_command("Hello world") is None
|
||
|
|
|
||
|
|
def test_empty_string_returns_none(self):
|
||
|
|
assert parse_command("") is None
|
||
|
|
|
||
|
|
def test_slash_only_returns_none(self):
|
||
|
|
assert parse_command("/") is None
|
||
|
|
|
||
|
|
def test_slash_with_spaces_returns_none(self):
|
||
|
|
assert parse_command("/ ") is None
|
||
|
|
|
||
|
|
def test_command_uppercase_to_lowercase(self):
|
||
|
|
result = parse_command("/STATUS")
|
||
|
|
assert result["action"] == "status"
|
||
|
|
|
||
|
|
def test_command_mixed_case(self):
|
||
|
|
result = parse_command("/HeLp")
|
||
|
|
assert result["action"] == "help"
|
||
|
|
|
||
|
|
def test_command_with_quoted_args(self):
|
||
|
|
result = parse_command('/poll create "Question text" "Option A"')
|
||
|
|
assert result["action"] == "poll"
|
||
|
|
assert len(result["args"]) == 5
|
||
|
|
|
||
|
|
|
||
|
|
class TestIsAuthorizedForCommands:
|
||
|
|
def test_wildcard_allows_all(self):
|
||
|
|
assert is_authorized_for_commands("+8613800138000", ["*"]) is True
|
||
|
|
|
||
|
|
def test_exact_match(self):
|
||
|
|
assert is_authorized_for_commands("+8613800138000", ["+8613800138000"]) is True
|
||
|
|
|
||
|
|
def test_different_format_match(self):
|
||
|
|
assert is_authorized_for_commands("+8613800138000", ["8613800138000"]) is True
|
||
|
|
|
||
|
|
def test_handle_with_spaces(self):
|
||
|
|
assert is_authorized_for_commands(" +8613800138000 ", ["8613800138000"]) is True
|
||
|
|
|
||
|
|
def test_no_match(self):
|
||
|
|
assert is_authorized_for_commands("+8613800138000", ["+8613900139000"]) is False
|
||
|
|
|
||
|
|
def test_empty_allow_list(self):
|
||
|
|
assert is_authorized_for_commands("+8613800138000", []) is False
|
||
|
|
|
||
|
|
def test_email_handle(self):
|
||
|
|
assert is_authorized_for_commands("test@example.com", ["test@example.com"]) is True
|
||
|
|
|
||
|
|
def test_wildcard_in_list(self):
|
||
|
|
assert is_authorized_for_commands("anyone", ["user1", "*", "user2"]) is True
|
||
|
|
|
||
|
|
|
||
|
|
class TestGetCommandHelp:
|
||
|
|
def test_basic_help(self):
|
||
|
|
help_text = get_command_help()
|
||
|
|
assert "Available commands" in help_text
|
||
|
|
assert "/status" in help_text
|
||
|
|
assert "/help" in help_text
|
||
|
|
|
||
|
|
def test_include_owner_commands(self):
|
||
|
|
help_text = get_command_help(include_owner=True)
|
||
|
|
assert "/approve" in help_text
|
||
|
|
assert "/reject" in help_text
|
||
|
|
assert "/allowlist" in help_text
|
||
|
|
|
||
|
|
def test_exclude_owner_commands(self):
|
||
|
|
help_text = get_command_help(include_owner=False)
|
||
|
|
assert "/approve" not in help_text
|
||
|
|
assert "/reject" not in help_text
|
||
|
|
assert "/allowlist" not in help_text
|