147 lines
4.3 KiB
Go
147 lines
4.3 KiB
Go
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 TestMainPrintUnreleasedWritesPendingNotes(t *testing.T) {
|
|
root := t.TempDir()
|
|
writeFile(t, filepath.Join(root, "CHANGELOG.md"), "# Changelog\n\n## [Unreleased]\n\n### Added\n\n- Feature.\n\n### Fixed\n\n- Bugfix.\n\n## [1.1.6] - 2017-12-20\n")
|
|
|
|
stdout, stderr, code := runMain(t, "--print-unreleased", "--root", root)
|
|
if code != 0 {
|
|
t.Fatalf("expected exit 0, got %d (stderr: %s)", code, stderr)
|
|
}
|
|
if stdout != "### Added\n\n- Feature.\n\n### Fixed\n\n- Bugfix.\n" {
|
|
t.Fatalf("unexpected unreleased output: %q", stdout)
|
|
}
|
|
}
|
|
|
|
func TestMainPrintReleaseNotesWritesTaggedSection(t *testing.T) {
|
|
root := t.TempDir()
|
|
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\n### Fixed\n\n- Historical note.\n")
|
|
|
|
stdout, stderr, code := runMain(t, "--print-release-notes", "--version", "1.1.6", "--root", root)
|
|
if code != 0 {
|
|
t.Fatalf("expected exit 0, got %d (stderr: %s)", code, stderr)
|
|
}
|
|
if stdout != "## [1.1.6] - 2017-12-20\n\n### Fixed\n\n- Historical note.\n" {
|
|
t.Fatalf("unexpected release notes output: %q", 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)
|
|
}
|
|
}
|