mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-08-21 23:21:11 +02:00
Currently 'userxx' and 'orgxx' are both used as username in test files when the user type is org, which is confusing. This PR replaces all 'userxx' with 'orgxx' when the user type is org(`user.type==1`). Some non-trivial changes 1. Rename `user3` dir to `org3` in `tests/git-repositories-meta` 2. Change `end` in `issue reference` because 'org3' is one char shorter than 'user3' ![ksnip_20230913-112819](https://github.com/go-gitea/gitea/assets/70063547/442988c5-4cf4-49b8-aa01-4dd6bf0ca954) 3. Change the search result number of `user/repo2` because `user3/repo21` can't be searched now ![ksnip_20230913-112931](https://github.com/go-gitea/gitea/assets/70063547/d9ebeba4-479f-4110-9a85-825efbc981fd) 4. Change the first org name getting from API because the result is ordered by alphabet asc and now `org 17` is before `org25` ![JW8U7NIO(J$H _YCRB36H)T](https://github.com/go-gitea/gitea/assets/70063547/f55a685c-cf24-40e5-a87f-3a2327319548) ![)KFD411O4I8RB5ZOH7E0 Z3](https://github.com/go-gitea/gitea/assets/70063547/a0dc3299-249c-46f6-91cb-d15d4ee88dd5) Other modifications are just find all and replace all. Unit tests with SQLite are all passed. --------- Co-authored-by: caicandong <1290147055@qq.com>
156 lines
5.9 KiB
Go
156 lines
5.9 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package integration
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"testing"
|
|
|
|
auth_model "code.gitea.io/gitea/models/auth"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
"code.gitea.io/gitea/models/unittest"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
api "code.gitea.io/gitea/modules/structs"
|
|
"code.gitea.io/gitea/tests"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestAPITopicSearch(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
searchURL, _ := url.Parse("/api/v1/topics/search")
|
|
var topics struct {
|
|
TopicNames []*api.TopicResponse `json:"topics"`
|
|
}
|
|
|
|
query := url.Values{"page": []string{"1"}, "limit": []string{"4"}}
|
|
|
|
searchURL.RawQuery = query.Encode()
|
|
res := MakeRequest(t, NewRequest(t, "GET", searchURL.String()), http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.Len(t, topics.TopicNames, 4)
|
|
assert.EqualValues(t, "6", res.Header().Get("x-total-count"))
|
|
|
|
query.Add("q", "topic")
|
|
searchURL.RawQuery = query.Encode()
|
|
res = MakeRequest(t, NewRequest(t, "GET", searchURL.String()), http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.Len(t, topics.TopicNames, 2)
|
|
|
|
query.Set("q", "database")
|
|
searchURL.RawQuery = query.Encode()
|
|
res = MakeRequest(t, NewRequest(t, "GET", searchURL.String()), http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
if assert.Len(t, topics.TopicNames, 1) {
|
|
assert.EqualValues(t, 2, topics.TopicNames[0].ID)
|
|
assert.EqualValues(t, "database", topics.TopicNames[0].Name)
|
|
assert.EqualValues(t, 1, topics.TopicNames[0].RepoCount)
|
|
}
|
|
}
|
|
|
|
func TestAPIRepoTopic(t *testing.T) {
|
|
defer tests.PrepareTestEnv(t)()
|
|
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of repo2
|
|
org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of repo3
|
|
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // write access to repo 3
|
|
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
|
|
repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3})
|
|
|
|
// Get user2's token
|
|
token2 := getUserToken(t, user2.Name, auth_model.AccessTokenScopeWriteRepository)
|
|
|
|
// Test read topics using login
|
|
url := fmt.Sprintf("/api/v1/repos/%s/%s/topics", user2.Name, repo2.Name)
|
|
req := NewRequest(t, "GET", url+"?token="+token2)
|
|
res := MakeRequest(t, req, http.StatusOK)
|
|
var topics *api.TopicName
|
|
DecodeJSON(t, res, &topics)
|
|
assert.ElementsMatch(t, []string{"topicname1", "topicname2"}, topics.TopicNames)
|
|
|
|
// Log out user2
|
|
url = fmt.Sprintf("/api/v1/repos/%s/%s/topics?token=%s", user2.Name, repo2.Name, token2)
|
|
|
|
// Test delete a topic
|
|
req = NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/topics/%s?token=%s", user2.Name, repo2.Name, "Topicname1", token2)
|
|
MakeRequest(t, req, http.StatusNoContent)
|
|
|
|
// Test add an existing topic
|
|
req = NewRequestf(t, "PUT", "/api/v1/repos/%s/%s/topics/%s?token=%s", user2.Name, repo2.Name, "Golang", token2)
|
|
MakeRequest(t, req, http.StatusNoContent)
|
|
|
|
// Test add a topic
|
|
req = NewRequestf(t, "PUT", "/api/v1/repos/%s/%s/topics/%s?token=%s", user2.Name, repo2.Name, "topicName3", token2)
|
|
MakeRequest(t, req, http.StatusNoContent)
|
|
|
|
// Test read topics using token
|
|
req = NewRequest(t, "GET", url)
|
|
res = MakeRequest(t, req, http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.ElementsMatch(t, []string{"topicname2", "golang", "topicname3"}, topics.TopicNames)
|
|
|
|
// Test replace topics
|
|
newTopics := []string{" windows ", " ", "MAC "}
|
|
req = NewRequestWithJSON(t, "PUT", url, &api.RepoTopicOptions{
|
|
Topics: newTopics,
|
|
})
|
|
MakeRequest(t, req, http.StatusNoContent)
|
|
req = NewRequest(t, "GET", url)
|
|
res = MakeRequest(t, req, http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.ElementsMatch(t, []string{"windows", "mac"}, topics.TopicNames)
|
|
|
|
// Test replace topics with something invalid
|
|
newTopics = []string{"topicname1", "topicname2", "topicname!"}
|
|
req = NewRequestWithJSON(t, "PUT", url, &api.RepoTopicOptions{
|
|
Topics: newTopics,
|
|
})
|
|
MakeRequest(t, req, http.StatusUnprocessableEntity)
|
|
req = NewRequest(t, "GET", url)
|
|
res = MakeRequest(t, req, http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.ElementsMatch(t, []string{"windows", "mac"}, topics.TopicNames)
|
|
|
|
// Test with some topics multiple times, less than 25 unique
|
|
newTopics = []string{"t1", "t2", "t1", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "17", "t18", "t19", "t20", "t21", "t22", "t23", "t24", "t25"}
|
|
req = NewRequestWithJSON(t, "PUT", url, &api.RepoTopicOptions{
|
|
Topics: newTopics,
|
|
})
|
|
MakeRequest(t, req, http.StatusNoContent)
|
|
req = NewRequest(t, "GET", url)
|
|
res = MakeRequest(t, req, http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.Len(t, topics.TopicNames, 25)
|
|
|
|
// Test writing more topics than allowed
|
|
newTopics = append(newTopics, "t26")
|
|
req = NewRequestWithJSON(t, "PUT", url, &api.RepoTopicOptions{
|
|
Topics: newTopics,
|
|
})
|
|
MakeRequest(t, req, http.StatusUnprocessableEntity)
|
|
|
|
// Test add a topic when there is already maximum
|
|
req = NewRequestf(t, "PUT", "/api/v1/repos/%s/%s/topics/%s?token=%s", user2.Name, repo2.Name, "t26", token2)
|
|
MakeRequest(t, req, http.StatusUnprocessableEntity)
|
|
|
|
// Test delete a topic that repo doesn't have
|
|
req = NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/topics/%s?token=%s", user2.Name, repo2.Name, "Topicname1", token2)
|
|
MakeRequest(t, req, http.StatusNotFound)
|
|
|
|
// Get user4's token
|
|
token4 := getUserToken(t, user4.Name, auth_model.AccessTokenScopeWriteRepository)
|
|
|
|
// Test read topics with write access
|
|
url = fmt.Sprintf("/api/v1/repos/%s/%s/topics?token=%s", org3.Name, repo3.Name, token4)
|
|
req = NewRequest(t, "GET", url)
|
|
res = MakeRequest(t, req, http.StatusOK)
|
|
DecodeJSON(t, res, &topics)
|
|
assert.Empty(t, topics.TopicNames)
|
|
|
|
// Test add a topic to repo with write access (requires repo admin access)
|
|
req = NewRequestf(t, "PUT", "/api/v1/repos/%s/%s/topics/%s?token=%s", org3.Name, repo3.Name, "topicName", token4)
|
|
MakeRequest(t, req, http.StatusForbidden)
|
|
}
|