diff --git a/internal/services/applications.go b/internal/services/applications.go index 19880f529..2c05c18eb 100644 --- a/internal/services/applications.go +++ b/internal/services/applications.go @@ -79,6 +79,14 @@ func findApplicationAndUpdate(applicationName string, applicationsWrapper wrappe return errors.Errorf("%s: %s", errorConstants.ApplicationNotFound, applicationName) } + // Check if project is already associated (prevents unnecessary API calls for both when flag enabled/disabled) + for _, id := range applicationResp.ProjectIds { + if id == projectID { + logger.PrintfIfVerbose("Project is already associated with the application. Skipping association") + return nil + } + } + isEnabled, err := checkDirectAssociationEnabled(featureFlagsWrapper, tenantWrapper) if err != nil { return errors.Wrap(err, "error while checking if direct association is enabled") @@ -140,12 +148,6 @@ func updateApplication(applicationModel *wrappers.ApplicationConfiguration, appl } func associateProjectToApplication(applicationID, projectID string, associatedProjectIds []string, applicationsWrapper wrappers.ApplicationsWrapper) error { - for _, id := range associatedProjectIds { - if id == projectID { - logger.PrintfIfVerbose("Project is already associated with the application. Skipping association") - return nil - } - } associateProjectsModel := &wrappers.AssociateProjectModel{ ProjectIds: []string{projectID}, } diff --git a/internal/services/applications_test.go b/internal/services/applications_test.go index ca1398c3e..e9af18a2d 100644 --- a/internal/services/applications_test.go +++ b/internal/services/applications_test.go @@ -11,6 +11,11 @@ import ( "gotest.tools/assert" ) +const ( + mockApplicationName = "MOCK" + testProjectName = "test-project" +) + func Test_createApplicationIds(t *testing.T) { type args struct { applicationID []string @@ -89,11 +94,42 @@ func Test_ProjectAssociation_ToApplicationWithoutDirectAssociation(t *testing.T) } } -func Test_AssociateProjectToApplication_ProjectAlreadyAssociated(t *testing.T) { - projectID := "project-123" - associatedProjectIds := []string{"project-123", "project-456"} - applicationName := "app-1" +func Test_FindApplicationAndUpdate_ProjectAlreadyAssociated_FlagEnabled(t *testing.T) { + applicationName := mockApplicationName + projectID := "ProjectID1" // This ID is already in the mock application's ProjectIds + projectName := testProjectName + + // Setup mocks applicationWrapper := &mock.ApplicationsMockWrapper{} - err := associateProjectToApplication(applicationName, projectID, associatedProjectIds, applicationWrapper) + featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{} + tenantWrapper := &mock.TenantConfigurationMockWrapper{} + + // Set flag to ENABLED + mock.Flag = wrappers.FeatureFlagResponseModel{ + Name: "directAssociationEnabled", + Status: true, + } + mock.Flags = wrappers.FeatureFlagsResponseModel{} // Empty to use single Flag + + err := findApplicationAndUpdate(applicationName, applicationWrapper, projectName, projectID, featureFlagsWrapper, tenantWrapper) + assert.NilError(t, err) +} + +func Test_FindApplicationAndUpdate_ProjectAlreadyAssociated_FlagDisabled(t *testing.T) { + applicationName := mockApplicationName + projectID := "ProjectID2" // This ID is already in the mock application's ProjectIds + projectName := testProjectName + + // Setup mocks + applicationWrapper := &mock.ApplicationsMockWrapper{} + featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{} + tenantWrapper := &mock.TenantConfigurationMockWrapper{} + + mock.Flag = wrappers.FeatureFlagResponseModel{ + Name: "directAssociationEnabled", + Status: false, + } + mock.Flags = wrappers.FeatureFlagsResponseModel{} + err := findApplicationAndUpdate(applicationName, applicationWrapper, projectName, projectID, featureFlagsWrapper, tenantWrapper) assert.NilError(t, err) } diff --git a/internal/wrappers/mock/application-mock.go b/internal/wrappers/mock/application-mock.go index 9bbdd28ef..8a0271492 100644 --- a/internal/wrappers/mock/application-mock.go +++ b/internal/wrappers/mock/application-mock.go @@ -31,12 +31,14 @@ func (a ApplicationsMockWrapper) Get(params map[string]string) (*wrappers.Applic Name: "MOCK", Description: "This is a mock application", Criticality: 2, - ProjectIds: []string{"ProjectID1", "ProjectID2", "MOCK", "test_project", "ID-new-project-name", "ID-newProject"}, + ProjectIds: []string{"ProjectID1", "ProjectID2", "test_project", "ID-new-project-name"}, CreatedAt: time.Now(), } if params["name"] == ExistingApplication { mockApplication.Name = ExistingApplication mockApplication.ID = "ID-newProject" + // For ExistingApplication, include "ID-newProject" for polling tests + mockApplication.ProjectIds = []string{"ProjectID1", "ProjectID2", "test_project", "ID-new-project-name", "ID-newProject"} return &wrappers.ApplicationsResponseModel{ TotalCount: 1, Applications: []wrappers.Application{mockApplication},