ReliefLensDemo / backend /tests /test_skills.py
copilot-swe-agent[bot]
feat: build complete ReliefLensAI backend
d0f3cbe unverified
Raw
History Blame Contribute Delete
7.82 kB
from __future__ import annotations
import pytest
import pytest_asyncio
from datetime import datetime
from schemas.signal import NormalizedSignal, SignalType
@pytest.mark.asyncio
async def test_transcribe_audio_demo():
from skills.transcribe_audio import transcribe_audio
result = await transcribe_audio("audio_001.mp3", demo_mode=True)
assert "transcription" in result
assert len(result["transcription"]) > 10
assert 0 <= result["confidence"] <= 1
@pytest.mark.asyncio
async def test_caption_image_demo():
from skills.caption_image import caption_image
result = await caption_image("image_001.jpg", demo_mode=True)
assert "caption" in result
assert len(result["caption"]) > 10
assert "objects_detected" in result
@pytest.mark.asyncio
async def test_extract_location_known():
from skills.extract_location import extract_location
result = await extract_location("Hay inundación en Barrio Santa Ana")
assert result["location_name"] is not None
assert result["confidence"] > 0.5
@pytest.mark.asyncio
async def test_extract_location_unknown():
from skills.extract_location import extract_location
result = await extract_location("No location mentioned here xyz abc")
assert result["confidence"] >= 0
@pytest.mark.asyncio
async def test_normalize_signal_demo():
from skills.normalize_signal import normalize_signal
result = await normalize_signal(
raw_text="Hay personas atrapadas en Barrio Santa Ana, al menos 5 heridos",
modality="text",
report_id="r_test_001",
vllm_client=None,
)
assert "signal_type" in result
assert "confidence" in result
assert result["source_report_id"] == "r_test_001"
@pytest.mark.asyncio
async def test_detect_duplicates():
from skills.detect_duplicates import detect_duplicates
now = datetime.utcnow()
signals = [
NormalizedSignal(
source_report_id="r1",
signal_type=SignalType.FLOOD,
description="Flooding in Santa Ana",
raw_text="Flooding in Santa Ana barrio water rising fast",
confidence=0.9,
modality="text",
created_at=now,
),
NormalizedSignal(
source_report_id="r2",
signal_type=SignalType.FLOOD,
description="Flooding in Santa Ana",
raw_text="Flooding in Santa Ana barrio water rising fast",
confidence=0.85,
modality="text",
created_at=now,
),
NormalizedSignal(
source_report_id="r3",
signal_type=SignalType.PERSON_TRAPPED,
description="Person trapped on roof",
raw_text="There is a person trapped on the roof of the school building",
confidence=0.92,
modality="text",
created_at=now,
),
]
unique = await detect_duplicates(signals, threshold=0.75)
assert len(unique) == 2
@pytest.mark.asyncio
async def test_classify_priority_person_trapped():
from skills.classify_priority import classify_priority
from schemas.incident import Priority
now = datetime.utcnow()
signal = NormalizedSignal(
source_report_id="r1",
signal_type=SignalType.PERSON_TRAPPED,
description="Person trapped",
raw_text="Hay una persona atrapada en el edificio, no puede salir",
confidence=0.9,
modality="text",
created_at=now,
)
priority = await classify_priority(signal)
assert priority == Priority.P0
@pytest.mark.asyncio
async def test_classify_priority_safe_status():
from skills.classify_priority import classify_priority
from schemas.incident import Priority
now = datetime.utcnow()
signal = NormalizedSignal(
source_report_id="r1",
signal_type=SignalType.SAFE_STATUS,
description="We are safe",
raw_text="Estamos bien, a salvo en el centro comunitario sin heridos",
confidence=0.8,
modality="text",
created_at=now,
)
priority = await classify_priority(signal)
assert priority == Priority.P3
@pytest.mark.asyncio
async def test_recommend_resources():
from skills.recommend_resources import recommend_resources
from schemas.incident import Incident, Priority
now = datetime.utcnow()
incident = Incident(
session_id="s1",
title="Flood — Santa Ana",
description="inundación severa, personas atrapadas, agua subiendo",
priority=Priority.P0,
confidence=0.9,
signal_ids=["sig1"],
created_at=now,
updated_at=now,
)
recs = await recommend_resources(incident)
assert len(recs) > 0
assert any(r.urgency == "immediate" for r in recs)
@pytest.mark.asyncio
async def test_generate_dispatch_message():
from skills.generate_dispatch_message import generate_dispatch_message
from schemas.incident import Incident, Priority
from schemas.resource import ResourceRecommendation, ResourceType
now = datetime.utcnow()
incident = Incident(
session_id="s1",
title="Persona atrapada — Santa Ana",
description="Persona atrapada en techo, agua subiendo",
priority=Priority.P0,
location="Barrio Santa Ana",
confidence=0.95,
affected_people=3,
signal_ids=["sig1"],
created_at=now,
updated_at=now,
)
resources = [
ResourceRecommendation(
incident_id=incident.id,
resource_type=ResourceType.RESCUE_TEAM,
description="Equipo rescate acuático",
quantity=2,
urgency="immediate",
rationale="Personas atrapadas",
)
]
msg = await generate_dispatch_message(incident, resources)
assert "ALERTA" in msg.message
assert "P0" in msg.message
assert "Santa Ana" in msg.message
@pytest.mark.asyncio
async def test_calculate_confidence():
from skills.calculate_confidence import calculate_confidence
now = datetime.utcnow()
signals = [
NormalizedSignal(source_report_id="r1", signal_type=SignalType.FLOOD, description="d", raw_text="t", confidence=0.9, modality="text", created_at=now),
NormalizedSignal(source_report_id="r2", signal_type=SignalType.FLOOD, description="d", raw_text="t", confidence=0.8, modality="image", created_at=now),
]
conf = await calculate_confidence(signals)
assert 0.0 <= conf <= 1.0
@pytest.mark.asyncio
async def test_fetch_amd_metrics_demo():
from skills.fetch_amd_metrics import fetch_amd_metrics
metrics = await fetch_amd_metrics("http://localhost:8000/v1", demo_mode=True)
assert metrics.tokens_per_second > 0
assert metrics.gpu_utilization > 0
@pytest.mark.asyncio
async def test_export_incident_report_json():
from skills.export_incident_report import export_incident_report
from schemas.incident import Incident, Priority
import json
now = datetime.utcnow()
incidents = [
Incident(session_id="s1", title="Test", description="desc", priority=Priority.P1, confidence=0.8, created_at=now, updated_at=now)
]
output = await export_incident_report(incidents, format="json")
data = json.loads(output)
assert len(data) == 1
assert data[0]["priority"] == "P1"
@pytest.mark.asyncio
async def test_export_incident_report_csv():
from skills.export_incident_report import export_incident_report
from schemas.incident import Incident, Priority
now = datetime.utcnow()
incidents = [
Incident(session_id="s1", title="CSV Test", description="desc", priority=Priority.P2, confidence=0.7, created_at=now, updated_at=now)
]
output = await export_incident_report(incidents, format="csv")
assert "CSV Test" in output
assert "P2" in output