Files
qwenpaw/tests/unit/routers/test_console_project_directory.py
agent-radar 1a3a4ccde1
Creator App Tests / PR Spam Gate (push) Skipped
Frontend Tests / PR Spam Gate (push) Skipped
NPM Format (website & console) / PR Spam Gate (push) Skipped
Pre-commit Checks / PR Spam Gate (push) Skipped
QwenPaw Creator Plugin Release / check-version (push) Canceled after 0s
QwenPaw Creator Plugin Release / upload-oss (push) Canceled after 0s
Tests / PR Spam Gate (push) Skipped
CodeQL / CodeQL (python) (push) Canceled after 0s
CodeQL / CodeQL (typescript) (push) Canceled after 0s
Creator App Tests / Creator Backend Tests (push) Canceled after 0s
Creator App Tests / Creator UI Build & Tests (push) Canceled after 0s
E2E Smoke Tests / Playwright UI Smoke (push) Canceled after 0s
Frontend Tests / Detect console changes (push) Canceled after 0s
NPM Format (website & console) / website format check (push) Canceled after 0s
NPM Format (website & console) / console format check (push) Canceled after 0s
Pre-commit Checks / Pre-commit (push) Canceled after 0s
QwenPaw Data Plugin Release / check-version (push) Canceled after 0s
Tests / Detect code changes (push) Canceled after 0s
Frontend Tests / Vitest Unit Tests (push) Canceled after 0s
Frontend Tests / Frontend Summary (push) Canceled after 0s
QwenPaw Data Plugin Release / upload-oss (push) Canceled after 0s
Tests / Maintainer Approval (push) Canceled after 0s
Tests / Unit Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Unit Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - macos-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.13 - ubuntu-latest (push) Canceled after 0s
Tests / Contract Tests - py3.11 - windows-latest (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - macos-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - fallback (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.13 - ubuntu-latest - p2 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p0 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p1 (push) Canceled after 0s
Tests / Integrated Tests - py3.11 - windows-latest - p2 (push) Canceled after 0s
Tests / Coverage Report (push) Canceled after 0s
Tests / Test Summary (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:01:50 +08:00

94 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
"""Tests for Console Session project-directory request handling."""
from pathlib import Path
from types import SimpleNamespace
from unittest.mock import AsyncMock
import pytest
from qwenpaw.app.routers.console import _persist_pending_project_dirs
@pytest.mark.asyncio
async def test_apply_session_project_dir_persists_before_dispatch(
tmp_path: Path,
) -> None:
"""The first request stores its Session project snapshot."""
updated_chat = SimpleNamespace(meta={})
workspace = SimpleNamespace(
chat_manager=SimpleNamespace(
set_session_project_dirs=AsyncMock(return_value=updated_chat),
),
)
chat = SimpleNamespace(id="chat-1", meta={})
payload = {
"meta": {
"request_context": {
"approval_level": "confirm",
"session_project_dir": str(tmp_path),
},
},
}
result = await _persist_pending_project_dirs(workspace, chat, payload)
assert result is updated_chat
workspace.chat_manager.set_session_project_dirs.assert_awaited_once_with(
"chat-1",
[{"path": str(tmp_path.resolve()), "label": None}],
)
assert payload["meta"]["request_context"] == {
"approval_level": "confirm",
}
@pytest.mark.asyncio
async def test_apply_session_project_dir_rejects_missing_directory(
tmp_path: Path,
) -> None:
"""An unavailable Session project never reaches the runtime.
The pending pick is client-supplied, so a path that is not a
directory is dropped (with a warning) rather than written onto the
chat, where it would silently steer every later turn.
"""
workspace = SimpleNamespace(
chat_manager=SimpleNamespace(set_session_project_dirs=AsyncMock()),
)
chat = SimpleNamespace(id="chat-1", meta={})
missing = tmp_path / "missing"
payload = {
"meta": {
"request_context": {
"session_project_dir": str(missing),
},
},
}
result = await _persist_pending_project_dirs(workspace, chat, payload)
assert result is chat
workspace.chat_manager.set_session_project_dirs.assert_not_awaited()
@pytest.mark.asyncio
async def test_apply_session_project_dir_ignores_other_context() -> None:
"""Requests without a Session project snapshot leave chat state alone."""
workspace = SimpleNamespace(
chat_manager=SimpleNamespace(set_session_project_dirs=AsyncMock()),
)
chat = SimpleNamespace(id="chat-1", meta={})
payload = {
"meta": {
"request_context": {
"approval_level": "confirm",
},
},
}
result = await _persist_pending_project_dirs(workspace, chat, payload)
assert result is chat
workspace.chat_manager.set_session_project_dirs.assert_not_awaited()