refactor(tests): optimize unit test structure
This commit is contained in:
11
.github/workflows/ci.yml
vendored
11
.github/workflows/ci.yml
vendored
@@ -21,13 +21,14 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Install uv
|
||||||
|
uses: astral-sh/setup-uv@v4
|
||||||
|
|
||||||
- name: Install system dependencies
|
- name: Install system dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install -y libolm-dev build-essential
|
run: sudo apt-get update && sudo apt-get install -y libolm-dev build-essential
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install all dependencies
|
||||||
run: |
|
run: uv sync --all-extras
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install .[dev]
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: python -m pytest tests/ -v
|
run: uv run pytest tests/
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@@ -113,6 +114,7 @@ class ExecTool(Tool):
|
|||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
|
if sys.platform != "win32":
|
||||||
try:
|
try:
|
||||||
os.waitpid(process.pid, os.WNOHANG)
|
os.waitpid(process.pid, os.WNOHANG)
|
||||||
except (ProcessLookupError, ChildProcessError) as e:
|
except (ProcessLookupError, ChildProcessError) as e:
|
||||||
|
|||||||
@@ -70,11 +70,8 @@ langsmith = [
|
|||||||
dev = [
|
dev = [
|
||||||
"pytest>=9.0.0,<10.0.0",
|
"pytest>=9.0.0,<10.0.0",
|
||||||
"pytest-asyncio>=1.3.0,<2.0.0",
|
"pytest-asyncio>=1.3.0,<2.0.0",
|
||||||
|
"pytest-cov>=6.0.0,<7.0.0",
|
||||||
"ruff>=0.1.0",
|
"ruff>=0.1.0",
|
||||||
"matrix-nio[e2e]>=0.25.2",
|
|
||||||
"mistune>=3.0.0,<4.0.0",
|
|
||||||
"nh3>=0.2.17,<1.0.0",
|
|
||||||
"mypy>=1.19.1",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
|
|||||||
@@ -3,6 +3,16 @@ from types import SimpleNamespace
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional dingtalk dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import dingtalk
|
||||||
|
DINGTALK_AVAILABLE = getattr(dingtalk, "DINGTALK_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
DINGTALK_AVAILABLE = False
|
||||||
|
|
||||||
|
if not DINGTALK_AVAILABLE:
|
||||||
|
pytest.skip("DingTalk dependencies not installed (dingtalk-stream)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
import nanobot.channels.dingtalk as dingtalk_module
|
import nanobot.channels.dingtalk as dingtalk_module
|
||||||
from nanobot.channels.dingtalk import DingTalkChannel, NanobotDingTalkHandler
|
from nanobot.channels.dingtalk import DingTalkChannel, NanobotDingTalkHandler
|
||||||
@@ -1,3 +1,14 @@
|
|||||||
|
# Check optional Feishu dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import feishu
|
||||||
|
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
|
if not FEISHU_AVAILABLE:
|
||||||
|
import pytest
|
||||||
|
pytest.skip("Feishu dependencies not installed (lark-oapi)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.channels.feishu import FeishuChannel
|
from nanobot.channels.feishu import FeishuChannel
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +1,14 @@
|
|||||||
|
# Check optional Feishu dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import feishu
|
||||||
|
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
|
if not FEISHU_AVAILABLE:
|
||||||
|
import pytest
|
||||||
|
pytest.skip("Feishu dependencies not installed (lark-oapi)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.channels.feishu import FeishuChannel, _extract_post_content
|
from nanobot.channels.feishu import FeishuChannel, _extract_post_content
|
||||||
|
|
||||||
|
|
||||||
@@ -7,6 +7,16 @@ from unittest.mock import MagicMock, patch
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional Feishu dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import feishu
|
||||||
|
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
|
if not FEISHU_AVAILABLE:
|
||||||
|
pytest.skip("Feishu dependencies not installed (lark-oapi)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
from nanobot.channels.feishu import FeishuChannel, FeishuConfig
|
from nanobot.channels.feishu import FeishuChannel, FeishuConfig
|
||||||
@@ -6,6 +6,17 @@ list of card elements into groups so that each group contains at most one
|
|||||||
table, allowing nanobot to send multiple cards instead of failing.
|
table, allowing nanobot to send multiple cards instead of failing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Check optional Feishu dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import feishu
|
||||||
|
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
|
if not FEISHU_AVAILABLE:
|
||||||
|
import pytest
|
||||||
|
pytest.skip("Feishu dependencies not installed (lark-oapi)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.channels.feishu import FeishuChannel
|
from nanobot.channels.feishu import FeishuChannel
|
||||||
|
|
||||||
|
|
||||||
@@ -6,6 +6,16 @@ from unittest.mock import MagicMock, patch
|
|||||||
import pytest
|
import pytest
|
||||||
from pytest import mark
|
from pytest import mark
|
||||||
|
|
||||||
|
# Check optional Feishu dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import feishu
|
||||||
|
FEISHU_AVAILABLE = getattr(feishu, "FEISHU_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
FEISHU_AVAILABLE = False
|
||||||
|
|
||||||
|
if not FEISHU_AVAILABLE:
|
||||||
|
pytest.skip("Feishu dependencies not installed (lark-oapi)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.channels.feishu import FeishuChannel
|
from nanobot.channels.feishu import FeishuChannel
|
||||||
|
|
||||||
@@ -4,6 +4,12 @@ from types import SimpleNamespace
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional matrix dependencies before importing
|
||||||
|
try:
|
||||||
|
import nh3 # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Matrix dependencies not installed (nh3)", allow_module_level=True)
|
||||||
|
|
||||||
import nanobot.channels.matrix as matrix_module
|
import nanobot.channels.matrix as matrix_module
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
@@ -4,6 +4,16 @@ from types import SimpleNamespace
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional QQ dependencies before running tests
|
||||||
|
try:
|
||||||
|
from nanobot.channels import qq
|
||||||
|
QQ_AVAILABLE = getattr(qq, "QQ_AVAILABLE", False)
|
||||||
|
except ImportError:
|
||||||
|
QQ_AVAILABLE = False
|
||||||
|
|
||||||
|
if not QQ_AVAILABLE:
|
||||||
|
pytest.skip("QQ dependencies not installed (qq-botpy)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
from nanobot.channels.qq import QQChannel, QQConfig
|
from nanobot.channels.qq import QQChannel, QQConfig
|
||||||
@@ -2,6 +2,12 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional Slack dependencies before running tests
|
||||||
|
try:
|
||||||
|
import slack_sdk # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Slack dependencies not installed (slack-sdk)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
from nanobot.channels.slack import SlackChannel
|
from nanobot.channels.slack import SlackChannel
|
||||||
@@ -5,6 +5,12 @@ from unittest.mock import AsyncMock
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
# Check optional Telegram dependencies before running tests
|
||||||
|
try:
|
||||||
|
import telegram # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pytest.skip("Telegram dependencies not installed (python-telegram-bot)", allow_module_level=True)
|
||||||
|
|
||||||
from nanobot.bus.events import OutboundMessage
|
from nanobot.bus.events import OutboundMessage
|
||||||
from nanobot.bus.queue import MessageBus
|
from nanobot.bus.queue import MessageBus
|
||||||
from nanobot.channels.telegram import TELEGRAM_REPLY_CONTEXT_MAX_LEN, TelegramChannel
|
from nanobot.channels.telegram import TELEGRAM_REPLY_CONTEXT_MAX_LEN, TelegramChannel
|
||||||
Reference in New Issue
Block a user