@@ -291,6 +291,94 @@ def test_create_study_retry_failed_keep_logs(
291291 assert response .status_code == 201
292292 assert len (response .json ()["logs" ]) == 1
293293
294+ @patch ("app.routers.studies.queue" )
295+ def test_create_study_force_completed (
296+ self ,
297+ mock_queue : MagicMock ,
298+ client : TestClient ,
299+ auth_headers : dict [str , str ],
300+ session : Session ,
301+ ):
302+ """Test force re-ingesting a completed study."""
303+ study = Study (name = "completed-study-force" , status = Status .COMPLETED )
304+ session .add (study )
305+ session .commit ()
306+
307+ mock_job = MagicMock ()
308+ mock_job .id = "job-force"
309+ mock_queue .enqueue .return_value = mock_job
310+
311+ response = client .post (
312+ "/studies/?force=true" ,
313+ json = {"name" : "completed-study-force" },
314+ headers = auth_headers ,
315+ )
316+ assert response .status_code == 201
317+ data = response .json ()
318+ assert data ["name" ] == "completed-study-force"
319+ assert data ["job_id" ] == "job-force"
320+ assert mock_queue .enqueue .called
321+
322+ @patch ("app.routers.studies.queue" )
323+ def test_create_study_force_completed_purges_logs_by_default (
324+ self ,
325+ mock_queue : MagicMock ,
326+ client : TestClient ,
327+ auth_headers : dict [str , str ],
328+ session : Session ,
329+ ):
330+ """Test that force re-ingesting a completed study purges logs by default."""
331+ study = Study (
332+ name = "completed-study-force-logs" ,
333+ status = Status .COMPLETED ,
334+ logs = [{"level" : "INFO" , "message" : "previous success" }],
335+ )
336+ session .add (study )
337+ session .commit ()
338+ session .refresh (study )
339+
340+ mock_job = MagicMock ()
341+ mock_job .id = "job-force-logs"
342+ mock_queue .enqueue .return_value = mock_job
343+
344+ response = client .post (
345+ "/studies/?force=true" ,
346+ json = {"name" : "completed-study-force-logs" },
347+ headers = auth_headers ,
348+ )
349+ assert response .status_code == 201
350+ assert response .json ()["logs" ] == []
351+
352+ @patch ("app.routers.studies.queue" )
353+ def test_create_study_force_completed_keep_logs (
354+ self ,
355+ mock_queue : MagicMock ,
356+ client : TestClient ,
357+ auth_headers : dict [str , str ],
358+ session : Session ,
359+ ):
360+ """Test that force re-ingesting a completed study preserves logs when keep_logs=true."""
361+ study = Study (
362+ name = "completed-study-force-keeplogs" ,
363+ status = Status .COMPLETED ,
364+ logs = [{"level" : "INFO" , "message" : "previous success" }],
365+ )
366+ session .add (study )
367+ session .commit ()
368+ session .refresh (study )
369+
370+ mock_job = MagicMock ()
371+ mock_job .id = "job-force-keeplogs"
372+ mock_queue .enqueue .return_value = mock_job
373+
374+ response = client .post (
375+ "/studies/?force=true&keep_logs=true" ,
376+ json = {"name" : "completed-study-force-keeplogs" },
377+ headers = auth_headers ,
378+ )
379+ assert response .status_code == 201
380+ assert len (response .json ()["logs" ]) == 1
381+
294382 def test_create_study_unauthorized (self , client : TestClient ):
295383 """Test creating a study without authentication."""
296384 response = client .post ("/studies/" , json = {"name" : "study" })
0 commit comments