diff --git a/tests/e2e/declare_repos_test.go b/tests/e2e/declare_repos_test.go index 9296f81bfc..7a49956a36 100644 --- a/tests/e2e/declare_repos_test.go +++ b/tests/e2e/declare_repos_test.go @@ -187,8 +187,10 @@ func newRepo(t *testing.T, userID int64, repoName string, enabledUnits map[unit_ Files: forgery.FilesInit{}, }) if len(enabledUnits) == 0 { - forgery.EnableRepoUnit(t, somerepo, unit_model.TypeCode, nil) - forgery.EnableRepoUnit(t, somerepo, unit_model.TypeIssues, nil) + forgery.EnableRepoUnits(t, somerepo, + unit_model.TypeCode, + unit_model.TypeIssues, + ) } for unit, config := range enabledUnits { forgery.EnableRepoUnit(t, somerepo, unit, config) diff --git a/tests/forgery/repo.go b/tests/forgery/repo.go index 4045bde657..d66eec4dfe 100644 --- a/tests/forgery/repo.go +++ b/tests/forgery/repo.go @@ -89,7 +89,7 @@ func CreateRepository(t testing.TB, owner *user_model.User, opts *CreateReposito if !createOptions.AutoInit && opts.Files != nil { sha, err := initRepo(owner, repo, gitFormat, opts.Files, "init") - require.NoError(t, err) + require.NoError(t, err, "Make sure the Forgejo HTTP server is running (or use %T instead of %T for the Files field)", FilesInit{}, opts.Files) if opts.LatestSha != nil { *opts.LatestSha = sha } @@ -118,7 +118,6 @@ func InitWiki(t testing.TB, repo *repo_model.Repository, branch string) { require.NoError(t, err) } -// config may be nil func EnableRepoUnit(t testing.TB, repo *repo_model.Repository, unit unit_model.Type, config convert.Conversion) { t.Helper() @@ -130,6 +129,36 @@ func EnableRepoUnit(t testing.TB, repo *repo_model.Repository, unit unit_model.T require.NoError(t, err) } +// to specify a non-default config, call [EnableRepoUnit] instead +func EnableRepoUnits(t testing.TB, repo *repo_model.Repository, units ...unit_model.Type) { + t.Helper() + + ru := make([]repo_model.RepoUnit, 0, len(units)) + for _, u := range units { + var config convert.Conversion + if u == unit_model.TypePullRequests { // pull request config is needed (otherwise no merge allowed by default) + config = &repo_model.PullRequestsConfig{ + AllowMerge: true, + AllowRebase: true, + AllowRebaseMerge: true, + AllowSquash: true, + AllowFastForwardOnly: true, + AllowManualMerge: true, + AllowRebaseUpdate: true, + DefaultMergeStyle: repo_model.MergeStyleMerge, + DefaultUpdateStyle: repo_model.UpdateStyleMerge, + } + } + ru = append(ru, repo_model.RepoUnit{ + RepoID: repo.ID, + Type: u, + Config: config, + }) + } + err := repo_service.UpdateRepositoryUnits(t.Context(), repo, ru, nil) + require.NoError(t, err) +} + func DisableRepoUnits(t testing.TB, repo *repo_model.Repository, units ...unit_model.Type) { t.Helper() diff --git a/tests/forgery/user.go b/tests/forgery/user.go index 1175297497..7190dab9da 100644 --- a/tests/forgery/user.go +++ b/tests/forgery/user.go @@ -7,6 +7,7 @@ import ( "math/rand/v2" "regexp" "strconv" + "strings" "testing" org_model "forgejo.org/models/organization" @@ -19,7 +20,7 @@ var nameCleaner = regexp.MustCompile(`[^a-zA-Z0-9-]+`) // exclude "_", to preven // uniqueSafeName replaces specials chars with _ and appends a random hex suffix func uniqueSafeName(testName string) string { - return nameCleaner.ReplaceAllLiteralString(testName, "_") + "-" + strconv.FormatUint(uint64(rand.Uint32()), 16) + return strings.Trim(nameCleaner.ReplaceAllLiteralString(testName, "_"), "-_") + "-" + strconv.FormatUint(uint64(rand.Uint32()), 16) } type CreateUserOptions struct { diff --git a/tests/integration/actions_token_metadata_test.go b/tests/integration/actions_token_metadata_test.go index 3ca697c7ca..dbbfe7532b 100644 --- a/tests/integration/actions_token_metadata_test.go +++ b/tests/integration/actions_token_metadata_test.go @@ -48,7 +48,7 @@ func TestActionGetTokenMetadata(t *testing.T) { ), }, }) - forgery.EnableRepoUnit(t, repo, unit_model.TypeActions, nil) + forgery.EnableRepoUnits(t, repo, unit_model.TypeActions) gitRepo, err := gitrepo.OpenRepository(db.DefaultContext, repo) require.NoError(t, err) diff --git a/tests/integration/pull_auto_merge_test.go b/tests/integration/pull_auto_merge_test.go index e9a428d4e7..6c7f60dd54 100644 --- a/tests/integration/pull_auto_merge_test.go +++ b/tests/integration/pull_auto_merge_test.go @@ -9,17 +9,14 @@ import ( "net/url" "os" "path" - "strings" "testing" "time" unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/git" app_context "forgejo.org/services/context" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,26 +24,17 @@ import ( func TestPullRemoveAutomerge(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) - user5Session := loginUser(t, user5.Name) - user2Session := loginUser(t, "user2") + repo := forgery.CreateRepository(t, nil, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode, unit_model.TypePullRequests) - repo, _, f := tests.CreateDeclarativeRepo(t, user5, "", - []unit_model.Type{unit_model.TypeCode, unit_model.TypePullRequests}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "FUNFACT", - ContentReader: strings.NewReader( - "The Netherlands got its first openly gay prime minister today."), - }, - }, - ) - defer f() + owner := repo.Owner + ownerSession := loginUser(t, owner.Name) dstPath := t.TempDir() - cloneURL, _ := url.Parse(fmt.Sprintf("%suser5/%s.git", u.String(), repo.Name)) - cloneURL.User = url.UserPassword("user5", userPassword) + cloneURL, _ := url.Parse(fmt.Sprintf("%s%s.git", u.String(), repo.FullName())) + cloneURL.User = url.UserPassword(owner.Name, userPassword) require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) doGitSetRemoteURL(dstPath, "origin", cloneURL)(t) @@ -71,13 +59,13 @@ func TestPullRemoveAutomerge(t *testing.T) { require.NoError(t, git.NewCommand(t.Context(), "push", "origin", "HEAD:refs/for/main", "-o", "topic=new-fun-fact").Run(&git.RunOpts{Dir: dstPath})) // Create a protected branch rule for automerge. - user5Session.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/settings/branches/edit", repo.FullName()), map[string]string{ + ownerSession.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/settings/branches/edit", repo.FullName()), map[string]string{ "rule_name": "main", "required_approvals": "1", }), http.StatusSeeOther) // Start a automerge for new pull request. - user5Session.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/merge", repo.FullName()), map[string]string{ + ownerSession.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/merge", repo.FullName()), map[string]string{ "merge_message_field": "I love automation when it works", "do": "merge", "merge_when_checks_succeed": "true", @@ -86,9 +74,12 @@ func TestPullRemoveAutomerge(t *testing.T) { t.Run("No permission", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - user2Session.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/cancel_auto_merge", repo.FullName()), nil), http.StatusSeeOther) + otherUser := forgery.CreateUser(t, nil) + otherSession := loginUser(t, otherUser.Name) - flashCookie := user2Session.GetCookie(app_context.CookieNameFlash) + otherSession.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/cancel_auto_merge", repo.FullName()), nil), http.StatusSeeOther) + + flashCookie := otherSession.GetCookie(app_context.CookieNameFlash) assert.NotNil(t, flashCookie) assert.Equal(t, "error%3DYou%2Bdo%2Bnot%2Bhave%2Bpermission%2Bto%2Bcancel%2Bthis%2Bpull%2Brequest%2527s%2Bauto%2Bmerge.", flashCookie.Value) }) @@ -96,9 +87,9 @@ func TestPullRemoveAutomerge(t *testing.T) { t.Run("Normal", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - user5Session.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/cancel_auto_merge", repo.FullName()), nil), http.StatusSeeOther) + ownerSession.MakeRequest(t, NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/pulls/1/cancel_auto_merge", repo.FullName()), nil), http.StatusSeeOther) - flashCookie := user5Session.GetCookie(app_context.CookieNameFlash) + flashCookie := ownerSession.GetCookie(app_context.CookieNameFlash) assert.NotNil(t, flashCookie) assert.Equal(t, "success%3DThe%2Bauto%2Bmerge%2Bwas%2Bcanceled%2Bfor%2Bthis%2Bpull%2Brequest.", flashCookie.Value) }) diff --git a/tests/integration/pull_create_test.go b/tests/integration/pull_create_test.go index f1ef88ec47..b63cdc2cd6 100644 --- a/tests/integration/pull_create_test.go +++ b/tests/integration/pull_create_test.go @@ -27,6 +27,7 @@ import ( repo_service "forgejo.org/services/repository" files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -146,21 +147,17 @@ func TestPullCreateWithPullTemplate(t *testing.T) { "docs/PULL_REQUEST_TEMPLATE.md", } - createBaseRepo := func(t *testing.T, templateFiles []string, message string) (*repo_model.Repository, func()) { + createBaseRepo := func(t *testing.T, templateFiles []string, message string) *repo_model.Repository { t.Helper() - changeOps := make([]*files_service.ChangeRepoFile, len(templateFiles)) - for i, template := range templateFiles { - changeOps[i] = &files_service.ChangeRepoFile{ - Operation: "create", - TreePath: template, - ContentReader: strings.NewReader(message + " " + template), - } + files := make(forgery.MapFS, len(templateFiles)) + for _, template := range templateFiles { + files[template] = forgery.MapFile(message + " " + template) } - repo, _, deferrer := tests.CreateDeclarativeRepo(t, baseUser, "", nil, nil, changeOps) - - return repo, deferrer + return forgery.CreateRepository(t, baseUser, &forgery.CreateRepositoryOptions{ + Files: files, + }) } testPullPreview := func(t *testing.T, session *TestSession, user, repo, message string) { @@ -190,8 +187,7 @@ func TestPullCreateWithPullTemplate(t *testing.T) { // Create the base repository, with the pull request template added. message := fmt.Sprintf("TestPullCreateWithPullTemplate/%s", template) - baseRepo, deferrer := createBaseRepo(t, []string{template}, message) - defer deferrer() + baseRepo := createBaseRepo(t, []string{template}, message) // Fork the repository session := loginUser(t, forkUser.Name) @@ -211,8 +207,7 @@ func TestPullCreateWithPullTemplate(t *testing.T) { // Create the base repository, with the pull request template added. message := "TestPullCreateWithPullTemplate/multiple" - baseRepo, deferrer := createBaseRepo(t, templateCandidates, message) - defer deferrer() + baseRepo := createBaseRepo(t, templateCandidates, message) // Fork the repository session := loginUser(t, forkUser.Name) diff --git a/tests/integration/pull_diff_test.go b/tests/integration/pull_diff_test.go index aca826d4ab..ba3822a1b1 100644 --- a/tests/integration/pull_diff_test.go +++ b/tests/integration/pull_diff_test.go @@ -9,17 +9,15 @@ import ( "net/url" "os" "path" - "strings" "testing" "time" issues_model "forgejo.org/models/issues" unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/git" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -70,28 +68,21 @@ func doTestPRDiff(t *testing.T, prDiffURL string, expectedFilenames []string, ed func TestPullDiff_AGitNotEditable(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - // Create temporary repository. - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "myrepo", - []unit_model.Type{unit_model.TypePullRequests}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "FUNFACT", - ContentReader: strings.NewReader("Smithy was the runner up to be Forgejo's name"), - }, - }, - ) - defer f() + repo := forgery.CreateRepository(t, nil, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypePullRequests) + + user := repo.Owner + session := loginUser(t, user.Name) clone := func(t *testing.T, clone string) string { t.Helper() dstPath := t.TempDir() cloneURL, _ := url.Parse(clone) - cloneURL.User = url.UserPassword("user2", userPassword) + cloneURL.User = url.UserPassword(user.Name, userPassword) require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) doGitSetRemoteURL(dstPath, "origin", cloneURL)(t) @@ -117,7 +108,7 @@ func TestPullDiff_AGitNotEditable(t *testing.T) { Message: "Add README.", })) } - dstPath := clone(t, fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name)) + dstPath := clone(t, fmt.Sprintf("%s%s.git", u.String(), repo.FullName())) // Create first commit. firstCommit(t, dstPath) diff --git a/tests/integration/pull_icon_test.go b/tests/integration/pull_icon_test.go index fbd87a7234..3ecd06c2ae 100644 --- a/tests/integration/pull_icon_test.go +++ b/tests/integration/pull_icon_test.go @@ -16,13 +16,13 @@ import ( issues_model "forgejo.org/models/issues" repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/git" issue_service "forgejo.org/services/issue" pull_service "forgejo.org/services/pull" files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -31,11 +31,13 @@ import ( func TestPullRequestIcons(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - repo, _, f := tests.CreateDeclarativeRepo(t, user, "pr-icons", []unit_model.Type{unit_model.TypeCode, unit_model.TypePullRequests}, nil, nil) - defer f() + repo := forgery.CreateRepository(t, nil, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode, unit_model.TypePullRequests) - session := loginUser(t, user.LoginName) + user := repo.Owner + session := loginUser(t, user.Name) // Individual PRs t.Run("Open", func(t *testing.T) { diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 14399fc936..03f44a7a1c 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -49,6 +49,7 @@ import ( commitstatus_service "forgejo.org/services/repository/commitstatus" webhook_service "forgejo.org/services/webhook" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/hashicorp/go-version" "github.com/stretchr/testify/assert" @@ -1269,8 +1270,9 @@ func TestMergeConcurrency(t *testing.T) { // been run up to 50 without errors. concurrentCount := 5 - repo, _, deferrer := tests.CreateDeclarativeRepo(t, user2, "concurrency-test", nil, nil, nil) - defer deferrer() + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) // Create labels for the PRs... labelNames := []string{"bug", "super-important", "tricky", "deadlock"} @@ -1395,8 +1397,9 @@ func TestMergeHTTPRequestCancellation(t *testing.T) { measuredMergeTime := 283 * time.Millisecond // time measured on a test system for one POST /%s/%s/pulls/%d/merge cancellationDuration := measuredMergeTime / time.Duration(cancellationChecks) // cancel after (i+1) * cancellationDuration for each PR - repo, _, deferrer := tests.CreateDeclarativeRepo(t, user2, "concurrency-test", nil, nil, nil) - defer deferrer() + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) bulkCreatePRs(t, cancellationChecks, repo, token, nil, 0) diff --git a/tests/integration/pull_reopen_test.go b/tests/integration/pull_reopen_test.go index 9e9121a41d..e964ec9003 100644 --- a/tests/integration/pull_reopen_test.go +++ b/tests/integration/pull_reopen_test.go @@ -26,6 +26,7 @@ import ( repo_service "forgejo.org/services/repository" files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -36,11 +37,11 @@ func TestPullrequestReopen(t *testing.T) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26}) - // Create an base repository. - baseRepo, _, f := tests.CreateDeclarativeRepo(t, user2, "reopen-base", - []unit_model.Type{unit_model.TypePullRequests}, nil, nil, - ) - defer f() + // Create an base repository with an initial commit. + baseRepo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) + forgery.EnableRepoUnits(t, baseRepo, unit_model.TypePullRequests) // Create a new branch on the base branch, so it can be deleted later. _, err := files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, user2, &files_service.ChangeRepoFilesOptions{ diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 3c0f4344f1..5af45f8180 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -105,14 +105,12 @@ func TestPullView_SelfReviewNotification(t *testing.T) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "test_reviewer", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\n"), + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "README.md": forgery.MapFile("# Hello Reviewer\n"), + "CODEOWNERS": forgery.MapFile("README.md @user5\n"), }, }) - defer f() // we need to add user1 as collaborator so it can be added as reviewer err := repo_module.AddCollaborator(db.DefaultContext, repo, user1) @@ -125,7 +123,7 @@ func TestPullView_SelfReviewNotification(t *testing.T) { require.NoError(t, err) // Create a pull request. - resp := testPullCreate(t, user2Session, "user2", "test_reviewer", false, repo.DefaultBranch, "codeowner-basebranch", "Test Pull Request") + resp := testPullCreate(t, user2Session, "user2", repo.Name, false, repo.DefaultBranch, "codeowner-basebranch", "Test Pull Request") prURL := test.RedirectURL(resp) elem := strings.Split(prURL, "/") assert.Equal(t, "pulls", elem[3]) @@ -361,14 +359,12 @@ func TestPullView_CodeOwner(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "test_codeowner", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\n"), + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "README.md": forgery.MapFile("# Hello CodeOwner\n"), + "CODEOWNERS": forgery.MapFile("README.md @user5\n"), }, }) - defer f() t.Run("First Pull Request", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -381,7 +377,7 @@ func TestPullView_CodeOwner(t *testing.T) { // Create a pull request. session := loginUser(t, "user2") - testPullCreate(t, session, "user2", "test_codeowner", false, repo.DefaultBranch, "codeowner-basebranch", "Test Pull Request") + testPullCreate(t, session, "user2", repo.Name, false, repo.DefaultBranch, "codeowner-basebranch", "Test Pull Request") pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadRepoID: repo.ID, HeadBranch: "codeowner-basebranch"}) unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) @@ -417,7 +413,7 @@ func TestPullView_CodeOwner(t *testing.T) { // Create a pull request. session := loginUser(t, "user2") - testPullCreate(t, session, "user2", "test_codeowner", false, repo.DefaultBranch, "codeowner-basebranch2", "Test Pull Request2") + testPullCreate(t, session, "user2", repo.Name, false, repo.DefaultBranch, "codeowner-basebranch2", "Test Pull Request2") pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{BaseRepoID: repo.ID, HeadBranch: "codeowner-basebranch2"}) unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 8}) @@ -819,17 +815,12 @@ func TestPullRequestStaleReview(t *testing.T) { session := loginUser(t, user2.Name) // Create temporary repository. - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypePullRequests}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "FUNFACT", - ContentReader: strings.NewReader("Smithy was the runner up to be Forgejo's name"), - }, + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "FUNFACT": forgery.MapFile("Smithy was the runner up to be Forgejo's name"), }, - ) - defer f() + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypePullRequests) clone := func(t *testing.T, clone string) string { t.Helper() diff --git a/tests/integration/pull_update_test.go b/tests/integration/pull_update_test.go index d013dfeb95..cdbbbc5f81 100644 --- a/tests/integration/pull_update_test.go +++ b/tests/integration/pull_update_test.go @@ -24,7 +24,7 @@ import ( pull_service "forgejo.org/services/pull" repo_service "forgejo.org/services/repository" files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -133,10 +133,9 @@ func TestAPIPullUpdateBranchProtection(t *testing.T) { func TestAPIPullAllowMaintainerEditRestrictedHead(t *testing.T) { onApplicationRun(t, func(t *testing.T, giteaURL *url.URL) { - baseRepoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - - realBaseRepo, _, cleanup := tests.CreateDeclarativeRepo(t, baseRepoOwner, "base-repo", nil, nil, nil) - defer cleanup() + realBaseRepo := forgery.CreateRepository(t, nil, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, // ensure an initial commit is present + }) forkUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) forkRepo, err := repo_service.ForkRepositoryAndUpdates(t.Context(), forkUser, forkUser, repo_service.ForkRepoOptions{ @@ -332,7 +331,9 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User, baseRepoOwn baseRepoOwner = baseRepoOwnerOption[0] } - baseRepo, _, _ := tests.CreateDeclarativeRepo(t, baseRepoOwner, "repo-pr-update", nil, nil, nil) + baseRepo := forgery.CreateRepository(t, baseRepoOwner, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, // ensure an initial commit is present + }) headRepo, err := repo_service.ForkRepositoryAndUpdates(git.DefaultContext, actor, forkOrg, repo_service.ForkRepoOptions{ BaseRepo: baseRepo, diff --git a/tests/integration/repo_activity_test.go b/tests/integration/repo_activity_test.go index e30f92daa3..0386498100 100644 --- a/tests/integration/repo_activity_test.go +++ b/tests/integration/repo_activity_test.go @@ -16,11 +16,10 @@ import ( "forgejo.org/models/db" repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/test" repo_service "forgejo.org/services/repository" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -105,7 +104,7 @@ func TestRepoActivity(t *testing.T) { func TestRepoActivityAllUnitsDisabled(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) unit_model.LoadUnitConfig() @@ -135,7 +134,7 @@ func TestRepoActivityAllUnitsDisabled(t *testing.T) { func TestRepoActivityOnlyCodeUnitWithEmptyRepo(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) unit_model.LoadUnitConfig() @@ -168,14 +167,17 @@ func TestRepoActivityOnlyCodeUnitWithEmptyRepo(t *testing.T) { func TestRepoActivityOnlyCodeUnitWithNonEmptyRepo(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) unit_model.LoadUnitConfig() // Create a repo, with only code unit enabled. - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit_model.Type{unit_model.TypeCode}, nil, nil) - defer f() + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) + forgery.DisableRepoUnits(t, repo, unit_model.AllRepoUnitTypes...) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode) req := NewRequest(t, "GET", fmt.Sprintf("%s/activity", repo.Link())) session.MakeRequest(t, req, http.StatusOK) @@ -191,7 +193,7 @@ func TestRepoActivityOnlyCodeUnitWithNonEmptyRepo(t *testing.T) { func TestRepoActivityOnlyIssuesUnit(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) unit_model.LoadUnitConfig() diff --git a/tests/integration/repo_archive_text_test.go b/tests/integration/repo_archive_text_test.go index 5a76e1e47b..86b4b587ac 100644 --- a/tests/integration/repo_archive_text_test.go +++ b/tests/integration/repo_archive_text_test.go @@ -6,14 +6,11 @@ package integration import ( "net/http" "net/url" - "path" "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/translation" - "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -21,16 +18,11 @@ import ( func TestArchiveText(t *testing.T) { onApplicationRun(t, func(t *testing.T, giteaURL *url.URL) { - testUser := "user2" - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: testUser}) - session := loginUser(t, testUser) - testRepoName := "archived_repo" tr := translation.NewLocale("en-US") - link := path.Join(testUser, testRepoName, "settings") - // Create test repo - _, _, f := tests.CreateDeclarativeRepo(t, user2, testRepoName, nil, nil, nil) - defer f() + repo := forgery.CreateRepository(t, nil, nil) + session := loginUser(t, repo.Owner.Name) + link := repo.HTMLURL() + "/settings" // Test settings page req := NewRequest(t, "GET", link) diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go index e4a62d8cfc..a749d519dc 100644 --- a/tests/integration/repo_badges_test.go +++ b/tests/integration/repo_badges_test.go @@ -9,22 +9,17 @@ import ( "net/http" "net/http/httptest" "net/url" - "strings" "testing" - actions_model "forgejo.org/models/actions" auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/git" "forgejo.org/modules/setting" "forgejo.org/modules/test" "forgejo.org/routers" "forgejo.org/services/release" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -32,34 +27,7 @@ import ( func TestBadges(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - prep := func(t *testing.T) (*repo_model.Repository, func()) { - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - repo, _, f := tests.CreateDeclarativeRepo(t, owner, "", - []unit_model.Type{unit_model.TypeActions, unit_model.TypeReleases}, - []unit_model.Type{unit_model.TypeIssues, unit_model.TypePullRequests}, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".gitea/workflows/pr.yml", - ContentReader: strings.NewReader("name: pr\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), - }, - { - Operation: "create", - TreePath: ".gitea/workflows/self-test.yaml", - ContentReader: strings.NewReader("name: self-test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), - }, - { - Operation: "create", - TreePath: ".gitea/workflows/tag-test.yaml", - ContentReader: strings.NewReader("name: tags\non:\n push:\n tags: '*'\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), - }, - }, - ) - assert.Equal(t, 2, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) - - return repo, f - } + user := forgery.CreateUser(t, nil) assertBadge := func(t *testing.T, resp *httptest.ResponseRecorder, badge string) { t.Helper() @@ -69,8 +37,6 @@ func TestBadges(t *testing.T) { t.Run("Workflows", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := prep(t) - defer f() // Actions disabled req := NewRequest(t, "GET", "/user2/repo1/badges/workflows/test.yaml/badge.svg") @@ -82,41 +48,49 @@ func TestBadges(t *testing.T) { assertBadge(t, resp, "test.yaml-Not%20found-crimson") // Actions enabled - req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg", repo.Name) + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + ".gitea/workflows/pr.yml": forgery.MapFile("name: pr\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + ".gitea/workflows/self-test.yaml": forgery.MapFile("name: self-test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + ".gitea/workflows/tag-test.yaml": forgery.MapFile("name: tags\non:\n push:\n tags: '*'\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + }, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypeActions) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/workflows/pr.yml/badge.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?branch=main", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/workflows/pr.yml/badge.svg?branch=main") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?branch=no-such-branch", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/workflows/pr.yml/badge.svg?branch=no-such-branch") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?event=cron", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/workflows/pr.yml/badge.svg?event=cron") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-Not%20found-crimson") // Workflow with a dash in its name - req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/self-test.yaml/badge.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/workflows/self-test.yaml/badge.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "self--test.yaml-waiting-lightgrey") // GitHub compatibility - req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/pr.yml/badge.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?branch=main", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/pr.yml/badge.svg?branch=main") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?branch=no-such-branch", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/pr.yml/badge.svg?branch=no-such-branch") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?event=cron", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/pr.yml/badge.svg?event=cron") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pr.yml-Not%20found-crimson") @@ -124,17 +98,16 @@ func TestBadges(t *testing.T) { defer tests.PrintCurrentTest(t)() // With no tags, the workflow has no runs, and isn't found - req := NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name) + req := NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/tag-test.yaml/badge.svg") resp := MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "tag--test.yaml-Not%20found-crimson") // Lets create a tag! - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - err := release.CreateNewTag(git.DefaultContext, owner, repo, "main", "v1", "message") + err := release.CreateNewTag(git.DefaultContext, repo.Owner, repo, "main", "v1", "message") require.NoError(t, err) // Now the workflow is waiting - req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/actions/workflows/tag-test.yaml/badge.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "tag--test.yaml-waiting-lightgrey") }) @@ -143,7 +116,8 @@ func TestBadges(t *testing.T) { t.Run("Stars", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", "/user2/repo1/badges/stars.svg") + repo := forgery.CreateRepository(t, user, nil) + req := NewRequest(t, "GET", repo.HTMLURL()+"/badges/stars.svg") resp := MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "stars-0-blue") @@ -159,8 +133,6 @@ func TestBadges(t *testing.T) { t.Run("Issues", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := prep(t) - defer f() // Issues enabled req := NewRequest(t, "GET", "/user2/repo1/badges/issues.svg") @@ -176,23 +148,23 @@ func TestBadges(t *testing.T) { assertBadge(t, resp, "issues-1%20closed-blue") // Issues disabled - req = NewRequestf(t, "GET", "/user2/%s/badges/issues.svg", repo.Name) + repo := forgery.CreateRepository(t, user, nil) + forgery.DisableRepoUnits(t, repo, unit_model.TypeIssues) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/issues.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "issues-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/badges/issues/open.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/issues/open.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "issues-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/badges/issues/closed.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/issues/closed.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "issues-Not%20found-crimson") }) t.Run("Pulls", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := prep(t) - defer f() // Pull requests enabled req := NewRequest(t, "GET", "/user2/repo1/badges/pulls.svg") @@ -208,29 +180,32 @@ func TestBadges(t *testing.T) { assertBadge(t, resp, "pulls-0%20closed-blue") // Pull requests disabled - req = NewRequestf(t, "GET", "/user2/%s/badges/pulls.svg", repo.Name) + repo := forgery.CreateRepository(t, user, nil) + forgery.DisableRepoUnits(t, repo, unit_model.TypePullRequests) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/pulls.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pulls-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/badges/pulls/open.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/pulls/open.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pulls-Not%20found-crimson") - req = NewRequestf(t, "GET", "/user2/%s/badges/pulls/closed.svg", repo.Name) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/pulls/closed.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "pulls-Not%20found-crimson") }) t.Run("Release", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := prep(t) - defer f() req := NewRequest(t, "GET", "/user2/repo1/badges/release.svg") resp := MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "release-v1.1-blue") - req = NewRequestf(t, "GET", "/user2/%s/badges/release.svg", repo.Name) + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, // a tag will be made later + }) + req = NewRequest(t, "GET", repo.HTMLURL()+"/badges/release.svg") resp = MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "release-Not%20found-crimson") @@ -243,7 +218,7 @@ func TestBadges(t *testing.T) { require.NoError(t, err) createNewReleaseUsingAPI(t, token, repo.Owner, repo, "repo-name-2.0", "main", "dashed release", "dashed release") - req := NewRequestf(t, "GET", "/user2/%s/badges/release.svg", repo.Name) + req := NewRequest(t, "GET", repo.HTMLURL()+"/badges/release.svg") resp := MakeRequest(t, req, http.StatusSeeOther) assertBadge(t, resp, "release-repo--name--2.0-blue") }) diff --git a/tests/integration/repo_citation_test.go b/tests/integration/repo_citation_test.go index 7925966f4f..aac4133352 100644 --- a/tests/integration/repo_citation_test.go +++ b/tests/integration/repo_citation_test.go @@ -10,53 +10,57 @@ import ( "testing" repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" ) func TestCitation(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - - session := loginUser(t, user.LoginName) + user := forgery.CreateUser(t, nil) t.Run("No citation", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, _, f := tests.CreateDeclarativeRepo(t, user, "citation-no-citation", []unit_model.Type{unit_model.TypeCode}, nil, nil) - defer f() + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "README": forgery.MapFile("no citation file"), + }, + }) - testCitationButtonExists(t, session, repo, "") + testCitationButtonExists(t, repo, "") }) t.Run("cff citation", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := createRepoWithDummyFile(t, user, "citation-cff", "CITATION.cff") - defer f() + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "CITATION.cff": forgery.MapFile("some content"), + }, + }) - testCitationButtonExists(t, session, repo, "CITATION.cff") + testCitationButtonExists(t, repo, "CITATION.cff") }) t.Run("bib citation", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - repo, f := createRepoWithDummyFile(t, user, "citation-bib", "CITATION.bib") - defer f() + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "CITATION.bib": forgery.MapFile("some content"), + }, + }) - testCitationButtonExists(t, session, repo, "CITATION.bib") + testCitationButtonExists(t, repo, "CITATION.bib") }) }) } -func testCitationButtonExists(t *testing.T, session *TestSession, repo *repo_model.Repository, file string) { +func testCitationButtonExists(t *testing.T, repo *repo_model.Repository, file string) { req := NewRequest(t, "GET", repo.HTMLURL()) - resp := session.MakeRequest(t, req, http.StatusOK) + resp := MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) links := doc.Find("a.citation-link") @@ -72,19 +76,7 @@ func testCitationButtonExists(t *testing.T, session *TestSession, repo *repo_mod // request the citation file to check for webcomponent presence req = NewRequest(t, "GET", href) - resp = session.MakeRequest(t, req, http.StatusOK) + resp = MakeRequest(t, req, http.StatusOK) doc = NewHTMLParser(t, resp.Body) doc.AssertElement(t, `lazy-webc[tag="citation-information"]`, true) } - -func createRepoWithDummyFile(t *testing.T, user *user_model.User, repoName, fileName string) (*repo_model.Repository, func()) { - repo, _, f := tests.CreateDeclarativeRepo(t, user, repoName, []unit_model.Type{unit_model.TypeCode}, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: fileName, - ContentReader: strings.NewReader("citation-content"), // viewer requires some content - }, - }) - - return repo, f -} diff --git a/tests/integration/repo_issue_title_test.go b/tests/integration/repo_issue_title_test.go index 385c02bf38..7951988bb7 100644 --- a/tests/integration/repo_issue_title_test.go +++ b/tests/integration/repo_issue_title_test.go @@ -13,13 +13,13 @@ import ( "forgejo.org/models/db" issues_model "forgejo.org/models/issues" repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/modules/git" issue_service "forgejo.org/services/issue" pull_service "forgejo.org/services/pull" files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,11 +27,12 @@ import ( func TestIssueTitles(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - repo, _, f := tests.CreateDeclarativeRepo(t, user, "issue-titles", nil, nil, nil) - defer f() + user := forgery.CreateUser(t, nil) + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) - session := loginUser(t, user.LoginName) + session := loginUser(t, user.Name) title := "Title :+1: `code :+1:`" issue1 := createIssue(t, user, repo, title, "Test issue") diff --git a/tests/integration/repo_settings_test.go b/tests/integration/repo_settings_test.go index 1e164563d8..96304f07ae 100644 --- a/tests/integration/repo_settings_test.go +++ b/tests/integration/repo_settings_test.go @@ -14,13 +14,13 @@ import ( unit_model "forgejo.org/models/unit" unit_tests "forgejo.org/models/unit/tests" "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/optional" "forgejo.org/modules/setting" app_context "forgejo.org/services/context" repo_service "forgejo.org/services/repository" user_service "forgejo.org/services/user" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -29,9 +29,8 @@ import ( func TestRepoSettingsUnits(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, Name: "repo1"}) - session := loginUser(t, user.Name) + repo := forgery.CreateRepository(t, nil, nil) + session := loginUser(t, repo.Owner.Name) req := NewRequest(t, "GET", fmt.Sprintf("%s/settings/units", repo.Link())) session.MakeRequest(t, req, http.StatusOK) @@ -40,11 +39,14 @@ func TestRepoSettingsUnits(t *testing.T) { func TestRepoSettingsAdminOptions(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) - admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{IsAdmin: true}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, Name: "repo1"}) + user := forgery.CreateUser(t, nil) + repo := forgery.CreateRepository(t, user, nil) link := repo.Link() + admin := forgery.CreateUser(t, &forgery.CreateUserOptions{ + IsAdmin: true, + }) + hasAdminOpts := func(t *testing.T, doer string, admin bool) { session := loginUser(t, doer) @@ -80,7 +82,7 @@ func TestRepoSettingsAdminOptions(t *testing.T) { func TestRepoAddMoreUnitsHighlighting(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) // Make sure there are no disabled repos in the settings! @@ -88,15 +90,16 @@ func TestRepoAddMoreUnitsHighlighting(t *testing.T) { unit_model.LoadUnitConfig() // Create a known-good repo, with some units disabled. - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit_model.Type{ + repo := forgery.CreateRepository(t, user, nil) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode, unit_model.TypePullRequests, unit_model.TypeProjects, unit_model.TypeActions, unit_model.TypeIssues, unit_model.TypeWiki, - }, []unit_model.Type{unit_model.TypePackages}, nil) - defer f() + ) + forgery.DisableRepoUnits(t, repo, unit_model.TypePackages) setUserHints := func(t *testing.T, hints bool) func() { saved := user.EnableRepoUnitHints @@ -171,7 +174,7 @@ func TestRepoAddMoreUnitsHighlighting(t *testing.T) { func TestRepoAddMoreUnits(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) + user := forgery.CreateUser(t, nil) session := loginUser(t, user.Name) // Make sure there are no disabled repos in the settings! @@ -179,7 +182,8 @@ func TestRepoAddMoreUnits(t *testing.T) { unit_model.LoadUnitConfig() // Create a known-good repo, with all units enabled. - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit_model.Type{ + repo := forgery.CreateRepository(t, user, nil) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode, unit_model.TypePullRequests, unit_model.TypeProjects, @@ -187,8 +191,7 @@ func TestRepoAddMoreUnits(t *testing.T) { unit_model.TypeActions, unit_model.TypeIssues, unit_model.TypeWiki, - }, nil, nil) - defer f() + ) assertAddMore := func(t *testing.T, present bool) { t.Helper() @@ -268,8 +271,10 @@ func TestRepoAddMoreUnits(t *testing.T) { func TestProtectedBranch(t *testing.T) { defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) + user := forgery.CreateUser(t, nil) + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) session := loginUser(t, user.Name) t.Run("Add", func(t *testing.T) { diff --git a/tests/integration/repo_signed_tag_test.go b/tests/integration/repo_signed_tag_test.go index 0ef256ef5f..8e10b0aa4b 100644 --- a/tests/integration/repo_signed_tag_test.go +++ b/tests/integration/repo_signed_tag_test.go @@ -12,14 +12,13 @@ import ( auth_model "forgejo.org/models/auth" "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/git" "forgejo.org/modules/gitrepo" "forgejo.org/modules/graceful" repo_module "forgejo.org/modules/repository" api "forgejo.org/modules/structs" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/require" ) @@ -28,9 +27,10 @@ func TestRepoSSHSignedTags(t *testing.T) { defer tests.PrepareTestEnv(t)() // Preparations - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", nil, nil, nil) - defer f() + user := forgery.CreateUser(t, nil) + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, // ensure that an initial commit is present (even though the git server is not listening) + }) // Set up an SSH key for the tagger tmpDir := t.TempDir() diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 16dc7cd483..26487e3470 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -617,19 +617,15 @@ func TestRenamedFileHistory(t *testing.T) { t.Run("Renamed file (with escaped name)", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user2 := forgery.CreateUser(t, nil) - repo, commitID, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypeCode}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "#beep", - ContentReader: strings.NewReader("ping pong"), - }, + var commitID string + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "#beep": forgery.MapFile("ping pong"), }, - ) - defer f() + LatestSha: &commitID, + }) files, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{ @@ -794,7 +790,7 @@ func TestViewCommitSignature(t *testing.T) { // Ensure the git config is updated with the new signing format. require.NoError(t, git.InitFull(t.Context())) - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user := forgery.CreateUser(t, nil) testCtx := NewAPITestContext(t, user.Name, "commit-header-signed", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) u.Path = testCtx.GitPath() @@ -993,47 +989,19 @@ func TestRepoFilesList(t *testing.T) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // create the repo - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypeCode}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "zEta", - ContentReader: strings.NewReader("zeta"), - }, - { - Operation: "create", - TreePath: "licensa", - ContentReader: strings.NewReader("licensa"), - }, - { - Operation: "create", - TreePath: "licensz", - ContentReader: strings.NewReader("licensz"), - }, - { - Operation: "create", - TreePath: "delta", - ContentReader: strings.NewReader("delta"), - }, - { - Operation: "create", - TreePath: "Charlie/aa.txt", - ContentReader: strings.NewReader("charlie"), - }, - { - Operation: "create", - TreePath: "Beta", - ContentReader: strings.NewReader("beta"), - }, - { - Operation: "create", - TreePath: "alpha", - ContentReader: strings.NewReader("alpha"), - }, + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "zEta": forgery.MapFile("zeta"), + "licensa": forgery.MapFile("licensa"), + "LICENSE": forgery.MapFile("LICENSE"), + "licensz": forgery.MapFile("licensz"), + "delta": forgery.MapFile("delta"), + "Charlie/aa.txt": forgery.MapFile("charlie"), + "Beta": forgery.MapFile("beta"), + "alpha": forgery.MapFile("alpha"), + "README.md": forgery.MapFile("README.md"), }, - ) - defer f() + }) req := NewRequest(t, "GET", "/"+repo.FullName()) resp := MakeRequest(t, req, http.StatusOK) @@ -1223,8 +1191,11 @@ func TestRepoSubmoduleView(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) t.Run("FromGit", func(t *testing.T) { - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", []unit_model.Type{unit_model.TypeCode}, nil, nil) - defer f() + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "README.md": forgery.MapFile("some explanation"), // file is expected in doGitClone + }, + }) // Clone the repository, add a submodule and push it. dstPath := t.TempDir() @@ -1262,24 +1233,15 @@ func TestRepoSubmoduleView(t *testing.T) { }) t.Run("Declarative", func(t *testing.T) { - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", []unit_model.Type{unit_model.TypeCode}, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".gitmodules", - ContentReader: strings.NewReader(`[submodule "relative-module"] + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + ".gitmodules": forgery.MapFile(`[submodule "relative-module"] path = relative-module url = https://git.example.org/submodule.git `), - }, { - Operation: "create", - TreePath: "relative-module", - FromTreePath: "", - ContentReader: nil, - SHA: "95601d16476a", - Options: files_service.RepoFileOptionMode(git.EntryModeCommit), + "relative-module": forgery.MapSubmodule("95601d16476a"), }, }) - defer f() // Check that the submodule entry exist and the link is correct. req := NewRequest(t, "GET", "/"+repo.FullName()) @@ -1300,26 +1262,17 @@ func TestRepoSubmoduleView(t *testing.T) { }) t.Run("SubmodulesFileTooBig", func(t *testing.T) { - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "", []unit_model.Type{unit_model.TypeCode}, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".gitmodules", - ContentReader: strings.NewReader(strings.Repeat("#", git.MaxGitmodulesFileSize-5) + // ensure that the partial read is invalid + repo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + ".gitmodules": forgery.MapFile(strings.Repeat("#", git.MaxGitmodulesFileSize-5) + // ensure that the partial read is invalid ` [submodule "relative-module"] path = relative-module url = https://git.example.org/submodule.git `), - }, { - Operation: "create", - TreePath: "relative-module", - FromTreePath: "", - ContentReader: nil, - SHA: "95601d16476a", - Options: files_service.RepoFileOptionMode(git.EntryModeCommit), + "relative-module": forgery.MapSubmodule("95601d16476a"), }, }) - defer f() // Check that the submodule entry exist and the link is correct. req := NewRequest(t, "GET", "/"+repo.FullName()) diff --git a/tests/integration/repo_view_test.go b/tests/integration/repo_view_test.go index 74864765ea..9ff33e26d1 100644 --- a/tests/integration/repo_view_test.go +++ b/tests/integration/repo_view_test.go @@ -7,66 +7,49 @@ import ( "fmt" "net/http" "net/url" - "strings" "testing" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" user_model "forgejo.org/models/user" "forgejo.org/routers/web/repo" "forgejo.org/services/context" "forgejo.org/services/contexttest" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" ) -func createRepoAndGetContext(t *testing.T, files []string, deleteMdReadme bool) (*context.Context, func()) { +func createRepoAndGetContext(t *testing.T, user *user_model.User, filenames ...string) *context.Context { t.Helper() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"}) - - size := len(files) - if deleteMdReadme { - size++ - } - changeFiles := make([]*files_service.ChangeRepoFile, size) - for i, e := range files { - changeFiles[i] = &files_service.ChangeRepoFile{ - Operation: "create", - TreePath: e, - ContentReader: strings.NewReader("test"), + files := make(forgery.MapFS, len(filenames)) + for _, e := range filenames { + if _, ok := files[e]; ok { + t.Errorf("duplicated filename %q", e) } + files[e] = forgery.MapFile("some readme content") } - if deleteMdReadme { - changeFiles[len(files)] = &files_service.ChangeRepoFile{ - Operation: "delete", - TreePath: "README.md", - } - } - - // README.md is already added by auto init - repo, _, f := tests.CreateDeclarativeRepo(t, user, "readmetest", []unit_model.Type{unit_model.TypeCode}, nil, changeFiles) - - ctx, _ := contexttest.MockContext(t, "user1/readmetest") + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: files, + }) + ctx, _ := contexttest.MockContext(t, repo.FullName()) ctx.SetParams(":id", fmt.Sprint(repo.ID)) contexttest.LoadRepo(t, ctx, repo.ID) contexttest.LoadGitRepo(t, ctx) contexttest.LoadRepoCommit(t, ctx) - - return ctx, func() { - f() + t.Cleanup(func() { ctx.Repo.GitRepo.Close() - } + }) + + return ctx } func TestRepoView_FindReadme(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { + user := forgery.CreateUser(t, nil) t.Run("PrioOneLocalizedMdReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.en.md", "README.en.org", "README.org", "README.txt", "README.tex"}, false) - defer f() + ctx := createRepoAndGetContext(t, user, "README.en.md", "README.en.org", "README.org", "README.txt", "README.tex", "README.md") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -76,8 +59,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioTwoMdReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.en.org", "README.org", "README.txt", "README.tex"}, false) - defer f() + ctx := createRepoAndGetContext(t, user, "README.en.org", "README.org", "README.txt", "README.tex", "README.md") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -87,8 +69,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioThreeLocalizedOrgReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.en.org", "README.org", "README.txt", "README.tex"}, true) - defer f() + ctx := createRepoAndGetContext(t, user, "README.en.org", "README.org", "README.txt", "README.tex") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -98,8 +79,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioFourOrgReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.org", "README.txt", "README.tex"}, true) - defer f() + ctx := createRepoAndGetContext(t, user, "README.org", "README.txt", "README.tex") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -109,8 +89,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioFiveTxtReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.txt", "README", "README.tex"}, true) - defer f() + ctx := createRepoAndGetContext(t, user, "README.txt", "README", "README.tex") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -120,8 +99,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioSixWithoutExtensionReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README", "README.tex"}, true) - defer f() + ctx := createRepoAndGetContext(t, user, "README", "README.tex") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -131,8 +109,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("PrioSevenAnyReadme", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{"README.tex"}, true) - defer f() + ctx := createRepoAndGetContext(t, user, "README.tex") tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -142,8 +119,7 @@ func TestRepoView_FindReadme(t *testing.T) { }) t.Run("DoNotPickReadmeIfNonPresent", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - ctx, f := createRepoAndGetContext(t, []string{}, true) - defer f() + ctx := createRepoAndGetContext(t, user) tree, _ := ctx.Repo.Commit.SubTree(ctx.Repo.TreePath) entries, _ := tree.ListEntries() @@ -156,45 +132,17 @@ func TestRepoView_FindReadme(t *testing.T) { func TestRepoViewFileLines(t *testing.T) { onApplicationRun(t, func(t *testing.T, _ *url.URL) { - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepo(t, user, "file-lines", []unit_model.Type{unit_model.TypeCode}, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "test-1", - ContentReader: strings.NewReader("No newline"), - }, - { - Operation: "create", - TreePath: "test-2", - ContentReader: strings.NewReader("No newline\n"), - }, - { - Operation: "create", - TreePath: "test-3", - ContentReader: strings.NewReader("Two\nlines"), - }, - { - Operation: "create", - TreePath: "test-4", - ContentReader: strings.NewReader("Really two\nlines\n"), - }, - { - Operation: "create", - TreePath: "empty", - ContentReader: strings.NewReader(""), - }, - { - Operation: "create", - TreePath: "seemingly-empty", - ContentReader: strings.NewReader("\n"), - }, - { - Operation: "create", - TreePath: "CITATION.cff", - ContentReader: strings.NewReader(""), + repo := forgery.CreateRepository(t, nil, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "test-1": forgery.MapFile("No newline"), + "test-2": forgery.MapFile("No newline\n"), + "test-3": forgery.MapFile("Two\nlines"), + "test-4": forgery.MapFile("Really two\nlines\n"), + "empty": forgery.MapFile(""), + "seemingly-empty": forgery.MapFile("\n"), + "CITATION.cff": forgery.MapFile(""), }, }) - defer f() testEOL := func(t *testing.T, filename string, hasEOL bool) { t.Helper() diff --git a/tests/integration/translations_test.go b/tests/integration/translations_test.go index b65c9c2a67..ba2ca9af43 100644 --- a/tests/integration/translations_test.go +++ b/tests/integration/translations_test.go @@ -10,10 +10,7 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -22,35 +19,21 @@ import ( // TestDataSizeTranslation is a test for usage of TrSize in file size display func TestDataSizeTranslation(t *testing.T) { onApplicationRun(t, func(t *testing.T, giteaURL *url.URL) { - testUser := "user2" - testRepoName := "data_size_test" noDigits := regexp.MustCompile("[0-9]+") longString100 := `testRepoMigrate(t, session, "https://code.forgejo.org/forgejo/test_repo.git", testRepoName, struct)` + "\n" // Login user - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: testUser}) - session := loginUser(t, testUser) + user := forgery.CreateUser(t, nil) + session := loginUser(t, user.Name) // Create test repo - testRepo, _, f := tests.CreateDeclarativeRepo(t, user2, testRepoName, nil, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "137byteFile.txt", - ContentReader: strings.NewReader(longString100 + strings.Repeat("1", 36) + "\n"), - }, - { - Operation: "create", - TreePath: "1.5kibFile.txt", - ContentReader: strings.NewReader(strings.Repeat(longString100, 15) + strings.Repeat("1", 35) + "\n"), - }, - { - Operation: "create", - TreePath: "1.25mibFile.txt", - ContentReader: strings.NewReader(strings.Repeat(longString100, 13107) + strings.Repeat("1", 19) + "\n"), - }, - }) - defer f() + testRepo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "137byteFile.txt": forgery.MapFile(longString100 + strings.Repeat("1", 36) + "\n"), + "1.5kibFile.txt": forgery.MapFile(strings.Repeat(longString100, 15) + strings.Repeat("1", 35) + "\n"), + "1.25mibFile.txt": forgery.MapFile(strings.Repeat(longString100, 13107) + strings.Repeat("1", 19) + "\n"), + }, + }) // Change language from English to catch regressions that make translated sizes fall back to // not translated, like to raw output of FileSize() or humanize.IBytes() @@ -67,7 +50,7 @@ func TestDataSizeTranslation(t *testing.T) { assert.Positive(t, repos.Length()) repos.Each(func(i int, repo *goquery.Selection) { repoName := repo.Find("a.name").Text() - if repoName == path.Join(testUser, testRepo.Name) { + if repoName == path.Join(user.Name, testRepo.Name) { repoSize := repo.Find("span").Text() repoSize = noDigits.ReplaceAllString(repoSize, "") assert.Equal(t, " КиБ", repoSize) @@ -75,7 +58,7 @@ func TestDataSizeTranslation(t *testing.T) { }) // Go to /user2/repo1 - req = NewRequest(t, "GET", path.Join(testUser, testRepoName)) + req = NewRequest(t, "GET", path.Join(user.Name, testRepo.Name)) resp = session.MakeRequest(t, req, http.StatusOK) // Check if repo size in repo summary is translated @@ -91,9 +74,9 @@ func TestDataSizeTranslation(t *testing.T) { assert.Equal(t, "git: КиБ; lfs: Б", fullSize) // Check if file sizes are correctly translated - testFileSizeTranslated(t, session, path.Join(testUser, testRepoName, "src/branch/main/137byteFile.txt"), "137 Б") - testFileSizeTranslated(t, session, path.Join(testUser, testRepoName, "src/branch/main/1.5kibFile.txt"), "1,5 КиБ") - testFileSizeTranslated(t, session, path.Join(testUser, testRepoName, "src/branch/main/1.25mibFile.txt"), "1,3 МиБ") + testFileSizeTranslated(t, session, path.Join(user.Name, testRepo.Name, "src/branch/main/137byteFile.txt"), "137 Б") + testFileSizeTranslated(t, session, path.Join(user.Name, testRepo.Name, "src/branch/main/1.5kibFile.txt"), "1,5 КиБ") + testFileSizeTranslated(t, session, path.Join(user.Name, testRepo.Name, "src/branch/main/1.25mibFile.txt"), "1,3 МиБ") }) } diff --git a/tests/integration/user_dashboard_test.go b/tests/integration/user_dashboard_test.go index 03c0a0f164..1860ce41d0 100644 --- a/tests/integration/user_dashboard_test.go +++ b/tests/integration/user_dashboard_test.go @@ -7,18 +7,14 @@ import ( "net/http" "net/url" "strconv" - "strings" "testing" "forgejo.org/models/issues" - unit_model "forgejo.org/models/unit" "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/gitrepo" issue_service "forgejo.org/services/issue" pull_service "forgejo.org/services/pull" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -46,28 +42,23 @@ func testUserDashboardFeedType(t *testing.T, page *HTMLDoc, isEmpty bool) { func TestDashboardTitleRendering(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - sess := loginUser(t, user4.Name) + user := forgery.CreateUser(t, nil) + sess := loginUser(t, user.Name) - repo, _, f := tests.CreateDeclarativeRepo(t, user4, "", - []unit_model.Type{unit_model.TypePullRequests, unit_model.TypeIssues}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "test.txt", - ContentReader: strings.NewReader("Just some text here"), - }, + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "README.md": forgery.MapFile("some readme to update via the pull request"), + "test.txt": forgery.MapFile("Just some text here"), }, - ) - defer f() + }) - issue := createIssue(t, user4, repo, "`:exclamation:` not rendered #1", "Hi there!") - pr := createPullRequest(t, user4, repo, "testing", "`:exclamation:` not rendered #1") + issue := createIssue(t, user, repo, "`:exclamation:` not rendered #1", "Hi there!") + pr := createPullRequest(t, user, repo, "testing", "`:exclamation:` not rendered #1") - _, err := issue_service.CreateIssueComment(t.Context(), user4, repo, issue, "hi", nil) + _, err := issue_service.CreateIssueComment(t.Context(), user, repo, issue, "hi", nil) require.NoError(t, err) - _, err = issue_service.CreateIssueComment(t.Context(), user4, repo, pr.Issue, "hi", nil) + _, err = issue_service.CreateIssueComment(t.Context(), user, repo, pr.Issue, "hi", nil) require.NoError(t, err) testIssueClose(t, sess, repo.OwnerName, repo.Name, strconv.Itoa(int(issue.Index)), false) @@ -94,18 +85,16 @@ func TestDashboardTitleRendering(t *testing.T) { func TestDashboardActionEscaping(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - sess := loginUser(t, user4.Name) + user := forgery.CreateUser(t, nil) + sess := loginUser(t, user.Name) - repo, _, f := tests.CreateDeclarativeRepo(t, user4, "", - []unit_model.Type{unit_model.TypePullRequests, unit_model.TypeIssues}, nil, - []*files_service.ChangeRepoFile{}, - ) - defer f() + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) - issue := createIssue(t, user4, repo, "Issue with | in title", "Hey here's a | for you") + issue := createIssue(t, user, repo, "Issue with | in title", "Hey here's a | for you") - _, err := issue_service.CreateIssueComment(t.Context(), user4, repo, issue, "Comment with a | in it", nil) + _, err := issue_service.CreateIssueComment(t.Context(), user, repo, issue, "Comment with a | in it", nil) require.NoError(t, err) testIssueClose(t, sess, repo.OwnerName, repo.Name, strconv.Itoa(int(issue.Index)), false) @@ -129,23 +118,22 @@ func TestDashboardActionEscaping(t *testing.T) { func TestDashboardReviewWorkflows(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - sess := loginUser(t, user4.Name) + user := forgery.CreateUser(t, nil) + sess := loginUser(t, user.Name) + + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.FilesInit{}, + }) - repo, _, f := tests.CreateDeclarativeRepo(t, user4, "", - []unit_model.Type{unit_model.TypePullRequests, unit_model.TypeIssues}, nil, - []*files_service.ChangeRepoFile{}, - ) - defer f() gitRepo, err := gitrepo.OpenRepository(t.Context(), repo) require.NoError(t, err) - pr := createPullRequest(t, user4, repo, "testing", "My very first PR!") + pr := createPullRequest(t, user, repo, "testing", "My very first PR!") - review, _, err := pull_service.SubmitReview(t.Context(), user4, gitRepo, pr.Issue, issues.ReviewTypeReject, "This isn't good enough!", "HEAD", []string{}) + review, _, err := pull_service.SubmitReview(t.Context(), user, gitRepo, pr.Issue, issues.ReviewTypeReject, "This isn't good enough!", "HEAD", []string{}) require.NoError(t, err) - _, err = pull_service.DismissReview(t.Context(), review.ID, repo.ID, "Come on, give the newbie a break!", user4, true, true) + _, err = pull_service.DismissReview(t.Context(), review.ID, repo.ID, "Come on, give the newbie a break!", user, true, true) require.NoError(t, err) response := sess.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK) diff --git a/tests/integration/user_profile_test.go b/tests/integration/user_profile_test.go index 10f3ce6be6..12ee58a0d6 100644 --- a/tests/integration/user_profile_test.go +++ b/tests/integration/user_profile_test.go @@ -9,14 +9,12 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/git" "forgejo.org/modules/setting" "forgejo.org/modules/test" repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,36 +22,23 @@ import ( func TestUserProfile(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { + user := forgery.CreateUser(t, nil) checkReadme := func(t *testing.T, title, readmeFilename string, expectedCount int) { t.Run(title, func(t *testing.T) { defer tests.PrintCurrentTest(t)() // Prepare the test repository - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - var ops []*files_service.ChangeRepoFile - op := "create" - if readmeFilename != "README.md" { - ops = append(ops, &files_service.ChangeRepoFile{ - Operation: "delete", - TreePath: "README.md", - }) - } else { - op = "update" - } + files := forgery.MapFS{} if readmeFilename != "" { - ops = append(ops, &files_service.ChangeRepoFile{ - Operation: op, - TreePath: readmeFilename, - ContentReader: strings.NewReader("# Hi!\n"), - }) + files[readmeFilename] = forgery.MapFile("# Hi!\n") } - - _, _, f := tests.CreateDeclarativeRepo(t, user2, ".profile", nil, nil, ops) - defer f() + _ = forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Name: ".profile", + Files: files, + }) // Perform the test - req := NewRequest(t, "GET", "/user2") + req := NewRequest(t, "GET", "/"+user.Name) resp := MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) @@ -80,26 +65,21 @@ func TestUserProfile(t *testing.T) { t.Run("readme-size", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - // Prepare the test repository - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - _, _, f := tests.CreateDeclarativeRepo(t, user2, ".profile", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "update", - TreePath: "README.md", - ContentReader: strings.NewReader(`## Lorem ipsum + _ = forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Name: ".profile", + Files: forgery.MapFS{ + "README.md": forgery.MapFile(`## Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ## Ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum`), }, }) - defer f() t.Run("full", func(t *testing.T) { defer tests.PrintCurrentTest(t)() defer test.MockVariableValue(&setting.UI.MaxDisplayFileSize, 500)() - req := NewRequest(t, "GET", "/user2") + req := NewRequest(t, "GET", "/"+user.Name) resp := MakeRequest(t, req, http.StatusOK) assert.Contains(t, resp.Body.String(), "Ut enim ad minim veniam") assert.Contains(t, resp.Body.String(), "mollit anim id est laborum") @@ -109,7 +89,7 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequa defer tests.PrintCurrentTest(t)() defer test.MockVariableValue(&setting.UI.MaxDisplayFileSize, 146)() - req := NewRequest(t, "GET", "/user2") + req := NewRequest(t, "GET", "/"+user.Name) resp := MakeRequest(t, req, http.StatusOK) assert.Contains(t, resp.Body.String(), "Ut enim ad minim") assert.NotContains(t, resp.Body.String(), "veniam") @@ -119,49 +99,46 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequa t.Run("forked-profile-repo", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - // Create users - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) + // Create forking user + forkingUser := forgery.CreateUser(t, nil) - // Create original .profile repository for user2 - originalRepo, _, f1 := tests.CreateDeclarativeRepo(t, user2, ".profile", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "update", - TreePath: "README.md", - ContentReader: strings.NewReader("# Original Profile Content\nThis should show up on user2 profile."), + // Create original .profile repository + originalRepo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Name: ".profile", + Files: forgery.MapFS{ + "README.md": forgery.MapFile("# Original Profile Content\nThis should show up on user profile."), }, }) - defer f1() - // Fork the .profile repository to user4 - forkedRepo, err := repo_service.ForkRepositoryAndUpdates(git.DefaultContext, user2, user4, repo_service.ForkRepoOptions{ + // Fork the .profile repository to forking user + forkedRepo, err := repo_service.ForkRepositoryAndUpdates(git.DefaultContext, user, forkingUser, repo_service.ForkRepoOptions{ BaseRepo: originalRepo, Name: ".profile", }) require.NoError(t, err) - // Verify that user2's profile shows the original content - req := NewRequest(t, "GET", "/user2") + // Verify that the original user's profile shows the original content + req := NewRequest(t, "GET", "/"+user.Name) resp := MakeRequest(t, req, http.StatusOK) // Check if the content appears in the response body bodyStr := resp.Body.String() if strings.Contains(bodyStr, "Original Profile Content") { // Original profile is working correctly - assert.Contains(t, bodyStr, "This should show up on user2 profile", "Original profile should render content") + assert.Contains(t, bodyStr, "This should show up on user profile", "Original profile should render content") } - // Verify that user4's profile does NOT show the forked content + // Verify that forking user's profile does NOT show the forked content // Since it's a fork, it should not render as a profile page (this is the main test) - req = NewRequest(t, "GET", "/user4") + req = NewRequest(t, "GET", "/"+forkingUser.Name) resp = MakeRequest(t, req, http.StatusOK) bodyStr = resp.Body.String() // The main assertion: forked .profile content should NOT appear on user profile assert.NotContains(t, bodyStr, "Original Profile Content", "Forked .profile repo should NOT render profile content") - assert.NotContains(t, bodyStr, "This should show up on user2 profile", "Forked .profile repo should NOT render profile content") + assert.NotContains(t, bodyStr, "This should show up on user profile", "Forked .profile repo should NOT render profile content") // Ensure the forked repository still exists and is accessible directly - req = NewRequest(t, "GET", "/user4/.profile") + req = NewRequest(t, "GET", "/"+forkingUser.Name+"/.profile") resp = MakeRequest(t, req, http.StatusOK) // The repository page should show the content (since it's the same as original) assert.Contains(t, resp.Body.String(), "Original Profile Content", "Forked repo should still be accessible") @@ -174,25 +151,17 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequa t.Run("private-profile-repo", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Create a private .profile repository - profileRepo, _, f := tests.CreateDeclarativeRepo(t, user2, ".profile", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "update", - TreePath: "README.md", - ContentReader: strings.NewReader("# Private Profile Content\nThis should NOT show up on user profile."), + profileRepo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Name: ".profile", + IsPrivate: true, + Files: forgery.MapFS{ + "README.md": forgery.MapFile("# Private Profile Content\nThis should NOT show up on user profile."), }, }) - defer f() - // Make the repository private - profileRepo.IsPrivate = true - err := repo_service.UpdateRepository(git.DefaultContext, profileRepo, true) - require.NoError(t, err) - - // Verify that user2's profile does NOT show the private content - req := NewRequest(t, "GET", "/user2") + // Verify that user's profile does NOT show the private content + req := NewRequest(t, "GET", "/"+user.Name) resp := MakeRequest(t, req, http.StatusOK) bodyStr := resp.Body.String() diff --git a/tests/integration/user_test.go b/tests/integration/user_test.go index 2ffa169af8..13ce197eee 100644 --- a/tests/integration/user_test.go +++ b/tests/integration/user_test.go @@ -30,6 +30,7 @@ import ( app_context "forgejo.org/services/context" "forgejo.org/services/mailer" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/PuerkitoBio/goquery" "github.com/pquerna/otp/totp" @@ -411,17 +412,16 @@ func TestUserHints(t *testing.T) { token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser) // Create a known-good repo, with only one unit enabled - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit_model.Type{ - unit_model.TypeCode, - }, []unit_model.Type{ + repo := forgery.CreateRepository(t, user, nil) + forgery.EnableRepoUnits(t, repo, unit_model.TypeCode) + forgery.DisableRepoUnits(t, repo, unit_model.TypePullRequests, unit_model.TypeProjects, unit_model.TypePackages, unit_model.TypeActions, unit_model.TypeIssues, unit_model.TypeWiki, - }, nil) - defer f() + ) ensureRepoUnitHints := func(t *testing.T, hints bool) { t.Helper() diff --git a/tests/integration/view_test.go b/tests/integration/view_test.go index fee9393409..dd6cc80809 100644 --- a/tests/integration/view_test.go +++ b/tests/integration/view_test.go @@ -11,12 +11,10 @@ import ( "testing" unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" "forgejo.org/modules/setting" "forgejo.org/modules/test" - files_service "forgejo.org/services/repository/files" "forgejo.org/tests" + "forgejo.org/tests/forgery" "github.com/stretchr/testify/assert" ) @@ -37,21 +35,18 @@ func TestRenderFileSVGIsInImgTag(t *testing.T) { func TestAmbiguousCharacterDetection(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) + user := forgery.CreateUser(t, nil) + session := loginUser(t, user.Name) // Prepare the environments. File view, commit view (diff), wiki page. - repo, commitID, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypeCode, unit_model.TypeWiki}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "test.sh", - ContentReader: strings.NewReader("Hello there!\nline western"), - }, + var commitID string + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "test.sh": forgery.MapFile("Hello there!\nline western"), }, - ) - defer f() + LatestSha: &commitID, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypeWiki) req := NewRequestWithValues(t, "POST", repo.Link()+"/wiki?action=new", map[string]string{ "title": "Normal", @@ -132,19 +127,16 @@ func TestAmbiguousCharacterDetection(t *testing.T) { func TestCommitListActions(t *testing.T) { onApplicationRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - repo, commitID, f := tests.CreateDeclarativeRepo(t, user2, "", - []unit_model.Type{unit_model.TypeCode, unit_model.TypeWiki}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "test/test.sh", - ContentReader: strings.NewReader("Hello there!"), - }, + user := forgery.CreateUser(t, nil) + session := loginUser(t, user.Name) + var commitID string + repo := forgery.CreateRepository(t, user, &forgery.CreateRepositoryOptions{ + Files: forgery.MapFS{ + "test/test.sh": forgery.MapFile("Hello there!"), }, - ) - defer f() + LatestSha: &commitID, + }) + forgery.EnableRepoUnits(t, repo, unit_model.TypeWiki) req := NewRequestWithValues(t, "POST", repo.Link()+"/wiki?action=new", map[string]string{ "title": "Normal", diff --git a/tests/integration/wiki_test.go b/tests/integration/wiki_test.go index efccd20ef8..c6f39accf1 100644 --- a/tests/integration/wiki_test.go +++ b/tests/integration/wiki_test.go @@ -98,7 +98,7 @@ func doRepoWikiGitOperation(t *testing.T, serverURL *url.URL, method RepoWikiMet privateRepo := forgery.CreateRepository(t, user2, &forgery.CreateRepositoryOptions{ IsPrivate: true, }) - forgery.EnableRepoUnit(t, privateRepo, unit_model.TypeWiki, nil) + forgery.EnableRepoUnits(t, privateRepo, unit_model.TypeWiki) session := loginUser(t, user2.LoginName) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)