From 342b7bae3c85ebf36a625ba36d0a8c1ad822f794 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Fri, 12 Jan 2024 11:50:29 +0100 Subject: [PATCH 1/2] tests: Lift out CreateDeclarativeRepo() There are a number of tests which require creating a repository on the fly, and they each do it their own way. To reduce code duplication, lift out this common pattern into a helper called `CreateDeclarativeRepo()`, which lets us create a repository, set up enabled and disabled repo units, and even add, delete, or update files. Also convert a number of users of this pattern to the new helper - those users that I introduced, and are in code introduced by Forgejo in the first place. Signed-off-by: Gergely Nagy --- tests/integration/actions_route_test.go | 51 +--- tests/integration/integration_test.go | 72 +++++ tests/integration/repo_badges_test.go | 331 ++++++++++------------ tests/integration/repo_lang_stats_test.go | 133 +++------ tests/integration/user_profile_test.go | 103 ++----- 5 files changed, 284 insertions(+), 406 deletions(-) diff --git a/tests/integration/actions_route_test.go b/tests/integration/actions_route_test.go index 41bd4116c2..df22fc8647 100644 --- a/tests/integration/actions_route_test.go +++ b/tests/integration/actions_route_test.go @@ -9,16 +9,11 @@ import ( "net/url" "strings" "testing" - "time" actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" - repo_model "code.gitea.io/gitea/models/repo" unit_model "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - repo_service "code.gitea.io/gitea/services/repository" files_service "code.gitea.io/gitea/services/repository/files" "github.com/stretchr/testify/assert" @@ -29,53 +24,17 @@ func TestActionsWebRouteLatestRun(t *testing.T) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // create the repo - repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "actions-latest", - Description: "test /actions/runs/latest", - AutoInit: true, - Gitignores: "Go", - License: "MIT", - Readme: "Default", - DefaultBranch: "main", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, repo) - - // enable actions - err = repo_service.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{ - RepoID: repo.ID, - Type: unit_model.TypeActions, - }}, nil) - assert.NoError(t, err) - - // add workflow file to the repo - addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ + repo, _, f := CreateDeclarativeRepo(t, user2, "", + []unit_model.Type{unit_model.TypeActions}, nil, + []*files_service.ChangeRepoFile{ { Operation: "create", TreePath: ".gitea/workflows/pr.yml", ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), }, }, - Message: "add workflow", - OldBranch: "main", - NewBranch: "main", - Author: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - assert.NoError(t, err) - assert.NotEmpty(t, addWorkflowToBaseResp) + ) + defer f() // a run has been created assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index 3a3fcc83c2..ceb4b11da3 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -1,4 +1,5 @@ // Copyright 2017 The Gitea Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. // SPDX-License-Identifier: MIT //nolint:forbidigo @@ -25,9 +26,12 @@ import ( "code.gitea.io/gitea/models/auth" "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" gitea_context "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/graceful" "code.gitea.io/gitea/modules/json" "code.gitea.io/gitea/modules/log" @@ -36,10 +40,13 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" user_service "code.gitea.io/gitea/services/user" "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" + gouuid "github.com/google/uuid" "github.com/markbates/goth" "github.com/markbates/goth/gothic" goth_gitlab "github.com/markbates/goth/providers/gitlab" @@ -577,3 +584,68 @@ func GetHTMLTitle(t testing.TB, session *TestSession, urlStr string) string { doc := NewHTMLParser(t, resp.Body) return doc.Find("head title").Text() } + +func CreateDeclarativeRepo(t *testing.T, owner *user_model.User, name string, enabledUnits, disabledUnits []unit_model.Type, files []*files_service.ChangeRepoFile) (*repo_model.Repository, string, func()) { + t.Helper() + + repoName := name + if repoName == "" { + repoName = gouuid.NewString() + } + + // Create a new repository + repo, err := repo_service.CreateRepository(db.DefaultContext, owner, owner, repo_service.CreateRepoOptions{ + Name: repoName, + Description: "Temporary Repo", + AutoInit: true, + Gitignores: "", + License: "WTFPL", + Readme: "Default", + DefaultBranch: "main", + }) + assert.NoError(t, err) + assert.NotEmpty(t, repo) + + if enabledUnits != nil || disabledUnits != nil { + units := make([]repo_model.RepoUnit, len(enabledUnits)) + for i, unitType := range enabledUnits { + units[i] = repo_model.RepoUnit{ + RepoID: repo.ID, + Type: unitType, + } + } + + err := repo_model.UpdateRepositoryUnits(db.DefaultContext, repo, units, disabledUnits) + assert.NoError(t, err) + } + + var sha string + if len(files) > 0 { + resp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, owner, &files_service.ChangeRepoFilesOptions{ + Files: files, + Message: "add files", + OldBranch: "main", + NewBranch: "main", + Author: &files_service.IdentityOptions{ + Name: owner.Name, + Email: owner.Email, + }, + Committer: &files_service.IdentityOptions{ + Name: owner.Name, + Email: owner.Email, + }, + Dates: &files_service.CommitDateOptions{ + Author: time.Now(), + Committer: time.Now(), + }, + }) + assert.NoError(t, err) + assert.NotEmpty(t, resp) + + sha = resp.Commit.SHA + } + + return repo, sha, func() { + repo_service.DeleteRepository(db.DefaultContext, owner, repo, false) + } +} diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go index e4b634d1a8..18d04930f9 100644 --- a/tests/integration/repo_badges_test.go +++ b/tests/integration/repo_badges_test.go @@ -10,228 +10,181 @@ import ( "net/url" "strings" "testing" - "time" actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" unit_model "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/test" - repo_service "code.gitea.io/gitea/services/repository" files_service "code.gitea.io/gitea/services/repository/files" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) -func assertBadge(t *testing.T, resp *httptest.ResponseRecorder, badge string) { - assert.Equal(t, fmt.Sprintf("https://img.shields.io/badge/%s", badge), test.RedirectURL(resp)) -} - -func createMinimalRepo(t *testing.T) func() { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - // Create a new repository - repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "minimal", - Description: "minimal repo for badge testing", - AutoInit: true, - Gitignores: "Go", - License: "MIT", - Readme: "Default", - DefaultBranch: "main", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, repo) - - // Enable Actions, and disable Issues, PRs and Releases - err = repo_service.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{ - RepoID: repo.ID, - Type: unit_model.TypeActions, - }}, []unit_model.Type{unit_model.TypeIssues, unit_model.TypePullRequests, unit_model.TypeReleases}) - assert.NoError(t, err) - - return func() { - repo_service.DeleteRepository(db.DefaultContext, user2, repo, false) - } -} - -func addWorkflow(t *testing.T) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, err := repo_model.GetRepositoryByOwnerAndName(db.DefaultContext, "user2", "minimal") - assert.NoError(t, err) - - // Add a workflow file to the repo - addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".gitea/workflows/pr.yml", - ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), - }, - }, - Message: "add workflow", - OldBranch: "main", - NewBranch: "main", - Author: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - assert.NoError(t, err) - assert.NotEmpty(t, addWorkflowToBaseResp) - - assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) -} - -func TestWorkflowBadges(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer tests.PrintCurrentTest(t)() - defer createMinimalRepo(t)() - - addWorkflow(t) - - // Actions disabled - req := NewRequest(t, "GET", "/user2/repo1/badges/workflows/test.yaml/badge.svg") - resp := MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "test.yaml-Not%20found-crimson") - - req = NewRequest(t, "GET", "/user2/repo1/badges/workflows/test.yaml/badge.svg?branch=no-such-branch") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "test.yaml-Not%20found-crimson") - - // Actions enabled - req = NewRequest(t, "GET", "/user2/minimal/badges/workflows/pr.yml/badge.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-waiting-lightgrey") - - req = NewRequest(t, "GET", "/user2/minimal/badges/workflows/pr.yml/badge.svg?branch=main") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-waiting-lightgrey") - - req = NewRequest(t, "GET", "/user2/minimal/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 = NewRequest(t, "GET", "/user2/minimal/badges/workflows/pr.yml/badge.svg?event=cron") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-Not%20found-crimson") - - // GitHub compatibility - req = NewRequest(t, "GET", "/user2/minimal/actions/workflows/pr.yml/badge.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-waiting-lightgrey") - - req = NewRequest(t, "GET", "/user2/minimal/actions/workflows/pr.yml/badge.svg?branch=main") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-waiting-lightgrey") - - req = NewRequest(t, "GET", "/user2/minimal/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 = NewRequest(t, "GET", "/user2/minimal/actions/workflows/pr.yml/badge.svg?event=cron") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pr.yml-Not%20found-crimson") - }) -} - func TestBadges(t *testing.T) { - defer tests.PrepareTestEnv(t)() + onGiteaRun(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}) - t.Run("Stars", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + repo, _, f := CreateDeclarativeRepo(t, owner, "", + []unit_model.Type{unit_model.TypeActions}, + []unit_model.Type{unit_model.TypeIssues, unit_model.TypePullRequests, unit_model.TypeReleases}, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: ".gitea/workflows/pr.yml", + ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), + }, + }, + ) - req := NewRequest(t, "GET", "/user2/repo1/badges/stars.svg") - resp := MakeRequest(t, req, http.StatusSeeOther) + assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) - assertBadge(t, resp, "stars-0-blue") - }) + return repo, f + } - t.Run("Issues", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer createMinimalRepo(t)() + assertBadge := func(t *testing.T, resp *httptest.ResponseRecorder, badge string) { + t.Helper() - // Issues enabled - req := NewRequest(t, "GET", "/user2/repo1/badges/issues.svg") - resp := MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-2-blue") + assert.Equal(t, fmt.Sprintf("https://img.shields.io/badge/%s", badge), test.RedirectURL(resp)) + } - req = NewRequest(t, "GET", "/user2/repo1/badges/issues/open.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-1%20open-blue") + t.Run("Workflows", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + repo, f := prep(t) + defer f() - req = NewRequest(t, "GET", "/user2/repo1/badges/issues/closed.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-1%20closed-blue") + // Actions disabled + req := NewRequest(t, "GET", "/user2/repo1/badges/workflows/test.yaml/badge.svg") + resp := MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "test.yaml-Not%20found-crimson") - // Issues disabled - req = NewRequest(t, "GET", "/user2/minimal/badges/issues.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-Not%20found-crimson") + req = NewRequest(t, "GET", "/user2/repo1/badges/workflows/test.yaml/badge.svg?branch=no-such-branch") + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "test.yaml-Not%20found-crimson") - req = NewRequest(t, "GET", "/user2/minimal/badges/issues/open.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-Not%20found-crimson") + // Actions enabled + req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequest(t, "GET", "/user2/minimal/badges/issues/closed.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "issues-Not%20found-crimson") - }) + req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?branch=main", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-waiting-lightgrey") - t.Run("Pulls", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer createMinimalRepo(t)() + req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?branch=no-such-branch", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-Not%20found-crimson") - // Pull requests enabled - req := NewRequest(t, "GET", "/user2/repo1/badges/pulls.svg") - resp := MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-3-blue") + req = NewRequestf(t, "GET", "/user2/%s/badges/workflows/pr.yml/badge.svg?event=cron", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-Not%20found-crimson") - req = NewRequest(t, "GET", "/user2/repo1/badges/pulls/open.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-3%20open-blue") + // GitHub compatibility + req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-waiting-lightgrey") - req = NewRequest(t, "GET", "/user2/repo1/badges/pulls/closed.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-0%20closed-blue") + req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?branch=main", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-waiting-lightgrey") - // Pull requests disabled - req = NewRequest(t, "GET", "/user2/minimal/badges/pulls.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-Not%20found-crimson") + req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?branch=no-such-branch", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-Not%20found-crimson") - req = NewRequest(t, "GET", "/user2/minimal/badges/pulls/open.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-Not%20found-crimson") + req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?event=cron", repo.Name) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pr.yml-Not%20found-crimson") + }) - req = NewRequest(t, "GET", "/user2/minimal/badges/pulls/closed.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "pulls-Not%20found-crimson") - }) + t.Run("Stars", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - t.Run("Release", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer createMinimalRepo(t)() + req := NewRequest(t, "GET", "/user2/repo1/badges/stars.svg") + resp := MakeRequest(t, req, http.StatusSeeOther) - req := NewRequest(t, "GET", "/user2/repo1/badges/release.svg") - resp := MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "release-v1.1-blue") + assertBadge(t, resp, "stars-0-blue") + }) - req = NewRequest(t, "GET", "/user2/minimal/badges/release.svg") - resp = MakeRequest(t, req, http.StatusSeeOther) - assertBadge(t, resp, "release-Not%20found-crimson") + 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") + resp := MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "issues-2-blue") + + req = NewRequest(t, "GET", "/user2/repo1/badges/issues/open.svg") + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "issues-1%20open-blue") + + req = NewRequest(t, "GET", "/user2/repo1/badges/issues/closed.svg") + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "issues-1%20closed-blue") + + // Issues disabled + req = NewRequestf(t, "GET", "/user2/%s/badges/issues.svg", repo.Name) + 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) + 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) + 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") + resp := MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pulls-3-blue") + + req = NewRequest(t, "GET", "/user2/repo1/badges/pulls/open.svg") + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pulls-3%20open-blue") + + req = NewRequest(t, "GET", "/user2/repo1/badges/pulls/closed.svg") + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "pulls-0%20closed-blue") + + // Pull requests disabled + req = NewRequestf(t, "GET", "/user2/%s/badges/pulls.svg", repo.Name) + 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) + 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) + 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) + resp = MakeRequest(t, req, http.StatusSeeOther) + assertBadge(t, resp, "release-Not%20found-crimson") + }) }) } diff --git a/tests/integration/repo_lang_stats_test.go b/tests/integration/repo_lang_stats_test.go index f3a7e4bc6d..3cc924c81b 100644 --- a/tests/integration/repo_lang_stats_test.go +++ b/tests/integration/repo_lang_stats_test.go @@ -14,105 +14,14 @@ import ( repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/indexer/stats" "code.gitea.io/gitea/modules/queue" - repo_service "code.gitea.io/gitea/services/repository" files_service "code.gitea.io/gitea/services/repository/files" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) -func createLangStatTestRepo(t *testing.T) (*repo_model.Repository, func()) { - t.Helper() - - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - // Create a new repository - repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "lang-stat-test", - Description: "minimal repo for language stats testing", - AutoInit: true, - Gitignores: "Go", - License: "MIT", - Readme: "Default", - DefaultBranch: "main", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, repo) - - return repo, func() { - repo_service.DeleteRepository(db.DefaultContext, user2, repo, false) - } -} - -func addLangStatTestFiles(t *testing.T, repo *repo_model.Repository, contents string) string { - t.Helper() - - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - - addFilesResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, owner, &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".gitattributes", - ContentReader: strings.NewReader(contents), - }, - { - Operation: "create", - TreePath: "docs.md", - ContentReader: strings.NewReader("This **is** a `markdown` file.\n"), - }, - { - Operation: "create", - TreePath: "foo.c", - ContentReader: strings.NewReader(`#include \nint main() {\n printf("Hello world!\n");\n return 0;\n}\n`), - }, - { - Operation: "create", - TreePath: "foo.nib", - ContentReader: strings.NewReader("Pinky promise, this is not a generated file!\n"), - }, - { - Operation: "create", - TreePath: ".dot.pas", - ContentReader: strings.NewReader("program Hello;\nbegin\n writeln('Hello, world.');\nend.\n"), - }, - { - Operation: "create", - TreePath: "cpplint.py", - ContentReader: strings.NewReader(`#! /usr/bin/env python\n\nprint("Hello world!")\n`), - }, - { - Operation: "create", - TreePath: "some-file.xml", - ContentReader: strings.NewReader(`\n\n Hello\n\n`), - }, - }, - Message: "add files", - OldBranch: "main", - NewBranch: "main", - Author: &files_service.IdentityOptions{ - Name: owner.Name, - Email: owner.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: owner.Name, - Email: owner.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - assert.NoError(t, err) - assert.NotEmpty(t, addFilesResp) - - return addFilesResp.Commit.SHA -} - func TestRepoLangStats(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { /****************** @@ -121,8 +30,46 @@ func TestRepoLangStats(t *testing.T) { prep := func(t *testing.T, attribs string) (*repo_model.Repository, string, func()) { t.Helper() - repo, f := createLangStatTestRepo(t) - sha := addLangStatTestFiles(t, repo, attribs) + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + + repo, sha, f := CreateDeclarativeRepo(t, user2, "", nil, nil, + []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: ".gitattributes", + ContentReader: strings.NewReader(attribs), + }, + { + Operation: "create", + TreePath: "docs.md", + ContentReader: strings.NewReader("This **is** a `markdown` file.\n"), + }, + { + Operation: "create", + TreePath: "foo.c", + ContentReader: strings.NewReader(`#include \nint main() {\n printf("Hello world!\n");\n return 0;\n}\n`), + }, + { + Operation: "create", + TreePath: "foo.nib", + ContentReader: strings.NewReader("Pinky promise, this is not a generated file!\n"), + }, + { + Operation: "create", + TreePath: ".dot.pas", + ContentReader: strings.NewReader("program Hello;\nbegin\n writeln('Hello, world.');\nend.\n"), + }, + { + Operation: "create", + TreePath: "cpplint.py", + ContentReader: strings.NewReader(`#! /usr/bin/env python\n\nprint("Hello world!")\n`), + }, + { + Operation: "create", + TreePath: "some-file.xml", + ContentReader: strings.NewReader(`\n\n Hello\n\n`), + }, + }) return repo, sha, f } diff --git a/tests/integration/user_profile_test.go b/tests/integration/user_profile_test.go index 001e061674..29758f3757 100644 --- a/tests/integration/user_profile_test.go +++ b/tests/integration/user_profile_test.go @@ -8,99 +8,46 @@ import ( "net/url" "strings" "testing" - "time" - "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/git" - repo_service "code.gitea.io/gitea/services/repository" files_service "code.gitea.io/gitea/services/repository/files" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) -func createProfileRepo(t *testing.T, readmeName string) func() { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - // Create a new repository - repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: ".profile", - DefaultBranch: "main", - IsPrivate: false, - AutoInit: true, - Readme: "Default", - }) - assert.NoError(t, err) - assert.NotEmpty(t, repo) - - deleteInitialReadmeResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, - &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ - { - Operation: "delete", - TreePath: "README.md", - }, - }, - Message: "Delete the initial readme", - Author: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - assert.NoError(t, err) - assert.NotEmpty(t, deleteInitialReadmeResp) - - if readmeName != "" { - addReadmeResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, - &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: readmeName, - ContentReader: strings.NewReader("# Hi!\n"), - }, - }, - Message: "Add a readme", - Author: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - - assert.NoError(t, err) - assert.NotEmpty(t, addReadmeResp) - } - - return func() { - repo_service.DeleteRepository(db.DefaultContext, user2, repo, false) - } -} - func TestUserProfile(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { checkReadme := func(t *testing.T, title, readmeFilename string, expectedCount int) { t.Run(title, func(t *testing.T) { defer tests.PrintCurrentTest(t)() - defer createProfileRepo(t, readmeFilename)() + // 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" + } + if readmeFilename != "" { + ops = append(ops, &files_service.ChangeRepoFile{ + Operation: op, + TreePath: readmeFilename, + ContentReader: strings.NewReader("# Hi!\n"), + }) + } + + _, _, f := CreateDeclarativeRepo(t, user2, ".profile", nil, nil, ops) + defer f() + + // Perform the test req := NewRequest(t, "GET", "/user2") resp := MakeRequest(t, req, http.StatusOK) From 2d475af49484bd428018e479fa35643f61a30426 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Fri, 12 Jan 2024 11:53:14 +0100 Subject: [PATCH 2/2] tests: Convert more tests to CreateDeclarativeRepo These tests originate from Gitea, so may cause conflicts in the longer run. But they use the same pattern, so transitioning them to the helper is hopefully a benefit that offsets the risk. Signed-off-by: Gergely Nagy --- tests/integration/actions_trigger_test.go | 71 +++-------------------- tests/integration/pull_merge_test.go | 14 +---- tests/integration/pull_update_test.go | 20 ++----- 3 files changed, 17 insertions(+), 88 deletions(-) diff --git a/tests/integration/actions_trigger_test.go b/tests/integration/actions_trigger_test.go index 684b93ed1d..5bcb39fcd5 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -11,9 +11,7 @@ import ( "time" actions_model "code.gitea.io/gitea/models/actions" - "code.gitea.io/gitea/models/db" issues_model "code.gitea.io/gitea/models/issues" - repo_model "code.gitea.io/gitea/models/repo" unit_model "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" @@ -33,25 +31,10 @@ func TestPullRequestTargetEvent(t *testing.T) { org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the forked repo // create the base repo - baseRepo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "repo-pull-request-target", - Description: "test pull-request-target event", - AutoInit: true, - Gitignores: "Go", - License: "MIT", - Readme: "Default", - DefaultBranch: "main", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, baseRepo) - - // enable actions - err = repo_model.UpdateRepositoryUnits(db.DefaultContext, baseRepo, []repo_model.RepoUnit{{ - RepoID: baseRepo.ID, - Type: unit_model.TypeActions, - }}, nil) - assert.NoError(t, err) + baseRepo, _, f := CreateDeclarativeRepo(t, user2, "repo-pull-request-target", + []unit_model.Type{unit_model.TypeActions}, nil, nil, + ) + defer f() // create the forked repo forkedRepo, err := repo_service.ForkRepository(git.DefaultContext, user2, org3, repo_service.ForkRepoOptions{ @@ -202,53 +185,17 @@ func TestSkipCI(t *testing.T) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // create the repo - repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "skip-ci", - Description: "test skip ci functionality", - AutoInit: true, - Gitignores: "Go", - License: "MIT", - Readme: "Default", - DefaultBranch: "main", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, repo) - - // enable actions - err = repo_model.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{ - RepoID: repo.ID, - Type: unit_model.TypeActions, - }}, nil) - assert.NoError(t, err) - - // add workflow file to the repo - addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ - Files: []*files_service.ChangeRepoFile{ + repo, _, f := CreateDeclarativeRepo(t, user2, "skip-ci", + []unit_model.Type{unit_model.TypeActions}, nil, + []*files_service.ChangeRepoFile{ { Operation: "create", TreePath: ".gitea/workflows/pr.yml", ContentReader: strings.NewReader("name: test\non:\n push:\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"), }, }, - Message: "add workflow", - OldBranch: "main", - NewBranch: "main", - Author: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: &files_service.IdentityOptions{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: &files_service.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }) - assert.NoError(t, err) - assert.NotEmpty(t, addWorkflowToBaseResp) + ) + defer f() // a run has been created assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 2aa6742a56..bb95d74d82 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -29,7 +29,6 @@ import ( "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/modules/translation" "code.gitea.io/gitea/services/pull" - repo_service "code.gitea.io/gitea/services/repository" files_service "code.gitea.io/gitea/services/repository/files" "github.com/stretchr/testify/assert" @@ -369,18 +368,11 @@ func TestConflictChecking(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // Create new clean repo to test conflict checking. - baseRepo, err := repo_service.CreateRepository(db.DefaultContext, user, user, repo_service.CreateRepoOptions{ - Name: "conflict-checking", - Description: "Tempo repo", - AutoInit: true, - Readme: "Default", - DefaultBranch: "main", - }) - assert.NoError(t, err) - assert.NotEmpty(t, baseRepo) + baseRepo, _, f := CreateDeclarativeRepo(t, user, "conflict-checking", nil, nil, nil) + defer f() // create a commit on new branch. - _, err = files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, user, &files_service.ChangeRepoFilesOptions{ + _, err := files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, user, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{ { Operation: "create", diff --git a/tests/integration/pull_update_test.go b/tests/integration/pull_update_test.go index 078253ffb0..094813d367 100644 --- a/tests/integration/pull_update_test.go +++ b/tests/integration/pull_update_test.go @@ -82,17 +82,7 @@ func TestAPIPullUpdateByRebase(t *testing.T) { } func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest { - baseRepo, err := repo_service.CreateRepository(db.DefaultContext, actor, actor, repo_service.CreateRepoOptions{ - Name: "repo-pr-update", - Description: "repo-tmp-pr-update description", - AutoInit: true, - Gitignores: "C,C++", - License: "MIT", - Readme: "Default", - IsPrivate: false, - }) - assert.NoError(t, err) - assert.NotEmpty(t, baseRepo) + baseRepo, _, _ := CreateDeclarativeRepo(t, actor, "repo-pr-update", nil, nil, nil) headRepo, err := repo_service.ForkRepository(git.DefaultContext, actor, forkOrg, repo_service.ForkRepoOptions{ BaseRepo: baseRepo, @@ -112,8 +102,8 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_mod }, }, Message: "Add File A", - OldBranch: "master", - NewBranch: "master", + OldBranch: "main", + NewBranch: "main", Author: &files_service.IdentityOptions{ Name: actor.Name, Email: actor.Email, @@ -139,7 +129,7 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_mod }, }, Message: "Add File on PR branch", - OldBranch: "master", + OldBranch: "main", NewBranch: "newBranch", Author: &files_service.IdentityOptions{ Name: actor.Name, @@ -168,7 +158,7 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_mod HeadRepoID: headRepo.ID, BaseRepoID: baseRepo.ID, HeadBranch: "newBranch", - BaseBranch: "master", + BaseBranch: "main", HeadRepo: headRepo, BaseRepo: baseRepo, Type: issues_model.PullRequestGitea,