mirror of
https://github.com/apricote/releaser-pleaser.git
synced 2026-02-08 02:37:04 +00:00
test: add framework for go-git related testing
This commit is contained in:
parent
b1180a17ba
commit
240813a2fd
2 changed files with 170 additions and 1 deletions
2
go.mod
2
go.mod
|
|
@ -4,6 +4,7 @@ go 1.23.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/blang/semver/v4 v4.0.0
|
github.com/blang/semver/v4 v4.0.0
|
||||||
|
github.com/go-git/go-billy/v5 v5.5.0
|
||||||
github.com/go-git/go-git/v5 v5.12.0
|
github.com/go-git/go-git/v5 v5.12.0
|
||||||
github.com/google/go-github/v66 v66.0.0
|
github.com/google/go-github/v66 v66.0.0
|
||||||
github.com/leodido/go-conventionalcommits v0.12.0
|
github.com/leodido/go-conventionalcommits v0.12.0
|
||||||
|
|
@ -23,7 +24,6 @@ require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
|
|
|
||||||
169
internal/git/util_test.go
Normal file
169
internal/git/util_test.go
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
package git
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"log/slog"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-git/go-billy/v5/memfs"
|
||||||
|
"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/go-git/go-git/v5/storage/memory"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
author = &object.Signature{
|
||||||
|
Name: "releaser-pleaser",
|
||||||
|
When: time.Date(2020, 01, 01, 01, 01, 01, 01, time.UTC),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
type CommitOption func(*commitOptions)
|
||||||
|
type commitOptions struct {
|
||||||
|
cleanFiles bool
|
||||||
|
files []commitFile
|
||||||
|
tags []string
|
||||||
|
newRef plumbing.ReferenceName
|
||||||
|
parentRef plumbing.ReferenceName
|
||||||
|
}
|
||||||
|
type commitFile struct {
|
||||||
|
path string
|
||||||
|
content string
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestCommit func(*testing.T, *Repository) error
|
||||||
|
type TestRepo func(*testing.T) *Repository
|
||||||
|
|
||||||
|
func WithCommit(message string, options ...CommitOption) TestCommit {
|
||||||
|
return func(t *testing.T, repo *Repository) error {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
require.NotEmpty(t, message, "commit message is required")
|
||||||
|
|
||||||
|
opts := &commitOptions{}
|
||||||
|
for _, opt := range options {
|
||||||
|
opt(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
wt, err := repo.r.Worktree()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if opts.parentRef != "" {
|
||||||
|
checkoutOptions := &git.CheckoutOptions{}
|
||||||
|
|
||||||
|
if opts.newRef != "" {
|
||||||
|
parentRef, err := repo.r.Reference(opts.parentRef, false)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
checkoutOptions.Create = true
|
||||||
|
checkoutOptions.Hash = parentRef.Hash()
|
||||||
|
checkoutOptions.Branch = opts.newRef
|
||||||
|
} else {
|
||||||
|
checkoutOptions.Branch = opts.parentRef
|
||||||
|
}
|
||||||
|
|
||||||
|
err = wt.Checkout(checkoutOptions)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yeet all files
|
||||||
|
if opts.cleanFiles {
|
||||||
|
files, err := wt.Filesystem.ReadDir(".")
|
||||||
|
require.NoError(t, err, "failed to get current files")
|
||||||
|
|
||||||
|
for _, fileInfo := range files {
|
||||||
|
err = wt.Filesystem.Remove(fileInfo.Name())
|
||||||
|
require.NoError(t, err, "failed to remove file %q", fileInfo.Name())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create new files
|
||||||
|
for _, fileInfo := range opts.files {
|
||||||
|
file, err := wt.Filesystem.Create(fileInfo.path)
|
||||||
|
require.NoError(t, err, "failed to create file %q", fileInfo.path)
|
||||||
|
|
||||||
|
_, err = file.Write([]byte(fileInfo.content))
|
||||||
|
_ = file.Close()
|
||||||
|
require.NoError(t, err, "failed to write content to file %q", fileInfo.path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit
|
||||||
|
commitHash, err := wt.Commit(message, &git.CommitOptions{
|
||||||
|
All: true,
|
||||||
|
AllowEmptyCommits: true,
|
||||||
|
Author: author,
|
||||||
|
Committer: author,
|
||||||
|
})
|
||||||
|
require.NoError(t, err, "failed to commit")
|
||||||
|
|
||||||
|
// Create tags
|
||||||
|
for _, tagName := range opts.tags {
|
||||||
|
_, err = repo.r.CreateTag(tagName, commitHash, nil)
|
||||||
|
require.NoError(t, err, "failed to create tag %q", tagName)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithFile(path, content string) CommitOption {
|
||||||
|
return func(opts *commitOptions) {
|
||||||
|
opts.files = append(opts.files, commitFile{path: path, content: content})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithCleanFiles() CommitOption {
|
||||||
|
return func(opts *commitOptions) {
|
||||||
|
opts.cleanFiles = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func AsNewBranch(ref plumbing.ReferenceName) CommitOption {
|
||||||
|
return func(opts *commitOptions) {
|
||||||
|
opts.newRef = ref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnBranch(ref plumbing.ReferenceName) CommitOption {
|
||||||
|
return func(opts *commitOptions) {
|
||||||
|
opts.parentRef = ref
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithTag(name string) CommitOption {
|
||||||
|
return func(opts *commitOptions) {
|
||||||
|
opts.tags = append(opts.tags, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithTestRepo(commits ...TestCommit) TestRepo {
|
||||||
|
return func(t *testing.T) *Repository {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
repo := &Repository{
|
||||||
|
logger: slog.New(slog.NewTextHandler(io.Discard, nil)),
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
repo.r, err = git.InitWithOptions(memory.NewStorage(), memfs.New(), git.InitOptions{
|
||||||
|
DefaultBranch: plumbing.Main,
|
||||||
|
})
|
||||||
|
require.NoError(t, err, "failed to create in-memory repository")
|
||||||
|
|
||||||
|
// Make initial commit
|
||||||
|
err = WithCommit("chore: init")(t, repo)
|
||||||
|
require.NoError(t, err, "failed to create init commit")
|
||||||
|
|
||||||
|
for i, commit := range commits {
|
||||||
|
err = commit(t, repo)
|
||||||
|
require.NoError(t, err, "failed to create commit %d", i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return repo
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue