loading up the forgejo repo on tangled to test page performance
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}