refactor(tests): use forgery.CreateRepository in more places (#12555)

Followup of #11356 to convert `tests.CreateDeclarativeRepo` to `forgery.CreateRepository` (34 occurrences remaining after this PR - 39 occurrences replaced here).

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/12555
Reviewed-by: limiting-factor <limiting-factor@noreply.codeberg.org>
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
This commit is contained in:
oliverpool 2026-06-01 11:59:05 +02:00 committed by Gusted
commit 216ff5c8fd
27 changed files with 403 additions and 596 deletions

View file

@ -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)

View file

@ -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()

View file

@ -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 {

View file

@ -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)

View file

@ -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)
})

View file

@ -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)

View file

@ -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)

View file

@ -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) {

View file

@ -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)

View file

@ -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{

View file

@ -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()

View file

@ -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,

View file

@ -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()

View file

@ -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)

View file

@ -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")
})

View file

@ -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
}

View file

@ -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")

View file

@ -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) {

View file

@ -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()

View file

@ -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())

View file

@ -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()

View file

@ -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 МиБ")
})
}

View file

@ -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)

View file

@ -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()

View file

@ -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()

View file

@ -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",

View file

@ -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)