Skip to content

Commit 7cec8a9

Browse files
Merge pull request #933 from Checkmarx/bug/miryamFoifer/ignoreGroupsWhenProjectExists
Do Not Update An Existing Project With A New Group (AST-70718)
2 parents 1dfb62b + 2de4fa3 commit 7cec8a9

File tree

4 files changed

+69
-32
lines changed

4 files changed

+69
-32
lines changed

internal/commands/scan_test.go

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import (
1212
"strings"
1313
"testing"
1414

15+
"github.com/checkmarx/ast-cli/internal/commands/util"
1516
errorConstants "github.com/checkmarx/ast-cli/internal/constants/errors"
1617
exitCodes "github.com/checkmarx/ast-cli/internal/constants/exit-codes"
18+
"github.com/checkmarx/ast-cli/internal/logger"
1719
commonParams "github.com/checkmarx/ast-cli/internal/params"
1820
"github.com/checkmarx/ast-cli/internal/wrappers"
1921
"github.com/checkmarx/ast-cli/internal/wrappers/mock"
@@ -52,6 +54,8 @@ const (
5254
InvalidEngineMessage = "Please verify if engine is installed"
5355
SCSScoreCardError = "SCS scan failed to start: Scorecard scan is missing required flags, please include in the ast-cli arguments: " +
5456
"--scs-repo-url your_repo_url --scs-repo-token your_repo_token"
57+
outputFileName = "test_output.log"
58+
noUpdatesForExistingProject = "No applicationId or tags to update. Skipping project update."
5559
)
5660

5761
func TestScanHelp(t *testing.T) {
@@ -382,14 +386,31 @@ func TestCreateScanBranches(t *testing.T) {
382386
execCmdNilAssertion(t, "scan", "create", "--project-name", "MOCK", "-s", dummyRepo, "-b", "branch_defined")
383387
}
384388

385-
func TestCreateScanWithProjectGroup(t *testing.T) {
389+
func TestCreateScan_WhenProjectNotExistsAndInvalidGroup_ShouldFail(t *testing.T) {
386390
err := execCmdNotNilAssertion(
387391
t,
388-
"scan", "create", "--project-name", "invalidGroup", "-s", ".", "--branch", "main", "--project-groups", "invalidGroup",
392+
"scan", "create", "--project-name", "newProject", "-s", ".", "--branch", "main", "--project-groups", "invalidGroup",
389393
)
390394
assert.Assert(t, err.Error() == "Failed updating a project: Failed finding groups: [invalidGroup]", "\n the received error is:", err.Error())
391395
}
392396

397+
func TestCreateScan_WhenProjectNotExists_ShouldCreateProjectAndAssignGroup(t *testing.T) {
398+
file := createOutputFile(t, outputFileName)
399+
defer deleteOutputFile(file)
400+
defer logger.SetOutput(os.Stdout)
401+
402+
baseArgs := []string{"scan", "create", "--project-name", "newProject", "-s", ".", "--branch", "main", "--project-groups", "existsGroup1", "--debug"}
403+
execCmdNilAssertion(
404+
t,
405+
baseArgs...,
406+
)
407+
stdoutString, err := util.ReadFileAsString(file.Name())
408+
if err != nil {
409+
t.Fatalf("Failed to read log file: %v", err)
410+
}
411+
assert.Equal(t, strings.Contains(stdoutString, "Updating project groups"), true, "Expected output: %s", "Updating project groups")
412+
}
413+
393414
func TestScanWorkflowMissingID(t *testing.T) {
394415
err := execCmdNotNilAssertion(t, "scan", "workflow")
395416
assert.Error(t, err, "Please provide a scan ID", err.Error())
@@ -590,11 +611,18 @@ func TestCreateScanProjectTags(t *testing.T) {
590611
"--project-tags", "test", "--debug")
591612
}
592613

593-
func TestCreateScanProjecGroupsError(t *testing.T) {
614+
func TestCreateScan_WhenProjectExists_ShouldIgnoreGroups(t *testing.T) {
615+
file := createOutputFile(t, outputFileName)
616+
defer deleteOutputFile(file)
617+
defer logger.SetOutput(os.Stdout)
594618
baseArgs := []string{scanCommand, "create", "--project-name", "MOCK", "-s", dummyRepo, "-b", "dummy_branch",
595-
"--debug", "--project-groups", "err"}
596-
err := execCmdNotNilAssertion(t, baseArgs...)
597-
assert.Error(t, err, "Failed updating a project: Failed finding groups: [err]", err.Error())
619+
"--debug", "--project-groups", "anyProjectGroup"}
620+
execCmdNilAssertion(t, baseArgs...)
621+
stdoutString, err := util.ReadFileAsString(file.Name())
622+
if err != nil {
623+
t.Fatalf("Failed to read log file: %v", err)
624+
}
625+
assert.Equal(t, strings.Contains(stdoutString, noUpdatesForExistingProject), true, "Expected output: %s", noUpdatesForExistingProject)
598626
}
599627
func TestScanCreateLastSastScanTimeWithInvalidValue(t *testing.T) {
600628
baseArgs := []string{"scan", "create", "--project-name", "MOCK", "-s", dummyRepo, "-b", "dummy_branch", "--sca-exploitable-path", "true", "--sca-last-sast-scan-time", "notaniteger"}
@@ -1275,3 +1303,20 @@ func TestFilterMatched(t *testing.T) {
12751303
})
12761304
}
12771305
}
1306+
1307+
func createOutputFile(t *testing.T, fileName string) *os.File {
1308+
file, err := os.Create(fileName)
1309+
if err != nil {
1310+
t.Fatalf("Failed to create log file: %v", err)
1311+
}
1312+
logger.SetOutput(file)
1313+
return file
1314+
}
1315+
1316+
func deleteOutputFile(file *os.File) {
1317+
file.Close()
1318+
err := os.Remove(file.Name())
1319+
if err != nil {
1320+
logger.Printf("Failed to remove log file: %v", err)
1321+
}
1322+
}

internal/services/projects.go

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ func FindProject(
3838

3939
for i := 0; i < len(resp.Projects); i++ {
4040
if resp.Projects[i].Name == projectName {
41-
projectGroups, _ := cmd.Flags().GetString(commonParams.ProjectGroupList)
4241
projectTags, _ := cmd.Flags().GetString(commonParams.ProjectTagList)
4342
projectPrivatePackage, _ := cmd.Flags().GetString(commonParams.ProjecPrivatePackageFlag)
4443
return updateProject(
@@ -50,7 +49,6 @@ func FindProject(
5049
applicationWrapper,
5150
projectName,
5251
applicationID,
53-
projectGroups,
5452
projectTags,
5553
projectPrivatePackage,
5654
featureFlagsWrapper)
@@ -185,7 +183,6 @@ func updateProject(
185183
applicationsWrapper wrappers.ApplicationsWrapper,
186184
projectName string,
187185
applicationID []string,
188-
projectGroups string,
189186
projectTags string,
190187
projectPrivatePackage string,
191188
featureFlagsWrapper wrappers.FeatureFlagsWrapper,
@@ -205,8 +202,8 @@ func updateProject(
205202
projModel.RepoURL = resp.Projects[i].RepoURL
206203
}
207204
}
208-
if projectGroups == "" && projectTags == "" && projectPrivatePackage == "" && len(applicationID) == 0 {
209-
logger.PrintIfVerbose("No groups, applicationId or tags to update. Skipping project update.")
205+
if projectTags == "" && projectPrivatePackage == "" && len(applicationID) == 0 {
206+
logger.PrintIfVerbose("No applicationId or tags to update. Skipping project update.")
210207
return projectID, nil
211208
}
212209
if projectPrivatePackage != "" {
@@ -245,26 +242,9 @@ func updateProject(
245242
}
246243
}
247244

248-
if projectGroups != "" {
249-
err = UpsertProjectGroupsByUpdateFlow(groupsWrapper, &projModel, projectsWrapper, accessManagementWrapper, projModelResp, projectGroups, projectID, projectName, featureFlagsWrapper)
250-
if err != nil {
251-
return projectID, err
252-
}
253-
}
254245
return projectID, nil
255246
}
256247

257-
func UpsertProjectGroupsByUpdateFlow(groupsWrapper wrappers.GroupsWrapper, projModel *wrappers.Project, projectsWrapper wrappers.ProjectsWrapper,
258-
accessManagementWrapper wrappers.AccessManagementWrapper, projModelResp *wrappers.ProjectResponseModel,
259-
projectGroups string, projectID string, projectName string, featureFlagsWrapper wrappers.FeatureFlagsWrapper) error {
260-
groupsMap, groups, groupErr := GetGroupMap(groupsWrapper, projectGroups, projModelResp, featureFlagsWrapper)
261-
if groupErr != nil {
262-
return groupErr
263-
}
264-
projModel.Groups = groups
265-
return UpsertProjectGroups(projModel, projectsWrapper, accessManagementWrapper, projectID, projectName, featureFlagsWrapper, groupsMap)
266-
}
267-
268248
func UpsertProjectGroups(projModel *wrappers.Project, projectsWrapper wrappers.ProjectsWrapper,
269249
accessManagementWrapper wrappers.AccessManagementWrapper, projectID string, projectName string,
270250
featureFlagsWrapper wrappers.FeatureFlagsWrapper, groupsMap []*wrappers.Group) error {

internal/services/projects_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ func Test_updateProject(t *testing.T) {
266266
ttt.args.applicationsWrapper,
267267
ttt.args.projectName,
268268
ttt.args.applicationID,
269-
ttt.args.projectGroups,
270269
ttt.args.projectTags,
271270
ttt.args.projectPrivatePackage,
272271
ttt.args.featureFlagsWrapper)

test/integration/scan_test.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"log"
1313
"os"
1414
"path/filepath"
15+
"reflect"
1516
"runtime"
1617
"strings"
1718
"testing"
@@ -1550,8 +1551,10 @@ func TestScanGeneratingPdfReportWithPdfOptions(t *testing.T) {
15501551
//
15511552
//}
15521553

1553-
func TestScanCreateUsingWrongProjectGroups(t *testing.T) {
1554-
_, projectName := getRootProject(t)
1554+
func TestScanCreate_WhenProjectExists_ShouldNotUpdateGroups(t *testing.T) {
1555+
projectID, projectName := getRootProject(t)
1556+
project := showProject(t, projectID)
1557+
groupsBeforeScanCreate := project.Groups
15551558

15561559
args := []string{
15571560
scanCommand, "create",
@@ -1561,10 +1564,20 @@ func TestScanCreateUsingWrongProjectGroups(t *testing.T) {
15611564
flag(params.PresetName), "Checkmarx Default",
15621565
flag(params.BranchFlag), "dummy_branch",
15631566
flag(params.ProjectGroupList), "wrong_group",
1567+
"--async",
15641568
}
15651569

15661570
err, _ := executeCommand(t, args...)
1567-
assertError(t, err, "Failed finding groups")
1571+
if err != nil {
1572+
assertError(t, err, "running a scan should pass")
1573+
}
1574+
1575+
project = showProject(t, projectID)
1576+
groupsAfterScanCreate := project.Groups
1577+
if !reflect.DeepEqual(groupsBeforeScanCreate, groupsAfterScanCreate) {
1578+
t.Errorf("When project exists, groups before and after scan creation should be equal. Got %v, want %v", groupsAfterScanCreate, groupsBeforeScanCreate)
1579+
}
1580+
15681581
}
15691582
func TestScanCreateExploitablePath(t *testing.T) {
15701583
_, projectName := getRootProject(t)

0 commit comments

Comments
 (0)