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>
124 lines
3.2 KiB
Go
124 lines
3.2 KiB
Go
package dev
|
|
|
|
import (
|
|
"maps"
|
|
"path/filepath"
|
|
"slices"
|
|
"testing"
|
|
|
|
"dappco.re/go/io"
|
|
)
|
|
|
|
func TestFindWorkflows_Good(t *testing.T) {
|
|
// Create a temp directory with workflow files
|
|
tmpDir := t.TempDir()
|
|
workflowsDir := filepath.Join(tmpDir, ".github", "workflows")
|
|
if err := io.Local.EnsureDir(workflowsDir); err != nil {
|
|
t.Fatalf("create workflows dir: %v", err)
|
|
}
|
|
|
|
// Create some workflow files
|
|
for _, name := range []string{"qa.yml", "tests.yml", "codeql.yaml"} {
|
|
if err := io.Local.Write(filepath.Join(workflowsDir, name), "name: Test"); err != nil {
|
|
t.Fatalf("write workflow %s: %v", name, err)
|
|
}
|
|
}
|
|
|
|
// Create a non-workflow file (should be ignored)
|
|
if err := io.Local.Write(filepath.Join(workflowsDir, "readme.md"), "# Workflows"); err != nil {
|
|
t.Fatalf("write readme: %v", err)
|
|
}
|
|
|
|
workflows := findWorkflows(tmpDir)
|
|
if len(workflows) != 3 {
|
|
t.Fatalf("workflows length = %d, want 3", len(workflows))
|
|
}
|
|
|
|
// Check that all expected workflows are found
|
|
found := make(map[string]bool)
|
|
for _, wf := range workflows {
|
|
found[wf] = true
|
|
}
|
|
|
|
for _, expected := range []string{"qa.yml", "tests.yml", "codeql.yaml"} {
|
|
if !found[expected] {
|
|
t.Fatalf("expected workflow %s in %v", expected, workflows)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFindWorkflows_NoWorkflowsDir_Bad(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
workflows := findWorkflows(tmpDir)
|
|
|
|
if len(workflows) != 0 {
|
|
t.Fatalf("workflows length = %d, want 0", len(workflows))
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_Good(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
templatesDir := filepath.Join(tmpDir, ".github", "workflow-templates")
|
|
if err := io.Local.EnsureDir(templatesDir); err != nil {
|
|
t.Fatalf("create templates dir: %v", err)
|
|
}
|
|
|
|
templateContent := "name: QA\non: [push]"
|
|
if err := io.Local.Write(filepath.Join(templatesDir, "qa.yml"), templateContent); err != nil {
|
|
t.Fatalf("write template workflow: %v", err)
|
|
}
|
|
|
|
// Test finding with .yml extension
|
|
result := findTemplateWorkflow(tmpDir, "qa.yml")
|
|
if result == "" {
|
|
t.Fatal("expected template workflow for qa.yml")
|
|
}
|
|
|
|
// Test finding without extension (should auto-add .yml)
|
|
result = findTemplateWorkflow(tmpDir, "qa")
|
|
if result == "" {
|
|
t.Fatal("expected template workflow for qa")
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_FallbackToWorkflows_Good(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
workflowsDir := filepath.Join(tmpDir, ".github", "workflows")
|
|
if err := io.Local.EnsureDir(workflowsDir); err != nil {
|
|
t.Fatalf("create workflows dir: %v", err)
|
|
}
|
|
|
|
templateContent := "name: Tests\non: [push]"
|
|
if err := io.Local.Write(filepath.Join(workflowsDir, "tests.yml"), templateContent); err != nil {
|
|
t.Fatalf("write workflow: %v", err)
|
|
}
|
|
|
|
result := findTemplateWorkflow(tmpDir, "tests.yml")
|
|
if result == "" {
|
|
t.Fatal("expected fallback workflow")
|
|
}
|
|
}
|
|
|
|
func TestFindTemplateWorkflow_NotFound_Bad(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
|
|
result := findTemplateWorkflow(tmpDir, "nonexistent.yml")
|
|
if result != "" {
|
|
t.Fatalf("result = %q, want empty", result)
|
|
}
|
|
}
|
|
|
|
func TestTemplateNames_Good(t *testing.T) {
|
|
templateSet := map[string]bool{
|
|
"z.yml": true,
|
|
"a.yml": true,
|
|
"m.yml": true,
|
|
}
|
|
|
|
names := slices.Sorted(maps.Keys(templateSet))
|
|
|
|
want := []string{"a.yml", "m.yml", "z.yml"}
|
|
if !slices.Equal(names, want) {
|
|
t.Fatalf("names = %v, want %v", names, want)
|
|
}
|
|
}
|