55 "fmt"
66 "reflect"
77 "sort"
8+ "sync"
89 "testing"
910 "time"
1011
@@ -376,6 +377,9 @@ func TestLoadCatalogSourcesWithMockRepositories(t *testing.T) {
376377 // Wait a bit for the goroutine to process
377378 time .Sleep (100 * time .Millisecond )
378379
380+ mockModelRepo .mu .RLock ()
381+ defer mockModelRepo .mu .RUnlock ()
382+
379383 // Verify that the model was saved
380384 if len (mockModelRepo .SavedModels ) != 1 {
381385 t .Errorf ("Expected 1 model to be saved, got %d" , len (mockModelRepo .SavedModels ))
@@ -390,11 +394,17 @@ func TestLoadCatalogSourcesWithMockRepositories(t *testing.T) {
390394 }
391395 }
392396
397+ mockModelArtifactRepo .mu .RLock ()
398+ defer mockModelArtifactRepo .mu .RUnlock ()
399+
393400 // Verify that artifacts were saved
394401 if len (mockModelArtifactRepo .SavedArtifacts ) != 1 {
395402 t .Errorf ("Expected 1 model artifact to be saved, got %d" , len (mockModelArtifactRepo .SavedArtifacts ))
396403 }
397404
405+ mockMetricsArtifactRepo .mu .RLock ()
406+ defer mockMetricsArtifactRepo .mu .RUnlock ()
407+
398408 if len (mockMetricsArtifactRepo .SavedMetrics ) != 1 {
399409 t .Errorf ("Expected 1 metrics artifact to be saved, got %d" , len (mockMetricsArtifactRepo .SavedMetrics ))
400410 }
@@ -470,6 +480,9 @@ func TestLoadCatalogSourcesWithRepositoryErrors(t *testing.T) {
470480 // Wait for processing
471481 time .Sleep (100 * time .Millisecond )
472482
483+ mockModelRepo .mu .RLock ()
484+ defer mockModelRepo .mu .RUnlock ()
485+
473486 // Verify that no models were saved due to the error
474487 if len (mockModelRepo .SavedModels ) != 0 {
475488 t .Errorf ("Expected 0 models to be saved due to error, got %d" , len (mockModelRepo .SavedModels ))
@@ -638,11 +651,14 @@ func (m *MockCatalogModelRepositoryWithErrors) Save(model dbmodels.CatalogModel)
638651
639652// MockCatalogModelRepository mocks the CatalogModelRepository interface.
640653type MockCatalogModelRepository struct {
654+ mu sync.RWMutex
641655 SavedModels []dbmodels.CatalogModel
642656 NextID int32
643657}
644658
645659func (m * MockCatalogModelRepository ) GetByID (id int32 ) (dbmodels.CatalogModel , error ) {
660+ m .mu .RLock ()
661+ defer m .mu .RUnlock ()
646662 for _ , model := range m .SavedModels {
647663 if model .GetID () != nil && * model .GetID () == id {
648664 return model , nil
@@ -652,6 +668,8 @@ func (m *MockCatalogModelRepository) GetByID(id int32) (dbmodels.CatalogModel, e
652668}
653669
654670func (m * MockCatalogModelRepository ) List (listOptions dbmodels.CatalogModelListOptions ) (* mrmodels.ListWrapper [dbmodels.CatalogModel ], error ) {
671+ m .mu .RLock ()
672+ defer m .mu .RUnlock ()
655673 return & mrmodels.ListWrapper [dbmodels.CatalogModel ]{
656674 Items : m .SavedModels ,
657675 PageSize : int32 (len (m .SavedModels )),
@@ -660,6 +678,8 @@ func (m *MockCatalogModelRepository) List(listOptions dbmodels.CatalogModelListO
660678}
661679
662680func (m * MockCatalogModelRepository ) GetByName (name string ) (dbmodels.CatalogModel , error ) {
681+ m .mu .RLock ()
682+ defer m .mu .RUnlock ()
663683 for _ , model := range m .SavedModels {
664684 if model .GetAttributes () != nil && model .GetAttributes ().Name != nil && * model .GetAttributes ().Name == name {
665685 return model , nil
@@ -669,6 +689,9 @@ func (m *MockCatalogModelRepository) GetByName(name string) (dbmodels.CatalogMod
669689}
670690
671691func (m * MockCatalogModelRepository ) Save (model dbmodels.CatalogModel ) (dbmodels.CatalogModel , error ) {
692+ m .mu .Lock ()
693+ defer m .mu .Unlock ()
694+
672695 m .NextID ++
673696 id := m .NextID
674697
@@ -685,13 +708,31 @@ func (m *MockCatalogModelRepository) Save(model dbmodels.CatalogModel) (dbmodels
685708 return savedModel , nil
686709}
687710
711+ func (m * MockCatalogModelRepository ) DeleteBySource (sourceID string ) error {
712+ // Mock implementation - no-op for testing
713+ return nil
714+ }
715+
716+ func (m * MockCatalogModelRepository ) DeleteByID (id int32 ) error {
717+ // Mock implementation - no-op for testing
718+ return nil
719+ }
720+
721+ func (m * MockCatalogModelRepository ) GetDistinctSourceIDs () ([]string , error ) {
722+ // Mock implementation - return empty list by default
723+ return []string {}, nil
724+ }
725+
688726// MockCatalogModelArtifactRepository mocks the CatalogModelArtifactRepository interface.
689727type MockCatalogModelArtifactRepository struct {
728+ mu sync.RWMutex
690729 SavedArtifacts []dbmodels.CatalogModelArtifact
691730 NextID int32
692731}
693732
694733func (m * MockCatalogModelArtifactRepository ) GetByID (id int32 ) (dbmodels.CatalogModelArtifact , error ) {
734+ m .mu .RLock ()
735+ defer m .mu .RUnlock ()
695736 for _ , artifact := range m .SavedArtifacts {
696737 if artifact .GetID () != nil && * artifact .GetID () == id {
697738 return artifact , nil
@@ -701,6 +742,8 @@ func (m *MockCatalogModelArtifactRepository) GetByID(id int32) (dbmodels.Catalog
701742}
702743
703744func (m * MockCatalogModelArtifactRepository ) List (listOptions dbmodels.CatalogModelArtifactListOptions ) (* mrmodels.ListWrapper [dbmodels.CatalogModelArtifact ], error ) {
745+ m .mu .RLock ()
746+ defer m .mu .RUnlock ()
704747 return & mrmodels.ListWrapper [dbmodels.CatalogModelArtifact ]{
705748 Items : m .SavedArtifacts ,
706749 PageSize : int32 (len (m .SavedArtifacts )),
@@ -709,6 +752,9 @@ func (m *MockCatalogModelArtifactRepository) List(listOptions dbmodels.CatalogMo
709752}
710753
711754func (m * MockCatalogModelArtifactRepository ) Save (modelArtifact dbmodels.CatalogModelArtifact , parentResourceID * int32 ) (dbmodels.CatalogModelArtifact , error ) {
755+ m .mu .Lock ()
756+ defer m .mu .Unlock ()
757+
712758 m .NextID ++
713759 id := m .NextID
714760
@@ -727,11 +773,15 @@ func (m *MockCatalogModelArtifactRepository) Save(modelArtifact dbmodels.Catalog
727773
728774// MockCatalogMetricsArtifactRepository mocks the CatalogMetricsArtifactRepository interface.
729775type MockCatalogMetricsArtifactRepository struct {
776+ mu sync.RWMutex
730777 SavedMetrics []dbmodels.CatalogMetricsArtifact
731778 NextID int32
732779}
733780
734781func (m * MockCatalogMetricsArtifactRepository ) GetByID (id int32 ) (dbmodels.CatalogMetricsArtifact , error ) {
782+ m .mu .RLock ()
783+ defer m .mu .RUnlock ()
784+
735785 for _ , metrics := range m .SavedMetrics {
736786 if metrics .GetID () != nil && * metrics .GetID () == id {
737787 return metrics , nil
@@ -741,6 +791,9 @@ func (m *MockCatalogMetricsArtifactRepository) GetByID(id int32) (dbmodels.Catal
741791}
742792
743793func (m * MockCatalogMetricsArtifactRepository ) List (listOptions dbmodels.CatalogMetricsArtifactListOptions ) (* mrmodels.ListWrapper [dbmodels.CatalogMetricsArtifact ], error ) {
794+ m .mu .RLock ()
795+ defer m .mu .RUnlock ()
796+
744797 return & mrmodels.ListWrapper [dbmodels.CatalogMetricsArtifact ]{
745798 Items : m .SavedMetrics ,
746799 PageSize : int32 (len (m .SavedMetrics )),
@@ -749,6 +802,9 @@ func (m *MockCatalogMetricsArtifactRepository) List(listOptions dbmodels.Catalog
749802}
750803
751804func (m * MockCatalogMetricsArtifactRepository ) Save (metricsArtifact dbmodels.CatalogMetricsArtifact , parentResourceID * int32 ) (dbmodels.CatalogMetricsArtifact , error ) {
805+ m .mu .Lock ()
806+ defer m .mu .Unlock ()
807+
752808 m .NextID ++
753809 id := m .NextID
754810
@@ -766,6 +822,9 @@ func (m *MockCatalogMetricsArtifactRepository) Save(metricsArtifact dbmodels.Cat
766822}
767823
768824func (m * MockCatalogMetricsArtifactRepository ) BatchSave (metricsArtifacts []dbmodels.CatalogMetricsArtifact , parentResourceID * int32 ) ([]dbmodels.CatalogMetricsArtifact , error ) {
825+ m .mu .Lock ()
826+ defer m .mu .Unlock ()
827+
769828 savedArtifacts := make ([]dbmodels.CatalogMetricsArtifact , len (metricsArtifacts ))
770829
771830 for i , metricsArtifact := range metricsArtifacts {
@@ -790,11 +849,14 @@ func (m *MockCatalogMetricsArtifactRepository) BatchSave(metricsArtifacts []dbmo
790849
791850// MockCatalogArtifactRepository mocks the CatalogArtifactRepository interface.
792851type MockCatalogArtifactRepository struct {
852+ mu sync.RWMutex
793853 SavedArtifacts []dbmodels.CatalogArtifact
794854 NextID int32
795855}
796856
797857func (m * MockCatalogArtifactRepository ) GetByID (id int32 ) (dbmodels.CatalogArtifact , error ) {
858+ m .mu .RLock ()
859+ defer m .mu .RUnlock ()
798860 for _ , artifact := range m .SavedArtifacts {
799861 // Check both model and metrics artifacts for the ID
800862 if artifact .CatalogModelArtifact != nil && artifact .CatalogModelArtifact .GetID () != nil && * artifact .CatalogModelArtifact .GetID () == id {
@@ -808,6 +870,8 @@ func (m *MockCatalogArtifactRepository) GetByID(id int32) (dbmodels.CatalogArtif
808870}
809871
810872func (m * MockCatalogArtifactRepository ) List (listOptions dbmodels.CatalogArtifactListOptions ) (* mrmodels.ListWrapper [dbmodels.CatalogArtifact ], error ) {
873+ m .mu .RLock ()
874+ defer m .mu .RUnlock ()
811875 return & mrmodels.ListWrapper [dbmodels.CatalogArtifact ]{
812876 Items : m .SavedArtifacts ,
813877 PageSize : int32 (len (m .SavedArtifacts )),
0 commit comments