@@ -274,3 +274,126 @@ def test_get_runs_returns_chronological_order(temp_dir):
274274
275275 runs = SQLiteStorage .get_runs ("proj" )
276276 assert runs == ["run-z" , "run-a" , "run-m" ]
277+
278+
279+ def test_rename_run (temp_dir ):
280+ project = "test_project"
281+ old_name = "old_run"
282+ new_name = "new_run"
283+
284+ config = {"param1" : "value1" , "_Created" : "2023-01-01T00:00:00" }
285+ metrics = [{"accuracy" : 0.95 , "loss" : 0.1 }]
286+ SQLiteStorage .bulk_log (project , old_name , metrics , config = config )
287+
288+ assert SQLiteStorage .get_run_config (project , old_name ) is not None
289+ assert len (SQLiteStorage .get_logs (project , old_name )) > 0
290+
291+ SQLiteStorage .rename_run (project , old_name , new_name )
292+
293+ assert SQLiteStorage .get_run_config (project , old_name ) is None
294+ assert len (SQLiteStorage .get_logs (project , old_name )) == 0
295+
296+ assert SQLiteStorage .get_run_config (project , new_name ) is not None
297+ assert len (SQLiteStorage .get_logs (project , new_name )) > 0
298+
299+ new_logs = SQLiteStorage .get_logs (project , new_name )
300+ assert new_logs [0 ]["accuracy" ] == 0.95
301+ assert new_logs [0 ]["loss" ] == 0.1
302+
303+
304+ def test_rename_run_duplicate_name (temp_dir ):
305+ project = "test_project"
306+ run1 = "run1"
307+ run2 = "run2"
308+
309+ SQLiteStorage .bulk_log (project , run1 , [{"a" : 1 }])
310+ SQLiteStorage .bulk_log (project , run2 , [{"b" : 2 }])
311+
312+ with pytest .raises (ValueError , match = "already exists" ):
313+ SQLiteStorage .rename_run (project , run1 , run2 )
314+
315+ assert len (SQLiteStorage .get_logs (project , run1 )) > 0
316+ assert len (SQLiteStorage .get_logs (project , run2 )) > 0
317+
318+
319+ def test_rename_run_with_media (temp_dir ):
320+ from trackio .utils import MEDIA_DIR
321+
322+ project = "test_project"
323+ old_name = "old_run"
324+ new_name = "new_run"
325+
326+ media_dir = MEDIA_DIR / project / old_name
327+ media_dir .mkdir (parents = True , exist_ok = True )
328+ test_file = media_dir / "test.txt"
329+ test_file .write_text ("test content" )
330+
331+ metrics = [
332+ {
333+ "image" : {
334+ "_type" : "trackio.image" ,
335+ "file_path" : f"{ project } /{ old_name } /test.txt" ,
336+ "caption" : "test" ,
337+ }
338+ }
339+ ]
340+ SQLiteStorage .bulk_log (project , old_name , metrics )
341+
342+ SQLiteStorage .rename_run (project , old_name , new_name )
343+
344+ new_media_dir = MEDIA_DIR / project / new_name
345+ assert new_media_dir .exists ()
346+ assert (new_media_dir / "test.txt" ).exists ()
347+
348+ old_media_dir = MEDIA_DIR / project / old_name
349+ assert not old_media_dir .exists ()
350+
351+ new_logs = SQLiteStorage .get_logs (project , new_name )
352+ assert len (new_logs ) > 0
353+ assert "image" in new_logs [0 ]
354+ assert new_logs [0 ]["image" ]["file_path" ].startswith (f"{ project } /{ new_name } /" )
355+
356+
357+ def test_rename_run_nonexistent (temp_dir ):
358+ project = "test_project"
359+ old_name = "nonexistent_run"
360+ new_name = "new_run"
361+
362+ with pytest .raises (ValueError , match = "does not exist" ):
363+ SQLiteStorage .rename_run (project , old_name , new_name )
364+
365+
366+ def test_rename_run_empty_name (temp_dir ):
367+ project = "test_project"
368+ old_name = "old_run"
369+
370+ SQLiteStorage .bulk_log (project , old_name , [{"a" : 1 }])
371+
372+ with pytest .raises (ValueError , match = "cannot be empty" ):
373+ SQLiteStorage .rename_run (project , old_name , "" )
374+
375+ with pytest .raises (ValueError , match = "cannot be empty" ):
376+ SQLiteStorage .rename_run (project , old_name , " " )
377+
378+ assert len (SQLiteStorage .get_logs (project , old_name )) > 0
379+
380+
381+ def test_rename_run_with_system_metrics (temp_dir ):
382+ project = "test_project"
383+ old_name = "old_run"
384+ new_name = "new_run"
385+
386+ metrics = [{"accuracy" : 0.95 }]
387+ SQLiteStorage .bulk_log (project , old_name , metrics )
388+
389+ system_metrics = [{"gpu_usage" : 80.5 }]
390+ SQLiteStorage .bulk_log_system (project , old_name , system_metrics )
391+
392+ SQLiteStorage .rename_run (project , old_name , new_name )
393+
394+ assert len (SQLiteStorage .get_logs (project , new_name )) > 0
395+ assert len (SQLiteStorage .get_system_logs (project , new_name )) > 0
396+ assert len (SQLiteStorage .get_system_logs (project , old_name )) == 0
397+
398+ new_system_logs = SQLiteStorage .get_system_logs (project , new_name )
399+ assert new_system_logs [0 ]["gpu_usage" ] == 80.5
0 commit comments