139 lines
4.0 KiB
Python
139 lines
4.0 KiB
Python
"""Pytest configuration and fixtures"""
|
|
|
|
import pytest
|
|
import asyncio
|
|
import json
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def bgp_collector_location_cache():
|
|
"""Mirror app startup seeding for tests that call sync BGP helpers."""
|
|
from app.services.bgp_collector_locations import (
|
|
SEED_PATH,
|
|
set_bgp_collector_location_cache,
|
|
)
|
|
|
|
payload = json.loads(SEED_PATH.read_text(encoding="utf-8"))
|
|
cache = {}
|
|
for entry in payload.get("locations", []):
|
|
collector_id = next(
|
|
alias for alias in entry.get("aliases", []) if str(alias).startswith("rrc")
|
|
)
|
|
cache[collector_id] = {
|
|
"city": entry.get("city"),
|
|
"country": entry.get("country"),
|
|
"latitude": entry.get("latitude"),
|
|
"longitude": entry.get("longitude"),
|
|
"precision": entry.get("precision") or "city",
|
|
"source": "legacy_seed",
|
|
"needs_confirmation": True,
|
|
"matched_location_name": entry.get("site") or collector_id,
|
|
"verified_at": None,
|
|
"confidence": entry.get("confidence"),
|
|
"operator": entry.get("operator"),
|
|
"site": entry.get("site"),
|
|
"verification_status": "unverified",
|
|
"source_note": entry.get("source_note"),
|
|
}
|
|
set_bgp_collector_location_cache(cache)
|
|
yield
|
|
set_bgp_collector_location_cache({})
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def event_loop():
|
|
"""Create event loop for async tests"""
|
|
loop = asyncio.get_event_loop_policy().new_event_loop()
|
|
yield loop
|
|
loop.close()
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_db_session():
|
|
"""Mock database session"""
|
|
session = AsyncMock(spec=AsyncSession)
|
|
session.add = MagicMock()
|
|
session.commit = AsyncMock()
|
|
session.execute = AsyncMock()
|
|
session.refresh = AsyncMock()
|
|
session.close = AsyncMock()
|
|
return session
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_top500_response():
|
|
"""Sample TOP500 API response"""
|
|
return {
|
|
"items": [
|
|
{
|
|
"rank": 1,
|
|
"system_name": "Frontier",
|
|
"country": "USA",
|
|
"city": "Oak Ridge",
|
|
"latitude": 35.9322,
|
|
"longitude": -84.3108,
|
|
"manufacturer": "HPE",
|
|
"r_max": 1102000.0,
|
|
"r_peak": 1685000.0,
|
|
"power": 21510.0,
|
|
"cores": 8730112,
|
|
"interconnect": "Slingshot 11",
|
|
"os": "CentOS",
|
|
},
|
|
{
|
|
"rank": 2,
|
|
"system_name": "Fugaku",
|
|
"country": "Japan",
|
|
"city": "Kobe",
|
|
"latitude": 34.6913,
|
|
"longitude": 135.1830,
|
|
"manufacturer": "Fujitsu",
|
|
"r_max": 442010.0,
|
|
"r_peak": 537212.0,
|
|
"power": 29899.0,
|
|
"cores": 7630848,
|
|
"interconnect": "Tofu interconnect D",
|
|
"os": "RHEL",
|
|
},
|
|
]
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_huggingface_response():
|
|
"""Sample Hugging Face API response"""
|
|
return {
|
|
"models": [
|
|
{
|
|
"id": "bert-base-uncased",
|
|
"author": "google",
|
|
"description": "BERT base model",
|
|
"likes": 25000,
|
|
"downloads": 5000000,
|
|
"language": "en",
|
|
"tags": ["transformer", "bert"],
|
|
"pipeline_tag": "feature-extraction",
|
|
"library_name": "transformers",
|
|
"createdAt": "2024-01-15T10:00:00Z",
|
|
}
|
|
]
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_alert_data():
|
|
"""Sample alert data"""
|
|
return {
|
|
"id": 1,
|
|
"severity": "warning",
|
|
"status": "active",
|
|
"datasource_id": 2,
|
|
"datasource_name": "Epoch AI",
|
|
"message": "API response time > 30s",
|
|
"created_at": "2024-01-20T09:30:00Z",
|
|
"acknowledged_by": None,
|
|
}
|