Cybersecurity-Projects/PROJECTS/intermediate/secrets-scanner/internal/engine/pipeline_test.go

148 lines
3.1 KiB
Go

// ©AngelaMos | 2026
// pipeline_test.go
package engine
import (
"context"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/CarterPerez-dev/portia/internal/rules"
"github.com/CarterPerez-dev/portia/internal/source"
)
func TestPipelineDirectoryScan(t *testing.T) {
t.Parallel()
dir := t.TempDir()
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, "config.py"),
[]byte(`api_key = "AKIAIOSFODNN7EXAMPLE"`+"\n"),
0o644,
))
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, "clean.go"),
[]byte("package main\n\nfunc main() {}\n"),
0o644,
))
reg := testRegistry()
p := NewPipeline(reg)
src := source.NewDirectory(dir, 0, nil)
result, err := p.Run(context.Background(), src)
require.NoError(t, err)
require.NotNil(t, result)
assert.GreaterOrEqual(t, len(result.Findings), 1)
found := false
for _, f := range result.Findings {
if f.RuleID == "test-aws-key" {
found = true
assert.Equal(t, "AKIAIOSFODNN7EXAMPLE", f.Secret)
}
}
assert.True(t, found, "expected to find AWS key")
}
func TestPipelineNoFindings(t *testing.T) {
t.Parallel()
dir := t.TempDir()
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, "main.go"),
[]byte("package main\n\nfunc main() {}\n"),
0o644,
))
reg := testRegistry()
p := NewPipeline(reg)
src := source.NewDirectory(dir, 0, nil)
result, err := p.Run(context.Background(), src)
require.NoError(t, err)
assert.Empty(t, result.Findings)
}
func TestPipelineMultipleSecrets(t *testing.T) {
t.Parallel()
dir := t.TempDir()
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, "secrets.env"),
[]byte(
`AWS_KEY=AKIAIOSFODNN7EXAMPLE`+"\n"+
`STRIPE_KEY=sk_live_4eC39HqLyjWDarjtT1zdp7dc`+"\n"+
`password = "xK9mP2vL5nQ8jR3t"`+"\n",
),
0o644,
))
reg := testRegistry()
p := NewPipeline(reg)
src := source.NewDirectory(dir, 0, nil)
result, err := p.Run(context.Background(), src)
require.NoError(t, err)
assert.GreaterOrEqual(t, len(result.Findings), 2)
}
func TestPipelineContextCancel(t *testing.T) {
t.Parallel()
dir := t.TempDir()
for i := range 20 {
name := "file" + string(rune('A'+i)) + ".txt"
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, name),
[]byte(`AKIAIOSFODNN7EXAMPLE`+"\n"),
0o644,
))
}
reg := testRegistry()
p := NewPipeline(reg)
src := source.NewDirectory(dir, 0, nil)
ctx, cancel := context.WithCancel(context.Background())
cancel()
_, err := p.Run(ctx, src)
assert.Error(t, err)
}
func TestPipelineDedup(t *testing.T) {
t.Parallel()
reg := rules.NewRegistry()
rules.RegisterBuiltins(reg)
p := NewPipeline(reg)
dir := t.TempDir()
require.NoError(t, os.WriteFile( //nolint:gosec
filepath.Join(dir, "dup.txt"),
[]byte(
`AKIAIOSFODNN7EXAMPLE`+"\n"+
`AKIAIOSFODNN7EXAMPLE`+"\n",
),
0o644,
))
src := source.NewDirectory(dir, 0, nil)
result, err := p.Run(context.Background(), src)
require.NoError(t, err)
awsCount := 0
for _, f := range result.Findings {
if f.Secret == "AKIAIOSFODNN7EXAMPLE" { //nolint:gosec
awsCount++
}
}
assert.LessOrEqual(t, awsCount, 2)
}