go-devops/cmd/setup/cmd_ci_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

85 lines
1.9 KiB
Go

package setup
import (
"bytes"
"io"
"os"
"strings"
"testing"
)
func captureStdout(t *testing.T, fn func() error) (string, error) {
t.Helper()
oldStdout := os.Stdout
r, w, err := os.Pipe()
if err != nil {
t.Fatalf("create pipe: %v", err)
}
defer func() {
_ = r.Close()
}()
os.Stdout = w
defer func() {
os.Stdout = oldStdout
}()
outC := make(chan string, 1)
errC := make(chan error, 1)
go func() {
var buf bytes.Buffer
_, copyErr := io.Copy(&buf, r)
errC <- copyErr
outC <- buf.String()
}()
runErr := fn()
if err := w.Close(); err != nil {
t.Fatalf("close pipe writer: %v", err)
}
if err := <-errC; err != nil {
t.Fatalf("copy stdout: %v", err)
}
out := <-outC
return out, runErr
}
func TestDefaultCIConfig_Good(t *testing.T) {
cfg := DefaultCIConfig()
checks := map[string]struct {
got string
want string
}{
"tap": {got: cfg.Tap, want: "host-uk/tap"},
"formula": {got: cfg.Formula, want: "core"},
"scoop bucket": {got: cfg.ScoopBucket, want: "https://forge.lthn.ai/core/scoop-bucket.git"},
"chocolatey pkg": {got: cfg.ChocolateyPkg, want: "core-cli"},
"repository": {got: cfg.Repository, want: "host-uk/core"},
"default version": {got: cfg.DefaultVersion, want: "dev"},
}
for name, check := range checks {
if check.got != check.want {
t.Fatalf("%s = %q, want %q", name, check.got, check.want)
}
}
}
func TestOutputPowershellInstall_Good(t *testing.T) {
out, err := captureStdout(t, func() error {
return outputPowershellInstall(DefaultCIConfig(), "dev")
})
if err != nil {
t.Fatalf("output powershell install: %v", err)
}
if !strings.Contains(out, `scoop bucket add host-uk $ScoopBucket`) {
t.Fatalf("output missing scoop bucket command: %q", out)
}
if strings.Contains(out, `https://https://forge.lthn.ai/core/scoop-bucket.git`) {
t.Fatalf("output contains doubled URL scheme: %q", out)
}
}