mirror of
https://github.com/apricote/releaser-pleaser.git
synced 2026-01-13 21:21:03 +00:00
* feat(forge): add new forge for forgejo We only support repositories hosted on Forgejo instances, but not Forgejo Actions or Woodpecker as CI solutions for now. * test(e2e): introduce e2e test framework with local forgejo
113 lines
2.7 KiB
Go
113 lines
2.7 KiB
Go
package forgejo
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"codeberg.org/mvdkleijn/forgejo-sdk/forgejo/v2"
|
|
|
|
"github.com/apricote/releaser-pleaser/test/e2e"
|
|
)
|
|
|
|
const (
|
|
TestAPIURL = "http://localhost:3000"
|
|
|
|
TestUserNameTemplate = "rp-%s"
|
|
TestUserPassword = "releaser-pleaser"
|
|
TestUserEmailTemplate = "releaser-pleaser-%s@example.com"
|
|
TestTokenName = "rp"
|
|
TestTokenScopes = "write:user,write:issue,write:repository"
|
|
)
|
|
|
|
type TestForge struct {
|
|
username string
|
|
token string
|
|
client *forgejo.Client
|
|
}
|
|
|
|
func (f *TestForge) Init(ctx context.Context, runID string) error {
|
|
if err := f.initUser(ctx, runID); err != nil {
|
|
return err
|
|
}
|
|
if err := f.initClient(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (f *TestForge) initUser(ctx context.Context, runID string) error {
|
|
f.username = fmt.Sprintf(TestUserNameTemplate, runID)
|
|
|
|
//gosec:disable G204
|
|
if output, err := exec.CommandContext(ctx,
|
|
"docker", "compose", "exec", "--user=1000", "forgejo",
|
|
"forgejo", "admin", "user", "create",
|
|
"--username", f.username,
|
|
"--password", TestUserPassword,
|
|
"--email", fmt.Sprintf(TestUserEmailTemplate, runID),
|
|
"--must-change-password=false",
|
|
).CombinedOutput(); err != nil {
|
|
slog.Debug("create forgejo user output", "output", output)
|
|
return fmt.Errorf("failed to create forgejo user: %w", err)
|
|
}
|
|
|
|
//gosec:disable G204
|
|
token, err := exec.CommandContext(ctx,
|
|
"docker", "compose", "exec", "--user=1000", "forgejo",
|
|
"forgejo", "admin", "user", "generate-access-token",
|
|
"--username", f.username,
|
|
"--token-name", TestTokenName,
|
|
"--scopes", TestTokenScopes,
|
|
"--raw",
|
|
).Output()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create forgejo token: %w", err)
|
|
}
|
|
|
|
f.token = strings.TrimSpace(string(token))
|
|
|
|
return nil
|
|
}
|
|
|
|
func (f *TestForge) initClient(ctx context.Context) (err error) {
|
|
f.client, err = forgejo.NewClient(TestAPIURL,
|
|
forgejo.SetToken(f.token),
|
|
forgejo.SetUserAgent("releaser-pleaser-e2e-tests"),
|
|
forgejo.SetContext(ctx),
|
|
// forgejo.SetDebugMode(),
|
|
)
|
|
return err
|
|
}
|
|
|
|
func (f *TestForge) CreateRepo(t *testing.T, opts e2e.CreateRepoOpts) (*e2e.Repository, error) {
|
|
t.Helper()
|
|
|
|
repo, _, err := f.client.CreateRepo(forgejo.CreateRepoOption{
|
|
Name: opts.Name,
|
|
Description: opts.Description,
|
|
DefaultBranch: opts.DefaultBranch,
|
|
Readme: "Default",
|
|
AutoInit: true,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &e2e.Repository{
|
|
Name: repo.Name,
|
|
}, nil
|
|
}
|
|
|
|
func (f *TestForge) RunArguments() []string {
|
|
return []string{"--forge=forgejo",
|
|
fmt.Sprintf("--owner=%s", f.username),
|
|
fmt.Sprintf("--api-url=%s", TestAPIURL),
|
|
fmt.Sprintf("--api-token=%s", f.token),
|
|
fmt.Sprintf("--username=%s", f.username),
|
|
}
|
|
}
|