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

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package integration
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"strings"
    10  	"testing"
    11  
    12  	auth_model "code.gitea.io/gitea/models/auth"
    13  	issues_model "code.gitea.io/gitea/models/issues"
    14  	repo_model "code.gitea.io/gitea/models/repo"
    15  	"code.gitea.io/gitea/models/unittest"
    16  	user_model "code.gitea.io/gitea/models/user"
    17  	api "code.gitea.io/gitea/modules/structs"
    18  
    19  	"github.com/stretchr/testify/assert"
    20  )
    21  
    22  func TestAPIModifyLabels(t *testing.T) {
    23  	assert.NoError(t, unittest.LoadFixtures())
    24  
    25  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
    26  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
    27  	session := loginUser(t, owner.Name)
    28  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
    29  	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels", owner.Name, repo.Name)
    30  
    31  	// CreateLabel
    32  	req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
    33  		Name:        "TestL 1",
    34  		Color:       "abcdef",
    35  		Description: "test label",
    36  	}).AddTokenAuth(token)
    37  	resp := MakeRequest(t, req, http.StatusCreated)
    38  	apiLabel := new(api.Label)
    39  	DecodeJSON(t, resp, &apiLabel)
    40  	dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, RepoID: repo.ID})
    41  	assert.EqualValues(t, dbLabel.Name, apiLabel.Name)
    42  	assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
    43  
    44  	req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
    45  		Name:        "TestL 2",
    46  		Color:       "#123456",
    47  		Description: "jet another test label",
    48  	}).AddTokenAuth(token)
    49  	MakeRequest(t, req, http.StatusCreated)
    50  	req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
    51  		Name:  "WrongTestL",
    52  		Color: "#12345g",
    53  	}).AddTokenAuth(token)
    54  	MakeRequest(t, req, http.StatusUnprocessableEntity)
    55  
    56  	// ListLabels
    57  	req = NewRequest(t, "GET", urlStr).
    58  		AddTokenAuth(token)
    59  	resp = MakeRequest(t, req, http.StatusOK)
    60  	var apiLabels []*api.Label
    61  	DecodeJSON(t, resp, &apiLabels)
    62  	assert.Len(t, apiLabels, 2)
    63  
    64  	// GetLabel
    65  	singleURLStr := fmt.Sprintf("/api/v1/repos/%s/%s/labels/%d", owner.Name, repo.Name, dbLabel.ID)
    66  	req = NewRequest(t, "GET", singleURLStr).
    67  		AddTokenAuth(token)
    68  	resp = MakeRequest(t, req, http.StatusOK)
    69  	DecodeJSON(t, resp, &apiLabel)
    70  	assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
    71  
    72  	// EditLabel
    73  	newName := "LabelNewName"
    74  	newColor := "09876a"
    75  	newColorWrong := "09g76a"
    76  	req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
    77  		Name:  &newName,
    78  		Color: &newColor,
    79  	}).AddTokenAuth(token)
    80  	resp = MakeRequest(t, req, http.StatusOK)
    81  	DecodeJSON(t, resp, &apiLabel)
    82  	assert.EqualValues(t, newColor, apiLabel.Color)
    83  	req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
    84  		Color: &newColorWrong,
    85  	}).AddTokenAuth(token)
    86  	MakeRequest(t, req, http.StatusUnprocessableEntity)
    87  
    88  	// DeleteLabel
    89  	req = NewRequest(t, "DELETE", singleURLStr).
    90  		AddTokenAuth(token)
    91  	MakeRequest(t, req, http.StatusNoContent)
    92  }
    93  
    94  func TestAPIAddIssueLabels(t *testing.T) {
    95  	assert.NoError(t, unittest.LoadFixtures())
    96  
    97  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    98  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
    99  	_ = unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID, ID: 2})
   100  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
   101  
   102  	session := loginUser(t, owner.Name)
   103  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
   104  	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
   105  		repo.OwnerName, repo.Name, issue.Index)
   106  	req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
   107  		Labels: []any{1, 2},
   108  	}).AddTokenAuth(token)
   109  	resp := MakeRequest(t, req, http.StatusOK)
   110  	var apiLabels []*api.Label
   111  	DecodeJSON(t, resp, &apiLabels)
   112  	assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
   113  
   114  	unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: 2})
   115  }
   116  
   117  func TestAPIAddIssueLabelsWithLabelNames(t *testing.T) {
   118  	assert.NoError(t, unittest.LoadFixtures())
   119  
   120  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   121  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
   122  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
   123  
   124  	session := loginUser(t, owner.Name)
   125  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
   126  	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
   127  		repo.OwnerName, repo.Name, issue.Index)
   128  	req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{
   129  		Labels: []any{"label1", "label2"},
   130  	}).AddTokenAuth(token)
   131  	resp := MakeRequest(t, req, http.StatusOK)
   132  	var apiLabels []*api.Label
   133  	DecodeJSON(t, resp, &apiLabels)
   134  	assert.Len(t, apiLabels, unittest.GetCount(t, &issues_model.IssueLabel{IssueID: issue.ID}))
   135  
   136  	var apiLabelNames []string
   137  	for _, label := range apiLabels {
   138  		apiLabelNames = append(apiLabelNames, label.Name)
   139  	}
   140  	assert.ElementsMatch(t, apiLabelNames, []string{"label1", "label2"})
   141  }
   142  
   143  func TestAPIReplaceIssueLabels(t *testing.T) {
   144  	assert.NoError(t, unittest.LoadFixtures())
   145  
   146  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   147  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
   148  	label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
   149  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
   150  
   151  	session := loginUser(t, owner.Name)
   152  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
   153  	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
   154  		owner.Name, repo.Name, issue.Index)
   155  	req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
   156  		Labels: []any{label.ID},
   157  	}).AddTokenAuth(token)
   158  	resp := MakeRequest(t, req, http.StatusOK)
   159  	var apiLabels []*api.Label
   160  	DecodeJSON(t, resp, &apiLabels)
   161  	if assert.Len(t, apiLabels, 1) {
   162  		assert.EqualValues(t, label.ID, apiLabels[0].ID)
   163  	}
   164  
   165  	unittest.AssertCount(t, &issues_model.IssueLabel{IssueID: issue.ID}, 1)
   166  	unittest.AssertExistsAndLoadBean(t, &issues_model.IssueLabel{IssueID: issue.ID, LabelID: label.ID})
   167  }
   168  
   169  func TestAPIReplaceIssueLabelsWithLabelNames(t *testing.T) {
   170  	assert.NoError(t, unittest.LoadFixtures())
   171  
   172  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
   173  	issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{RepoID: repo.ID})
   174  	label := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{RepoID: repo.ID})
   175  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
   176  
   177  	session := loginUser(t, owner.Name)
   178  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteIssue)
   179  	urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels",
   180  		owner.Name, repo.Name, issue.Index)
   181  	req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{
   182  		Labels: []any{label.Name},
   183  	}).AddTokenAuth(token)
   184  	resp := MakeRequest(t, req, http.StatusOK)
   185  	var apiLabels []*api.Label
   186  	DecodeJSON(t, resp, &apiLabels)
   187  	if assert.Len(t, apiLabels, 1) {
   188  		assert.EqualValues(t, label.Name, apiLabels[0].Name)
   189  	}
   190  }
   191  
   192  func TestAPIModifyOrgLabels(t *testing.T) {
   193  	assert.NoError(t, unittest.LoadFixtures())
   194  
   195  	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
   196  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID})
   197  	user := "user1"
   198  	session := loginUser(t, user)
   199  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
   200  	urlStr := fmt.Sprintf("/api/v1/orgs/%s/labels", owner.Name)
   201  
   202  	// CreateLabel
   203  	req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
   204  		Name:        "TestL 1",
   205  		Color:       "abcdef",
   206  		Description: "test label",
   207  	}).AddTokenAuth(token)
   208  	resp := MakeRequest(t, req, http.StatusCreated)
   209  	apiLabel := new(api.Label)
   210  	DecodeJSON(t, resp, &apiLabel)
   211  	dbLabel := unittest.AssertExistsAndLoadBean(t, &issues_model.Label{ID: apiLabel.ID, OrgID: owner.ID})
   212  	assert.EqualValues(t, dbLabel.Name, apiLabel.Name)
   213  	assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
   214  
   215  	req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
   216  		Name:        "TestL 2",
   217  		Color:       "#123456",
   218  		Description: "jet another test label",
   219  	}).AddTokenAuth(token)
   220  	MakeRequest(t, req, http.StatusCreated)
   221  	req = NewRequestWithJSON(t, "POST", urlStr, &api.CreateLabelOption{
   222  		Name:  "WrongTestL",
   223  		Color: "#12345g",
   224  	}).AddTokenAuth(token)
   225  	MakeRequest(t, req, http.StatusUnprocessableEntity)
   226  
   227  	// ListLabels
   228  	req = NewRequest(t, "GET", urlStr).
   229  		AddTokenAuth(token)
   230  	resp = MakeRequest(t, req, http.StatusOK)
   231  	var apiLabels []*api.Label
   232  	DecodeJSON(t, resp, &apiLabels)
   233  	assert.Len(t, apiLabels, 4)
   234  
   235  	// GetLabel
   236  	singleURLStr := fmt.Sprintf("/api/v1/orgs/%s/labels/%d", owner.Name, dbLabel.ID)
   237  	req = NewRequest(t, "GET", singleURLStr).
   238  		AddTokenAuth(token)
   239  	resp = MakeRequest(t, req, http.StatusOK)
   240  	DecodeJSON(t, resp, &apiLabel)
   241  	assert.EqualValues(t, strings.TrimLeft(dbLabel.Color, "#"), apiLabel.Color)
   242  
   243  	// EditLabel
   244  	newName := "LabelNewName"
   245  	newColor := "09876a"
   246  	newColorWrong := "09g76a"
   247  	req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
   248  		Name:  &newName,
   249  		Color: &newColor,
   250  	}).AddTokenAuth(token)
   251  	resp = MakeRequest(t, req, http.StatusOK)
   252  	DecodeJSON(t, resp, &apiLabel)
   253  	assert.EqualValues(t, newColor, apiLabel.Color)
   254  	req = NewRequestWithJSON(t, "PATCH", singleURLStr, &api.EditLabelOption{
   255  		Color: &newColorWrong,
   256  	}).AddTokenAuth(token)
   257  	MakeRequest(t, req, http.StatusUnprocessableEntity)
   258  
   259  	// DeleteLabel
   260  	req = NewRequest(t, "DELETE", singleURLStr).
   261  		AddTokenAuth(token)
   262  	MakeRequest(t, req, http.StatusNoContent)
   263  }