|
@@ -2,6 +2,7 @@ package detect
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
|
+ "os"
|
|
|
"path/filepath"
|
|
"path/filepath"
|
|
|
"testing"
|
|
"testing"
|
|
|
|
|
|
|
@@ -12,20 +13,22 @@ import (
|
|
|
"github.com/zricethezav/gitleaks/v8/report"
|
|
"github.com/zricethezav/gitleaks/v8/report"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-func TestDetectFindings(t *testing.T) {
|
|
|
|
|
|
|
+const configPath = "../testdata/config/"
|
|
|
|
|
+const repoBasePath = "../testdata/repos/"
|
|
|
|
|
+
|
|
|
|
|
+func TestDetect(t *testing.T) {
|
|
|
tests := []struct {
|
|
tests := []struct {
|
|
|
cfgName string
|
|
cfgName string
|
|
|
- opts Options
|
|
|
|
|
- filePath string
|
|
|
|
|
- bytes []byte
|
|
|
|
|
- commit string
|
|
|
|
|
|
|
+ fragment Fragment
|
|
|
expectedFindings []report.Finding
|
|
expectedFindings []report.Finding
|
|
|
wantError error
|
|
wantError error
|
|
|
}{
|
|
}{
|
|
|
{
|
|
{
|
|
|
- cfgName: "escaped_character_group",
|
|
|
|
|
- bytes: []byte(`pypi-AgEIcHlwaS5vcmcAAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAAB`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "escaped_character_group",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `pypi-AgEIcHlwaS5vcmcAAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAA-AAAAAAAAAAB`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{
|
|
expectedFindings: []report.Finding{
|
|
|
{
|
|
{
|
|
|
Description: "PyPI upload token",
|
|
Description: "PyPI upload token",
|
|
@@ -38,13 +41,16 @@ func TestDetectFindings(t *testing.T) {
|
|
|
EndLine: 1,
|
|
EndLine: 1,
|
|
|
StartColumn: 1,
|
|
StartColumn: 1,
|
|
|
EndColumn: 86,
|
|
EndColumn: 86,
|
|
|
|
|
+ Entropy: 1.9606875,
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "simple",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{
|
|
expectedFindings: []report.Finding{
|
|
|
{
|
|
{
|
|
|
Description: "AWS Access Key",
|
|
Description: "AWS Access Key",
|
|
@@ -57,32 +63,41 @@ func TestDetectFindings(t *testing.T) {
|
|
|
EndLine: 1,
|
|
EndLine: 1,
|
|
|
StartColumn: 15,
|
|
StartColumn: 15,
|
|
|
EndColumn: 34,
|
|
EndColumn: 34,
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "allow_aws_re",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "allow_aws_re",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "allow_path",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "allow_path",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "allow_commit",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "allow_commit",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ CommitSHA: "allowthiscommit",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
- commit: "allowthiscommit",
|
|
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "entropy_group",
|
|
|
|
|
- bytes: []byte(`const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "entropy_group",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{
|
|
expectedFindings: []report.Finding{
|
|
|
{
|
|
{
|
|
|
Description: "Discord API key",
|
|
Description: "Discord API key",
|
|
@@ -100,15 +115,19 @@ func TestDetectFindings(t *testing.T) {
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "generic_with_py_path",
|
|
|
|
|
- bytes: []byte(`const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "generic_with_py_path",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "generic_with_py_path",
|
|
|
|
|
- bytes: []byte(`const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`),
|
|
|
|
|
- filePath: "tmp.py",
|
|
|
|
|
|
|
+ cfgName: "generic_with_py_path",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`,
|
|
|
|
|
+ FilePath: "tmp.py",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{
|
|
expectedFindings: []report.Finding{
|
|
|
{
|
|
{
|
|
|
Description: "Generic API Key",
|
|
Description: "Generic API Key",
|
|
@@ -126,9 +145,11 @@ func TestDetectFindings(t *testing.T) {
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "path_only",
|
|
|
|
|
- bytes: []byte(`const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`),
|
|
|
|
|
- filePath: "tmp.py",
|
|
|
|
|
|
|
+ cfgName: "path_only",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`,
|
|
|
|
|
+ FilePath: "tmp.py",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{
|
|
expectedFindings: []report.Finding{
|
|
|
{
|
|
{
|
|
|
Description: "Python Files",
|
|
Description: "Python Files",
|
|
@@ -140,22 +161,28 @@ func TestDetectFindings(t *testing.T) {
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "bad_entropy_group",
|
|
|
|
|
- bytes: []byte(`const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "bad_entropy_group",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `const Discord_Public_Key = "e7322523fb86ed64c836a979cf8465fbd436378c653c1db38f9ae87bc62a6fd5"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
wantError: fmt.Errorf("Discord API key invalid regex secret group 5, max regex secret group 3"),
|
|
wantError: fmt.Errorf("Discord API key invalid regex secret group 5, max regex secret group 3"),
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "simple",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: filepath.Join(configPath, "simple.toml"),
|
|
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: filepath.Join(configPath, "simple.toml"),
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- cfgName: "allow_global_aws_re",
|
|
|
|
|
- bytes: []byte(`awsToken := \"AKIALALEMEL33243OLIA\"`),
|
|
|
|
|
- filePath: "tmp.go",
|
|
|
|
|
|
|
+ cfgName: "allow_global_aws_re",
|
|
|
|
|
+ fragment: Fragment{
|
|
|
|
|
+ Raw: `awsToken := \"AKIALALEMEL33243OLIA\"`,
|
|
|
|
|
+ FilePath: "tmp.go",
|
|
|
|
|
+ },
|
|
|
expectedFindings: []report.Finding{},
|
|
expectedFindings: []report.Finding{},
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
@@ -171,7 +198,10 @@ func TestDetectFindings(t *testing.T) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
var vc config.ViperConfig
|
|
var vc config.ViperConfig
|
|
|
- viper.Unmarshal(&vc)
|
|
|
|
|
|
|
+ err = viper.Unmarshal(&vc)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
cfg, err := vc.Translate()
|
|
cfg, err := vc.Translate()
|
|
|
cfg.Path = filepath.Join(configPath, tt.cfgName+".toml")
|
|
cfg.Path = filepath.Join(configPath, tt.cfgName+".toml")
|
|
|
if tt.wantError != nil {
|
|
if tt.wantError != nil {
|
|
@@ -180,8 +210,231 @@ func TestDetectFindings(t *testing.T) {
|
|
|
}
|
|
}
|
|
|
assert.Equal(t, tt.wantError, err)
|
|
assert.Equal(t, tt.wantError, err)
|
|
|
}
|
|
}
|
|
|
|
|
+ d := NewDetector(cfg)
|
|
|
|
|
|
|
|
- findings := DetectFindings(cfg, tt.bytes, tt.filePath, tt.commit)
|
|
|
|
|
|
|
+ findings := d.Detect(tt.fragment)
|
|
|
assert.ElementsMatch(t, tt.expectedFindings, findings)
|
|
assert.ElementsMatch(t, tt.expectedFindings, findings)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// TestFromGit tests the FromGit function
|
|
|
|
|
+func TestFromGit(t *testing.T) {
|
|
|
|
|
+ tests := []struct {
|
|
|
|
|
+ cfgName string
|
|
|
|
|
+ source string
|
|
|
|
|
+ logOpts string
|
|
|
|
|
+ expectedFindings []report.Finding
|
|
|
|
|
+ }{
|
|
|
|
|
+ {
|
|
|
|
|
+ source: filepath.Join(repoBasePath, "small"),
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ expectedFindings: []report.Finding{
|
|
|
|
|
+ {
|
|
|
|
|
+ Description: "AWS Access Key",
|
|
|
|
|
+ StartLine: 20,
|
|
|
|
|
+ EndLine: 20,
|
|
|
|
|
+ StartColumn: 19,
|
|
|
|
|
+ EndColumn: 38,
|
|
|
|
|
+ Secret: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Match: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ File: "main.go",
|
|
|
|
|
+ Date: "2021-11-02T23:37:53Z",
|
|
|
|
|
+ Commit: "1b6da43b82b22e4eaa10bcf8ee591e91abbfc587",
|
|
|
|
|
+ Author: "Zachary Rice",
|
|
|
|
|
+ Email: "zricer@protonmail.com",
|
|
|
|
|
+ Message: "Accidentally add a secret",
|
|
|
|
|
+ RuleID: "aws-access-key",
|
|
|
|
|
+ Tags: []string{"key", "AWS"},
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ Description: "AWS Access Key",
|
|
|
|
|
+ StartLine: 9,
|
|
|
|
|
+ EndLine: 9,
|
|
|
|
|
+ StartColumn: 17,
|
|
|
|
|
+ EndColumn: 36,
|
|
|
|
|
+ Secret: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Match: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ File: "foo/foo.go",
|
|
|
|
|
+ Date: "2021-11-02T23:48:06Z",
|
|
|
|
|
+ Commit: "491504d5a31946ce75e22554cc34203d8e5ff3ca",
|
|
|
|
|
+ Author: "Zach Rice",
|
|
|
|
|
+ Email: "zricer@protonmail.com",
|
|
|
|
|
+ Message: "adding foo package with secret",
|
|
|
|
|
+ RuleID: "aws-access-key",
|
|
|
|
|
+ Tags: []string{"key", "AWS"},
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ source: filepath.Join(repoBasePath, "small"),
|
|
|
|
|
+ logOpts: "--all foo...",
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ expectedFindings: []report.Finding{
|
|
|
|
|
+ {
|
|
|
|
|
+ Description: "AWS Access Key",
|
|
|
|
|
+ StartLine: 9,
|
|
|
|
|
+ EndLine: 9,
|
|
|
|
|
+ StartColumn: 17,
|
|
|
|
|
+ EndColumn: 36,
|
|
|
|
|
+ Secret: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Match: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Date: "2021-11-02T23:48:06Z",
|
|
|
|
|
+ File: "foo/foo.go",
|
|
|
|
|
+ Commit: "491504d5a31946ce75e22554cc34203d8e5ff3ca",
|
|
|
|
|
+ Author: "Zach Rice",
|
|
|
|
|
+ Email: "zricer@protonmail.com",
|
|
|
|
|
+ Message: "adding foo package with secret",
|
|
|
|
|
+ RuleID: "aws-access-key",
|
|
|
|
|
+ Tags: []string{"key", "AWS"},
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ err := moveDotGit("dotGit", ".git")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ defer func() {
|
|
|
|
|
+ if err := moveDotGit(".git", "dotGit"); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
|
|
+
|
|
|
|
|
+ for _, tt := range tests {
|
|
|
|
|
+
|
|
|
|
|
+ viper.AddConfigPath(configPath)
|
|
|
|
|
+ viper.SetConfigName("simple")
|
|
|
|
|
+ viper.SetConfigType("toml")
|
|
|
|
|
+ err = viper.ReadInConfig()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var vc config.ViperConfig
|
|
|
|
|
+ err = viper.Unmarshal(&vc)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg, err := vc.Translate()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ detector := NewDetector(cfg)
|
|
|
|
|
+ findings, err := detector.DetectGit(tt.source, tt.logOpts, DetectType)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for _, f := range findings {
|
|
|
|
|
+ f.Match = "" // remove lines cause copying and pasting them has some wack formatting
|
|
|
|
|
+ }
|
|
|
|
|
+ assert.ElementsMatch(t, tt.expectedFindings, findings)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TestFromGit tests the FromGit function
|
|
|
|
|
+func TestFromFiles(t *testing.T) {
|
|
|
|
|
+ tests := []struct {
|
|
|
|
|
+ cfgName string
|
|
|
|
|
+ source string
|
|
|
|
|
+ expectedFindings []report.Finding
|
|
|
|
|
+ }{
|
|
|
|
|
+ {
|
|
|
|
|
+ source: filepath.Join(repoBasePath, "nogit"),
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ expectedFindings: []report.Finding{
|
|
|
|
|
+ {
|
|
|
|
|
+ Description: "AWS Access Key",
|
|
|
|
|
+ StartLine: 20,
|
|
|
|
|
+ EndLine: 20,
|
|
|
|
|
+ StartColumn: 16,
|
|
|
|
|
+ EndColumn: 35,
|
|
|
|
|
+ Match: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Secret: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ File: "../testdata/repos/nogit/main.go",
|
|
|
|
|
+ RuleID: "aws-access-key",
|
|
|
|
|
+ Tags: []string{"key", "AWS"},
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ source: filepath.Join(repoBasePath, "nogit", "main.go"),
|
|
|
|
|
+ cfgName: "simple",
|
|
|
|
|
+ expectedFindings: []report.Finding{
|
|
|
|
|
+ {
|
|
|
|
|
+ Description: "AWS Access Key",
|
|
|
|
|
+ StartLine: 20,
|
|
|
|
|
+ EndLine: 20,
|
|
|
|
|
+ StartColumn: 16,
|
|
|
|
|
+ EndColumn: 35,
|
|
|
|
|
+ Match: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ Secret: "AKIALALEMEL33243OLIA",
|
|
|
|
|
+ File: "../testdata/repos/nogit/main.go",
|
|
|
|
|
+ RuleID: "aws-access-key",
|
|
|
|
|
+ Tags: []string{"key", "AWS"},
|
|
|
|
|
+ Entropy: 3.0841837,
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for _, tt := range tests {
|
|
|
|
|
+ viper.AddConfigPath(configPath)
|
|
|
|
|
+ viper.SetConfigName("simple")
|
|
|
|
|
+ viper.SetConfigType("toml")
|
|
|
|
|
+ err := viper.ReadInConfig()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var vc config.ViperConfig
|
|
|
|
|
+ err = viper.Unmarshal(&vc)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ cfg, _ := vc.Translate()
|
|
|
|
|
+ detector := NewDetector(cfg)
|
|
|
|
|
+ findings, err := detector.DetectFiles(tt.source)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ assert.ElementsMatch(t, tt.expectedFindings, findings)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func moveDotGit(from, to string) error {
|
|
|
|
|
+ repoDirs, err := os.ReadDir("../testdata/repos")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, dir := range repoDirs {
|
|
|
|
|
+ if to == ".git" {
|
|
|
|
|
+ _, err := os.Stat(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), "dotGit"))
|
|
|
|
|
+ if os.IsNotExist(err) {
|
|
|
|
|
+ // dont want to delete the only copy of .git accidentally
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ os.RemoveAll(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), ".git"))
|
|
|
|
|
+ }
|
|
|
|
|
+ if !dir.IsDir() {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ _, err := os.Stat(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), from))
|
|
|
|
|
+ if os.IsNotExist(err) {
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ err = os.Rename(fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), from),
|
|
|
|
|
+ fmt.Sprintf("%s/%s/%s", repoBasePath, dir.Name(), to))
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return nil
|
|
|
|
|
+}
|