diff --git a/internal/vociferate/vociferate_test.go b/internal/vociferate/vociferate_test.go index a0f0a88..b53046d 100644 --- a/internal/vociferate/vociferate_test.go +++ b/internal/vociferate/vociferate_test.go @@ -2,7 +2,9 @@ package vociferate_test import ( "os" + "os/exec" "path/filepath" + "strings" "testing" "git.hrafn.xyz/aether/vociferate/internal/vociferate" @@ -23,12 +25,14 @@ func (s *PrepareSuite) SetupTest() { s.rootDir = s.T().TempDir() s.T().Setenv("GITHUB_SERVER_URL", "") s.T().Setenv("GITHUB_REPOSITORY", "") - require.NoError(s.T(), os.MkdirAll(filepath.Join(s.rootDir, ".git"), 0o755)) - require.NoError(s.T(), os.WriteFile( - filepath.Join(s.rootDir, ".git", "config"), - []byte("[remote \"origin\"]\n\turl = git@git.hrafn.xyz:aether/vociferate.git\n"), - 0o644, - )) + + runGit(s.T(), s.rootDir, "init") + runGit(s.T(), s.rootDir, "config", "user.name", "Vociferate Tests") + runGit(s.T(), s.rootDir, "config", "user.email", "vociferate-tests@example.com") + require.NoError(s.T(), os.WriteFile(filepath.Join(s.rootDir, ".gitkeep"), []byte("\n"), 0o644)) + runGit(s.T(), s.rootDir, "add", ".gitkeep") + runGit(s.T(), s.rootDir, "commit", "-m", "chore: initial test commit") + runGit(s.T(), s.rootDir, "remote", "add", "origin", "git@git.hrafn.xyz:aether/vociferate.git") require.NoError(s.T(), os.WriteFile( filepath.Join(s.rootDir, "release-version"), @@ -43,6 +47,22 @@ func (s *PrepareSuite) SetupTest() { )) } +func runGit(t *testing.T, rootDir string, args ...string) string { + t.Helper() + + command := exec.Command("git", append([]string{"-C", rootDir}, args...)...) + output, err := command.CombinedOutput() + require.NoError(t, err, "git %s failed:\n%s", strings.Join(args, " "), string(output)) + + return strings.TrimSpace(string(output)) +} + +func firstCommitShortHash(t *testing.T, rootDir string) string { + t.Helper() + + return runGit(t, rootDir, "rev-list", "--max-parents=0", "--abbrev-commit", "HEAD") +} + func (s *PrepareSuite) TestPrepare_UpdatesVersionAndPromotesUnreleasedNotes() { err := vociferate.Prepare(s.rootDir, "v1.1.7", "2026-03-20", vociferate.Options{}) @@ -54,7 +74,8 @@ func (s *PrepareSuite) TestPrepare_UpdatesVersionAndPromotesUnreleasedNotes() { changelogBytes, err := os.ReadFile(filepath.Join(s.rootDir, "changelog.md")) require.NoError(s.T(), err) - require.Equal(s.T(), "# Changelog\n\n## [Unreleased]\n\n### Breaking\n\n### Added\n\n### Changed\n\n### Removed\n\n### Fixed\n\n## [1.1.7] - 2026-03-20\n\n### Breaking\n\n### Added\n\n- New thing.\n\n### Fixed\n\n- Old thing.\n\n## [1.1.6] - 2017-12-20\n\n### Fixed\n\n- Historical note.\n\n[Unreleased]: https://git.hrafn.xyz/aether/vociferate/src/branch/main\n[1.1.7]: https://git.hrafn.xyz/aether/vociferate/releases/tag/v1.1.7\n[1.1.6]: https://git.hrafn.xyz/aether/vociferate/releases/tag/v1.1.6\n", string(changelogBytes)) + firstCommit := firstCommitShortHash(s.T(), s.rootDir) + require.Equal(s.T(), "# Changelog\n\n## [Unreleased]\n\n### Breaking\n\n### Added\n\n### Changed\n\n### Removed\n\n### Fixed\n\n## [1.1.7] - 2026-03-20\n\n### Breaking\n\n### Added\n\n- New thing.\n\n### Fixed\n\n- Old thing.\n\n## [1.1.6] - 2017-12-20\n\n### Fixed\n\n- Historical note.\n\n[Unreleased]: https://git.hrafn.xyz/aether/vociferate/compare/v1.1.7...main\n[1.1.7]: https://git.hrafn.xyz/aether/vociferate/compare/v1.1.6...v1.1.7\n[1.1.6]: https://git.hrafn.xyz/aether/vociferate/compare/"+firstCommit+"...v1.1.6\n", string(changelogBytes)) } func (s *PrepareSuite) TestPrepare_ReturnsErrorWhenUnreleasedSectionMissing() { @@ -255,15 +276,16 @@ func (s *PrepareSuite) TestPrepare_UsesGitHrafnXYZEnvironmentForChangelogLinks() changelogBytes, readErr := os.ReadFile(filepath.Join(s.rootDir, "changelog.md")) require.NoError(s.T(), readErr) changelog := string(changelogBytes) + firstCommit := firstCommitShortHash(s.T(), s.rootDir) require.Contains(s.T(), changelog, "## [Unreleased]\n") require.Contains(s.T(), changelog, "### Changed\n") require.Contains(s.T(), changelog, "### Removed\n") require.Contains(s.T(), changelog, "## [1.1.7] - 2026-03-20") require.Contains(s.T(), changelog, "## [1.1.6] - 2017-12-20") - require.Contains(s.T(), changelog, "[Unreleased]: https://git.hrafn.xyz/aether/vociferate/src/branch/main") - require.Contains(s.T(), changelog, "[1.1.7]: https://git.hrafn.xyz/aether/vociferate/releases/tag/v1.1.7") - require.Contains(s.T(), changelog, "[1.1.6]: https://git.hrafn.xyz/aether/vociferate/releases/tag/v1.1.6") + require.Contains(s.T(), changelog, "[Unreleased]: https://git.hrafn.xyz/aether/vociferate/compare/v1.1.7...main") + require.Contains(s.T(), changelog, "[1.1.7]: https://git.hrafn.xyz/aether/vociferate/compare/v1.1.6...v1.1.7") + require.Contains(s.T(), changelog, "[1.1.6]: https://git.hrafn.xyz/aether/vociferate/compare/"+firstCommit+"...v1.1.6") } func (s *PrepareSuite) TestPrepare_UsesGitHubEnvironmentForChangelogLinks() { @@ -276,13 +298,14 @@ func (s *PrepareSuite) TestPrepare_UsesGitHubEnvironmentForChangelogLinks() { changelogBytes, readErr := os.ReadFile(filepath.Join(s.rootDir, "changelog.md")) require.NoError(s.T(), readErr) changelog := string(changelogBytes) + firstCommit := firstCommitShortHash(s.T(), s.rootDir) require.Contains(s.T(), changelog, "## [Unreleased]\n") require.Contains(s.T(), changelog, "### Changed\n") require.Contains(s.T(), changelog, "### Removed\n") require.Contains(s.T(), changelog, "## [1.1.7] - 2026-03-20") require.Contains(s.T(), changelog, "## [1.1.6] - 2017-12-20") - require.Contains(s.T(), changelog, "[Unreleased]: https://github.com/aether/vociferate/src/branch/main") - require.Contains(s.T(), changelog, "[1.1.7]: https://github.com/aether/vociferate/releases/tag/v1.1.7") - require.Contains(s.T(), changelog, "[1.1.6]: https://github.com/aether/vociferate/releases/tag/v1.1.6") + require.Contains(s.T(), changelog, "[Unreleased]: https://github.com/aether/vociferate/compare/v1.1.7...main") + require.Contains(s.T(), changelog, "[1.1.7]: https://github.com/aether/vociferate/compare/v1.1.6...v1.1.7") + require.Contains(s.T(), changelog, "[1.1.6]: https://github.com/aether/vociferate/compare/"+firstCommit+"...v1.1.6") }