145 lines
3.6 KiB
Go
145 lines
3.6 KiB
Go
package action
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"os"
|
||
|
|
"path/filepath"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/require"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestAnalyzeCodeActivity(t *testing.T) {
|
||
|
|
// Create temp directory with some Go code
|
||
|
|
tmpDir, err := os.MkdirTemp("", "analyze-test")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tmpDir)
|
||
|
|
|
||
|
|
// Create go.mod
|
||
|
|
goMod := `module test
|
||
|
|
go 1.21
|
||
|
|
`
|
||
|
|
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "go.mod"), []byte(goMod), 0644))
|
||
|
|
|
||
|
|
// Create a simple Go file
|
||
|
|
goCode := `package main
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
println("hello")
|
||
|
|
}
|
||
|
|
`
|
||
|
|
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "main.go"), []byte(goCode), 0644))
|
||
|
|
|
||
|
|
// Run activity
|
||
|
|
output, err := AnalyzeCodeActivity(context.Background(), AnalyzeCodeInput{
|
||
|
|
Path: tmpDir,
|
||
|
|
Depth: 3,
|
||
|
|
})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Verify output
|
||
|
|
require.Greater(t, output.Quality, 0.0)
|
||
|
|
require.NotNil(t, output.Metrics)
|
||
|
|
require.NotEmpty(t, output.Summary)
|
||
|
|
|
||
|
|
totalFiles, ok := output.Metrics["totalFiles"].(int)
|
||
|
|
require.True(t, ok)
|
||
|
|
require.Equal(t, 1, totalFiles) // Just main.go (go.mod not counted)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestAnalyzeCodeActivity_PathNotExist(t *testing.T) {
|
||
|
|
_, err := AnalyzeCodeActivity(context.Background(), AnalyzeCodeInput{
|
||
|
|
Path: "/nonexistent/path",
|
||
|
|
})
|
||
|
|
require.Error(t, err)
|
||
|
|
require.Contains(t, err.Error(), "does not exist")
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSecurityScanActivity(t *testing.T) {
|
||
|
|
// Create temp directory
|
||
|
|
tmpDir, err := os.MkdirTemp("", "security-test")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tmpDir)
|
||
|
|
|
||
|
|
// Create a file with potential secret (matches pattern "password=")
|
||
|
|
code := `package main
|
||
|
|
|
||
|
|
var config = map[string]string{
|
||
|
|
"password=": "supersecret123",
|
||
|
|
"api_key=": "sk-12345",
|
||
|
|
}
|
||
|
|
`
|
||
|
|
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "main.go"), []byte(code), 0644))
|
||
|
|
|
||
|
|
// Run activity
|
||
|
|
output, err := SecurityScanActivity(context.Background(), SecurityScanInput{
|
||
|
|
Path: tmpDir,
|
||
|
|
Severity: "medium",
|
||
|
|
})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Should find the hardcoded password
|
||
|
|
require.Greater(t, len(output.Vulnerabilities), 0)
|
||
|
|
require.Less(t, output.SecurityScore, 100.0)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSecurityScanActivity_Clean(t *testing.T) {
|
||
|
|
// Create temp directory with clean code
|
||
|
|
tmpDir, err := os.MkdirTemp("", "security-clean-test")
|
||
|
|
require.NoError(t, err)
|
||
|
|
defer os.RemoveAll(tmpDir)
|
||
|
|
|
||
|
|
// Create clean code
|
||
|
|
code := `package main
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
println("hello")
|
||
|
|
}
|
||
|
|
`
|
||
|
|
require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "main.go"), []byte(code), 0644))
|
||
|
|
|
||
|
|
// Run activity
|
||
|
|
output, err := SecurityScanActivity(context.Background(), SecurityScanInput{
|
||
|
|
Path: tmpDir,
|
||
|
|
})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Should be clean
|
||
|
|
require.Equal(t, 0, len(output.Vulnerabilities))
|
||
|
|
require.Equal(t, 100.0, output.SecurityScore)
|
||
|
|
require.Equal(t, "low", output.RiskLevel)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGenerateReportActivity(t *testing.T) {
|
||
|
|
output, err := GenerateReportActivity(context.Background(), GenerateReportInput{
|
||
|
|
AnalysisResult: map[string]interface{}{"quality": 0.85},
|
||
|
|
SecurityResult: map[string]interface{}{"score": 95.0},
|
||
|
|
Format: "markdown",
|
||
|
|
})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
require.Contains(t, output.Report, "# Analysis Report")
|
||
|
|
require.NotEmpty(t, output.ReportPath)
|
||
|
|
|
||
|
|
// Verify file was created
|
||
|
|
_, err = os.Stat(output.ReportPath)
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
// Cleanup
|
||
|
|
os.Remove(output.ReportPath)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGenerateReportActivity_JSON(t *testing.T) {
|
||
|
|
output, err := GenerateReportActivity(context.Background(), GenerateReportInput{
|
||
|
|
AnalysisResult: map[string]interface{}{"quality": 0.85},
|
||
|
|
SecurityResult: map[string]interface{}{"score": 95.0},
|
||
|
|
Format: "json",
|
||
|
|
})
|
||
|
|
require.NoError(t, err)
|
||
|
|
|
||
|
|
require.Contains(t, output.Report, `"timestamp"`)
|
||
|
|
|
||
|
|
// Cleanup
|
||
|
|
os.Remove(output.ReportPath)
|
||
|
|
}
|