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

255 lines
9.5 KiB
Python

"""
Comprehensive API Tests for Local Deep Research.
This test suite checks all API endpoints for proper authentication,
response formats, and basic functionality.
"""
import json
from loguru import logger
class TestAllAPIs:
"""Test suite for all API endpoints."""
def test_auth_apis(self, authenticated_client):
"""Test authentication APIs."""
# Check auth status
response = authenticated_client.get("/auth/check")
assert response.status_code == 200
data = json.loads(response.data)
assert data["authenticated"] is True
assert "username" in data
# Test integrity check
response = authenticated_client.get("/auth/integrity-check")
assert response.status_code == 200
data = json.loads(response.data)
assert "integrity" in data
assert "username" in data
def test_settings_apis(self, authenticated_client):
"""Test settings APIs."""
# Get all settings
response = authenticated_client.get("/settings/api")
assert response.status_code == 200
data = json.loads(response.data)
assert data["status"] == "success"
assert "settings" in data
# Get categories
response = authenticated_client.get("/settings/api/categories")
assert response.status_code == 200
data = json.loads(response.data)
assert "categories" in data
# Get types
response = authenticated_client.get("/settings/api/types")
assert response.status_code == 200
data = json.loads(response.data)
assert "types" in data
# Get available models
response = authenticated_client.get("/settings/api/available-models")
assert response.status_code == 200
data = json.loads(response.data)
assert (
"providers" in data or "models" in data
) # API might return either
# Get available search engines - THIS IS FAILING
logger.info("Testing search engines API...")
response = authenticated_client.get(
"/settings/api/available-search-engines"
)
logger.info(f"Search engines response: {response.status_code}")
if response.status_code != 200:
logger.error(f"Search engines error: {response.data}")
assert response.status_code == 200
data = json.loads(response.data)
assert "engines" in data or "engine_options" in data
# Get warnings
response = authenticated_client.get("/settings/api/warnings")
assert response.status_code == 200
data = json.loads(response.data)
assert isinstance(
data, (list, dict)
) # API might return list or dict with warnings
# Test get/set specific setting
response = authenticated_client.get("/settings/api/llm.temperature")
if response.status_code == 404:
# Setting doesn't exist, create it
response = authenticated_client.put(
"/settings/api/llm.temperature",
json={"value": 0.7},
content_type="application/json",
)
assert response.status_code in [200, 201]
# Get data location
response = authenticated_client.get("/settings/api/data-location")
assert response.status_code == 200
data = json.loads(response.data)
assert (
"data_directory" in data or "data_dir" in data
) # API might return either
assert "is_custom" in data
def test_research_apis(self, authenticated_client):
"""Test research APIs."""
# Get research history
response = authenticated_client.get("/history/api")
assert response.status_code == 200
data = json.loads(response.data)
assert "items" in data or "history" in data # API might return either
# Start a test research
research_data = {
"query": "API test research query",
"model": "gpt-3.5-turbo",
"search_engines": ["searxng"],
"local_context": 2000,
"web_context": 2000,
"temperature": 0.7,
}
response = authenticated_client.post(
"/research/api/start",
json=research_data,
content_type="application/json",
)
# The research start API might fail in test environment due to
# missing LLM configuration or other issues. We'll accept any
# response as long as it's a valid HTTP response.
assert response.status_code in [200, 400, 404, 500]
# If successful, test the other endpoints
if response.status_code == 200:
data = json.loads(response.data)
if "research_id" in data:
research_id = data["research_id"]
# Check status
response = authenticated_client.get(
f"/research/api/status/{research_id}"
)
assert response.status_code == 200
# Terminate research
response = authenticated_client.post(
f"/research/api/terminate/{research_id}"
)
assert response.status_code in [200, 404]
def test_metrics_apis(self, authenticated_client):
"""Test metrics APIs."""
# Get metrics summary
response = authenticated_client.get("/metrics/api/metrics")
assert response.status_code == 200
data = json.loads(response.data)
assert "metrics" in data or "summary" in data # API might return either
# Get enhanced metrics
response = authenticated_client.get("/metrics/api/metrics/enhanced")
assert response.status_code == 200
# Get star reviews
response = authenticated_client.get("/metrics/api/star-reviews")
assert response.status_code == 200
# Get pricing info
response = authenticated_client.get("/metrics/api/pricing")
assert response.status_code == 200
data = json.loads(response.data)
assert "pricing" in data or "models" in data # API might return either
# Get cost analytics
response = authenticated_client.get("/metrics/api/cost-analytics")
assert response.status_code == 200
def test_benchmark_apis(self, authenticated_client):
"""Test benchmark APIs."""
# Get benchmark history
response = authenticated_client.get("/benchmark/api/history")
assert response.status_code == 200
data = json.loads(response.data)
assert "runs" in data or "history" in data # API might return either
# Get saved configs
response = authenticated_client.get("/benchmark/api/configs")
assert response.status_code == 200
data = json.loads(response.data)
assert "configs" in data
# Check running benchmark
response = authenticated_client.get("/benchmark/api/running")
assert response.status_code == 200
data = json.loads(response.data)
assert (
"is_running" in data or "success" in data
) # API might return either
# Validate config
test_config = {
"name": "Test Config",
"queries": ["test query"],
"models": ["gpt-3.5-turbo"],
"search_engines": ["searxng"],
}
response = authenticated_client.post(
"/benchmark/api/validate-config",
json=test_config,
content_type="application/json",
)
assert response.status_code == 200
def test_history_apis(self, authenticated_client):
"""Test history APIs."""
response = authenticated_client.get("/history/api")
assert response.status_code == 200
data = json.loads(response.data)
assert "items" in data or "history" in data # API might return either
# Get the actual history list
history_data = data.get("items", data.get("history", []))
assert isinstance(history_data, list)
def test_config_apis(self, authenticated_client):
"""Test configuration APIs."""
# Get current config - api_bp is registered with /research/api prefix
response = authenticated_client.get(
"/research/api/settings/current-config"
)
assert response.status_code == 200
data = json.loads(response.data)
assert "success" in data # API returns success status
if data.get("success"):
assert "config" in data # Config is nested under config key
# Get public config - This endpoint may not exist
response = authenticated_client.get("/api/config")
if response.status_code == 404:
# Endpoint doesn't exist, skip test
pass
else:
assert response.status_code == 200
data = json.loads(response.data)
assert "version" in data or "available_models" in data
def test_health_check_apis(self, authenticated_client):
"""Test health check APIs."""
# Check Ollama status - the api_bp is registered with /research/api prefix
response = authenticated_client.get("/research/api/check/ollama_status")
assert response.status_code == 200
data = json.loads(response.data)
assert (
"running" in data or "available" in data
) # API might return either
# Check Ollama model
response = authenticated_client.get("/research/api/check/ollama_model")
# This might return 400 if no model specified
assert response.status_code in [200, 400]