loading up the forgejo repo on tangled to test page performance
at forgejo 211 lines 6.5 kB view raw
1// Copyright 2023 The Gitea Authors. All rights reserved. 2// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. 3// SPDX-License-Identifier: MIT 4 5package integration 6 7import ( 8 "fmt" 9 "net/http" 10 "testing" 11 12 repo_model "forgejo.org/models/repo" 13 "forgejo.org/models/unittest" 14 user_model "forgejo.org/models/user" 15 api "forgejo.org/modules/structs" 16 "forgejo.org/tests" 17 18 "github.com/stretchr/testify/assert" 19 "github.com/stretchr/testify/require" 20 "gopkg.in/yaml.v3" 21) 22 23func createIssueConfigInDirectory(t *testing.T, user *user_model.User, repo *repo_model.Repository, dir string, issueConfig map[string]any) { 24 config, err := yaml.Marshal(issueConfig) 25 require.NoError(t, err) 26 27 err = createOrReplaceFileInBranch(user, repo, fmt.Sprintf("%s/ISSUE_TEMPLATE/config.yaml", dir), repo.DefaultBranch, string(config)) 28 require.NoError(t, err) 29} 30 31func createIssueConfig(t *testing.T, user *user_model.User, repo *repo_model.Repository, issueConfig map[string]any) { 32 createIssueConfigInDirectory(t, user, repo, ".gitea", issueConfig) 33} 34 35func getIssueConfig(t *testing.T, owner, repo string) api.IssueConfig { 36 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config", owner, repo) 37 req := NewRequest(t, "GET", urlStr) 38 resp := MakeRequest(t, req, http.StatusOK) 39 40 var issueConfig api.IssueConfig 41 DecodeJSON(t, resp, &issueConfig) 42 43 return issueConfig 44} 45 46func TestAPIRepoGetIssueConfig(t *testing.T) { 47 defer tests.PrepareTestEnv(t)() 48 49 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49}) 50 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 51 52 t.Run("Default", func(t *testing.T) { 53 defer tests.PrintCurrentTest(t)() 54 55 issueConfig := getIssueConfig(t, owner.Name, repo.Name) 56 57 assert.True(t, issueConfig.BlankIssuesEnabled) 58 assert.Empty(t, issueConfig.ContactLinks) 59 }) 60 61 t.Run("DisableBlankIssues", func(t *testing.T) { 62 defer tests.PrintCurrentTest(t)() 63 64 config := make(map[string]any) 65 config["blank_issues_enabled"] = false 66 67 createIssueConfig(t, owner, repo, config) 68 69 issueConfig := getIssueConfig(t, owner.Name, repo.Name) 70 71 assert.False(t, issueConfig.BlankIssuesEnabled) 72 assert.Empty(t, issueConfig.ContactLinks) 73 }) 74 75 t.Run("ContactLinks", func(t *testing.T) { 76 defer tests.PrintCurrentTest(t)() 77 78 contactLink := make(map[string]string) 79 contactLink["name"] = "TestName" 80 contactLink["url"] = "https://example.com" 81 contactLink["about"] = "TestAbout" 82 83 config := make(map[string]any) 84 config["contact_links"] = []map[string]string{contactLink} 85 86 createIssueConfig(t, owner, repo, config) 87 88 issueConfig := getIssueConfig(t, owner.Name, repo.Name) 89 90 assert.True(t, issueConfig.BlankIssuesEnabled) 91 assert.Len(t, issueConfig.ContactLinks, 1) 92 93 assert.Equal(t, "TestName", issueConfig.ContactLinks[0].Name) 94 assert.Equal(t, "https://example.com", issueConfig.ContactLinks[0].URL) 95 assert.Equal(t, "TestAbout", issueConfig.ContactLinks[0].About) 96 }) 97 98 t.Run("Full", func(t *testing.T) { 99 defer tests.PrintCurrentTest(t)() 100 101 contactLink := make(map[string]string) 102 contactLink["name"] = "TestName" 103 contactLink["url"] = "https://example.com" 104 contactLink["about"] = "TestAbout" 105 106 config := make(map[string]any) 107 config["blank_issues_enabled"] = false 108 config["contact_links"] = []map[string]string{contactLink} 109 110 createIssueConfig(t, owner, repo, config) 111 112 issueConfig := getIssueConfig(t, owner.Name, repo.Name) 113 114 assert.False(t, issueConfig.BlankIssuesEnabled) 115 assert.Len(t, issueConfig.ContactLinks, 1) 116 117 assert.Equal(t, "TestName", issueConfig.ContactLinks[0].Name) 118 assert.Equal(t, "https://example.com", issueConfig.ContactLinks[0].URL) 119 assert.Equal(t, "TestAbout", issueConfig.ContactLinks[0].About) 120 }) 121} 122 123func TestAPIRepoIssueConfigPaths(t *testing.T) { 124 defer tests.PrepareTestEnv(t)() 125 126 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49}) 127 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 128 129 templateConfigCandidates := []string{ 130 ".forgejo/ISSUE_TEMPLATE/config", 131 ".forgejo/issue_template/config", 132 ".gitea/ISSUE_TEMPLATE/config", 133 ".gitea/issue_template/config", 134 ".github/ISSUE_TEMPLATE/config", 135 ".github/issue_template/config", 136 } 137 138 for _, candidate := range templateConfigCandidates { 139 for _, extension := range []string{".yaml", ".yml"} { 140 fullPath := candidate + extension 141 t.Run(fullPath, func(t *testing.T) { 142 defer tests.PrintCurrentTest(t)() 143 144 configMap := make(map[string]any) 145 configMap["blank_issues_enabled"] = false 146 147 configData, err := yaml.Marshal(configMap) 148 require.NoError(t, err) 149 150 _, err = createFileInBranch(owner, repo, fullPath, repo.DefaultBranch, string(configData)) 151 require.NoError(t, err) 152 153 issueConfig := getIssueConfig(t, owner.Name, repo.Name) 154 155 assert.False(t, issueConfig.BlankIssuesEnabled) 156 assert.Empty(t, issueConfig.ContactLinks) 157 158 _, err = deleteFileInBranch(owner, repo, fullPath, repo.DefaultBranch) 159 require.NoError(t, err) 160 }) 161 } 162 } 163} 164 165func TestAPIRepoValidateIssueConfig(t *testing.T) { 166 defer tests.PrepareTestEnv(t)() 167 168 repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49}) 169 owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) 170 171 urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config/validate", owner.Name, repo.Name) 172 173 t.Run("Valid", func(t *testing.T) { 174 defer tests.PrintCurrentTest(t)() 175 176 req := NewRequest(t, "GET", urlStr) 177 resp := MakeRequest(t, req, http.StatusOK) 178 179 var issueConfigValidation api.IssueConfigValidation 180 DecodeJSON(t, resp, &issueConfigValidation) 181 182 assert.True(t, issueConfigValidation.Valid) 183 assert.Empty(t, issueConfigValidation.Message) 184 }) 185 186 t.Run("Invalid", func(t *testing.T) { 187 dirs := []string{".gitea", ".forgejo"} 188 for _, dir := range dirs { 189 t.Run(dir, func(t *testing.T) { 190 defer tests.PrintCurrentTest(t)() 191 defer func() { 192 deleteFileInBranch(owner, repo, fmt.Sprintf("%s/ISSUE_TEMPLATE/config.yaml", dir), repo.DefaultBranch) 193 }() 194 195 config := make(map[string]any) 196 config["blank_issues_enabled"] = "Test" 197 198 createIssueConfigInDirectory(t, owner, repo, dir, config) 199 200 req := NewRequest(t, "GET", urlStr) 201 resp := MakeRequest(t, req, http.StatusOK) 202 203 var issueConfigValidation api.IssueConfigValidation 204 DecodeJSON(t, resp, &issueConfigValidation) 205 206 assert.False(t, issueConfigValidation.Valid) 207 assert.NotEmpty(t, issueConfigValidation.Message) 208 }) 209 } 210 }) 211}