diff --git a/backend/routes/sessions.py b/backend/routes/sessions.py index 8b6091e..a97e7b5 100644 --- a/backend/routes/sessions.py +++ b/backend/routes/sessions.py @@ -71,6 +71,22 @@ async def get_session(session_id: str): raise HTTPException(404, "Session not found") return s +@router.post("/{session_id}/clone") +async def clone_session(session_id: str): + s = db_service.get_session(session_id) + if not s: + raise HTTPException(404, "Session not found") + new_id = str(uuid.uuid4()) + db_service.create_session(new_id, title=f"{s['title']} (Copy)", model=s["model"]) + messages = db_service.get_messages_full(session_id) + for msg in messages: + db_service.save_message( + new_id, + msg["role"], + msg["content"], + msg["sources"] + ) + return db_service.get_session(new_id) @router.patch("/{session_id}") async def update_session(session_id: str, body: SessionUpdate): diff --git a/backend/tests/test_api.py b/backend/tests/test_api.py index 2b83e30..f1f2bef 100644 --- a/backend/tests/test_api.py +++ b/backend/tests/test_api.py @@ -60,7 +60,28 @@ def test_delete_session(): r2 = client.delete(f"/api/sessions/{sid}") assert r2.status_code == 200 - +def test_clone_session(): + r = client.post( + "/api/sessions/", + json={"title": "Original Chat", "model": "llama3"} + ) + sid = r.json()["id"] + db.save_message(sid, "user", "Hello") + db.save_message(sid, "assistant", "Hi there") + clone = client.post(f"/api/sessions/{sid}/clone") + assert clone.status_code == 200 + cloned = clone.json() + assert cloned["id"] != sid + assert cloned["title"] == "Original Chat (Copy)" + assert cloned["model"] == "llama3" + msgs = client.get(f"/api/sessions/{cloned['id']}/messages") + assert msgs.status_code == 200 + assert msgs.json()["count"] == 2 + +def test_clone_session_not_found(): + r = client.post("/api/sessions/nonexistent/clone") + assert r.status_code == 404 + def test_get_messages_empty(): r = client.post("/api/sessions/", json={"title": "Msg Test"}) sid = r.json()["id"]