From 582ab21bc34b25752639e064ab722fc58cc0becd Mon Sep 17 00:00:00 2001 From: Gusted Date: Sun, 10 Nov 2024 18:25:41 +0100 Subject: [PATCH] chore: improve test quality - Merge tests together. - Remove unecessary usage of `onGiteaRun`. - Make proper use of `unittest`. - Make proper use of `test.MockVariable`. - I have not checked all of the testing files yet. --- .../integration/actions_commit_status_test.go | 3 +- tests/integration/api_admin_org_test.go | 83 +++-- tests/integration/api_branch_test.go | 33 +- tests/integration/api_fork_test.go | 30 +- tests/integration/api_nodeinfo_test.go | 34 +-- tests/integration/api_org_test.go | 288 +++++++++--------- tests/integration/last_updated_time_test.go | 73 +++-- tests/integration/pull_commit_test.go | 31 +- tests/integration/pull_review_test.go | 33 +- tests/integration/rename_branch_test.go | 2 - tests/integration/repo_collaborator_test.go | 32 +- tests/integration/repo_migration_ui_test.go | 26 +- tests/integration/repo_tag_test.go | 94 ++---- tests/integration/repo_view_test.go | 40 ++- tests/integration/repofiles_change_test.go | 269 +++++++--------- tests/integration/user_avatar_test.go | 101 +++--- .../integration/user_profile_activity_test.go | 99 +++--- .../integration/user_profile_follows_test.go | 133 ++++---- 18 files changed, 620 insertions(+), 784 deletions(-) diff --git a/tests/integration/actions_commit_status_test.go b/tests/integration/actions_commit_status_test.go index 7be40eb0fa..0dae5db344 100644 --- a/tests/integration/actions_commit_status_test.go +++ b/tests/integration/actions_commit_status_test.go @@ -14,6 +14,7 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/services/actions" "code.gitea.io/gitea/services/automerge" @@ -23,7 +24,7 @@ import ( func TestActionsAutomerge(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { - assert.True(t, setting.Actions.Enabled, "Actions should be enabled") + defer test.MockVariableValue(&setting.Actions.Enabled, true)() ctx := db.DefaultContext diff --git a/tests/integration/api_admin_org_test.go b/tests/integration/api_admin_org_test.go index a29d0ba1d7..823ef2f136 100644 --- a/tests/integration/api_admin_org_test.go +++ b/tests/integration/api_admin_org_test.go @@ -5,7 +5,6 @@ package integration import ( "net/http" - "net/url" "strings" "testing" @@ -19,57 +18,55 @@ import ( ) func TestAPIAdminOrgCreate(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) - org := api.CreateOrgOption{ - UserName: "user2_org", - FullName: "User2's organization", - Description: "This organization created by admin for user2", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "private", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusCreated) + org := api.CreateOrgOption{ + UserName: "user2_org", + FullName: "User2's organization", + Description: "This organization created by admin for user2", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "private", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusCreated) - var apiOrg api.Organization - DecodeJSON(t, resp, &apiOrg) + var apiOrg api.Organization + DecodeJSON(t, resp, &apiOrg) - assert.Equal(t, org.UserName, apiOrg.Name) - assert.Equal(t, org.FullName, apiOrg.FullName) - assert.Equal(t, org.Description, apiOrg.Description) - assert.Equal(t, org.Website, apiOrg.Website) - assert.Equal(t, org.Location, apiOrg.Location) - assert.Equal(t, org.Visibility, apiOrg.Visibility) + assert.Equal(t, org.UserName, apiOrg.Name) + assert.Equal(t, org.FullName, apiOrg.FullName) + assert.Equal(t, org.Description, apiOrg.Description) + assert.Equal(t, org.Website, apiOrg.Website) + assert.Equal(t, org.Location, apiOrg.Location) + assert.Equal(t, org.Visibility, apiOrg.Visibility) - unittest.AssertExistsAndLoadBean(t, &user_model.User{ - Name: org.UserName, - LowerName: strings.ToLower(org.UserName), - FullName: org.FullName, - }) + unittest.AssertExistsAndLoadBean(t, &user_model.User{ + Name: org.UserName, + LowerName: strings.ToLower(org.UserName), + FullName: org.FullName, }) } func TestAPIAdminOrgCreateBadVisibility(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) - org := api.CreateOrgOption{ - UserName: "user2_org", - FullName: "User2's organization", - Description: "This organization created by admin for user2", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "notvalid", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). - AddTokenAuth(token) - MakeRequest(t, req, http.StatusUnprocessableEntity) - }) + org := api.CreateOrgOption{ + UserName: "user2_org", + FullName: "User2's organization", + Description: "This organization created by admin for user2", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "notvalid", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). + AddTokenAuth(token) + MakeRequest(t, req, http.StatusUnprocessableEntity) } func TestAPIAdminOrgCreateNotAdmin(t *testing.T) { diff --git a/tests/integration/api_branch_test.go b/tests/integration/api_branch_test.go index 63159f3c41..41b2c2efd1 100644 --- a/tests/integration/api_branch_test.go +++ b/tests/integration/api_branch_test.go @@ -9,14 +9,13 @@ import ( "testing" auth_model "code.gitea.io/gitea/models/auth" - "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func testAPIGetBranch(t *testing.T, branchName string, exists bool) { @@ -234,35 +233,17 @@ func TestAPIBranchProtection(t *testing.T) { } func TestAPICreateBranchWithSyncBranches(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - branches, err := db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ - RepoID: 1, - }) - require.NoError(t, err) - assert.Len(t, branches, 4) - - // make a broke repository with no branch on database - _, err = db.DeleteByBean(db.DefaultContext, git_model.Branch{RepoID: 1}) - require.NoError(t, err) - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + unittest.AssertCount(t, &git_model.Branch{RepoID: 1}, 4) + + // make a broke repository with no branch on database + unittest.AssertSuccessfulDelete(t, &git_model.Branch{RepoID: 1}) + ctx := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) giteaURL.Path = ctx.GitPath() testAPICreateBranch(t, ctx.Session, "user2", "repo1", "", "new_branch", http.StatusCreated) - }) - branches, err = db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ - RepoID: 1, + unittest.AssertExistsIf(t, true, &git_model.Branch{RepoID: 1, Name: "new_branch"}) }) - require.NoError(t, err) - assert.Len(t, branches, 5) - - branches, err = db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ - RepoID: 1, - Keyword: "new_branch", - }) - require.NoError(t, err) - assert.Len(t, branches, 1) } diff --git a/tests/integration/api_fork_test.go b/tests/integration/api_fork_test.go index b80b4c6645..6a6b05f700 100644 --- a/tests/integration/api_fork_test.go +++ b/tests/integration/api_fork_test.go @@ -7,7 +7,6 @@ package integration import ( "fmt" "net/http" - "net/url" "testing" auth_model "code.gitea.io/gitea/models/auth" @@ -86,25 +85,24 @@ func TestCreateForkNoLogin(t *testing.T) { } func TestAPIDisabledForkRepo(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.Repository.DisableForks, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + defer test.MockVariableValue(&setting.Repository.DisableForks, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + defer tests.PrepareTestEnv(t)() - t.Run("fork listing", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + t.Run("fork listing", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks") - MakeRequest(t, req, http.StatusNotFound) - }) + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks") + MakeRequest(t, req, http.StatusNotFound) + }) - t.Run("forking", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + t.Run("forking", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - session := loginUser(t, "user5") - token := getTokenForLoggedInUser(t, session) + session := loginUser(t, "user5") + token := getTokenForLoggedInUser(t, session) - req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{}).AddTokenAuth(token) - session.MakeRequest(t, req, http.StatusNotFound) - }) + req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{}).AddTokenAuth(token) + session.MakeRequest(t, req, http.StatusNotFound) }) } diff --git a/tests/integration/api_nodeinfo_test.go b/tests/integration/api_nodeinfo_test.go index 33d06ed1b4..d000083717 100644 --- a/tests/integration/api_nodeinfo_test.go +++ b/tests/integration/api_nodeinfo_test.go @@ -5,35 +5,31 @@ package integration import ( "net/http" - "net/url" "testing" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestNodeinfo(t *testing.T) { - setting.Federation.Enabled = true - testWebRoutes = routers.NormalRoutes() - defer func() { - setting.Federation.Enabled = false - testWebRoutes = routers.NormalRoutes() - }() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + defer tests.PrepareTestEnv(t)() - onGiteaRun(t, func(*testing.T, *url.URL) { - req := NewRequest(t, "GET", "/api/v1/nodeinfo") - resp := MakeRequest(t, req, http.StatusOK) - VerifyJSONSchema(t, resp, "nodeinfo_2.1.json") + req := NewRequest(t, "GET", "/api/v1/nodeinfo") + resp := MakeRequest(t, req, http.StatusOK) + VerifyJSONSchema(t, resp, "nodeinfo_2.1.json") - var nodeinfo api.NodeInfo - DecodeJSON(t, resp, &nodeinfo) - assert.True(t, nodeinfo.OpenRegistrations) - assert.Equal(t, "forgejo", nodeinfo.Software.Name) - assert.Equal(t, 29, nodeinfo.Usage.Users.Total) - assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) - assert.Equal(t, 4, nodeinfo.Usage.LocalComments) - }) + var nodeinfo api.NodeInfo + DecodeJSON(t, resp, &nodeinfo) + assert.True(t, nodeinfo.OpenRegistrations) + assert.Equal(t, "forgejo", nodeinfo.Software.Name) + assert.Equal(t, 29, nodeinfo.Usage.Users.Total) + assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) + assert.Equal(t, 4, nodeinfo.Usage.LocalComments) } diff --git a/tests/integration/api_org_test.go b/tests/integration/api_org_test.go index 70d3a446f7..3a7c81ca3a 100644 --- a/tests/integration/api_org_test.go +++ b/tests/integration/api_org_test.go @@ -6,7 +6,6 @@ package integration import ( "fmt" "net/http" - "net/url" "strings" "testing" @@ -19,150 +18,144 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestAPIOrgCreate(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - token := getUserToken(t, "user1", auth_model.AccessTokenScopeWriteOrganization) + defer tests.PrepareTestEnv(t)() + token := getUserToken(t, "user1", auth_model.AccessTokenScopeWriteOrganization) - org := api.CreateOrgOption{ - UserName: "user1_org", - FullName: "User1's organization", - Description: "This organization created by user1", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "limited", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/orgs", &org). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusCreated) + org := api.CreateOrgOption{ + UserName: "user1_org", + FullName: "User1's organization", + Description: "This organization created by user1", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "limited", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/orgs", &org). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusCreated) - var apiOrg api.Organization - DecodeJSON(t, resp, &apiOrg) + var apiOrg api.Organization + DecodeJSON(t, resp, &apiOrg) - assert.Equal(t, org.UserName, apiOrg.Name) - assert.Equal(t, org.FullName, apiOrg.FullName) - assert.Equal(t, org.Description, apiOrg.Description) - assert.Equal(t, org.Website, apiOrg.Website) - assert.Equal(t, org.Location, apiOrg.Location) - assert.Equal(t, org.Visibility, apiOrg.Visibility) + assert.Equal(t, org.UserName, apiOrg.Name) + assert.Equal(t, org.FullName, apiOrg.FullName) + assert.Equal(t, org.Description, apiOrg.Description) + assert.Equal(t, org.Website, apiOrg.Website) + assert.Equal(t, org.Location, apiOrg.Location) + assert.Equal(t, org.Visibility, apiOrg.Visibility) - unittest.AssertExistsAndLoadBean(t, &user_model.User{ - Name: org.UserName, - LowerName: strings.ToLower(org.UserName), - FullName: org.FullName, - }) - - // Check owner team permission - ownerTeam, _ := org_model.GetOwnerTeam(db.DefaultContext, apiOrg.ID) - - for _, ut := range unit_model.AllRepoUnitTypes { - up := perm.AccessModeOwner - if ut == unit_model.TypeExternalTracker || ut == unit_model.TypeExternalWiki { - up = perm.AccessModeRead - } - unittest.AssertExistsAndLoadBean(t, &org_model.TeamUnit{ - OrgID: apiOrg.ID, - TeamID: ownerTeam.ID, - Type: ut, - AccessMode: up, - }) - } - - req = NewRequestf(t, "GET", "/api/v1/orgs/%s", org.UserName). - AddTokenAuth(token) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &apiOrg) - assert.EqualValues(t, org.UserName, apiOrg.Name) - - req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", org.UserName). - AddTokenAuth(token) - resp = MakeRequest(t, req, http.StatusOK) - - var repos []*api.Repository - DecodeJSON(t, resp, &repos) - for _, repo := range repos { - assert.False(t, repo.Private) - } - - req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", org.UserName). - AddTokenAuth(token) - resp = MakeRequest(t, req, http.StatusOK) - - // user1 on this org is public - var users []*api.User - DecodeJSON(t, resp, &users) - assert.Len(t, users, 1) - assert.EqualValues(t, "user1", users[0].UserName) + unittest.AssertExistsAndLoadBean(t, &user_model.User{ + Name: org.UserName, + LowerName: strings.ToLower(org.UserName), + FullName: org.FullName, }) + + // Check owner team permission + ownerTeam, _ := org_model.GetOwnerTeam(db.DefaultContext, apiOrg.ID) + + for _, ut := range unit_model.AllRepoUnitTypes { + up := perm.AccessModeOwner + if ut == unit_model.TypeExternalTracker || ut == unit_model.TypeExternalWiki { + up = perm.AccessModeRead + } + unittest.AssertExistsAndLoadBean(t, &org_model.TeamUnit{ + OrgID: apiOrg.ID, + TeamID: ownerTeam.ID, + Type: ut, + AccessMode: up, + }) + } + + req = NewRequestf(t, "GET", "/api/v1/orgs/%s", org.UserName). + AddTokenAuth(token) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &apiOrg) + assert.EqualValues(t, org.UserName, apiOrg.Name) + + req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", org.UserName). + AddTokenAuth(token) + resp = MakeRequest(t, req, http.StatusOK) + + var repos []*api.Repository + DecodeJSON(t, resp, &repos) + for _, repo := range repos { + assert.False(t, repo.Private) + } + + req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", org.UserName). + AddTokenAuth(token) + resp = MakeRequest(t, req, http.StatusOK) + + // user1 on this org is public + var users []*api.User + DecodeJSON(t, resp, &users) + assert.Len(t, users, 1) + assert.EqualValues(t, "user1", users[0].UserName) } func TestAPIOrgEdit(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteOrganization) - org := api.EditOrgOption{ - FullName: "Org3 organization new full name", - Description: "A new description", - Website: "https://try.gitea.io/new", - Location: "Beijing", - Visibility: "private", - } - req := NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &org). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteOrganization) + org := api.EditOrgOption{ + FullName: "Org3 organization new full name", + Description: "A new description", + Website: "https://try.gitea.io/new", + Location: "Beijing", + Visibility: "private", + } + req := NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &org). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusOK) - var apiOrg api.Organization - DecodeJSON(t, resp, &apiOrg) + var apiOrg api.Organization + DecodeJSON(t, resp, &apiOrg) - assert.Equal(t, "org3", apiOrg.Name) - assert.Equal(t, org.FullName, apiOrg.FullName) - assert.Equal(t, org.Description, apiOrg.Description) - assert.Equal(t, org.Website, apiOrg.Website) - assert.Equal(t, org.Location, apiOrg.Location) - assert.Equal(t, org.Visibility, apiOrg.Visibility) - }) + assert.Equal(t, "org3", apiOrg.Name) + assert.Equal(t, org.FullName, apiOrg.FullName) + assert.Equal(t, org.Description, apiOrg.Description) + assert.Equal(t, org.Website, apiOrg.Website) + assert.Equal(t, org.Location, apiOrg.Location) + assert.Equal(t, org.Visibility, apiOrg.Visibility) } func TestAPIOrgEditBadVisibility(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user1") + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteOrganization) - org := api.EditOrgOption{ - FullName: "Org3 organization new full name", - Description: "A new description", - Website: "https://try.gitea.io/new", - Location: "Beijing", - Visibility: "badvisibility", - } - req := NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &org). - AddTokenAuth(token) - MakeRequest(t, req, http.StatusUnprocessableEntity) - }) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteOrganization) + org := api.EditOrgOption{ + FullName: "Org3 organization new full name", + Description: "A new description", + Website: "https://try.gitea.io/new", + Location: "Beijing", + Visibility: "badvisibility", + } + req := NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &org). + AddTokenAuth(token) + MakeRequest(t, req, http.StatusUnprocessableEntity) } func TestAPIOrgDeny(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - setting.Service.RequireSignInView = true - defer func() { - setting.Service.RequireSignInView = false - }() + defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Service.RequireSignInView, true)() - orgName := "user1_org" - req := NewRequestf(t, "GET", "/api/v1/orgs/%s", orgName) - MakeRequest(t, req, http.StatusNotFound) + orgName := "user1_org" + req := NewRequestf(t, "GET", "/api/v1/orgs/%s", orgName) + MakeRequest(t, req, http.StatusNotFound) - req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", orgName) - MakeRequest(t, req, http.StatusNotFound) + req = NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", orgName) + MakeRequest(t, req, http.StatusNotFound) - req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", orgName) - MakeRequest(t, req, http.StatusNotFound) - }) + req = NewRequestf(t, "GET", "/api/v1/orgs/%s/members", orgName) + MakeRequest(t, req, http.StatusNotFound) } func TestAPIGetAll(t *testing.T) { @@ -192,37 +185,36 @@ func TestAPIGetAll(t *testing.T) { } func TestAPIOrgSearchEmptyTeam(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - token := getUserToken(t, "user1", auth_model.AccessTokenScopeWriteOrganization) - orgName := "org_with_empty_team" + defer tests.PrepareTestEnv(t)() + token := getUserToken(t, "user1", auth_model.AccessTokenScopeWriteOrganization) + orgName := "org_with_empty_team" - // create org - req := NewRequestWithJSON(t, "POST", "/api/v1/orgs", &api.CreateOrgOption{ - UserName: orgName, - }).AddTokenAuth(token) - MakeRequest(t, req, http.StatusCreated) + // create org + req := NewRequestWithJSON(t, "POST", "/api/v1/orgs", &api.CreateOrgOption{ + UserName: orgName, + }).AddTokenAuth(token) + MakeRequest(t, req, http.StatusCreated) - // create team with no member - req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/orgs/%s/teams", orgName), &api.CreateTeamOption{ - Name: "Empty", - IncludesAllRepositories: true, - Permission: "read", - Units: []string{"repo.code", "repo.issues", "repo.ext_issues", "repo.wiki", "repo.pulls"}, - }).AddTokenAuth(token) - MakeRequest(t, req, http.StatusCreated) + // create team with no member + req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/orgs/%s/teams", orgName), &api.CreateTeamOption{ + Name: "Empty", + IncludesAllRepositories: true, + Permission: "read", + Units: []string{"repo.code", "repo.issues", "repo.ext_issues", "repo.wiki", "repo.pulls"}, + }).AddTokenAuth(token) + MakeRequest(t, req, http.StatusCreated) - // case-insensitive search for teams that have no members - req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/teams/search?q=%s", orgName, "empty")). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - data := struct { - Ok bool - Data []*api.Team - }{} - DecodeJSON(t, resp, &data) - assert.True(t, data.Ok) - if assert.Len(t, data.Data, 1) { - assert.EqualValues(t, "Empty", data.Data[0].Name) - } - }) + // case-insensitive search for teams that have no members + req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/teams/search?q=%s", orgName, "empty")). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusOK) + data := struct { + Ok bool + Data []*api.Team + }{} + DecodeJSON(t, resp, &data) + assert.True(t, data.Ok) + if assert.Len(t, data.Data, 1) { + assert.EqualValues(t, "Empty", data.Data[0].Name) + } } diff --git a/tests/integration/last_updated_time_test.go b/tests/integration/last_updated_time_test.go index 54c0eeb629..1d9240a31f 100644 --- a/tests/integration/last_updated_time_test.go +++ b/tests/integration/last_updated_time_test.go @@ -2,60 +2,59 @@ package integration import ( "net/http" - "net/url" "path" "strings" "testing" + "code.gitea.io/gitea/tests" + "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) func TestRepoLastUpdatedTime(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user := "user2" - session := loginUser(t, user) + defer tests.PrepareTestEnv(t)() + user := "user2" + session := loginUser(t, user) - req := NewRequest(t, "GET", "/explore/repos?q=repo1") - resp := session.MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - node := doc.doc.Find(".flex-item-body").First() - { - buf := "" - findTextNonNested(t, node, &buf) - assert.Equal(t, "Updated", strings.TrimSpace(buf)) - } + req := NewRequest(t, "GET", "/explore/repos?q=repo1") + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + node := doc.doc.Find(".flex-item-body").First() + { + buf := "" + findTextNonNested(t, node, &buf) + assert.Equal(t, "Updated", strings.TrimSpace(buf)) + } - // Relative time should be present as a descendent - { - relativeTime := node.Find("relative-time").Text() - assert.True(t, strings.HasPrefix(relativeTime, "19")) // ~1970, might underflow with timezone - } - }) + // Relative time should be present as a descendent + { + relativeTime := node.Find("relative-time").Text() + assert.True(t, strings.HasPrefix(relativeTime, "19")) // ~1970, might underflow with timezone + } } func TestBranchLastUpdatedTime(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user := "user2" - repo := "repo1" - session := loginUser(t, user) + defer tests.PrepareTestEnv(t)() + user := "user2" + repo := "repo1" + session := loginUser(t, user) - req := NewRequest(t, "GET", path.Join(user, repo, "branches")) - resp := session.MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - node := doc.doc.Find("p:has(span.commit-message)") + req := NewRequest(t, "GET", path.Join(user, repo, "branches")) + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + node := doc.doc.Find("p:has(span.commit-message)") - { - buf := "" - findTextNonNested(t, node, &buf) - assert.True(t, strings.Contains(buf, "Updated")) - } + { + buf := "" + findTextNonNested(t, node, &buf) + assert.True(t, strings.Contains(buf, "Updated")) + } - { - relativeTime := node.Find("relative-time").Text() - assert.True(t, strings.HasPrefix(relativeTime, "2017")) - } - }) + { + relativeTime := node.Find("relative-time").Text() + assert.True(t, strings.HasPrefix(relativeTime, "2017")) + } } // Find all text that are direct descendents diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 477f01725d..5ef6d6ceca 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -5,30 +5,29 @@ package integration import ( "net/http" - "net/url" "testing" pull_service "code.gitea.io/gitea/services/pull" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestListPullCommits(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - session := loginUser(t, "user5") - req := NewRequest(t, "GET", "/user2/repo1/pulls/3/commits/list") - resp := session.MakeRequest(t, req, http.StatusOK) + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user5") + req := NewRequest(t, "GET", "/user2/repo1/pulls/3/commits/list") + resp := session.MakeRequest(t, req, http.StatusOK) - var pullCommitList struct { - Commits []pull_service.CommitInfo `json:"commits"` - LastReviewCommitSha string `json:"last_review_commit_sha"` - } - DecodeJSON(t, resp, &pullCommitList) + var pullCommitList struct { + Commits []pull_service.CommitInfo `json:"commits"` + LastReviewCommitSha string `json:"last_review_commit_sha"` + } + DecodeJSON(t, resp, &pullCommitList) - if assert.Len(t, pullCommitList.Commits, 2) { - assert.Equal(t, "5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", pullCommitList.Commits[0].ID) - assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.Commits[1].ID) - } - assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.LastReviewCommitSha) - }) + if assert.Len(t, pullCommitList.Commits, 2) { + assert.Equal(t, "5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", pullCommitList.Commits[0].ID) + assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.Commits[1].ID) + } + assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.LastReviewCommitSha) } diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index fc3e9be4a0..b3380cc6b8 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -18,7 +18,6 @@ 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/gitrepo" "code.gitea.io/gitea/modules/test" issue_service "code.gitea.io/gitea/services/issue" @@ -283,32 +282,18 @@ func TestPullView_CodeOwner(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - // Create the repo. - repo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ - Name: "test_codeowner", - Readme: "Default", - AutoInit: true, - ObjectFormatName: git.Sha1ObjectFormat.Name(), - DefaultBranch: "master", - }) - require.NoError(t, err) - - // add CODEOWNERS to default branch - _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ - OldBranch: repo.DefaultBranch, - Files: []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\n"), - }, + repo, _, f := tests.CreateDeclarativeRepo(t, user2, "test_codeowner", nil, nil, []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: "CODEOWNERS", + ContentReader: strings.NewReader("README.md @user5\n"), }, }) - require.NoError(t, err) + defer f() t.Run("First Pull Request", func(t *testing.T) { // create a new branch to prepare for pull request - _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ + _, err := files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ NewBranch: "codeowner-basebranch", Files: []*files_service.ChangeRepoFile{ { @@ -328,7 +313,7 @@ func TestPullView_CodeOwner(t *testing.T) { unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) require.NoError(t, pr.LoadIssue(db.DefaultContext)) - err := issue_service.ChangeTitle(db.DefaultContext, pr.Issue, user2, "[WIP] Test Pull Request") + err = issue_service.ChangeTitle(db.DefaultContext, pr.Issue, user2, "[WIP] Test Pull Request") require.NoError(t, err) prUpdated1 := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) require.NoError(t, prUpdated1.LoadIssue(db.DefaultContext)) @@ -342,7 +327,7 @@ func TestPullView_CodeOwner(t *testing.T) { }) // change the default branch CODEOWNERS file to change README.md's codeowner - _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ + _, err := files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{ { Operation: "update", diff --git a/tests/integration/rename_branch_test.go b/tests/integration/rename_branch_test.go index a96cbf5623..20d4c9b48f 100644 --- a/tests/integration/rename_branch_test.go +++ b/tests/integration/rename_branch_test.go @@ -22,8 +22,6 @@ func TestRenameBranch(t *testing.T) { } func testRenameBranch(t *testing.T, u *url.URL) { - defer tests.PrepareTestEnv(t)() - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) unittest.AssertExistsAndLoadBean(t, &git_model.Branch{RepoID: repo.ID, Name: "master"}) diff --git a/tests/integration/repo_collaborator_test.go b/tests/integration/repo_collaborator_test.go index beeb950f5a..292cd5862b 100644 --- a/tests/integration/repo_collaborator_test.go +++ b/tests/integration/repo_collaborator_test.go @@ -5,33 +5,33 @@ package integration import ( "net/http" - "net/url" "strings" "testing" + "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) // TestRepoCollaborators is a test for contents of Collaborators tab in the repo settings // It only covers a few elements and can be extended as needed func TestRepoCollaborators(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - session := loginUser(t, "user2") + defer tests.PrepareTestEnv(t)() + session := loginUser(t, "user2") - // Visit Collaborators tab of repo settings - response := session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/settings/collaboration"), http.StatusOK) - page := NewHTMLParser(t, response.Body).Find(".repo-setting-content") + // Visit Collaborators tab of repo settings + response := session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/settings/collaboration"), http.StatusOK) + page := NewHTMLParser(t, response.Body).Find(".repo-setting-content") - // Veirfy header - assert.EqualValues(t, "Collaborators", strings.TrimSpace(page.Find("h4").Text())) + // Veirfy header + assert.EqualValues(t, "Collaborators", strings.TrimSpace(page.Find("h4").Text())) - // Veirfy button text - page = page.Find("#repo-collab-form") - assert.EqualValues(t, "Add collaborator", strings.TrimSpace(page.Find("button.primary").Text())) + // Veirfy button text + page = page.Find("#repo-collab-form") + assert.EqualValues(t, "Add collaborator", strings.TrimSpace(page.Find("button.primary").Text())) - // Veirfy placeholder - placeholder, exists := page.Find("#search-user-box input").Attr("placeholder") - assert.True(t, exists) - assert.EqualValues(t, "Search users...", placeholder) - }) + // Veirfy placeholder + placeholder, exists := page.Find("#search-user-box input").Attr("placeholder") + assert.True(t, exists) + assert.EqualValues(t, "Search users...", placeholder) } diff --git a/tests/integration/repo_migration_ui_test.go b/tests/integration/repo_migration_ui_test.go index 40688d4a60..594b09b490 100644 --- a/tests/integration/repo_migration_ui_test.go +++ b/tests/integration/repo_migration_ui_test.go @@ -5,26 +5,26 @@ package integration import ( "net/http" - "net/url" "testing" + "code.gitea.io/gitea/tests" + "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) func TestRepoMigrationUI(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - sessionUser1 := loginUser(t, "user1") - // Nothing is tested in plain Git migration form right now - testRepoMigrationFormGitHub(t, sessionUser1) - testRepoMigrationFormGitea(t, sessionUser1) - testRepoMigrationFormGitLab(t, sessionUser1) - testRepoMigrationFormGogs(t, sessionUser1) - testRepoMigrationFormOneDev(t, sessionUser1) - testRepoMigrationFormGitBucket(t, sessionUser1) - testRepoMigrationFormCodebase(t, sessionUser1) - testRepoMigrationFormForgejo(t, sessionUser1) - }) + defer tests.PrepareTestEnv(t)() + sessionUser1 := loginUser(t, "user1") + // Nothing is tested in plain Git migration form right now + testRepoMigrationFormGitHub(t, sessionUser1) + testRepoMigrationFormGitea(t, sessionUser1) + testRepoMigrationFormGitLab(t, sessionUser1) + testRepoMigrationFormGogs(t, sessionUser1) + testRepoMigrationFormOneDev(t, sessionUser1) + testRepoMigrationFormGitBucket(t, sessionUser1) + testRepoMigrationFormCodebase(t, sessionUser1) + testRepoMigrationFormForgejo(t, sessionUser1) } func testRepoMigrationFormGitHub(t *testing.T, session *TestSession) { diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go index 808d2e17e6..06b6c30383 100644 --- a/tests/integration/repo_tag_test.go +++ b/tests/integration/repo_tag_test.go @@ -11,8 +11,6 @@ import ( "testing" "code.gitea.io/gitea/models" - "code.gitea.io/gitea/models/db" - git_model "code.gitea.io/gitea/models/git" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" @@ -31,20 +29,6 @@ func TestTagViewWithoutRelease(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - defer func() { - releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ - IncludeTags: true, - TagNames: []string{"no-release"}, - RepoID: repo.ID, - }) - require.NoError(t, err) - - for _, release := range releases { - _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) - require.NoError(t, err) - } - }() - err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "no-release", "release-less tag") require.NoError(t, err) @@ -70,27 +54,27 @@ func TestTagViewWithoutRelease(t *testing.T) { } func TestCreateNewTagProtected(t *testing.T) { - defer tests.PrepareTestEnv(t)() + onGiteaRun(t, func(t *testing.T, u *url.URL) { + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) + t.Run("Code", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - t.Run("Code", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "t-first", "first tag") + require.NoError(t, err) - err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "t-first", "first tag") - require.NoError(t, err) + err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-2", "second tag") + require.Error(t, err) + assert.True(t, models.IsErrProtectedTagName(err)) - err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-2", "second tag") - require.Error(t, err) - assert.True(t, models.IsErrProtectedTagName(err)) + err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1.1", "third tag") + require.NoError(t, err) + }) - err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1.1", "third tag") - require.NoError(t, err) - }) + t.Run("Git", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - t.Run("Git", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { httpContext := NewAPITestContext(t, owner.Name, repo.Name) dstPath := t.TempDir() @@ -107,10 +91,10 @@ func TestCreateNewTagProtected(t *testing.T) { require.Error(t, err) assert.Contains(t, err.Error(), "Tag v-2 is protected") }) - }) - t.Run("GitTagForce", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + t.Run("GitTagForce", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + httpContext := NewAPITestContext(t, owner.Name, repo.Name) dstPath := t.TempDir() @@ -120,13 +104,7 @@ func TestCreateNewTagProtected(t *testing.T) { doGitClone(dstPath, u)(t) - _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - _, _, err = git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) + _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) require.NoError(t, err) _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) @@ -142,27 +120,6 @@ func TestCreateNewTagProtected(t *testing.T) { assert.Contains(t, tagsTab.Text(), "force update v2") }) }) - - // Cleanup - releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ - IncludeTags: true, - TagNames: []string{"v-1", "v-1.1"}, - RepoID: repo.ID, - }) - require.NoError(t, err) - - for _, release := range releases { - _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) - require.NoError(t, err) - } - - protectedTags, err := git_model.GetProtectedTags(db.DefaultContext, repo.ID) - require.NoError(t, err) - - for _, protectedTag := range protectedTags { - err = git_model.DeleteProtectedTag(db.DefaultContext, protectedTag) - require.NoError(t, err) - } } func TestSyncRepoTags(t *testing.T) { @@ -200,18 +157,5 @@ func TestSyncRepoTags(t *testing.T) { require.NoError(t, repo_module.SyncRepoTags(git.DefaultContext, repo.ID)) testTag(t) }) - - // Cleanup - releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ - IncludeTags: true, - TagNames: []string{"v2"}, - RepoID: repo.ID, - }) - require.NoError(t, err) - - for _, release := range releases { - _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) - require.NoError(t, err) - } }) } diff --git a/tests/integration/repo_view_test.go b/tests/integration/repo_view_test.go index 7c280e2491..46e75063bc 100644 --- a/tests/integration/repo_view_test.go +++ b/tests/integration/repo_view_test.go @@ -62,8 +62,9 @@ func createRepoAndGetContext(t *testing.T, files []string, deleteMdReadme bool) } func TestRepoView_FindReadme(t *testing.T) { - t.Run("PrioOneLocalizedMdReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + 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() @@ -73,9 +74,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.en.md", file.Name()) }) - }) - t.Run("PrioTwoMdReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + 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() @@ -85,9 +85,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.md", file.Name()) }) - }) - t.Run("PrioThreeLocalizedOrgReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + 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() @@ -97,9 +96,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.en.org", file.Name()) }) - }) - t.Run("PrioFourOrgReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + 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() @@ -109,9 +107,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.org", file.Name()) }) - }) - t.Run("PrioFiveTxtReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + t.Run("PrioFiveTxtReadme", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() ctx, f := createRepoAndGetContext(t, []string{"README.txt", "README", "README.tex"}, true) defer f() @@ -121,9 +118,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.txt", file.Name()) }) - }) - t.Run("PrioSixWithoutExtensionReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + t.Run("PrioSixWithoutExtensionReadme", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() ctx, f := createRepoAndGetContext(t, []string{"README", "README.tex"}, true) defer f() @@ -133,9 +129,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README", file.Name()) }) - }) - t.Run("PrioSevenAnyReadme", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + t.Run("PrioSevenAnyReadme", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() ctx, f := createRepoAndGetContext(t, []string{"README.tex"}, true) defer f() @@ -145,9 +140,8 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.tex", file.Name()) }) - }) - t.Run("DoNotPickReadmeIfNonPresent", func(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { + t.Run("DoNotPickReadmeIfNonPresent", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() ctx, f := createRepoAndGetContext(t, []string{}, true) defer f() diff --git a/tests/integration/repofiles_change_test.go b/tests/integration/repofiles_change_test.go index 9790b36183..1896971046 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -63,8 +64,8 @@ func getDeleteRepoFilesOptions(repo *repo_model.Repository) *files_service.Chang Files: []*files_service.ChangeRepoFile{ { Operation: "delete", - TreePath: "README.md", - SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f", + TreePath: "README_new.md", + SHA: "dbf8d00e022e05b7e5cf7e535de857de57925647", }, }, LastCommitID: "", @@ -244,184 +245,142 @@ func getExpectedFileResponseForRepofilesUpdate(commitID, filename, lastCommitSHA } } -func TestChangeRepoFilesForCreate(t *testing.T) { - // setup +func TestChangeRepoFiles(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - opts := getCreateRepoFilesOptions(repo) - // test - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - - // asserts + gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo) require.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) defer gitRepo.Close() - commitID, _ := gitRepo.GetBranchCommitID(opts.NewBranch) - lastCommit, _ := gitRepo.GetCommitByPath("new/file.txt") - expectedFileResponse := getExpectedFileResponseForRepofilesCreate(commitID, lastCommit.ID.String()) - assert.NotNil(t, expectedFileResponse) - if expectedFileResponse != nil { + t.Run("Create", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getCreateRepoFilesOptions(repo) + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) + + commitID, err := gitRepo.GetBranchCommitID(opts.NewBranch) + require.NoError(t, err) + lastCommit, err := gitRepo.GetCommitByPath("new/file.txt") + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesCreate(commitID, lastCommit.ID.String()) assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) - } - }) -} + }) -func TestChangeRepoFilesForUpdate(t *testing.T) { - // setup - onGiteaRun(t, func(t *testing.T, u *url.URL) { - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - opts := getUpdateRepoFilesOptions(repo) + t.Run("Update", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getUpdateRepoFilesOptions(repo) + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) - // test - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + commit, err := gitRepo.GetBranchCommit(opts.NewBranch) + require.NoError(t, err) + lastCommit, err := commit.GetCommitByPath(opts.Files[0].TreePath) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) + assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) + }) - // asserts - require.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) - defer gitRepo.Close() + t.Run("Update and move", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getUpdateRepoFilesOptions(repo) + opts.Files[0].SHA = "dbf8d00e022e05b7e5cf7e535de857de57925647" + opts.Files[0].FromTreePath = "README.md" + opts.Files[0].TreePath = "README_new.md" // new file name, README_new.md + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) - commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) - assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) - assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) - }) -} + commit, err := gitRepo.GetBranchCommit(opts.NewBranch) + require.NoError(t, err) + lastCommit, err := commit.GetCommitByPath(opts.Files[0].TreePath) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) -func TestChangeRepoFilesForUpdateWithFileMove(t *testing.T) { - // setup - onGiteaRun(t, func(t *testing.T, u *url.URL) { - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - opts := getUpdateRepoFilesOptions(repo) - opts.Files[0].FromTreePath = "README.md" - opts.Files[0].TreePath = "README_new.md" // new file name, README_new.md + // assert that the old file no longer exists in the last commit of the branch + fromEntry, err := commit.GetTreeEntryByPath(opts.Files[0].FromTreePath) + switch err.(type) { + case git.ErrNotExist: + // correct, continue + default: + t.Fatalf("expected git.ErrNotExist, got:%v", err) + } + toEntry, err := commit.GetTreeEntryByPath(opts.Files[0].TreePath) + require.NoError(t, err) + assert.Nil(t, fromEntry) // Should no longer exist here + assert.NotNil(t, toEntry) // Should exist here + // assert SHA has remained the same but paths use the new file name + assert.EqualValues(t, expectedFileResponse.Content.SHA, filesResponse.Files[0].SHA) + assert.EqualValues(t, expectedFileResponse.Content.Name, filesResponse.Files[0].Name) + assert.EqualValues(t, expectedFileResponse.Content.Path, filesResponse.Files[0].Path) + assert.EqualValues(t, expectedFileResponse.Content.URL, filesResponse.Files[0].URL) + assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) + assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) + }) - // test - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + t.Run("Change without branch names", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getUpdateRepoFilesOptions(repo) + opts.OldBranch = "" + opts.NewBranch = "" + opts.Files[0].TreePath = "README_new.md" + opts.Files[0].SHA = "dbf8d00e022e05b7e5cf7e535de857de57925647" - // asserts - require.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) - defer gitRepo.Close() + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) - commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) - // assert that the old file no longer exists in the last commit of the branch - fromEntry, err := commit.GetTreeEntryByPath(opts.Files[0].FromTreePath) - switch err.(type) { - case git.ErrNotExist: - // correct, continue - default: - t.Fatalf("expected git.ErrNotExist, got:%v", err) - } - toEntry, err := commit.GetTreeEntryByPath(opts.Files[0].TreePath) - require.NoError(t, err) - assert.Nil(t, fromEntry) // Should no longer exist here - assert.NotNil(t, toEntry) // Should exist here - // assert SHA has remained the same but paths use the new file name - assert.EqualValues(t, expectedFileResponse.Content.SHA, filesResponse.Files[0].SHA) - assert.EqualValues(t, expectedFileResponse.Content.Name, filesResponse.Files[0].Name) - assert.EqualValues(t, expectedFileResponse.Content.Path, filesResponse.Files[0].Path) - assert.EqualValues(t, expectedFileResponse.Content.URL, filesResponse.Files[0].URL) - assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) - assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) - }) -} + commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) + }) -// Test opts with branch names removed, should get same results as above test -func TestChangeRepoFilesWithoutBranchNames(t *testing.T) { - // setup - onGiteaRun(t, func(t *testing.T, u *url.URL) { - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - opts := getUpdateRepoFilesOptions(repo) - opts.OldBranch = "" - opts.NewBranch = "" + t.Run("Delete files", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getDeleteRepoFilesOptions(repo) - // test - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesDelete() + assert.NotNil(t, filesResponse) + assert.Nil(t, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) + assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) + assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) - // asserts - require.NoError(t, err) - gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) - defer gitRepo.Close() + filesResponse, err = files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + assert.Nil(t, filesResponse) + expectedError := "repository file does not exist [path: " + opts.Files[0].TreePath + "]" + assert.EqualError(t, err, expectedError) + }) - commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) - assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) - }) -} + t.Run("Delete without branch name", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + opts := getDeleteRepoFilesOptions(repo) + opts.OldBranch = "" + opts.NewBranch = "" + opts.Files[0].SHA = "103ff9234cefeee5ec5361d22b49fbb04d385885" + opts.Files[0].TreePath = "new/file.txt" -func TestChangeRepoFilesForDelete(t *testing.T) { - onGiteaRun(t, testDeleteRepoFiles) -} - -func testDeleteRepoFiles(t *testing.T, u *url.URL) { - // setup - unittest.PrepareTestEnv(t) - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - opts := getDeleteRepoFilesOptions(repo) - - t.Run("Delete README.md file", func(t *testing.T) { - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesDelete() - assert.NotNil(t, filesResponse) - assert.Nil(t, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) - assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) - assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) - }) - - t.Run("Verify README.md has been deleted", func(t *testing.T) { - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - assert.Nil(t, filesResponse) - expectedError := "repository file does not exist [path: " + opts.Files[0].TreePath + "]" - assert.EqualError(t, err, expectedError) - }) -} - -// Test opts with branch names removed, same results -func TestChangeRepoFilesForDeleteWithoutBranchNames(t *testing.T) { - onGiteaRun(t, testDeleteRepoFilesWithoutBranchNames) -} - -func testDeleteRepoFilesWithoutBranchNames(t *testing.T, u *url.URL) { - // setup - unittest.PrepareTestEnv(t) - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - - opts := getDeleteRepoFilesOptions(repo) - opts.OldBranch = "" - opts.NewBranch = "" - - t.Run("Delete README.md without Branch Name", func(t *testing.T) { - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesDelete() - assert.NotNil(t, filesResponse) - assert.Nil(t, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) - assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) - assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesDelete() + assert.NotNil(t, filesResponse) + assert.Nil(t, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) + assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) + assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) + }) }) } diff --git a/tests/integration/user_avatar_test.go b/tests/integration/user_avatar_test.go index a5805d0eda..a7c0264aaa 100644 --- a/tests/integration/user_avatar_test.go +++ b/tests/integration/user_avatar_test.go @@ -10,85 +10,78 @@ import ( "io" "mime/multipart" "net/http" - "net/url" "testing" "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/avatar" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestUserAvatar(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + defer tests.PrepareTestEnv(t)() + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - seed := user2.Email - if len(seed) == 0 { - seed = user2.Name - } + seed := user2.Email + if len(seed) == 0 { + seed = user2.Name + } - img, err := avatar.RandomImage([]byte(seed)) - if err != nil { - require.NoError(t, err) - return - } + img, err := avatar.RandomImage([]byte(seed)) + if err != nil { + require.NoError(t, err) + return + } - session := loginUser(t, "user2") - csrf := GetCSRF(t, session, "/user/settings") + session := loginUser(t, "user2") + csrf := GetCSRF(t, session, "/user/settings") - imgData := &bytes.Buffer{} + imgData := &bytes.Buffer{} - body := &bytes.Buffer{} + body := &bytes.Buffer{} - // Setup multi-part - writer := multipart.NewWriter(body) - writer.WriteField("source", "local") - part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") - if err != nil { - require.NoError(t, err) - return - } + // Setup multi-part + writer := multipart.NewWriter(body) + writer.WriteField("source", "local") + part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") + if err != nil { + require.NoError(t, err) + return + } - if err := png.Encode(imgData, img); err != nil { - require.NoError(t, err) - return - } + if err := png.Encode(imgData, img); err != nil { + require.NoError(t, err) + return + } - if _, err := io.Copy(part, imgData); err != nil { - require.NoError(t, err) - return - } + if _, err := io.Copy(part, imgData); err != nil { + require.NoError(t, err) + return + } - if err := writer.Close(); err != nil { - require.NoError(t, err) - return - } + if err := writer.Close(); err != nil { + require.NoError(t, err) + return + } - req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) - req.Header.Add("X-Csrf-Token", csrf) - req.Header.Add("Content-Type", writer.FormDataContentType()) + req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) + req.Header.Add("X-Csrf-Token", csrf) + req.Header.Add("Content-Type", writer.FormDataContentType()) - session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) - user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) - _ = session.MakeRequest(t, req, http.StatusOK) + req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) + _ = session.MakeRequest(t, req, http.StatusOK) - testGetAvatarRedirect(t, user2) + req = NewRequestf(t, "GET", "/%s.png", user2.Name) + resp := MakeRequest(t, req, http.StatusSeeOther) + assert.EqualValues(t, fmt.Sprintf("/avatars/%s", user2.Avatar), resp.Header().Get("location")) - // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. - }) -} - -func testGetAvatarRedirect(t *testing.T, user *user_model.User) { - t.Run(fmt.Sprintf("getAvatarRedirect_%s", user.Name), func(t *testing.T) { - req := NewRequestf(t, "GET", "/%s.png", user.Name) - resp := MakeRequest(t, req, http.StatusSeeOther) - assert.EqualValues(t, fmt.Sprintf("/avatars/%s", user.Avatar), resp.Header().Get("location")) - }) + // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. } diff --git a/tests/integration/user_profile_activity_test.go b/tests/integration/user_profile_activity_test.go index 8f3042678a..77d188903e 100644 --- a/tests/integration/user_profile_activity_test.go +++ b/tests/integration/user_profile_activity_test.go @@ -5,11 +5,11 @@ package integration import ( "net/http" - "net/url" "strconv" "testing" "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -23,70 +23,69 @@ import ( // - Profile visibility // - Public activity visibility func TestUserProfileActivity(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - // This test needs multiple users with different access statuses to check for all possible states - userAdmin := loginUser(t, "user1") - userRegular := loginUser(t, "user2") - // Activity availability should be the same for guest and another non-admin user, so this is not tested separately - userGuest := emptyTestSession(t) + defer tests.PrepareTestEnv(t)() + // This test needs multiple users with different access statuses to check for all possible states + userAdmin := loginUser(t, "user1") + userRegular := loginUser(t, "user2") + // Activity availability should be the same for guest and another non-admin user, so this is not tested separately + userGuest := emptyTestSession(t) - // = Public profile, public activity = + // = Public profile, public activity = - // Set activity visibility of user2 to public. This is the default, but won't hurt to set it before testing. - testChangeUserActivityVisibility(t, userRegular, "off") + // Set activity visibility of user2 to public. This is the default, but won't hurt to set it before testing. + testChangeUserActivityVisibility(t, userRegular, "off") - // Verify availability of RSS button and activity tab - testUser2ActivityButtonsAvailability(t, userAdmin, true) - testUser2ActivityButtonsAvailability(t, userRegular, true) - testUser2ActivityButtonsAvailability(t, userGuest, true) + // Verify availability of RSS button and activity tab + testUser2ActivityButtonsAvailability(t, userAdmin, true) + testUser2ActivityButtonsAvailability(t, userRegular, true) + testUser2ActivityButtonsAvailability(t, userGuest, true) - // Verify the hint for all types of users: admin, self, guest - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to everyone, but as an administrator you can also see interactions in private spaces.", true) - hintLink := testUser2ActivityVisibility(t, userRegular, "Your activity is visible to everyone, except for interactions in private spaces. Configure.", true) - testUser2ActivityVisibility(t, userGuest, "", true) + // Verify the hint for all types of users: admin, self, guest + testUser2ActivityVisibility(t, userAdmin, "This activity is visible to everyone, but as an administrator you can also see interactions in private spaces.", true) + hintLink := testUser2ActivityVisibility(t, userRegular, "Your activity is visible to everyone, except for interactions in private spaces. Configure.", true) + testUser2ActivityVisibility(t, userGuest, "", true) - // When viewing own profile, the user is offered to configure activity visibility. Verify that the link is correct and works, also check that it links back to the activity tab. - linkCorrect := assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) - if linkCorrect { - page := NewHTMLParser(t, userRegular.MakeRequest(t, NewRequest(t, "GET", hintLink), http.StatusOK).Body) - activityLink, exists := page.Find(".field:has(.checkbox#keep-activity-private) .help a").Attr("href") - assert.True(t, exists) - assert.EqualValues(t, "/user2?tab=activity", activityLink) - } + // When viewing own profile, the user is offered to configure activity visibility. Verify that the link is correct and works, also check that it links back to the activity tab. + linkCorrect := assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) + if linkCorrect { + page := NewHTMLParser(t, userRegular.MakeRequest(t, NewRequest(t, "GET", hintLink), http.StatusOK).Body) + activityLink, exists := page.Find(".field:has(.checkbox#keep-activity-private) .help a").Attr("href") + assert.True(t, exists) + assert.EqualValues(t, "/user2?tab=activity", activityLink) + } - // = Private profile, but public activity = + // = Private profile, but public activity = - // Set profile visibility of user2 to private - testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePrivate) + // Set profile visibility of user2 to private + testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePrivate) - // When profile activity is configured as public, but the profile is private, tell the user about this and link to visibility settings. - hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators because your profile is private. Configure.", true) - assert.EqualValues(t, "/user/settings#visibility-setting", hintLink) + // When profile activity is configured as public, but the profile is private, tell the user about this and link to visibility settings. + hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators because your profile is private. Configure.", true) + assert.EqualValues(t, "/user/settings#visibility-setting", hintLink) - // When the profile is private, tell the admin about this. - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) + // When the profile is private, tell the admin about this. + testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) - // Set profile visibility of user2 back to public - testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePublic) + // Set profile visibility of user2 back to public + testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePublic) - // = Private acitivty = + // = Private acitivty = - // Set activity visibility of user2 to private - testChangeUserActivityVisibility(t, userRegular, "on") + // Set activity visibility of user2 to private + testChangeUserActivityVisibility(t, userRegular, "on") - // Verify availability of RSS button and activity tab - testUser2ActivityButtonsAvailability(t, userAdmin, true) - testUser2ActivityButtonsAvailability(t, userRegular, true) - testUser2ActivityButtonsAvailability(t, userGuest, false) + // Verify availability of RSS button and activity tab + testUser2ActivityButtonsAvailability(t, userAdmin, true) + testUser2ActivityButtonsAvailability(t, userRegular, true) + testUser2ActivityButtonsAvailability(t, userGuest, false) - // Verify the hint for all types of users: admin, self, guest - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) - hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators. Configure.", true) - testUser2ActivityVisibility(t, userGuest, "This user has disabled the public visibility of the activity.", false) + // Verify the hint for all types of users: admin, self, guest + testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) + hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators. Configure.", true) + testUser2ActivityVisibility(t, userGuest, "This user has disabled the public visibility of the activity.", false) - // Verify that Configure link is correct - assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) - }) + // Verify that Configure link is correct + assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) } // testChangeUserActivityVisibility allows to easily change visibility of public activity for a user diff --git a/tests/integration/user_profile_follows_test.go b/tests/integration/user_profile_follows_test.go index bad0944d88..24b74268e6 100644 --- a/tests/integration/user_profile_follows_test.go +++ b/tests/integration/user_profile_follows_test.go @@ -6,10 +6,11 @@ package integration import ( "fmt" "net/http" - "net/url" "strings" "testing" + "code.gitea.io/gitea/tests" + "github.com/stretchr/testify/assert" ) @@ -19,92 +20,92 @@ import ( // - Followers and Following lists have correct amounts of items // - %d followers and %following counters are always present and always have correct numbers and use correct plurals func TestUserProfileFollows(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - // This test needs 3 users to check for all possible states - // The accounts of user3 and user4 are not functioning - user1 := loginUser(t, "user1") - user2 := loginUser(t, "user2") - user5 := loginUser(t, "user5") + defer tests.PrepareTestEnv(t)() - followersLink := "#profile-avatar-card a[href='/user1?tab=followers']" - followingLink := "#profile-avatar-card a[href='/user1?tab=following']" - listHeader := ".user-cards h2" - listItems := ".user-cards .list" + // This test needs 3 users to check for all possible states + // The accounts of user3 and user4 are not functioning + user1 := loginUser(t, "user1") + user2 := loginUser(t, "user2") + user5 := loginUser(t, "user5") - // = No follows = + followersLink := "#profile-avatar-card a[href='/user1?tab=followers']" + followingLink := "#profile-avatar-card a[href='/user1?tab=following']" + listHeader := ".user-cards h2" + listItems := ".user-cards .list" - var followCount int + // = No follows = - // Request the profile of user1, the Followers tab - response := user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page := NewHTMLParser(t, response.Body) + var followCount int - // Verify that user1 has no followers - testSelectorEquals(t, page, followersLink, "0 followers") - testSelectorEquals(t, page, listHeader, "Followers") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Followers tab + response := user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page := NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify that user1 has no followers + testSelectorEquals(t, page, followersLink, "0 followers") + testSelectorEquals(t, page, listHeader, "Followers") + testListCount(t, page, listItems, followCount) - // Verify that user1 does not follow anyone - testSelectorEquals(t, page, followingLink, "0 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Make user1 and user2 follow each other - testUserFollowUser(t, user1, "user2") - testUserFollowUser(t, user2, "user1") + // Verify that user1 does not follow anyone + testSelectorEquals(t, page, followingLink, "0 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) - // = 1 follow each = + // Make user1 and user2 follow each other + testUserFollowUser(t, user1, "user2") + testUserFollowUser(t, user2, "user1") - followCount++ + // = 1 follow each = - // Request the profile of user1, the Followers tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + followCount++ - // Verify it is now followed by 1 user - testSelectorEquals(t, page, followersLink, "1 follower") - testSelectorEquals(t, page, listHeader, "Follower") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Followers tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify it is now followed by 1 user + testSelectorEquals(t, page, followersLink, "1 follower") + testSelectorEquals(t, page, listHeader, "Follower") + testListCount(t, page, listItems, followCount) - // Verify it now follows follows 1 user - testSelectorEquals(t, page, followingLink, "1 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Make user1 and user3 follow each other - testUserFollowUser(t, user1, "user5") - testUserFollowUser(t, user5, "user1") + // Verify it now follows follows 1 user + testSelectorEquals(t, page, followingLink, "1 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) - // = 2 follows = + // Make user1 and user3 follow each other + testUserFollowUser(t, user1, "user5") + testUserFollowUser(t, user5, "user1") - followCount++ + // = 2 follows = - // Request the profile of user1, the Followers tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + followCount++ - // Verify it is now followed by 2 users - testSelectorEquals(t, page, followersLink, "2 followers") - testSelectorEquals(t, page, listHeader, "Followers") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Followers tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify it is now followed by 2 users + testSelectorEquals(t, page, followersLink, "2 followers") + testSelectorEquals(t, page, listHeader, "Followers") + testListCount(t, page, listItems, followCount) - // Verify it now follows follows 2 users - testSelectorEquals(t, page, followingLink, "2 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) - }) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) + + // Verify it now follows follows 2 users + testSelectorEquals(t, page, followingLink, "2 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) } // testUserFollowUser simply follows a user `following` by session of user `follower`