"""TDD: Schedule API tests""" from datetime import datetime def _seed_schedules(db): """Insert initial schedule records for tests""" from app.models.schedule import Schedule from croniter import croniter schedules = [ Schedule(id=1, name="租戶檢查", cron_timer="0 */3 * * * *", status="Waiting", next_run_at=croniter("0 */3 * * * *", datetime.utcnow()).get_next(datetime)), Schedule(id=2, name="帳號檢查", cron_timer="0 */3 * * * *", status="Waiting", next_run_at=croniter("0 */3 * * * *", datetime.utcnow()).get_next(datetime)), Schedule(id=3, name="系統狀態", cron_timer="0 0 8 * * *", status="Waiting", next_run_at=croniter("0 0 8 * * *", datetime.utcnow()).get_next(datetime)), ] for s in schedules: db.add(s) db.commit() def test_list_schedules(client, db): _seed_schedules(db) resp = client.get("/api/v1/schedules") assert resp.status_code == 200 schedules = resp.json() assert len(schedules) == 3 names = [s["name"] for s in schedules] assert "租戶檢查" in names assert "帳號檢查" in names assert "系統狀態" in names def test_get_schedule(client, db): _seed_schedules(db) resp = client.get("/api/v1/schedules/1") assert resp.status_code == 200 data = resp.json() assert data["id"] == 1 assert data["name"] == "租戶檢查" assert data["status"] == "Waiting" assert data["cron_timer"] == "0 */3 * * * *" assert data["next_run_at"] is not None def test_get_schedule_not_found(client, db): resp = client.get("/api/v1/schedules/99") assert resp.status_code == 404 def test_update_schedule_cron(client, db): _seed_schedules(db) resp = client.put("/api/v1/schedules/1", json={"cron_timer": "0 */5 * * * *"}) assert resp.status_code == 200 data = resp.json() assert data["cron_timer"] == "0 */5 * * * *" assert data["next_run_at"] is not None def test_update_schedule_invalid_cron(client, db): _seed_schedules(db) resp = client.put("/api/v1/schedules/1", json={"cron_timer": "invalid cron"}) assert resp.status_code == 422 def test_manual_run_schedule(client, db): _seed_schedules(db) resp = client.post("/api/v1/schedules/1/run") assert resp.status_code == 202 data = resp.json() assert data["schedule_id"] == 1 def test_manual_run_already_going(client, db): _seed_schedules(db) from app.models.schedule import Schedule s = db.get(Schedule, 1) s.status = "Going" db.commit() resp = client.post("/api/v1/schedules/1/run") assert resp.status_code == 409 def test_schedule_logs_empty(client, db): _seed_schedules(db) resp = client.get("/api/v1/schedules/1/logs") assert resp.status_code == 200 assert resp.json() == []