feat(music-lab): 파이프라인 하드 삭제 엔드포인트 DELETE /api/music/pipeline/{id}
cancel(state→cancelled, active/failed 뷰에서만 제거)만으론 status=all 뷰에
행이 남아 옛 dead 파이프라인을 완전히 치울 수 없었음. DELETE로 하드 삭제 추가.
- db.delete_pipeline(pid)→bool: 자식행(pipeline_feedback, pipeline_jobs) 먼저
삭제 후 video_pipelines 삭제(SQLite FK 미강제라 명시적 cascade). 존재 여부 bool.
- DELETE /api/music/pipeline/{id}: 없으면 404, 있으면 {"ok":true,"deleted":id}.
상태 가드 없음(관리자 정리 용도, cancel과 동일한 단순 정책).
- 테스트 3종(삭제+404+자식행 cascade) TDD Red→Green. music-lab 152 passed.
- CLAUDE.md 엔드포인트 카탈로그 갱신.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EqCYBhvTcdeCTUDX3RhWx9
This commit is contained in:
@@ -105,6 +105,29 @@ def test_cancel_pipeline(client):
|
||||
assert db.get_pipeline(pid)["state"] == "cancelled"
|
||||
|
||||
|
||||
def test_delete_pipeline_removes_from_db(client):
|
||||
pid = client.post("/api/music/pipeline", json={"track_id": 1}).json()["id"]
|
||||
r = client.request("DELETE", f"/api/music/pipeline/{pid}")
|
||||
assert r.status_code == 200
|
||||
assert r.json()["ok"] is True
|
||||
assert db.get_pipeline(pid) is None
|
||||
all_ids = [p["id"] for p in client.get("/api/music/pipeline?status=all").json()["pipelines"]]
|
||||
assert pid not in all_ids
|
||||
|
||||
|
||||
def test_delete_pipeline_not_found_returns_404(client):
|
||||
r = client.request("DELETE", "/api/music/pipeline/99999")
|
||||
assert r.status_code == 404
|
||||
|
||||
|
||||
def test_delete_pipeline_removes_child_jobs(client):
|
||||
pid = client.post("/api/music/pipeline", json={"track_id": 1}).json()["id"]
|
||||
db.create_pipeline_job(pid, "cover")
|
||||
assert len(db.list_pipeline_jobs(pid)) == 1
|
||||
client.request("DELETE", f"/api/music/pipeline/{pid}")
|
||||
assert db.list_pipeline_jobs(pid) == []
|
||||
|
||||
|
||||
def test_setup_get_returns_defaults(client):
|
||||
r = client.get("/api/music/setup")
|
||||
assert r.status_code == 200
|
||||
|
||||
Reference in New Issue
Block a user