mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-04 00:27:14 +00:00
fix(test): make test-quick reliable as developer gate
Fixes for D-001验收问题: 1. test-quick.sh: use set -euo pipefail, uv run ruff, no tail pipe 2. Remove unused imports in factories (app.py, platform.py, provider.py) 3. Fix unused variable in smoke test 4. Add noqa: E402 to test_n8nsvapi.py lazy imports 5. Update smoke test docs: "minimal fake flow" not full pipeline Now test-quick is a reliable gate: lint failures exit 1, test failures propagate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+9
-10
@@ -4,31 +4,30 @@
|
|||||||
# Runs linting, unit tests, and smoke tests without requiring real provider keys
|
# Runs linting, unit tests, and smoke tests without requiring real provider keys
|
||||||
# Suitable for local branch validation
|
# Suitable for local branch validation
|
||||||
|
|
||||||
set -e
|
set -euo pipefail
|
||||||
|
|
||||||
echo "=== LangBot Quick Self-Test ==="
|
echo "=== LangBot Quick Self-Test ==="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 1. Ruff check
|
# 1. Ruff check
|
||||||
echo "[1/3] Running ruff check..."
|
echo "[1/3] Running ruff check..."
|
||||||
if command -v ruff &> /dev/null; then
|
uv run ruff check src/langbot/ tests/ --output-format=concise || {
|
||||||
ruff check src/langbot/ tests/ --quiet || {
|
echo ""
|
||||||
echo "⚠ Ruff check found issues. Run 'ruff check --fix' to auto-fix."
|
echo "⚠ Ruff check found issues. Run 'uv run ruff check --fix' to auto-fix."
|
||||||
}
|
exit 1
|
||||||
else
|
}
|
||||||
echo "⚠ ruff not installed, skipping lint check"
|
echo "✓ Ruff check passed"
|
||||||
fi
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 2. Unit tests
|
# 2. Unit tests
|
||||||
echo "[2/3] Running unit tests..."
|
echo "[2/3] Running unit tests..."
|
||||||
uv run pytest tests/unit_tests/ -q --tb=short 2>&1 | tail -5
|
uv run pytest tests/unit_tests/ -q --tb=short
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# 3. Smoke tests (if exists)
|
# 3. Smoke tests (if exists)
|
||||||
echo "[3/3] Running smoke tests..."
|
echo "[3/3] Running smoke tests..."
|
||||||
if [ -d "tests/smoke" ]; then
|
if [ -d "tests/smoke" ]; then
|
||||||
uv run pytest tests/smoke/ -q --tb=short 2>&1 | tail -5
|
uv run pytest tests/smoke/ -q --tb=short
|
||||||
else
|
else
|
||||||
echo "No smoke tests found, skipping"
|
echo "No smoke tests found, skipping"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from unittest.mock import AsyncMock, Mock
|
from unittest.mock import AsyncMock, Mock
|
||||||
|
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
|
||||||
|
|
||||||
|
|
||||||
class FakeApp:
|
class FakeApp:
|
||||||
"""Mock Application object providing all basic dependencies needed by stages."""
|
"""Mock Application object providing all basic dependencies needed by stages."""
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import typing
|
|||||||
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
import langbot_plugin.api.entities.builtin.platform.message as platform_message
|
||||||
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
import langbot_plugin.api.entities.builtin.platform.events as platform_events
|
||||||
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
import langbot_plugin.api.entities.builtin.platform.entities as platform_entities
|
||||||
import langbot_plugin.api.entities.builtin.provider.session as provider_session
|
|
||||||
|
|
||||||
|
|
||||||
class FakePlatform:
|
class FakePlatform:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Provides a deterministic fake provider that simulates LLM responses without real
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from unittest.mock import AsyncMock, Mock
|
from unittest.mock import Mock
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
import langbot_plugin.api.entities.builtin.provider.message as provider_message
|
import langbot_plugin.api.entities.builtin.provider.message as provider_message
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
"""
|
"""
|
||||||
Smoke tests for LangBot core message flow.
|
Minimal fake flow smoke tests for LangBot.
|
||||||
|
|
||||||
These tests verify the basic message processing flow works correctly
|
These tests verify basic component interactions using fake providers and platforms.
|
||||||
using fake providers and platforms.
|
Not a full pipeline integration test - tests individual factory components.
|
||||||
|
|
||||||
|
For full pipeline tests, see tests/integration/ (planned).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
@@ -272,21 +274,25 @@ class TestFakeMessageFlow:
|
|||||||
|
|
||||||
|
|
||||||
class TestMessageFlowIntegration:
|
class TestMessageFlowIntegration:
|
||||||
"""Integration smoke tests for full message flow."""
|
"""Minimal fake flow integration tests.
|
||||||
|
|
||||||
|
These tests verify component interactions but do NOT run full LangBot pipeline.
|
||||||
|
For real pipeline tests, integration tests are needed (planned).
|
||||||
|
"""
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_minimal_message_flow(self):
|
async def test_minimal_message_flow(self):
|
||||||
"""Smoke test: message enters, fake provider responds, platform captures outbound.
|
"""Minimal fake flow test: fake query -> fake provider -> fake platform.
|
||||||
|
|
||||||
This test verifies:
|
This test verifies:
|
||||||
1. Fake app is created
|
1. Fake text query is created
|
||||||
2. Fake text message enters
|
2. Fake provider returns LANGBOT_FAKE_PONG
|
||||||
3. Fake provider returns LANGBOT_FAKE_PONG
|
3. Fake platform captures outbound response
|
||||||
4. Fake platform captures outbound response
|
4. No unexpected exception
|
||||||
5. No unexpected exception
|
|
||||||
|
Note: This does NOT run actual LangBot pipeline stages.
|
||||||
"""
|
"""
|
||||||
# Setup
|
# Setup
|
||||||
app = FakeApp()
|
|
||||||
platform = FakePlatform(bot_account_id="test-bot")
|
platform = FakePlatform(bot_account_id="test-bot")
|
||||||
provider = fake_provider_pong()
|
provider = fake_provider_pong()
|
||||||
model = fake_model(provider=provider)
|
model = fake_model(provider=provider)
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ sys.modules.setdefault('langbot.pkg.provider.runner', _mock_runner)
|
|||||||
sys.modules.setdefault('langbot.pkg.core.app', MagicMock())
|
sys.modules.setdefault('langbot.pkg.core.app', MagicMock())
|
||||||
sys.modules.setdefault('langbot.pkg.utils.httpclient', MagicMock())
|
sys.modules.setdefault('langbot.pkg.utils.httpclient', MagicMock())
|
||||||
|
|
||||||
import pytest
|
import pytest # noqa: E402
|
||||||
import langbot_plugin.api.entities.builtin.provider.message as provider_message
|
import langbot_plugin.api.entities.builtin.provider.message as provider_message # noqa: E402
|
||||||
from langbot.pkg.provider.runners.n8nsvapi import N8nServiceAPIRunner
|
from langbot.pkg.provider.runners.n8nsvapi import N8nServiceAPIRunner # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user