@@ -348,6 +348,39 @@ func TestSyncManager_Start(t *testing.T) {
348348 }
349349}
350350
351+ func TestSyncManager_Start_PreventMultipleStarts (t * testing.T ) {
352+ handler := & mockSyncHandler {
353+ repoKey : repository.RepositoryKey {Name : "test-repo" , Namespace : "test-ns" },
354+ }
355+ manager := NewSyncManager (handler , nil )
356+
357+ ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
358+ defer cancel ()
359+
360+ // First start should succeed
361+ manager .Start (ctx , 1 * time .Second )
362+ assert .True (t , manager .running , "Manager should be running after first start" )
363+
364+ // Parallel starts should be ignored and not increase syncCount
365+ manager .Start (ctx , 1 * time .Second )
366+ manager .Start (ctx , 1 * time .Second )
367+ manager .Start (ctx , 1 * time .Second )
368+
369+ // Wait to ensure no additional goroutines were started
370+ time .Sleep (100 * time .Millisecond )
371+
372+ // Sync count should not have increased
373+ assert .Equal (t , handler .syncCount , 1 , "Parallel starts should not create additional sync activity" )
374+
375+ // Stop and verify we can start again
376+ manager .Stop ()
377+ assert .False (t , manager .running , "Manager should not be running after stop" )
378+
379+ // Should be able to start again after stop
380+ manager .Start (ctx , 1 * time .Second )
381+ assert .True (t , manager .running , "Manager should be running after restart" )
382+ }
383+
351384func TestSyncManager_HasValidSyncSpec (t * testing.T ) {
352385 tests := []struct {
353386 name string
0 commit comments