test: raise coverage with cli and internal helper tests
This commit is contained in:
120
cmd/vociferate/main_test.go
Normal file
120
cmd/vociferate/main_test.go
Normal file
@@ -0,0 +1,120 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMainRecommendPrintsTag(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
writeFile(t, filepath.Join(root, "release-version"), "1.1.6\n")
|
||||
writeFile(t, filepath.Join(root, "changelog.md"), "# Changelog\n\n## [Unreleased]\n\n### Added\n\n- Feature.\n\n## [1.1.6] - 2017-12-20\n")
|
||||
|
||||
stdout, stderr, code := runMain(t, "--recommend", "--root", root)
|
||||
if code != 0 {
|
||||
t.Fatalf("expected exit 0, got %d (stderr: %s)", code, stderr)
|
||||
}
|
||||
if strings.TrimSpace(stdout) != "v1.2.0" {
|
||||
t.Fatalf("unexpected recommended tag: %q", strings.TrimSpace(stdout))
|
||||
}
|
||||
}
|
||||
|
||||
func TestMainUsageExitWhenRequiredFlagsMissing(t *testing.T) {
|
||||
_, stderr, code := runMain(t)
|
||||
if code != 2 {
|
||||
t.Fatalf("expected exit 2, got %d", code)
|
||||
}
|
||||
if !strings.Contains(stderr, "usage: vociferate") {
|
||||
t.Fatalf("expected usage text in stderr, got: %s", stderr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMainPrepareUpdatesFiles(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
writeFile(t, filepath.Join(root, ".git", "config"), "[remote \"origin\"]\n\turl = git@git.hrafn.xyz:aether/vociferate.git\n")
|
||||
writeFile(t, filepath.Join(root, "release-version"), "1.1.6\n")
|
||||
writeFile(t, filepath.Join(root, "changelog.md"), "# Changelog\n\n## [Unreleased]\n\n### Fixed\n\n- Patch note.\n\n## [1.1.6] - 2017-12-20\n")
|
||||
|
||||
_, stderr, code := runMain(t, "--version", "v1.1.7", "--date", "2026-03-20", "--root", root)
|
||||
if code != 0 {
|
||||
t.Fatalf("expected exit 0, got %d (stderr: %s)", code, stderr)
|
||||
}
|
||||
|
||||
versionBytes, err := os.ReadFile(filepath.Join(root, "release-version"))
|
||||
if err != nil {
|
||||
t.Fatalf("read release-version: %v", err)
|
||||
}
|
||||
if strings.TrimSpace(string(versionBytes)) != "1.1.7" {
|
||||
t.Fatalf("unexpected version file value: %q", string(versionBytes))
|
||||
}
|
||||
}
|
||||
|
||||
func TestMainPrepareReturnsExitOneOnFailure(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
_, stderr, code := runMain(t, "--version", "v1.1.7", "--date", "2026-03-20", "--root", root)
|
||||
if code != 1 {
|
||||
t.Fatalf("expected exit 1, got %d", code)
|
||||
}
|
||||
if !strings.Contains(stderr, "prepare release") {
|
||||
t.Fatalf("expected prepare error in stderr, got: %s", stderr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHelperProcess(t *testing.T) {
|
||||
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
|
||||
return
|
||||
}
|
||||
|
||||
idx := -1
|
||||
for i, arg := range os.Args {
|
||||
if arg == "--" {
|
||||
idx = i
|
||||
break
|
||||
}
|
||||
}
|
||||
if idx == -1 {
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
args := append([]string{"vociferate"}, os.Args[idx+1:]...)
|
||||
os.Args = args
|
||||
flag.CommandLine = flag.NewFlagSet(args[0], flag.ExitOnError)
|
||||
|
||||
main()
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
func runMain(t *testing.T, args ...string) (string, string, int) {
|
||||
t.Helper()
|
||||
|
||||
cmdArgs := append([]string{"-test.run=TestHelperProcess", "--"}, args...)
|
||||
cmd := exec.Command(os.Args[0], cmdArgs...)
|
||||
cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1")
|
||||
|
||||
out, err := cmd.CombinedOutput()
|
||||
output := string(out)
|
||||
if err == nil {
|
||||
return output, "", 0
|
||||
}
|
||||
|
||||
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||
return "", output, exitErr.ExitCode()
|
||||
}
|
||||
|
||||
t.Fatalf("run helper process: %v", err)
|
||||
return "", "", -1
|
||||
}
|
||||
|
||||
func writeFile(t *testing.T, path, content string) {
|
||||
t.Helper()
|
||||
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
||||
t.Fatalf("mkdir for %s: %v", path, err)
|
||||
}
|
||||
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
||||
t.Fatalf("write file %s: %v", path, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user