test: raise coverage with cli and internal helper tests

This commit is contained in:
Micheal Wilkinson
2026-03-20 22:33:56 +00:00
parent 3ea4af158e
commit 87059d21fd
2 changed files with 243 additions and 0 deletions

120
cmd/vociferate/main_test.go Normal file
View 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)
}
}