releaser-pleaser/test/e2e/framework.go

97 lines
1.6 KiB
Go
Raw Permalink Normal View History

package e2e
import (
"bytes"
"context"
"crypto/rand"
"encoding/hex"
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/require"
"github.com/apricote/releaser-pleaser/cmd/rp/cmd"
)
const (
TestDefaultBranch = "main"
)
func randomString() string {
randomBytes := make([]byte, 4)
if _, err := rand.Read(randomBytes); err != nil {
panic(err)
}
return hex.EncodeToString(randomBytes)
}
type Framework struct {
runID string
forge TestForge
}
func NewFramework(ctx context.Context, forge TestForge) (*Framework, error) {
f := &Framework{
runID: randomString(),
forge: forge,
}
err := forge.Init(ctx, f.runID)
if err != nil {
return nil, err
}
return f, nil
}
type Repository struct {
Name string
}
func (f *Framework) NewRepository(t *testing.T, name string) *Repository {
t.Helper()
r := &Repository{
Name: fmt.Sprintf("%s-%s-%s", name, f.runID, randomString()),
}
repo, err := f.forge.CreateRepo(t, CreateRepoOpts{
Name: r.Name,
Description: name,
DefaultBranch: TestDefaultBranch,
})
require.NoError(t, err)
require.NotNil(t, repo)
return r
}
func (f *Framework) Run(t *testing.T, r *Repository, extraFiles []string) error {
t.Helper()
ctx := t.Context()
rootCmd := cmd.NewRootCmd()
rootCmd.SetArgs(append([]string{
"run",
fmt.Sprintf("--repo=%s", r.Name),
fmt.Sprintf("--extra-files=%q", strings.Join(extraFiles, "\n")),
}, f.forge.RunArguments()...))
var stdout, stderr bytes.Buffer
rootCmd.SetOut(&stdout)
rootCmd.SetErr(&stderr)
err := rootCmd.ExecuteContext(ctx)
stdoutString := stdout.String()
stderrString := stderr.String()
t.Log(stdoutString)
t.Log(stderrString)
return err
}