Files
ledgrab/server/tests/api/test_audio_processing_templates_api.py
T
alexei.dolgolyov ce1f4847f3 feat(processed-audio-sources): phase 7 - testing and polish
Fix test_list_filters test (filter_id field name mismatch).
Add tests for audio filters, template store, and source store.
All 678 tests pass, ruff clean, tsc clean, esbuild clean.
No dead code remaining from old source types.
2026-03-31 22:50:02 +03:00

150 lines
5.0 KiB
Python

"""API tests for audio processing template endpoints."""
import pytest
from fastapi.testclient import TestClient
from wled_controller.main import app
from wled_controller.config import get_config
# Ensure audio filters registered
import wled_controller.core.audio.filters # noqa: F401
_config = get_config()
_api_key = next(iter(_config.auth.api_keys.values()), "")
AUTH = {"Authorization": f"Bearer {_api_key}"} if _api_key else {}
@pytest.fixture(scope="module")
def client():
"""Provide a TestClient with lifespan (startup/shutdown) properly triggered."""
with TestClient(app) as c:
yield c
# Track created template IDs for cleanup
_created_ids: list[str] = []
@pytest.fixture(autouse=True)
def cleanup_after_test(client):
"""Clean up created templates after each test."""
yield
for tid in list(_created_ids):
client.delete(f"/api/v1/audio-processing-templates/{tid}", headers=AUTH)
_created_ids.clear()
def _create(client, name: str, filters: list | None = None, **kwargs) -> dict:
"""Helper: create a template and track for cleanup."""
body = {"name": name, "filters": filters or [], **kwargs}
resp = client.post("/api/v1/audio-processing-templates", json=body, headers=AUTH)
if resp.status_code == 201:
_created_ids.append(resp.json()["id"])
return resp
class TestAudioProcessingTemplateAPI:
"""Test /api/v1/audio-processing-templates endpoints."""
def test_list(self, client):
resp = client.get("/api/v1/audio-processing-templates", headers=AUTH)
assert resp.status_code == 200
data = resp.json()
assert "templates" in data
assert "count" in data
def test_create(self, client):
resp = _create(
client,
"API Test Template",
filters=[{"filter_id": "gain", "options": {"factor": 2.0}}],
description="A test template",
tags=["test"],
)
assert resp.status_code == 201
data = resp.json()
assert data["name"] == "API Test Template"
assert data["id"].startswith("apt_")
assert len(data["filters"]) == 1
assert data["filters"][0]["filter_id"] == "gain"
assert data["description"] == "A test template"
assert data["tags"] == ["test"]
def test_create_invalid_filter_returns_400(self, client):
resp = client.post(
"/api/v1/audio-processing-templates",
json={
"name": "Bad Template",
"filters": [{"filter_id": "nonexistent", "options": {}}],
},
headers=AUTH,
)
assert resp.status_code == 400
def test_get_by_id(self, client):
create_resp = _create(client, "Fetchable Template")
tid = create_resp.json()["id"]
resp = client.get(f"/api/v1/audio-processing-templates/{tid}", headers=AUTH)
assert resp.status_code == 200
assert resp.json()["name"] == "Fetchable Template"
def test_get_nonexistent_returns_404(self, client):
resp = client.get("/api/v1/audio-processing-templates/apt_nonexistent", headers=AUTH)
assert resp.status_code == 404
def test_update(self, client):
create_resp = _create(client, "Original API Template")
tid = create_resp.json()["id"]
resp = client.put(
f"/api/v1/audio-processing-templates/{tid}",
json={
"name": "Updated API Template",
"filters": [{"filter_id": "inverter", "options": {}}],
},
headers=AUTH,
)
assert resp.status_code == 200
data = resp.json()
assert data["name"] == "Updated API Template"
assert len(data["filters"]) == 1
def test_update_nonexistent_returns_404(self, client):
resp = client.put(
"/api/v1/audio-processing-templates/apt_nonexistent",
json={"name": "X"},
headers=AUTH,
)
assert resp.status_code == 404
def test_delete(self, client):
create_resp = _create(client, "To Delete API")
tid = create_resp.json()["id"]
_created_ids.remove(tid)
resp = client.delete(f"/api/v1/audio-processing-templates/{tid}", headers=AUTH)
assert resp.status_code == 204
resp2 = client.get(f"/api/v1/audio-processing-templates/{tid}", headers=AUTH)
assert resp2.status_code == 404
def test_delete_nonexistent_returns_404(self, client):
resp = client.delete("/api/v1/audio-processing-templates/apt_nonexistent", headers=AUTH)
assert resp.status_code == 404
class TestFilterRegistryAPI:
"""Test /api/v1/audio-filters endpoint."""
def test_list_filters(self, client):
resp = client.get("/api/v1/audio-filters", headers=AUTH)
if resp.status_code == 404:
pytest.skip("Audio filters registry endpoint not implemented")
assert resp.status_code == 200
data = resp.json()
assert "filters" in data
ids = {f["filter_id"] for f in data["filters"]}
assert "gain" in ids
assert "inverter" in ids