@@ -766,4 +766,114 @@ api_key: test-key-456`
766766 }
767767 }
768768 })
769+
770+ t .Run ("--max-findings flag: caps total number of findings" , func (t * testing.T ) {
771+ projectDir := t .TempDir ()
772+
773+ // Create multiple files with secrets to ensure we have more than the limit
774+ for i := 1 ; i <= 5 ; i ++ {
775+ content := fmt .Sprintf ("secret%d: ghp_%dabcdefghijklmnopqrstuvwxyz12345678" , i , i )
776+ err := os .WriteFile (path .Join (projectDir , fmt .Sprintf ("secret%d.txt" , i )), []byte (content ), 0644 )
777+ require .NoError (t , err , "failed to create test file" )
778+ }
779+
780+ // Run scan with --max-findings set to 2
781+ err = executable .run ("filesystem" , "--path" , projectDir , "--max-findings" , "2" , "--ignore-on-exit" , "results" )
782+ assert .NoError (t , err , "scan should succeed with max-findings flag" )
783+
784+ report , err := executable .getReport ()
785+ require .NoError (t , err , "failed to get report" )
786+
787+ totalSecrets := report .GetTotalSecretsFound ()
788+ t .Logf ("Total secrets found with --max-findings=2: %d" , totalSecrets )
789+ assert .LessOrEqual (t , totalSecrets , 2 , "should find at most 2 secrets when --max-findings=2" )
790+ })
791+
792+ t .Run ("--max-rule-matches-per-fragment flag: limits matches per rule per fragment" , func (t * testing.T ) {
793+ projectDir := t .TempDir ()
794+
795+ // Create a single file with multiple secrets that match the same rule
796+ content := `Multiple GitHub PATs in one file:
797+ token1: ghp_1234567890abcdefghijklmnopqrstuvwxyz
798+ token2: ghp_abcdefghijklmnopqrstuvwxyz1234567890
799+ token3: ghp_9876543210zyxwvutsrqponmlkjihgfedcba
800+ token4: ghp_aB3cD4eF5gH6iJ7kL8mN9oP0qR1sT2uV3wX4
801+ token5: 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`
802+
803+ err := os .WriteFile (path .Join (projectDir , "multi_secrets.txt" ), []byte (content ), 0644 )
804+ require .NoError (t , err , "failed to create test file" )
805+
806+ // Run scan with --max-rule-matches-per-fragment set to 2
807+ err = executable .run ("filesystem" , "--path" , projectDir , "--max-rule-matches-per-fragment" , "2" , "--ignore-on-exit" , "results" )
808+ assert .NoError (t , err , "scan should succeed with max-rule-matches-per-fragment flag" )
809+
810+ report , err := executable .getReport ()
811+ require .NoError (t , err , "failed to get report" )
812+
813+ totalSecrets := report .GetTotalSecretsFound ()
814+ t .Logf ("Total secrets found with --max-rule-matches-per-fragment=2: %d" , totalSecrets )
815+ assert .LessOrEqual (t , totalSecrets , 2 , "should find at most 2 secrets per rule per fragment" )
816+ })
817+
818+ t .Run ("--max-secret-size flag: ignores secrets larger than specified size" , func (t * testing.T ) {
819+ projectDir := t .TempDir ()
820+
821+ // Create a file with a normal-sized secret
822+ normalSecret := "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" // 40 chars
823+ err := os .WriteFile (path .Join (projectDir , "normal.txt" ), []byte (normalSecret ), 0644 )
824+ require .NoError (t , err , "failed to create test file" )
825+
826+ // Run scan with --max-secret-size set to a value smaller than the secret
827+ err = executable .run ("filesystem" , "--path" , projectDir , "--max-secret-size" , "10" , "--ignore-on-exit" , "results" )
828+ assert .NoError (t , err , "scan should succeed with max-secret-size flag" )
829+
830+ report , err := executable .getReport ()
831+ require .NoError (t , err , "failed to get report" )
832+
833+ totalSecrets := report .GetTotalSecretsFound ()
834+ t .Logf ("Total secrets found with --max-secret-size=10: %d" , totalSecrets )
835+ assert .Equal (t , 0 , totalSecrets , "should find no secrets when max-secret-size is smaller than secret" )
836+
837+ // Run scan with --max-secret-size set to a value larger than the secret
838+ err = executable .run ("filesystem" , "--path" , projectDir , "--max-secret-size" , "100" , "--ignore-on-exit" , "results" )
839+ assert .NoError (t , err , "scan should succeed with max-secret-size flag" )
840+
841+ report , err = executable .getReport ()
842+ require .NoError (t , err , "failed to get report" )
843+
844+ totalSecrets = report .GetTotalSecretsFound ()
845+ t .Logf ("Total secrets found with --max-secret-size=100: %d" , totalSecrets )
846+ assert .GreaterOrEqual (t , totalSecrets , 1 , "should find secrets when max-secret-size is larger than secret" )
847+ })
848+
849+ t .Run ("Combined limit flags: multiple limit flags together" , func (t * testing.T ) {
850+ projectDir := t .TempDir ()
851+
852+ // Create multiple files with multiple secrets each
853+ for i := 1 ; i <= 5 ; i ++ {
854+ content := fmt .Sprintf (`File %d secrets:
855+ token1: ghp_%d234567890abcdefghijklmnopqrstuvwxy
856+ token2: ghp_%dabcdefghijklmnopqrstuvwxyz123456789` , i , i , i )
857+ err := os .WriteFile (path .Join (projectDir , fmt .Sprintf ("file%d.txt" , i )), []byte (content ), 0644 )
858+ require .NoError (t , err , "failed to create test file" )
859+ }
860+
861+ // Run scan with multiple limit flags
862+ err = executable .run ("filesystem" ,
863+ "--path" , projectDir ,
864+ "--max-findings" , "3" ,
865+ "--max-rule-matches-per-fragment" , "1" ,
866+ "--max-secret-size" , "100" ,
867+ "--ignore-on-exit" , "results" )
868+ assert .NoError (t , err , "scan should succeed with combined limit flags" )
869+
870+ report , err := executable .getReport ()
871+ require .NoError (t , err , "failed to get report" )
872+
873+ totalSecrets := report .GetTotalSecretsFound ()
874+ t .Logf ("Total secrets found with combined limit flags: %d" , totalSecrets )
875+ // With max-rule-matches-per-fragment=1, we get at most 1 per file (3 files)
876+ // With max-findings=3, we get at most 3 total
877+ assert .LessOrEqual (t , totalSecrets , 3 , "should respect combined limit flags" )
878+ })
769879}
0 commit comments