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>
85 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|