from __future__ import annotations from fastapi.testclient import TestClient from yolo_webui.app import app def test_get_config_defaults() -> None: client = TestClient(app) response = client.get("/api/config/defaults") assert response.status_code == 200 data = response.json() assert data["dataset"] == "coco8.yaml" assert data["model"] == "yolo11n.pt" assert data["augmentation"]["enabled"] is True assert data["mlflow"]["enabled"] is True def test_get_status_idle() -> None: client = TestClient(app) response = client.get("/api/train/status") assert response.status_code == 200 data = response.json() assert data["status"] == "idle" assert data["epoch"] == 0 assert data["total_epochs"] == 0 assert isinstance(data["logs"], list) def test_start_training_validation_error() -> None: client = TestClient(app) # Empty dataset is invalid bad_config = { "dataset": " ", "model": "yolo11n.pt", "task": "detect" } response = client.post("/api/train/start", json=bad_config) assert response.status_code == 400 assert "Укажите путь или имя датасета" in response.json()["detail"] def test_stop_training_when_idle() -> None: client = TestClient(app) response = client.post("/api/train/stop") assert response.status_code == 200 assert "Запрос на остановку отправлен" in response.json()["message"] def test_sessions_flow(monkeypatch, tmp_path) -> None: client = TestClient(app) # Patch sessions directory to use tmp_path monkeypatch.setattr("yolo_webui.app.get_sessions_dir", lambda: tmp_path) # 1. Get empty sessions list response = client.get("/api/sessions") assert response.status_code == 200 assert response.json() == [] # 2. Save a session config = { "dataset": "coco8.yaml", "model": "yolo11n.pt", "task": "detect" } response = client.post("/api/sessions/my_session", json=config) assert response.status_code == 200 assert "успешно сохранена" in response.json()["message"] # 3. List sessions should contain 'my_session' response = client.get("/api/sessions") assert response.json() == ["my_session"] # 4. Load session response = client.get("/api/sessions/my_session") assert response.status_code == 200 assert response.json()["dataset"] == "coco8.yaml" # 5. Delete session response = client.delete("/api/sessions/my_session") assert response.status_code == 200 assert "удалена" in response.json()["message"] # 6. List sessions should be empty again response = client.get("/api/sessions") assert response.json() == [] # 7. Loading nonexistent session should return 404 response = client.get("/api/sessions/nonexistent") assert response.status_code == 404