1
0
Fork 0
golang-forgejo-f3-gof3/tree/tests/f3/generator.go

475 lines
15 KiB
Go
Raw Permalink Normal View History

// Copyright Earl Warren <contact@earl-warren.org>
// Copyright Loïc Dachary <loic@dachary.org>
// SPDX-License-Identifier: MIT
package f3
import (
"context"
"crypto/sha256"
"fmt"
"io"
"strings"
"testing"
"time"
"code.forgejo.org/f3/gof3/v3/f3"
tests_repository "code.forgejo.org/f3/gof3/v3/forges/helpers/tests/repository"
"code.forgejo.org/f3/gof3/v3/path"
f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3"
"code.forgejo.org/f3/gof3/v3/tree/generic"
)
func GeneratorSetRandomID(id string, f f3.Interface, parent path.Path) f3.Interface {
if parent.First().(generic.NodeInterface).GetTree().AllocateID() {
return f
}
return GeneratorSetID(f, id)
}
func GeneratorSetID(f f3.Interface, id string) f3.Interface {
f.SetID(id)
return f
}
type ModificatorFunc func(t *testing.T, f f3.Interface, parent path.Path) []f3.Interface
func GeneratorModify(t *testing.T, f f3.Interface, parent path.Path) []f3.Interface {
switch v := f.(type) {
case *f3.User:
return GeneratorModifyUser(v)
case *f3.Organization:
return GeneratorModifyOrganization(v)
case *f3.Project:
return GeneratorModifyProject(v, parent)
case *f3.Issue:
return GeneratorModifyIssue(v, parent)
case *f3.Milestone:
return GeneratorModifyMilestone(v, parent)
case *f3.Topic:
return GeneratorModifyTopic(v, parent)
case *f3.Reaction:
// a reaction cannot be modified, it can only be created and deleted
return []f3.Interface{}
case *f3.Label:
return GeneratorModifyLabel(v, parent)
case *f3.Comment:
return GeneratorModifyComment(v, parent)
case *f3.Release:
return GeneratorModifyRelease(t, v, parent)
case *f3.ReleaseAsset:
return GeneratorModifyReleaseAsset(v, parent)
case *f3.PullRequest:
return GeneratorModifyPullRequest(t, v, parent)
case *f3.Review:
// a review cannot be modified, it can only be created and deleted
return []f3.Interface{}
case *f3.ReviewComment:
return GeneratorModifyReviewComment(t, v, parent)
default:
panic(fmt.Errorf("not implemented %T", f))
}
}
type GeneratorFunc func(t *testing.T, name string, f f3.Interface, parent path.Path) f3.Interface
func GeneratorSetRandom(t *testing.T, name string, f f3.Interface, parent path.Path) f3.Interface {
GeneratorSetRandomID(name, f, parent)
switch v := f.(type) {
case *f3.User:
return GeneratorSetRandomUser(v)
case *f3.Organization:
return GeneratorSetRandomOrganization(v)
case *f3.Project:
return GeneratorSetRandomProject(v, parent)
case *f3.Issue:
return GeneratorSetRandomIssue(v, parent)
case *f3.Milestone:
return GeneratorSetRandomMilestone(v, parent)
case *f3.Topic:
return GeneratorSetRandomTopic(v, parent)
case *f3.Reaction:
return GeneratorSetRandomReaction(v, parent)
case *f3.Label:
return GeneratorSetRandomLabel(v, parent)
case *f3.Comment:
return GeneratorSetRandomComment(v, parent)
case *f3.Release:
return GeneratorSetRandomRelease(t, v, parent)
case *f3.ReleaseAsset:
return GeneratorSetRandomReleaseAsset(v, parent)
case *f3.PullRequest:
return GeneratorSetRandomPullRequest(t, v, parent)
case *f3.Review:
return GeneratorSetReview(t, v, parent)
case *f3.ReviewComment:
return GeneratorSetReviewComment(t, v, parent)
default:
panic(fmt.Errorf("not implemented %T", f))
}
}
func GeneratorSetRandomUser(user *f3.User) *f3.User {
username := fmt.Sprintf("generateduser%s", user.GetID())
user.Name = username + " Doe"
user.UserName = username
user.Email = username + "@example.com"
user.Password = "Wrobyak4"
return user
}
func GeneratorModifyUser(user *f3.User) []f3.Interface {
return []f3.Interface{user.Clone()}
}
func GeneratorSetRandomOrganization(organization *f3.Organization) *f3.Organization {
organizationname := fmt.Sprintf("generatedorg%s", organization.GetID())
organization.FullName = organizationname + " Lambda"
organization.Name = organizationname
return organization
}
func GeneratorModifyOrganization(organization *f3.Organization) []f3.Interface {
organization0 := organization.Clone().(*f3.Organization)
organization0.FullName = "modified " + organization.FullName
return []f3.Interface{organization0}
}
func GeneratorSetRandomProject(project *f3.Project, parent path.Path) *f3.Project {
projectname := fmt.Sprintf("project%s", project.GetID())
project.Name = projectname
project.IsPrivate = false
project.IsMirror = false
project.Description = "project description"
project.DefaultBranch = "main"
return project
}
func GeneratorModifyProject(project *f3.Project, parent path.Path) []f3.Interface {
project0 := project.Clone().(*f3.Project)
project0.Description = "modified " + project.Description
return []f3.Interface{project0}
}
func GeneratorSetRandomIssue(issue *f3.Issue, parent path.Path) *f3.Issue {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
projectNode := f3_tree.GetFirstNodeKind(parent.Last().(generic.NodeInterface), f3_tree.KindProject)
labelsNode := projectNode.Find(generic.NewPathFromString("labels"))
labels := labelsNode.GetChildren()
firstLabel := labels[0]
now := now()
updated := tick(&now)
closed := tick(&now)
created := tick(&now)
userRef := f3_tree.NewUserReference(user.GetID())
labelRef := f3_tree.NewIssueLabelReference(firstLabel.GetID())
milestonesNode := projectNode.Find(generic.NewPathFromString("milestones"))
milestones := milestonesNode.GetChildren()
firstMilestone := milestones[0]
issue.PosterID = userRef
issue.Assignees = []*f3.Reference{userRef}
issue.Labels = []*f3.Reference{labelRef}
issue.Milestone = f3_tree.NewIssueMilestoneReference(firstMilestone.GetID())
issue.Title = "title"
issue.Content = "content"
issue.State = f3.IssueStateOpen
issue.IsLocked = false
issue.Created = created
issue.Updated = updated
issue.Closed = &closed
return issue
}
func GeneratorModifyIssue(issue *f3.Issue, parent path.Path) []f3.Interface {
assignees := issue.Assignees
milestone := issue.Milestone
labels := issue.Labels
issue0 := issue.Clone().(*f3.Issue)
issue0.Title = "modified " + issue.Title
issue0.Content = "modified " + issue.Content
issueClosed := issue0.Clone().(*f3.Issue)
issueClosed.Assignees = []*f3.Reference{}
issueClosed.Milestone = &f3.Reference{}
issueClosed.Labels = []*f3.Reference{}
issueClosed.State = f3.IssueStateClosed
issueClosed.IsLocked = true
issueOpen := issue0.Clone().(*f3.Issue)
issueOpen.Assignees = assignees
issueOpen.Milestone = milestone
issueOpen.Labels = labels
issueOpen.State = f3.IssueStateOpen
issueClosed.IsLocked = false
return []f3.Interface{
issue0,
issueClosed,
issueOpen,
}
}
func GeneratorSetRandomMilestone(milestone *f3.Milestone, parent path.Path) *f3.Milestone {
now := now()
created := tick(&now)
updated := tick(&now)
deadline := tick(&now)
title := fmt.Sprintf("milestone%s", milestone.GetID())
milestone.Title = title
milestone.Description = title + " description"
milestone.Deadline = &deadline
milestone.Created = created
milestone.Updated = &updated
milestone.Closed = nil
milestone.State = f3.MilestoneStateOpen
return milestone
}
func GeneratorModifyMilestone(milestone *f3.Milestone, parent path.Path) []f3.Interface {
milestone0 := milestone.Clone().(*f3.Milestone)
milestone0.Title = "modified " + milestone.Title
milestoneClosed := milestone0.Clone().(*f3.Milestone)
milestoneClosed.State = f3.MilestoneStateClosed
deadline := time.Now().Truncate(time.Second).Add(5 * time.Minute)
milestoneClosed.Deadline = &deadline
milestoneOpen := milestone0.Clone().(*f3.Milestone)
milestoneOpen.State = f3.MilestoneStateOpen
return []f3.Interface{
milestone0,
milestoneClosed,
milestoneOpen,
}
}
func GeneratorSetRandomTopic(topic *f3.Topic, parent path.Path) *f3.Topic {
topic.Name = fmt.Sprintf("topic%s", topic.GetID())
return topic
}
func GeneratorModifyTopic(topic *f3.Topic, parent path.Path) []f3.Interface {
topic0 := topic.Clone().(*f3.Topic)
return []f3.Interface{topic0}
}
func GeneratorSetRandomReaction(reaction *f3.Reaction, parent path.Path) *f3.Reaction {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
reaction.UserID = f3_tree.NewUserReference(user.GetID())
reaction.Content = "laugh"
return reaction
}
func GeneratorSetRandomLabel(label *f3.Label, parent path.Path) *f3.Label {
name := fmt.Sprintf("label%s", label.GetID())
label.Name = name
label.Description = name + " description"
label.Color = "ffffff"
return label
}
func GeneratorModifyLabel(label *f3.Label, parent path.Path) []f3.Interface {
label0 := label.Clone().(*f3.Label)
label0.Name = "modified" + label.Name
label0.Color = "f0f0f0"
label0.Description = "modified " + label.Description
return []f3.Interface{label0}
}
func GeneratorSetRandomComment(comment *f3.Comment, parent path.Path) *f3.Comment {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
now := now()
commentCreated := tick(&now)
commentUpdated := tick(&now)
comment.PosterID = f3_tree.NewUserReference(user.GetID())
comment.Created = commentCreated
comment.Updated = commentUpdated
comment.Content = "comment content"
return comment
}
func GeneratorModifyComment(comment *f3.Comment, parent path.Path) []f3.Interface {
comment0 := comment.Clone().(*f3.Comment)
comment0.Content = "modified" + comment.Content
return []f3.Interface{comment0}
}
func GeneratorSetRandomRelease(t *testing.T, release *f3.Release, parent path.Path) *f3.Release {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
project := f3_tree.GetFirstNodeKind(parent.Last().(generic.NodeInterface), f3_tree.KindProject)
repository := project.Find(generic.NewPathFromString("repositories/vcs"))
repository.Get(context.Background())
repositoryHelper := tests_repository.NewTestHelper(t, "", repository)
now := now()
releaseCreated := tick(&now)
tag := fmt.Sprintf("release%s", release.GetID())
repositoryHelper.CreateRepositoryTag(tag, "master")
sha := repositoryHelper.GetRepositorySha("master")
fmt.Printf("GeneratorSetRandomRelease %s %s\n", repository.GetCurrentPath(), repository.GetID())
repositoryHelper.PushMirror()
release.TagName = tag
release.TargetCommitish = sha
release.Name = tag + " name"
release.Body = tag + " body"
release.Draft = false
release.Prerelease = false
release.PublisherID = f3_tree.NewUserReference(user.GetID())
release.Created = releaseCreated
return release
}
func GeneratorModifyRelease(t *testing.T, release *f3.Release, parent path.Path) []f3.Interface {
release0 := release.Clone().(*f3.Release)
release0.Body = "modified " + release.Body
return []f3.Interface{release0}
}
func GeneratorSetRandomReleaseAsset(asset *f3.ReleaseAsset, parent path.Path) *f3.ReleaseAsset {
name := fmt.Sprintf("assetname%s", asset.GetID())
content := fmt.Sprintf("assetcontent%s", asset.GetID())
downloadURL := "downloadURL"
now := now()
assetCreated := tick(&now)
size := len(content)
downloadCount := int64(10)
sha256 := fmt.Sprintf("%x", sha256.Sum256([]byte(content)))
asset.Name = name
asset.Size = int64(size)
asset.DownloadCount = downloadCount
asset.Created = assetCreated
asset.SHA256 = sha256
asset.DownloadURL = downloadURL
asset.DownloadFunc = func() io.ReadCloser {
rc := io.NopCloser(strings.NewReader(content))
return rc
}
return asset
}
func GeneratorModifyReleaseAsset(asset *f3.ReleaseAsset, parent path.Path) []f3.Interface {
asset0 := asset.Clone().(*f3.ReleaseAsset)
asset0.Name = "modified" + asset.Name
return []f3.Interface{asset0}
}
func GeneratorSetRandomPullRequest(t *testing.T, pullRequest *f3.PullRequest, parent path.Path) *f3.PullRequest {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
projectNode := f3_tree.GetFirstNodeKind(parent.Last().(generic.NodeInterface), f3_tree.KindProject)
repositoryNode := projectNode.Find(generic.NewPathFromString("repositories/vcs"))
repositoryNode.Get(context.Background())
repositoryHelper := tests_repository.NewTestHelper(t, "", repositoryNode)
mainRef := "master"
mainSha := repositoryHelper.GetRepositorySha(mainRef)
featureRef := "generatedfeature"
repositoryHelper.InternalBranchRepositoryFeature(featureRef, featureRef+" content")
featureSha := repositoryHelper.GetRepositorySha(featureRef)
fmt.Printf("createPullRequest: master %s at main %s feature %s\n", repositoryHelper.GetBare(), mainSha, featureSha)
repositoryHelper.PushMirror()
now := now()
prCreated := tick(&now)
prUpdated := tick(&now)
pullRequest.PosterID = f3_tree.NewUserReference(user.GetID())
pullRequest.Title = featureRef + " pr title"
pullRequest.Content = featureRef + " pr content"
pullRequest.State = f3.PullRequestStateOpen
pullRequest.IsLocked = false
pullRequest.Created = prCreated
pullRequest.Updated = prUpdated
pullRequest.Closed = nil
pullRequest.Merged = false
pullRequest.MergedTime = nil
pullRequest.MergeCommitSHA = ""
pullRequest.Head = f3.PullRequestBranch{
Ref: featureRef,
SHA: featureSha,
Repository: f3.NewReference("../../repository/vcs"),
}
pullRequest.Base = f3.PullRequestBranch{
Ref: mainRef,
SHA: mainSha,
Repository: f3.NewReference("../../repository/vcs"),
}
return pullRequest
}
func GeneratorModifyPullRequest(t *testing.T, pullRequest *f3.PullRequest, parent path.Path) []f3.Interface {
pullRequest0 := pullRequest.Clone().(*f3.PullRequest)
pullRequest0.Title = "modified " + pullRequest.Title
return []f3.Interface{pullRequest0}
}
func GeneratorSetReview(t *testing.T, review *f3.Review, parent path.Path) *f3.Review {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
projectNode := f3_tree.GetFirstNodeKind(parent.Last().(generic.NodeInterface), f3_tree.KindProject)
repositoryNode := projectNode.Find(generic.NewPathFromString("repositories/vcs"))
repositoryNode.Get(context.Background())
repositoryHelper := tests_repository.NewTestHelper(t, "", repositoryNode)
now := now()
reviewCreated := tick(&now)
featureSha := repositoryHelper.GetRepositorySha("feature")
review.ReviewerID = f3_tree.NewUserReference(user.GetID())
review.Official = true
review.CommitID = featureSha
review.Content = "the review content"
review.CreatedAt = reviewCreated
review.State = f3.ReviewStateCommented
return review
}
func GeneratorSetReviewComment(t *testing.T, comment *f3.ReviewComment, parent path.Path) *f3.ReviewComment {
user := f3_tree.GetFirstFormat[*f3.User](parent.Last().(generic.NodeInterface))
projectNode := f3_tree.GetFirstNodeKind(parent.Last().(generic.NodeInterface), f3_tree.KindProject)
repositoryNode := projectNode.Find(generic.NewPathFromString("repositories/vcs"))
repositoryNode.Get(context.Background())
repositoryHelper := tests_repository.NewTestHelper(t, "", repositoryNode)
now := now()
commentCreated := tick(&now)
commentUpdated := tick(&now)
featureSha := repositoryHelper.GetRepositorySha("feature")
comment.Content = "comment content"
comment.TreePath = "README.md"
comment.DiffHunk = "@@ -108,7 +108,6 @@"
comment.Line = 1
comment.CommitID = featureSha
comment.PosterID = f3_tree.NewUserReference(user.GetID())
comment.CreatedAt = commentCreated
comment.UpdatedAt = commentUpdated
return comment
}
func GeneratorModifyReviewComment(t *testing.T, comment *f3.ReviewComment, parent path.Path) []f3.Interface {
comment0 := comment.Clone().(*f3.ReviewComment)
comment0.Content = "modified " + comment.Content
return []f3.Interface{comment0}
}