Files
wehub-resource-sync 7a0da7932b
OSV-Scanner (Scheduled) / scan-scheduled (push) Failing after 0s
Create Release / test-gate (push) Has been cancelled
Create Release / release-gate (push) Has been cancelled
Create Release / ci-gate (push) Has been cancelled
Create Release / version-check (push) Has been cancelled
Create Release / e2e-test-gate (push) Has been cancelled
Create Release / responsive-test-gate (push) Has been cancelled
Create Release / compat-test-gate (push) Has been cancelled
Create Release / compose-integration-gate (push) Has been cancelled
Create Release / vulture-gate (push) Has been cancelled
Create Release / build (push) Has been cancelled
Create Release / provenance (push) Has been cancelled
Create Release / prerelease-docker (push) Has been cancelled
Create Release / publish-docker (push) Has been cancelled
Create Release / create-release (push) Has been cancelled
Create Release / cleanup-changelog (push) Has been cancelled
Create Release / trigger-pypi (push) Has been cancelled
Create Release / monitor-pypi (push) Has been cancelled
Create Release / Clean up orphan prerelease tags and signatures (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-form] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-metrics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [research-workflow] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-core] (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [history-news] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [library] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [link-analytics] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-core] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [chat-lifecycle] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [error-benchmark] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [settings-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) (push) Has been cancelled
Docker Tests (Consolidated) / Accessibility Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Unit Tests (push) Has been cancelled
Docker Tests (Consolidated) / LLM Example Tests (push) Has been cancelled
Docker Tests (Consolidated) / Production Image Smoke Test (push) Has been cancelled
Docker Tests (Consolidated) / Infrastructure Tests (push) Has been cancelled
OSSF Scorecard / OSSF Security Scorecard Analysis (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [mobile] (push) Has been cancelled
Backwards Compatibility / Verify Encryption Constants (push) Has been cancelled
Backwards Compatibility / PyPI Version Compatibility (push) Has been cancelled
Backwards Compatibility / Database Migration Tests (push) Has been cancelled
CodeQL Advanced / Analyze (python) (push) Has been cancelled
Docker Tests (Consolidated) / detect-changes (push) Has been cancelled
Docker Tests (Consolidated) / Build Test Image (push) Has been cancelled
Docker Tests (Consolidated) / All Pytest Tests + Coverage (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [accessibility] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [api-crud] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-login] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-pages] (push) Has been cancelled
Docker Tests (Consolidated) / UI Tests (Puppeteer) [auth-register] (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:08:55 +08:00

243 lines
5.6 KiB
Python

"""Shared fixtures for web services tests."""
import pytest
from unittest.mock import Mock, MagicMock, patch
@pytest.fixture(autouse=True)
def _allow_socket_subscribe():
"""Mock the chat-mode socket-subscribe ownership check.
See the matching conftest in ``tests/web/services/conftest.py`` for
full context. Pre-existing socket tests in this directory don't set
up a Flask request context, so without this autouse fixture the new
``session.get("username")`` lookup in ``__handle_subscribe`` raises
``RuntimeError: Working outside of request context``.
Tests in this directory import via ``local_deep_research.web...``
(no ``src.`` prefix). Patch BOTH paths because Python may treat the
two import paths as distinct module identities depending on how the
package is installed.
"""
# Resolve the module from whichever path is importable.
try:
from local_deep_research.web.services.socket_service import (
SocketIOService,
)
module_path = "local_deep_research.web.services.socket_service"
except ImportError:
from src.local_deep_research.web.services.socket_service import (
SocketIOService,
)
module_path = "src.local_deep_research.web.services.socket_service"
with (
patch(f"{module_path}.session", {"username": "test-owner"}),
patch.object(SocketIOService, "_user_owns_research", return_value=True),
):
yield
@pytest.fixture
def sample_markdown():
"""Sample markdown content for testing."""
return """# Test Document
This is a test document with **bold** and *italic* text.
## Section 1
A paragraph with some content.
| Column 1 | Column 2 |
|----------|----------|
| Data 1 | Data 2 |
## Section 2
- Item 1
- Item 2
- Item 3
```python
def example():
return "code block"
```
"""
@pytest.fixture
def simple_markdown():
"""Minimal markdown for basic tests."""
return "# Hello World\n\nThis is a test."
@pytest.fixture
def markdown_with_special_chars():
"""Markdown with special characters."""
return """# Special Characters
Testing: <>&"'
Unicode: café, naïve, 日本語
Symbols: © ® ™ € £ ¥
"""
@pytest.fixture
def sample_metadata():
"""Sample metadata for PDF generation."""
return {
"author": "Test Author",
"date": "2024-01-15",
"subject": "Test Subject",
}
@pytest.fixture
def custom_css():
"""Custom CSS for PDF styling."""
return """
body {
font-family: 'Times New Roman', serif;
font-size: 12pt;
}
h1 {
color: navy;
}
"""
@pytest.fixture
def valid_pdf_bytes():
"""Generate valid minimal PDF bytes for testing extraction."""
# This is a minimal valid PDF structure
pdf_content = b"""%PDF-1.4
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792]
/Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>
endobj
4 0 obj
<< /Length 44 >>
stream
BT /F1 12 Tf 100 700 Td (Hello World) Tj ET
endstream
endobj
5 0 obj
<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000115 00000 n
0000000266 00000 n
0000000359 00000 n
trailer
<< /Size 6 /Root 1 0 R >>
startxref
434
%%EOF"""
return pdf_content
@pytest.fixture
def invalid_pdf_bytes():
"""Invalid/corrupted PDF bytes."""
return b"This is not a valid PDF file"
@pytest.fixture
def empty_file_bytes():
"""Empty file bytes."""
return b""
@pytest.fixture
def mock_flask_app():
"""Mock Flask app for socket service testing."""
app = Mock()
app.config = {}
return app
@pytest.fixture
def mock_socketio():
"""Mock SocketIO instance."""
socketio = Mock()
socketio.emit = Mock(return_value=None)
socketio.on = Mock(return_value=lambda f: f)
socketio.on_error = Mock(return_value=lambda f: f)
socketio.on_error_default = Mock(return_value=lambda f: f)
socketio.run = Mock()
return socketio
@pytest.fixture
def mock_request():
"""Mock Flask request object."""
request = Mock()
request.sid = "test-session-id-123"
return request
@pytest.fixture
def sample_research_id():
"""Sample research ID for testing."""
return "research-abc-123"
@pytest.fixture
def sample_sources():
"""Sample sources for research sources service."""
return [
{
"title": "Source 1",
"url": "https://example.com/source1",
"snippet": "This is the first source snippet.",
"full_content": "Full content of source 1.",
},
{
"link": "https://example.com/source2", # Alternative key
"name": "Source 2", # Alternative key
"snippet": "Second source snippet.",
},
{
"title": "Source 3",
"url": "https://example.com/source3",
"snippet": "Third source with a very long snippet that should be truncated "
* 50,
},
]
@pytest.fixture
def mock_db_session():
"""Mock database session."""
session = MagicMock()
session.__enter__ = Mock(return_value=session)
session.__exit__ = Mock(return_value=False)
return session
@pytest.fixture
def mock_research_resource():
"""Mock ResearchResource model instance."""
resource = Mock()
resource.id = 1
resource.research_id = "research-abc-123"
resource.title = "Test Resource"
resource.url = "https://example.com/resource"
resource.content_preview = "Preview content"
resource.source_type = "web"
resource.resource_metadata = {"key": "value"}
return resource