forgejo/tests/integration/api_issue_templates_test.go
Ruud van Asseldonk 995dba14ec feat: search in the docs directory for issue and pull request templates (#8863)
For pull request templates, Forgejo currently does not look in the `docs` directory, but [GitHub does](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository#adding-a-pull-request-template). By making Forgejo also look there, it becomes possible to have the same repository work on both sites, without the need for vendor-specific paths.

There was duplication in the list of accepted file paths. On the one hand it’s nice for greppability that they are all spelled out, but it does mean adding 6 variants, I thought it would be more maintainable to deduplicate the Cartesian product. I added one fully spelled out path in the comment to still maintain some greppability.

Resolves forgejo/forgejo#8284

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8863
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Co-authored-by: Ruud van Asseldonk <dev@veniogames.com>
Co-committed-by: Ruud van Asseldonk <dev@veniogames.com>
2025-08-26 22:08:10 +02:00

115 lines
3.4 KiB
Go

// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"fmt"
"net/http"
"net/url"
"testing"
repo_model "forgejo.org/models/repo"
"forgejo.org/models/unittest"
user_model "forgejo.org/models/user"
api "forgejo.org/modules/structs"
"forgejo.org/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestAPIIssueTemplateList(t *testing.T) {
onGiteaRun(t, func(t *testing.T, u *url.URL) {
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
t.Run("no templates", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/issue_templates", repo.FullName()))
resp := MakeRequest(t, req, http.StatusOK)
var issueTemplates []*api.IssueTemplate
DecodeJSON(t, resp, &issueTemplates)
assert.Empty(t, issueTemplates)
})
t.Run("existing template", func(t *testing.T) {
templateCandidates := []string{
".forgejo/ISSUE_TEMPLATE/test.md",
".forgejo/issue_template/test.md",
".gitea/ISSUE_TEMPLATE/test.md",
".gitea/issue_template/test.md",
".github/ISSUE_TEMPLATE/test.md",
".github/issue_template/test.md",
"docs/issue_template/test.md",
}
for _, template := range templateCandidates {
t.Run(template, func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
defer deleteFileInBranch(user, repo, template, repo.DefaultBranch)
err := createOrReplaceFileInBranch(user, repo, template, repo.DefaultBranch,
`---
name: 'Template Name'
about: 'This template is for testing!'
title: '[TEST] '
ref: 'main'
---
This is the template!`)
require.NoError(t, err)
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/issue_templates", repo.FullName()))
resp := MakeRequest(t, req, http.StatusOK)
var issueTemplates []*api.IssueTemplate
DecodeJSON(t, resp, &issueTemplates)
assert.Len(t, issueTemplates, 1)
assert.Equal(t, "Template Name", issueTemplates[0].Name)
assert.Equal(t, "This template is for testing!", issueTemplates[0].About)
assert.Equal(t, "refs/heads/main", issueTemplates[0].Ref)
assert.Equal(t, template, issueTemplates[0].FileName)
})
}
})
t.Run("multiple templates", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
templatePriority := []string{
".forgejo/issue_template/test.md",
".gitea/issue_template/test.md",
".github/issue_template/test.md",
"docs/issue_template/test.md",
}
defer func() {
for _, template := range templatePriority {
deleteFileInBranch(user, repo, template, repo.DefaultBranch)
}
}()
for _, template := range templatePriority {
err := createOrReplaceFileInBranch(user, repo, template, repo.DefaultBranch,
`---
name: 'Template Name'
about: 'This template is for testing!'
title: '[TEST] '
ref: 'main'
---
This is the template!`)
require.NoError(t, err)
}
req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/issue_templates", repo.FullName()))
resp := MakeRequest(t, req, http.StatusOK)
var issueTemplates []*api.IssueTemplate
DecodeJSON(t, resp, &issueTemplates)
// If templates have the same filename and content, but in different
// directories, they count as different templates, and all are
// considered.
assert.Len(t, issueTemplates, 4)
})
})
}