Skip to content

Commit

Permalink
test: improves coverage for changelog generation.
Browse files Browse the repository at this point in the history
  • Loading branch information
outofcoffee committed Apr 12, 2024
1 parent c19760f commit 464fb9a
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 39 deletions.
8 changes: 4 additions & 4 deletions changelog/changelog.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func GetUpdatedChangelog(
// always disable vPrefix for changelog heading
nextVersion = semver.GetNextVersion(currentVersion, false, unreleasedCommits)
if nextVersion == "" {
panic("Could not determine next version")
return vcs.ReleaseMetadata{}, "", fmt.Errorf("could not determine next version")
}

// update unreleased version name to next version to ensure date is rendered
Expand All @@ -220,18 +220,18 @@ func GetUpdatedChangelog(

lines, err := ReadFile(changelogFile)
if err != nil {
panic(fmt.Errorf("failed to read changelog file: %s: %v", changelogFile, err))
return vcs.ReleaseMetadata{}, "", fmt.Errorf("failed to read changelog file: %s: %v", changelogFile, err)
}
sections := SplitIntoSections(lines)
if err != nil {
panic(err)
return vcs.ReleaseMetadata{}, "", fmt.Errorf("failed to split changes into sections: %v", err)
}

output := sections.Boilerplate + rendered + "\n\n" + sections.Body

sha, err := vcs.GetHeadSha(repoPath)
if err != nil {
panic(fmt.Errorf("failed to get head sha: %v", err))
return vcs.ReleaseMetadata{}, "", fmt.Errorf("failed to get head sha: %v", err)
}
metadata = vcs.ReleaseMetadata{
OldVersion: currentVersion,
Expand Down
119 changes: 85 additions & 34 deletions changelog/changelog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package changelog

import (
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/release-tools/since/cfg"
"github.com/release-tools/since/vcs"
Expand Down Expand Up @@ -160,7 +161,25 @@ func TestSplitIntoSections(t *testing.T) {
}

func TestGetUpdatedChangelog(t *testing.T) {
repoDir := createTestRepo(t)
repoWithTagsAndNoUnreleasedChanges := createTestRepo(t)

repoWithTagsAndUnreleasedChanges := createTestRepo(t)
commitChange(
t,
repoWithTagsAndUnreleasedChanges,
"CHANGELOG.md",
changelogTemplate,
"docs: adds changelog",
time.Now(),
)
unreleasedCommitSha := commitChange(
t,
repoWithTagsAndUnreleasedChanges,
"README.md",
"unreleased change\r\n",
"feat: unreleased change",
time.Now(),
)

type args struct {
config cfg.SinceConfig
Expand All @@ -183,14 +202,46 @@ func TestGetUpdatedChangelog(t *testing.T) {
name: "no changes",
args: args{
orderBy: vcs.TagOrderSemver,
repoPath: repoDir,
repoPath: repoWithTagsAndNoUnreleasedChanges,
afterTag: "0.1.0",
},
wantMetadata: vcs.ReleaseMetadata{},
wantUpdatedChangelog: "",
wantErr: true,
errMessage: "no changes since start tag",
},
{
name: "unreleased changes",
args: args{
changelogFile: path.Join(repoWithTagsAndUnreleasedChanges, "CHANGELOG.md"),
orderBy: vcs.TagOrderSemver,
repoPath: repoWithTagsAndUnreleasedChanges,
afterTag: "0.1.0",
},
wantMetadata: vcs.ReleaseMetadata{
NewVersion: "0.2.0",
OldVersion: "0.1.0",
RepoPath: repoWithTagsAndUnreleasedChanges,
Sha: unreleasedCommitSha.String(),
VPrefix: false,
},
wantUpdatedChangelog: `# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.2.0]
### Added
- feat: unreleased change
### Changed
- docs: adds changelog
`,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down Expand Up @@ -220,70 +271,70 @@ func createTestRepo(t *testing.T) string {
repoDir := t.TempDir()
t.Logf("created repo dir: %s", repoDir)

repoPathToReadme := path.Join(repoDir, "README.md")
readme, err := os.Create(repoPathToReadme)
if err != nil {
t.Fatal(err)
}

repo, err := git.PlainInit(repoDir, false)
if err != nil {
t.Fatal(err)
}
w, err := repo.Worktree()

c1 := commitChange(t, repoDir, "README.md", "first update\r\n", "feat: first update", time.UnixMilli(time.Now().UnixMilli()-10000))
_, err = repo.CreateTag("0.0.1", c1, nil)
if err != nil {
t.Fatal(err)
}

_, err = readme.WriteString("first update")
c2 := commitChange(t, repoDir, "README.md", "second update\r\n", "feat: second update", time.Now())
_, err = repo.CreateTag("0.1.0", c2, nil)
if err != nil {
t.Fatal(err)
}
_, err = w.Add("README.md")

return repoDir
}

func commitChange(
t *testing.T,
repoDir string,
filename string,
appendText string,
msg string,
when time.Time,
) plumbing.Hash {
repo, err := git.PlainOpen(repoDir)
if err != nil {
t.Fatal(err)
}
c1sig := &object.Signature{
Name: "user",
Email: "[email protected]",
When: time.UnixMilli(time.Now().UnixMilli() - 10000),
}
c1, err := w.Commit("first update", &git.CommitOptions{
Author: c1sig,
Committer: c1sig,
})

repoPathToFile := path.Join(repoDir, filename)
file, err := os.OpenFile(repoPathToFile, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
t.Fatal(err)
}
_, err = repo.CreateTag("0.0.1", c1, nil)
defer file.Close()

w, err := repo.Worktree()
if err != nil {
t.Fatal(err)
}

_, err = readme.WriteString("second update")
_, err = file.WriteString(appendText)
if err != nil {
t.Fatal(err)
}
_, err = w.Add("README.md")
_, err = w.Add(filename)
if err != nil {
t.Fatal(err)
}
c2Sig := &object.Signature{
commitSig := &object.Signature{
Name: "user",
Email: "[email protected]",
When: time.Now(),
When: when,
}
c2, err := w.Commit("second update", &git.CommitOptions{
Author: c2Sig,
Committer: c2Sig,
commit, err := w.Commit(msg, &git.CommitOptions{
Author: commitSig,
Committer: commitSig,
})
if err != nil {
t.Fatal(err)
}
_, err = repo.CreateTag("0.1.0", c2, nil)
if err != nil {
t.Fatal(err)
}

return repoDir
return commit
}
6 changes: 5 additions & 1 deletion cmd/project_release.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ func release(
panic(err)
}

metadata, updatedChangelog := changelog.GetUpdatedChangelog(config, changelogFile, orderBy, repoPath, "", latestTag, unique)
metadata, updatedChangelog, err := changelog.GetUpdatedChangelog(config, changelogFile, orderBy, repoPath, "", latestTag, unique)
if err != nil {
panic(err)
}

version := metadata.NewVersion
if metadata.VPrefix {
version = "v" + version
Expand Down

0 comments on commit 464fb9a

Please sign in to comment.