code.gitea.io/gitea@v1.22.3/tests/integration/api_issue_config_test.go (about)

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