Skip to content

Commit 1624ebc

Browse files
committed
[TESTS] issue & PR templates in .forgejo are recognized
This adds a few tests for the previous change, to verify that issue template configs, issue templates and pr templates are all recognized in `.forgejo` directories. Signed-off-by: Gergely Nagy <[email protected]>
1 parent 271db6f commit 1624ebc

File tree

3 files changed

+198
-20
lines changed

3 files changed

+198
-20
lines changed

tests/integration/api_issue_config_test.go

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
23
// SPDX-License-Identifier: MIT
34

45
package integration
@@ -18,14 +19,18 @@ import (
1819
"gopkg.in/yaml.v3"
1920
)
2021

21-
func createIssueConfig(t *testing.T, user *user_model.User, repo *repo_model.Repository, issueConfig map[string]any) {
22+
func createIssueConfigInDirectory(t *testing.T, user *user_model.User, repo *repo_model.Repository, dir string, issueConfig map[string]any) {
2223
config, err := yaml.Marshal(issueConfig)
2324
assert.NoError(t, err)
2425

25-
err = createOrReplaceFileInBranch(user, repo, ".gitea/ISSUE_TEMPLATE/config.yaml", repo.DefaultBranch, string(config))
26+
err = createOrReplaceFileInBranch(user, repo, fmt.Sprintf("%s/ISSUE_TEMPLATE/config.yaml", dir), repo.DefaultBranch, string(config))
2627
assert.NoError(t, err)
2728
}
2829

30+
func createIssueConfig(t *testing.T, user *user_model.User, repo *repo_model.Repository, issueConfig map[string]any) {
31+
createIssueConfigInDirectory(t, user, repo, ".gitea", issueConfig)
32+
}
33+
2934
func getIssueConfig(t *testing.T, owner, repo string) api.IssueConfig {
3035
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config", owner, repo)
3136
req := NewRequest(t, "GET", urlStr)
@@ -44,13 +49,17 @@ func TestAPIRepoGetIssueConfig(t *testing.T) {
4449
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
4550

4651
t.Run("Default", func(t *testing.T) {
52+
defer tests.PrintCurrentTest(t)()
53+
4754
issueConfig := getIssueConfig(t, owner.Name, repo.Name)
4855

4956
assert.True(t, issueConfig.BlankIssuesEnabled)
5057
assert.Len(t, issueConfig.ContactLinks, 0)
5158
})
5259

5360
t.Run("DisableBlankIssues", func(t *testing.T) {
61+
defer tests.PrintCurrentTest(t)()
62+
5463
config := make(map[string]any)
5564
config["blank_issues_enabled"] = false
5665

@@ -63,6 +72,8 @@ func TestAPIRepoGetIssueConfig(t *testing.T) {
6372
})
6473

6574
t.Run("ContactLinks", func(t *testing.T) {
75+
defer tests.PrintCurrentTest(t)()
76+
6677
contactLink := make(map[string]string)
6778
contactLink["name"] = "TestName"
6879
contactLink["url"] = "https://example.com"
@@ -84,6 +95,8 @@ func TestAPIRepoGetIssueConfig(t *testing.T) {
8495
})
8596

8697
t.Run("Full", func(t *testing.T) {
98+
defer tests.PrintCurrentTest(t)()
99+
87100
contactLink := make(map[string]string)
88101
contactLink["name"] = "TestName"
89102
contactLink["url"] = "https://example.com"
@@ -113,6 +126,8 @@ func TestAPIRepoIssueConfigPaths(t *testing.T) {
113126
owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
114127

115128
templateConfigCandidates := []string{
129+
".forgejo/ISSUE_TEMPLATE/config",
130+
".forgejo/issue_template/config",
116131
".gitea/ISSUE_TEMPLATE/config",
117132
".gitea/issue_template/config",
118133
".github/ISSUE_TEMPLATE/config",
@@ -123,6 +138,8 @@ func TestAPIRepoIssueConfigPaths(t *testing.T) {
123138
for _, extension := range []string{".yaml", ".yml"} {
124139
fullPath := canidate + extension
125140
t.Run(fullPath, func(t *testing.T) {
141+
defer tests.PrintCurrentTest(t)()
142+
126143
configMap := make(map[string]any)
127144
configMap["blank_issues_enabled"] = false
128145

@@ -153,6 +170,8 @@ func TestAPIRepoValidateIssueConfig(t *testing.T) {
153170
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config/validate", owner.Name, repo.Name)
154171

155172
t.Run("Valid", func(t *testing.T) {
173+
defer tests.PrintCurrentTest(t)()
174+
156175
req := NewRequest(t, "GET", urlStr)
157176
resp := MakeRequest(t, req, http.StatusOK)
158177

@@ -164,18 +183,28 @@ func TestAPIRepoValidateIssueConfig(t *testing.T) {
164183
})
165184

166185
t.Run("Invalid", func(t *testing.T) {
167-
config := make(map[string]any)
168-
config["blank_issues_enabled"] = "Test"
186+
dirs := []string{".gitea", ".forgejo"}
187+
for _, dir := range dirs {
188+
t.Run(dir, func(t *testing.T) {
189+
defer tests.PrintCurrentTest(t)()
190+
defer func() {
191+
deleteFileInBranch(owner, repo, fmt.Sprintf("%s/ISSUE_TEMPLATE/config.yaml", dir), repo.DefaultBranch)
192+
}()
169193

170-
createIssueConfig(t, owner, repo, config)
194+
config := make(map[string]any)
195+
config["blank_issues_enabled"] = "Test"
171196

172-
req := NewRequest(t, "GET", urlStr)
173-
resp := MakeRequest(t, req, http.StatusOK)
197+
createIssueConfigInDirectory(t, owner, repo, dir, config)
174198

175-
var issueConfigValidation api.IssueConfigValidation
176-
DecodeJSON(t, resp, &issueConfigValidation)
199+
req := NewRequest(t, "GET", urlStr)
200+
resp := MakeRequest(t, req, http.StatusOK)
201+
202+
var issueConfigValidation api.IssueConfigValidation
203+
DecodeJSON(t, resp, &issueConfigValidation)
177204

178-
assert.False(t, issueConfigValidation.Valid)
179-
assert.NotEmpty(t, issueConfigValidation.Message)
205+
assert.False(t, issueConfigValidation.Valid)
206+
assert.NotEmpty(t, issueConfigValidation.Message)
207+
})
208+
}
180209
})
181210
}

tests/integration/api_issue_templates_test.go

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,31 +34,81 @@ func TestAPIIssueTemplateList(t *testing.T) {
3434
})
3535

3636
t.Run("existing template", func(t *testing.T) {
37+
templateCandidates := []string{
38+
".forgejo/ISSUE_TEMPLATE/test.md",
39+
".forgejo/issue_template/test.md",
40+
".gitea/ISSUE_TEMPLATE/test.md",
41+
".gitea/issue_template/test.md",
42+
".github/ISSUE_TEMPLATE/test.md",
43+
".github/issue_template/test.md",
44+
}
45+
46+
for _, template := range templateCandidates {
47+
t.Run(template, func(t *testing.T) {
48+
defer tests.PrintCurrentTest(t)()
49+
defer func() {
50+
deleteFileInBranch(user, repo, template, repo.DefaultBranch)
51+
}()
52+
53+
err := createOrReplaceFileInBranch(user, repo, template, repo.DefaultBranch,
54+
`---
55+
name: 'Template Name'
56+
about: 'This template is for testing!'
57+
title: '[TEST] '
58+
ref: 'main'
59+
---
60+
61+
This is the template!`)
62+
assert.NoError(t, err)
63+
64+
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/issue_templates", repo.FullName()))
65+
resp := MakeRequest(t, req, http.StatusOK)
66+
var issueTemplates []*api.IssueTemplate
67+
DecodeJSON(t, resp, &issueTemplates)
68+
assert.Len(t, issueTemplates, 1)
69+
assert.Equal(t, "Template Name", issueTemplates[0].Name)
70+
assert.Equal(t, "This template is for testing!", issueTemplates[0].About)
71+
assert.Equal(t, "refs/heads/main", issueTemplates[0].Ref)
72+
assert.Equal(t, template, issueTemplates[0].FileName)
73+
})
74+
}
75+
})
76+
77+
t.Run("multiple templates", func(t *testing.T) {
3778
defer tests.PrintCurrentTest(t)()
79+
templatePriority := []string{
80+
".forgejo/issue_template/test.md",
81+
".gitea/issue_template/test.md",
82+
".github/issue_template/test.md",
83+
}
3884
defer func() {
39-
deleteFileInBranch(user, repo, "ISSUE_TEMPLATE/test.md", repo.DefaultBranch)
85+
for _, template := range templatePriority {
86+
deleteFileInBranch(user, repo, template, repo.DefaultBranch)
87+
}
4088
}()
4189

42-
err := createOrReplaceFileInBranch(user, repo, "ISSUE_TEMPLATE/test.md", repo.DefaultBranch,
43-
`---
90+
for _, template := range templatePriority {
91+
err := createOrReplaceFileInBranch(user, repo, template, repo.DefaultBranch,
92+
`---
4493
name: 'Template Name'
4594
about: 'This template is for testing!'
4695
title: '[TEST] '
4796
ref: 'main'
4897
---
4998
5099
This is the template!`)
51-
assert.NoError(t, err)
100+
assert.NoError(t, err)
101+
}
52102

53103
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/issue_templates", repo.FullName()))
54104
resp := MakeRequest(t, req, http.StatusOK)
55105
var issueTemplates []*api.IssueTemplate
56106
DecodeJSON(t, resp, &issueTemplates)
57-
assert.Len(t, issueTemplates, 1)
58-
assert.Equal(t, "Template Name", issueTemplates[0].Name)
59-
assert.Equal(t, "This template is for testing!", issueTemplates[0].About)
60-
assert.Equal(t, "refs/heads/main", issueTemplates[0].Ref)
61-
assert.Equal(t, "ISSUE_TEMPLATE/test.md", issueTemplates[0].FileName)
107+
108+
// If templates have the same filename and content, but in different
109+
// directories, they count as different templates, and all are
110+
// considered.
111+
assert.Len(t, issueTemplates, 3)
62112
})
63113
})
64114
}

tests/integration/pull_create_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,105 @@ func TestPullCreate(t *testing.T) {
9696
})
9797
}
9898

99+
func TestPullCreateWithPullTemplate(t *testing.T) {
100+
onGiteaRun(t, func(t *testing.T, u *url.URL) {
101+
baseUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
102+
forkUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
103+
104+
templateCandidates := []string{
105+
".forgejo/PULL_REQUEST_TEMPLATE.md",
106+
".forgejo/pull_request_template.md",
107+
".gitea/PULL_REQUEST_TEMPLATE.md",
108+
".gitea/pull_request_template.md",
109+
".github/PULL_REQUEST_TEMPLATE.md",
110+
".github/pull_request_template.md",
111+
}
112+
113+
createBaseRepo := func(t *testing.T, templateFiles []string, message string) (*repo_model.Repository, func()) {
114+
t.Helper()
115+
116+
changeOps := make([]*files_service.ChangeRepoFile, len(templateFiles))
117+
for i, template := range templateFiles {
118+
changeOps[i] = &files_service.ChangeRepoFile{
119+
Operation: "create",
120+
TreePath: template,
121+
ContentReader: strings.NewReader(message + " " + template),
122+
}
123+
}
124+
125+
repo, _, deferrer := CreateDeclarativeRepo(t, baseUser, "", nil, nil, changeOps)
126+
127+
return repo, deferrer
128+
}
129+
130+
testPullPreview := func(t *testing.T, session *TestSession, user, repo, message string) {
131+
t.Helper()
132+
133+
req := NewRequest(t, "GET", path.Join(user, repo))
134+
resp := session.MakeRequest(t, req, http.StatusOK)
135+
136+
// Click the PR button to create a pull
137+
htmlDoc := NewHTMLParser(t, resp.Body)
138+
link, exists := htmlDoc.doc.Find("#new-pull-request").Attr("href")
139+
assert.True(t, exists, "The template has changed")
140+
141+
// Load the pull request preview
142+
req = NewRequest(t, "GET", link)
143+
resp = session.MakeRequest(t, req, http.StatusOK)
144+
145+
// Check that the message from the template is present.
146+
htmlDoc = NewHTMLParser(t, resp.Body)
147+
pullRequestMessage := htmlDoc.doc.Find("textarea[placeholder*='comment']").Text()
148+
assert.Equal(t, message, pullRequestMessage)
149+
}
150+
151+
for i, template := range templateCandidates {
152+
t.Run(template, func(t *testing.T) {
153+
defer tests.PrintCurrentTest(t)()
154+
155+
// Create the base repository, with the pull request template added.
156+
message := fmt.Sprintf("TestPullCreateWithPullTemplate/%s", template)
157+
baseRepo, deferrer := createBaseRepo(t, []string{template}, message)
158+
defer deferrer()
159+
160+
// Fork the repository
161+
session := loginUser(t, forkUser.Name)
162+
testRepoFork(t, session, baseUser.Name, baseRepo.Name, forkUser.Name, baseRepo.Name)
163+
forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: forkUser.ID, Name: baseRepo.Name})
164+
165+
// Apply a change to the fork
166+
err := createOrReplaceFileInBranch(forkUser, forkedRepo, "README.md", forkedRepo.DefaultBranch, fmt.Sprintf("Hello, World (%d)\n", i))
167+
assert.NoError(t, err)
168+
169+
testPullPreview(t, session, forkUser.Name, forkedRepo.Name, message+" "+template)
170+
})
171+
}
172+
173+
t.Run("multiple template options", func(t *testing.T) {
174+
defer tests.PrintCurrentTest(t)()
175+
176+
// Create the base repository, with the pull request template added.
177+
message := "TestPullCreateWithPullTemplate/multiple"
178+
baseRepo, deferrer := createBaseRepo(t, templateCandidates, message)
179+
defer deferrer()
180+
181+
// Fork the repository
182+
session := loginUser(t, forkUser.Name)
183+
testRepoFork(t, session, baseUser.Name, baseRepo.Name, forkUser.Name, baseRepo.Name)
184+
forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: forkUser.ID, Name: baseRepo.Name})
185+
186+
// Apply a change to the fork
187+
err := createOrReplaceFileInBranch(forkUser, forkedRepo, "README.md", forkedRepo.DefaultBranch, "Hello, World (%d)\n")
188+
assert.NoError(t, err)
189+
190+
// Unlike issues, where all candidates are considered and shown, for
191+
// pull request, there's a priority: if there are multiple
192+
// templates, only the highest priority one is used.
193+
testPullPreview(t, session, forkUser.Name, forkedRepo.Name, message+" .forgejo/PULL_REQUEST_TEMPLATE.md")
194+
})
195+
})
196+
}
197+
99198
func TestPullCreate_TitleEscape(t *testing.T) {
100199
onGiteaRun(t, func(t *testing.T, u *url.URL) {
101200
session := loginUser(t, "user1")

0 commit comments

Comments
 (0)