From 7a6e70f68827735d32314f7dd52f1f90314c5ae8 Mon Sep 17 00:00:00 2001 From: Hitesh Madgulkar <212497904+cx-hitesh-madgulkar@users.noreply.github.com> Date: Thu, 4 Dec 2025 09:28:56 +0530 Subject: [PATCH 1/4] added-falgs-check --- internal/commands/predicates.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/commands/predicates.go b/internal/commands/predicates.go index 7b212c705..9bdfec0a2 100644 --- a/internal/commands/predicates.go +++ b/internal/commands/predicates.go @@ -54,16 +54,42 @@ func triageGetStatesSubCommand(customStatesWrapper wrappers.CustomStatesWrapper, } triageGetStatesCmd.PersistentFlags().Bool(params.AllStatesFlag, false, "Show all custom states, including the ones that have been deleted") - + triageGetStatesCmd.PersistentFlags().String(params.ScanTypeFlag, "sast", "Scan Type") return triageGetStatesCmd } func runTriageGetStates(customStatesWrapper wrappers.CustomStatesWrapper, featureFlagsWrapper wrappers.FeatureFlagsWrapper) func(*cobra.Command, []string) error { return func(cmd *cobra.Command, _ []string) error { + scanType, _ := cmd.Flags().GetString(params.ScanTypeFlag) + if scanType != "" { + scanType = strings.TrimSpace(strings.ToLower(scanType)) + } flagResponse, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, wrappers.CustomStatesFeatureFlag) if !flagResponse.Status { return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) } + + if scanType == params.SastType || scanType == "" { + sastCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SAST_CUSTOM_STATES_ENABLED") + if !sastCustomStates.Status { + return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) + } + } + + if scanType == params.KicsType { + kicsCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "KICS_CUSTOM_STATES_ENABLED") + if !kicsCustomStates.Status { + return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) + } + } + + if scanType == params.ScaType { + scaCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SCA_CUSTOM_STATES_ENABLED") + if !scaCustomStates.Status { + return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) + } + } + includeDeleted, _ := cmd.Flags().GetBool(params.AllStatesFlag) states, err := customStatesWrapper.GetAllCustomStates(includeDeleted) if err != nil { From a8a031d3ce5847443a75450759bb5d4261f8188d Mon Sep 17 00:00:00 2001 From: Hitesh Madgulkar <212497904+cx-hitesh-madgulkar@users.noreply.github.com> Date: Fri, 5 Dec 2025 13:30:28 +0530 Subject: [PATCH 2/4] sca-flag-name-corrected --- internal/commands/predicates.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/commands/predicates.go b/internal/commands/predicates.go index 9bdfec0a2..351ea8dcf 100644 --- a/internal/commands/predicates.go +++ b/internal/commands/predicates.go @@ -84,7 +84,7 @@ func runTriageGetStates(customStatesWrapper wrappers.CustomStatesWrapper, featur } if scanType == params.ScaType { - scaCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SCA_CUSTOM_STATES_ENABLED") + scaCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SCA_CUSTOM_STATES") if !scaCustomStates.Status { return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) } From af93a78e1205fc485df34618342dfb410fc30134 Mon Sep 17 00:00:00 2001 From: Hitesh Madgulkar <212497904+cx-hitesh-madgulkar@users.noreply.github.com> Date: Mon, 8 Dec 2025 18:01:39 +0530 Subject: [PATCH 3/4] added-ut --- internal/commands/predicates.go | 20 ++- internal/commands/predicates_test.go | 181 +++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 12 deletions(-) diff --git a/internal/commands/predicates.go b/internal/commands/predicates.go index 351ea8dcf..a870d230b 100644 --- a/internal/commands/predicates.go +++ b/internal/commands/predicates.go @@ -69,27 +69,23 @@ func runTriageGetStates(customStatesWrapper wrappers.CustomStatesWrapper, featur return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) } - if scanType == params.SastType || scanType == "" { - sastCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SAST_CUSTOM_STATES_ENABLED") - if !sastCustomStates.Status { - return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) - } - } - - if scanType == params.KicsType { + switch scanType { + case params.KicsType: kicsCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "KICS_CUSTOM_STATES_ENABLED") if !kicsCustomStates.Status { return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) } - } - - if scanType == params.ScaType { + case params.ScaType: scaCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SCA_CUSTOM_STATES") if !scaCustomStates.Status { return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) } + default: + sastCustomStates, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, "SAST_CUSTOM_STATES_ENABLED") + if !sastCustomStates.Status { + return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON) + } } - includeDeleted, _ := cmd.Flags().GetBool(params.AllStatesFlag) states, err := customStatesWrapper.GetAllCustomStates(includeDeleted) if err != nil { diff --git a/internal/commands/predicates_test.go b/internal/commands/predicates_test.go index 94890dcda..91495d12a 100644 --- a/internal/commands/predicates_test.go +++ b/internal/commands/predicates_test.go @@ -210,6 +210,187 @@ func TestRunTriageUpdateWithSystemState(t *testing.T) { assert.NilError(t, err) } +func TestRunTriageGetStates_ScanTypeSwitch(t *testing.T) { + tests := []struct { + name string + scanType string + customStatesFeatureFlag wrappers.FeatureFlagResponseModel + scanTypeFeatureFlag wrappers.FeatureFlagResponseModel + expectedError bool + description string + }{ + { + name: "KICS scan type with KICS custom states enabled", + scanType: "kics", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "KICS_CUSTOM_STATES_ENABLED", Status: true}, + expectedError: false, + description: "Should successfully get custom states for KICS when feature flag is enabled", + }, + { + name: "KICS scan type with KICS custom states disabled", + scanType: "kics", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "KICS_CUSTOM_STATES_ENABLED", Status: false}, + expectedError: false, + description: "Should return system states for KICS when feature flag is disabled", + }, + { + name: "SCA scan type with SCA custom states enabled", + scanType: "sca", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SCA_CUSTOM_STATES", Status: true}, + expectedError: false, + description: "Should successfully get custom states for SCA when feature flag is enabled", + }, + { + name: "SCA scan type with SCA custom states disabled", + scanType: "sca", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SCA_CUSTOM_STATES", Status: false}, + expectedError: false, + description: "Should return system states for SCA when feature flag is disabled", + }, + { + name: "SAST scan type with SAST custom states enabled", + scanType: "sast", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SAST_CUSTOM_STATES_ENABLED", Status: true}, + expectedError: false, + description: "Should successfully get custom states for SAST when feature flag is enabled", + }, + { + name: "SAST scan type with SAST custom states disabled", + scanType: "sast", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SAST_CUSTOM_STATES_ENABLED", Status: false}, + expectedError: false, + description: "Should return system states for SAST when feature flag is disabled", + }, + { + name: "Unknown scan type defaults to SAST behavior", + scanType: "unknown", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SAST_CUSTOM_STATES_ENABLED", Status: true}, + expectedError: false, + description: "Should default to SAST logic for unknown scan types", + }, + { + name: "KICS with uppercase scan type", + scanType: "KICS", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "KICS_CUSTOM_STATES_ENABLED", Status: true}, + expectedError: false, + description: "Should handle uppercase scan type correctly", + }, + { + name: "SCA with mixed case scan type", + scanType: "ScA", + customStatesFeatureFlag: wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true}, + scanTypeFeatureFlag: wrappers.FeatureFlagResponseModel{Name: "SCA_CUSTOM_STATES", Status: true}, + expectedError: false, + description: "Should handle mixed case scan type correctly", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + clearFlags() + mockCustomStatesWrapper := &mock.CustomStatesMockWrapper{} + mockFeatureFlagsWrapper := &mock.FeatureFlagsMockWrapper{} + + // First, set the custom states feature flag + mock.Flag = tt.customStatesFeatureFlag + cmd := triageGetStatesSubCommand(mockCustomStatesWrapper, mockFeatureFlagsWrapper) + + // Then set the scan-type specific feature flag for the actual execution + mock.Flag = tt.scanTypeFeatureFlag + cmd.SetArgs([]string{"--scan-type", tt.scanType}) + + err := cmd.Execute() + + if tt.expectedError { + assert.Assert(t, err != nil, tt.description) + } else { + assert.NilError(t, err, tt.description) + } + }) + } +} + +func TestRunTriageGetStates_OverallFeatureFlagDisabled(t *testing.T) { + clearFlags() + mockCustomStatesWrapper := &mock.CustomStatesMockWrapper{} + mockFeatureFlagsWrapper := &mock.FeatureFlagsMockWrapper{} + + // Set the overall custom states feature flag to disabled + mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: false} + + cmd := triageGetStatesSubCommand(mockCustomStatesWrapper, mockFeatureFlagsWrapper) + cmd.SetArgs([]string{"--scan-type", "sast"}) + + err := cmd.Execute() + assert.NilError(t, err, "Should return system states when overall custom states feature flag is disabled") +} + +func TestRunTriageGetStates_WithAllFlag(t *testing.T) { + clearFlags() + mockCustomStatesWrapper := &mock.CustomStatesMockWrapper{} + mockFeatureFlagsWrapper := &mock.FeatureFlagsMockWrapper{} + + tests := []struct { + name string + scanType string + allFlag bool + }{ + { + name: "KICS with all flag true", + scanType: "kics", + allFlag: true, + }, + { + name: "SCA with all flag false", + scanType: "sca", + allFlag: false, + }, + { + name: "SAST with all flag true", + scanType: "sast", + allFlag: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + clearFlags() + mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.CustomStatesFeatureFlag, Status: true} + + cmd := triageGetStatesSubCommand(mockCustomStatesWrapper, mockFeatureFlagsWrapper) + + // Set the scan-type specific feature flag to enabled + switch tt.scanType { + case "kics": + mock.Flag = wrappers.FeatureFlagResponseModel{Name: "KICS_CUSTOM_STATES_ENABLED", Status: true} + case "sca": + mock.Flag = wrappers.FeatureFlagResponseModel{Name: "SCA_CUSTOM_STATES", Status: true} + default: + mock.Flag = wrappers.FeatureFlagResponseModel{Name: "SAST_CUSTOM_STATES_ENABLED", Status: true} + } + + args := []string{"--scan-type", tt.scanType} + if tt.allFlag { + args = append(args, "--all") + } + cmd.SetArgs(args) + + err := cmd.Execute() + assert.NilError(t, err) + }) + } +} + func TestDetermineSystemOrCustomState(t *testing.T) { tests := []struct { name string From 266e4d91e27c033ba2a856cf18851a7106dd5fac Mon Sep 17 00:00:00 2001 From: Hitesh Madgulkar <212497904+cx-hitesh-madgulkar@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:57:18 +0530 Subject: [PATCH 4/4] removed-condition --- internal/commands/predicates.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/commands/predicates.go b/internal/commands/predicates.go index a870d230b..a87f5bfde 100644 --- a/internal/commands/predicates.go +++ b/internal/commands/predicates.go @@ -61,9 +61,7 @@ func triageGetStatesSubCommand(customStatesWrapper wrappers.CustomStatesWrapper, func runTriageGetStates(customStatesWrapper wrappers.CustomStatesWrapper, featureFlagsWrapper wrappers.FeatureFlagsWrapper) func(*cobra.Command, []string) error { return func(cmd *cobra.Command, _ []string) error { scanType, _ := cmd.Flags().GetString(params.ScanTypeFlag) - if scanType != "" { - scanType = strings.TrimSpace(strings.ToLower(scanType)) - } + scanType = strings.TrimSpace(strings.ToLower(scanType)) flagResponse, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, wrappers.CustomStatesFeatureFlag) if !flagResponse.Status { return printer.Print(cmd.OutOrStdout(), systemStates, printer.FormatJSON)