test(cmd/orca): smoke test ≥50% toe-hold, main→run refactor (T01.11, REQ-057)
Refactor main() into run() int (main calls os.Exit(run())) so the test can exercise the CLI directly without os.Exit terminating the test process. Add main_test.go with two cases: run() success path (version command → exit 0) and run() error path (job run with missing spec → exit 1, stderr contains "error:"). Low-effort toe-hold per RESEARCH §1.1/§1.4 — do not over-invest in glue-code coverage. Coverage: go test -cover ./cmd/orca → 80.0% (was 0%, target ≥50%). go test -race PASS. ---ci--- project: orca phase: 1 milestone: v0.8 status: execute ---/ci---
This commit is contained in:
+9
-1
@@ -8,8 +8,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
os.Exit(run())
|
||||||
|
}
|
||||||
|
|
||||||
|
// run executes the orca CLI and returns the process exit code. It is
|
||||||
|
// extracted from main so tests can exercise the error path without
|
||||||
|
// os.Exit terminating the test process.
|
||||||
|
func run() int {
|
||||||
if err := cli.Execute(); err != nil {
|
if err := cli.Execute(); err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRunSuccess(t *testing.T) {
|
||||||
|
orig := os.Args
|
||||||
|
t.Cleanup(func() { os.Args = orig })
|
||||||
|
os.Args = []string{"orca", "version"}
|
||||||
|
if code := run(); code != 0 {
|
||||||
|
t.Errorf("run() = %d, want 0", code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunError(t *testing.T) {
|
||||||
|
origArgs := os.Args
|
||||||
|
t.Cleanup(func() { os.Args = origArgs })
|
||||||
|
os.Args = []string{"orca", "job", "run", "/nonexistent/spec.hcl"}
|
||||||
|
|
||||||
|
r, w, err := os.Pipe()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("pipe: %v", err)
|
||||||
|
}
|
||||||
|
origStderr := os.Stderr
|
||||||
|
os.Stderr = w
|
||||||
|
t.Cleanup(func() { os.Stderr = origStderr })
|
||||||
|
|
||||||
|
code := run()
|
||||||
|
w.Close()
|
||||||
|
out, _ := io.ReadAll(r)
|
||||||
|
if code != 1 {
|
||||||
|
t.Errorf("run() = %d, want 1", code)
|
||||||
|
}
|
||||||
|
if !strings.Contains(string(out), "error:") {
|
||||||
|
t.Errorf("stderr missing 'error:' prefix: %s", out)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user