go-devops/devkit/secret_test.go
Snider 9f6fa7ec17 fix(devops): r2 — replace must* helpers with stdlib + verify CLI module resolution on PR #2
Round 2 follow-up to 907c5fa. Closes residual CodeRabbit findings.

Test infra:
- Replaced must* test helpers across cmd_apply_test, cmd_file_sync_test,
  cmd_vm_test, cmd_ci_test, cmd_repo_test, cmd_wizard_test,
  cmd_api_testgen_test, cmd_workflow_test, secret_test, coverage_test,
  scan_secrets_test, snapshot_test with stdlib checks.
- Deleted stale package-level test_helpers_test.go files that only
  supported the old must* pattern.
- AX-6 maintained: no testify Go imports / go.mod requires. Remaining
  go.sum testify entries are transitive checksums after go mod tidy.

Module graph:
- CLI imports switched back to Cobra-compatible
  dappco.re/go/core/cli/pkg/cli module + replacements for private
  vanity modules. GOWORK=off resolves cleanly under isolated cache.
- locales/embed.go / go.sum: i18n checksum + go mod tidy clean.

Verified-but-already-correct (no code change needed):
- cmd/dev/service.go: no-op core.Result{OK:true} + prompt type assertion
- cmd/workspace/config.go: filepath.Abs normalisation + fmt.Errorf
  wrapping
- tests/cli/devops/main.go: raw walk/read errors wrapped
- tests/cli/devops/Taskfile.yaml: strict shell flags
- cmd/dev/cmd_issues.go + cmd_reviews.go: import grouping (after CLI
  module correction)

Verification: gofmt clean, GOWORK=off go vet + go test -count=1 ./...
pass with explicit cache paths.

Closes residual findings on https://github.com/dAppCore/go-devops/pull/2

Co-authored-by: Codex <noreply@openai.com>
2026-04-27 17:29:14 +01:00

99 lines
2.9 KiB
Go

package devkit
import (
"os"
"path/filepath"
"testing"
)
func TestScanDir_Good(t *testing.T) {
root := t.TempDir()
if err := os.WriteFile(filepath.Join(root, "config.yml"), []byte(`
api_key: "ghp_abcdefghijklmnopqrstuvwxyz1234"
`), 0o600); err != nil {
t.Fatalf("write config.yml: %v", err)
}
if err := os.Mkdir(filepath.Join(root, "nested"), 0o755); err != nil {
t.Fatalf("create nested dir: %v", err)
}
if err := os.WriteFile(filepath.Join(root, "nested", "creds.txt"), []byte("access_key = AKIA1234567890ABCDEF\n"), 0o600); err != nil {
t.Fatalf("write creds.txt: %v", err)
}
findings, err := ScanDir(root)
if err != nil {
t.Fatalf("scan dir: %v", err)
}
if len(findings) != 2 {
t.Fatalf("findings length = %d, want 2", len(findings))
}
if findings[0].Rule != "github-token" {
t.Fatalf("findings[0].Rule = %q, want %q", findings[0].Rule, "github-token")
}
if findings[0].Line != 2 {
t.Fatalf("findings[0].Line = %d, want 2", findings[0].Line)
}
if got := filepath.Base(findings[0].Path); got != "config.yml" {
t.Fatalf("findings[0] path base = %q, want %q", got, "config.yml")
}
if findings[1].Rule != "aws-access-key-id" {
t.Fatalf("findings[1].Rule = %q, want %q", findings[1].Rule, "aws-access-key-id")
}
if findings[1].Line != 1 {
t.Fatalf("findings[1].Line = %d, want 1", findings[1].Line)
}
if got := filepath.Base(findings[1].Path); got != "creds.txt" {
t.Fatalf("findings[1] path base = %q, want %q", got, "creds.txt")
}
}
func TestScanDir_SkipsBinaryAndIgnoredDirs_Good(t *testing.T) {
root := t.TempDir()
if err := os.Mkdir(filepath.Join(root, ".git"), 0o755); err != nil {
t.Fatalf("create .git dir: %v", err)
}
if err := os.WriteFile(filepath.Join(root, ".git", "config"), []byte("token=ghp_abcdefghijklmnopqrstuvwxyz1234"), 0o600); err != nil {
t.Fatalf("write .git config: %v", err)
}
if err := os.WriteFile(filepath.Join(root, "blob.bin"), []byte{0, 1, 2, 3, 4}, 0o600); err != nil {
t.Fatalf("write blob.bin: %v", err)
}
findings, err := ScanDir(root)
if err != nil {
t.Fatalf("scan dir: %v", err)
}
if len(findings) != 0 {
t.Fatalf("findings length = %d, want 0", len(findings))
}
}
func TestScanDir_ReportsGenericAssignments_Bad(t *testing.T) {
root := t.TempDir()
if err := os.WriteFile(filepath.Join(root, "secrets.env"), []byte("client_secret: abcdefghijklmnop\n"), 0o600); err != nil {
t.Fatalf("write secrets.env: %v", err)
}
findings, err := ScanDir(root)
if err != nil {
t.Fatalf("scan dir: %v", err)
}
if len(findings) != 1 {
t.Fatalf("findings length = %d, want 1", len(findings))
}
if findings[0].Rule != "generic-secret-assignment" {
t.Fatalf("findings[0].Rule = %q, want %q", findings[0].Rule, "generic-secret-assignment")
}
if findings[0].Line != 1 {
t.Fatalf("findings[0].Line = %d, want 1", findings[0].Line)
}
if findings[0].Column != 1 {
t.Fatalf("findings[0].Column = %d, want 1", findings[0].Column)
}
}