Skip to content

Commit a7f4634

Browse files
Fix unnecessary API calls when project already associated (AST-137848)
Consolidated duplicate project association checks at the findApplicationAndUpdate entry point to prevent unnecessary API calls for both flag enabled and disabled states. Changes: - Added top-level check in findApplicationAndUpdate to skip API calls when projectID already in ProjectIds - Removed redundant internal check from associateProjectToApplication function - Rewrote tests to verify behavior at entry point for both flag states The fix ensures: ✅ No unnecessary CreateProjectAssociation API calls when flag is ENABLED ✅ No unnecessary UpdateApplication API calls when flag is DISABLED ✅ Single responsibility principle - check happens at entry point only ✅ All tests pass with no regressions Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
1 parent 443258d commit a7f4634

2 files changed

Lines changed: 44 additions & 11 deletions

File tree

internal/services/applications.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ func findApplicationAndUpdate(applicationName string, applicationsWrapper wrappe
7979
return errors.Errorf("%s: %s", errorConstants.ApplicationNotFound, applicationName)
8080
}
8181

82+
// Check if project is already associated (prevents unnecessary API calls for both when flag enabled/disabled)
83+
for _, id := range applicationResp.ProjectIds {
84+
if id == projectID {
85+
logger.PrintfIfVerbose("Project is already associated with the application. Skipping association")
86+
return nil
87+
}
88+
}
89+
8290
isEnabled, err := checkDirectAssociationEnabled(featureFlagsWrapper, tenantWrapper)
8391
if err != nil {
8492
return errors.Wrap(err, "error while checking if direct association is enabled")
@@ -140,12 +148,6 @@ func updateApplication(applicationModel *wrappers.ApplicationConfiguration, appl
140148
}
141149

142150
func associateProjectToApplication(applicationID, projectID string, associatedProjectIds []string, applicationsWrapper wrappers.ApplicationsWrapper) error {
143-
for _, id := range associatedProjectIds {
144-
if id == projectID {
145-
logger.PrintfIfVerbose("Project is already associated with the application. Skipping association")
146-
return nil
147-
}
148-
}
149151
associateProjectsModel := &wrappers.AssociateProjectModel{
150152
ProjectIds: []string{projectID},
151153
}

internal/services/applications_test.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,42 @@ func Test_ProjectAssociation_ToApplicationWithoutDirectAssociation(t *testing.T)
8989
}
9090
}
9191

92-
func Test_AssociateProjectToApplication_ProjectAlreadyAssociated(t *testing.T) {
93-
projectID := "project-123"
94-
associatedProjectIds := []string{"project-123", "project-456"}
95-
applicationName := "app-1"
92+
func Test_FindApplicationAndUpdate_ProjectAlreadyAssociated_FlagEnabled(t *testing.T) {
93+
applicationName := "MOCK"
94+
projectID := "ProjectID1" // This ID is already in the mock application's ProjectIds
95+
projectName := "test-project"
96+
97+
// Setup mocks
9698
applicationWrapper := &mock.ApplicationsMockWrapper{}
97-
err := associateProjectToApplication(applicationName, projectID, associatedProjectIds, applicationWrapper)
99+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
100+
tenantWrapper := &mock.TenantConfigurationMockWrapper{}
101+
102+
// Set flag to ENABLED
103+
mock.Flag = wrappers.FeatureFlagResponseModel{
104+
Name: "directAssociationEnabled",
105+
Status: true,
106+
}
107+
mock.Flags = wrappers.FeatureFlagsResponseModel{} // Empty to use single Flag
108+
109+
err := findApplicationAndUpdate(applicationName, applicationWrapper, projectName, projectID, featureFlagsWrapper, tenantWrapper)
110+
assert.NilError(t, err)
111+
}
112+
113+
func Test_FindApplicationAndUpdate_ProjectAlreadyAssociated_FlagDisabled(t *testing.T) {
114+
applicationName := "MOCK"
115+
projectID := "ProjectID2" // This ID is already in the mock application's ProjectIds
116+
projectName := "test-project"
117+
118+
// Setup mocks
119+
applicationWrapper := &mock.ApplicationsMockWrapper{}
120+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
121+
tenantWrapper := &mock.TenantConfigurationMockWrapper{}
122+
123+
mock.Flag = wrappers.FeatureFlagResponseModel{
124+
Name: "directAssociationEnabled",
125+
Status: false,
126+
}
127+
mock.Flags = wrappers.FeatureFlagsResponseModel{}
128+
err := findApplicationAndUpdate(applicationName, applicationWrapper, projectName, projectID, featureFlagsWrapper, tenantWrapper)
98129
assert.NilError(t, err)
99130
}

0 commit comments

Comments
 (0)