You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

api_issue_config_test.go 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "testing"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. api "code.gitea.io/gitea/modules/structs"
  12. "code.gitea.io/gitea/tests"
  13. "github.com/stretchr/testify/assert"
  14. "gopkg.in/yaml.v3"
  15. )
  16. func createIssueConfig(t *testing.T, user *user_model.User, repo *repo_model.Repository, issueConfig map[string]any) {
  17. config, err := yaml.Marshal(issueConfig)
  18. assert.NoError(t, err)
  19. err = createOrReplaceFileInBranch(user, repo, ".gitea/ISSUE_TEMPLATE/config.yaml", repo.DefaultBranch, string(config))
  20. assert.NoError(t, err)
  21. }
  22. func getIssueConfig(t *testing.T, owner, repo string) api.IssueConfig {
  23. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config", owner, repo)
  24. req := NewRequest(t, "GET", urlStr)
  25. resp := MakeRequest(t, req, http.StatusOK)
  26. var issueConfig api.IssueConfig
  27. DecodeJSON(t, resp, &issueConfig)
  28. return issueConfig
  29. }
  30. func TestAPIRepoGetIssueConfig(t *testing.T) {
  31. defer tests.PrepareTestEnv(t)()
  32. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49})
  33. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  34. t.Run("Default", func(t *testing.T) {
  35. issueConfig := getIssueConfig(t, owner.Name, repo.Name)
  36. assert.True(t, issueConfig.BlankIssuesEnabled)
  37. assert.Len(t, issueConfig.ContactLinks, 0)
  38. })
  39. t.Run("DisableBlankIssues", func(t *testing.T) {
  40. config := make(map[string]any)
  41. config["blank_issues_enabled"] = false
  42. createIssueConfig(t, owner, repo, config)
  43. issueConfig := getIssueConfig(t, owner.Name, repo.Name)
  44. assert.False(t, issueConfig.BlankIssuesEnabled)
  45. assert.Len(t, issueConfig.ContactLinks, 0)
  46. })
  47. t.Run("ContactLinks", func(t *testing.T) {
  48. contactLink := make(map[string]string)
  49. contactLink["name"] = "TestName"
  50. contactLink["url"] = "https://example.com"
  51. contactLink["about"] = "TestAbout"
  52. config := make(map[string]any)
  53. config["contact_links"] = []map[string]string{contactLink}
  54. createIssueConfig(t, owner, repo, config)
  55. issueConfig := getIssueConfig(t, owner.Name, repo.Name)
  56. assert.True(t, issueConfig.BlankIssuesEnabled)
  57. assert.Len(t, issueConfig.ContactLinks, 1)
  58. assert.Equal(t, "TestName", issueConfig.ContactLinks[0].Name)
  59. assert.Equal(t, "https://example.com", issueConfig.ContactLinks[0].URL)
  60. assert.Equal(t, "TestAbout", issueConfig.ContactLinks[0].About)
  61. })
  62. t.Run("Full", func(t *testing.T) {
  63. contactLink := make(map[string]string)
  64. contactLink["name"] = "TestName"
  65. contactLink["url"] = "https://example.com"
  66. contactLink["about"] = "TestAbout"
  67. config := make(map[string]any)
  68. config["blank_issues_enabled"] = false
  69. config["contact_links"] = []map[string]string{contactLink}
  70. createIssueConfig(t, owner, repo, config)
  71. issueConfig := getIssueConfig(t, owner.Name, repo.Name)
  72. assert.False(t, issueConfig.BlankIssuesEnabled)
  73. assert.Len(t, issueConfig.ContactLinks, 1)
  74. assert.Equal(t, "TestName", issueConfig.ContactLinks[0].Name)
  75. assert.Equal(t, "https://example.com", issueConfig.ContactLinks[0].URL)
  76. assert.Equal(t, "TestAbout", issueConfig.ContactLinks[0].About)
  77. })
  78. }
  79. func TestAPIRepoIssueConfigPaths(t *testing.T) {
  80. defer tests.PrepareTestEnv(t)()
  81. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49})
  82. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  83. templateConfigCandidates := []string{
  84. ".gitea/ISSUE_TEMPLATE/config",
  85. ".gitea/issue_template/config",
  86. ".github/ISSUE_TEMPLATE/config",
  87. ".github/issue_template/config",
  88. }
  89. for _, canidate := range templateConfigCandidates {
  90. for _, extension := range []string{".yaml", ".yml"} {
  91. fullPath := canidate + extension
  92. t.Run(fullPath, func(t *testing.T) {
  93. configMap := make(map[string]any)
  94. configMap["blank_issues_enabled"] = false
  95. configData, err := yaml.Marshal(configMap)
  96. assert.NoError(t, err)
  97. _, err = createFileInBranch(owner, repo, fullPath, repo.DefaultBranch, string(configData))
  98. assert.NoError(t, err)
  99. issueConfig := getIssueConfig(t, owner.Name, repo.Name)
  100. assert.False(t, issueConfig.BlankIssuesEnabled)
  101. assert.Len(t, issueConfig.ContactLinks, 0)
  102. _, err = deleteFileInBranch(owner, repo, fullPath, repo.DefaultBranch)
  103. assert.NoError(t, err)
  104. })
  105. }
  106. }
  107. }
  108. func TestAPIRepoValidateIssueConfig(t *testing.T) {
  109. defer tests.PrepareTestEnv(t)()
  110. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 49})
  111. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
  112. urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issue_config/validate", owner.Name, repo.Name)
  113. t.Run("Valid", func(t *testing.T) {
  114. req := NewRequest(t, "GET", urlStr)
  115. resp := MakeRequest(t, req, http.StatusOK)
  116. var issueConfigValidation api.IssueConfigValidation
  117. DecodeJSON(t, resp, &issueConfigValidation)
  118. assert.True(t, issueConfigValidation.Valid)
  119. assert.Empty(t, issueConfigValidation.Message)
  120. })
  121. t.Run("Invalid", func(t *testing.T) {
  122. config := make(map[string]any)
  123. config["blank_issues_enabled"] = "Test"
  124. createIssueConfig(t, owner, repo, config)
  125. req := NewRequest(t, "GET", urlStr)
  126. resp := MakeRequest(t, req, http.StatusOK)
  127. var issueConfigValidation api.IssueConfigValidation
  128. DecodeJSON(t, resp, &issueConfigValidation)
  129. assert.False(t, issueConfigValidation.Valid)
  130. assert.NotEmpty(t, issueConfigValidation.Message)
  131. })
  132. }