Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 133 additions & 1 deletion tests/integration/api_project_board_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,155 @@
package integration

import (
"fmt"
"net/http"
"net/url"
"testing"

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 TestAPIListProjectBoads(t *testing.T) {
func TestAPIListProjectBoards(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
project := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)

link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards", project.ID))
link.RawQuery = url.Values{"token": {token}}.Encode()

var apiBoards []*api.ProjectBoard
req := NewRequest(t, "GET", link.String())
resp := session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiBoards)
assert.Len(t, apiBoards, 3)
}

func TestAPICreateProjectBoard(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
project := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)

link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards", project.ID))
link.RawQuery = url.Values{"token": {token}}.Encode()

payload := &api.NewProjectBoardPayload{
Title: "Test Board",
Color: "#000000",
Default: false,
}

req := NewRequestWithJSON(t, "POST", link.String(), payload)
resp := session.MakeRequest(t, req, http.StatusCreated)
var apiBoard *api.ProjectBoard
DecodeJSON(t, resp, &apiBoard)
assert.Equal(t, payload.Title, apiBoard.Title)
assert.Equal(t, payload.Color, apiBoard.Color)
assert.Equal(t, payload.Default, apiBoard.Default)
}

func TestAPIGetProjectBoard(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
project := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)

testCase := []struct {
boardID int64
expectedBoard *api.ProjectBoard
}{
{1, &api.ProjectBoard{Title: "Test Board 1", Color: "#000000", Default: true}},
{2, &api.ProjectBoard{Title: "Test Board 2", Color: "#000000", Default: false}},
{3, &api.ProjectBoard{Title: "Test Board 3", Color: "#000000", Default: false}},
}

for _, test := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards/%d", project.ID, test.boardID))
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequest(t, "GET", link.String())
resp := session.MakeRequest(t, req, http.StatusOK)
var apiBoard *api.ProjectBoard
DecodeJSON(t, resp, apiBoard)
assert.Equal(t, test.expectedBoard.Title, apiBoard.Title)
assert.Equal(t, test.expectedBoard.Color, apiBoard.Color)
assert.Equal(t, test.expectedBoard.Default, apiBoard.Default)
}
}

func TestAPIGetProjectBoardReqPermission(t *testing.T) {
}

func TestAPIUpdateProjectBoard(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
project := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)

payload := &api.UpdateProjectBoardPayload{
Title: "Edit Test Board",
Color: "#000000",
}

expected := &api.ProjectBoard{
Title: payload.Title,
Color: payload.Color,
}

testCase := []int{1, 2, 3}
for _, boardID := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards/%d", project.ID, boardID))
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequestWithJSON(t, "PATCH", link.String(), payload)
resp := session.MakeRequest(t, req, http.StatusOK)
var apiBoard *api.ProjectBoard
DecodeJSON(t, resp, apiBoard)
assert.Equal(t, expected.Title, apiBoard.Title)
assert.Equal(t, expected.Color, apiBoard.Color)
assert.Equal(t, expected.Default, apiBoard.Default)
}
}

func TestAPIDeleteProjectBoard(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
project := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)

testCase := []int{1, 2, 3}
for _, boardID := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards/%d", project.ID, boardID))
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequest(t, "DELETE", link.String())
resp := session.MakeRequest(t, req, http.StatusNoContent)
DecodeJSON(t, resp, nil)

// Check if board is deleted
link, _ = url.Parse(fmt.Sprintf("/api/v1/projects/%d/boards/%d", project.ID, boardID))
req = NewRequest(t, "GET", link.String())
resp = session.MakeRequest(t, req, http.StatusNotFound)
}
}
160 changes: 138 additions & 22 deletions tests/integration/api_project_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,54 +11,170 @@ import (
"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 TestAPIListUserProjects(t *testing.T) {
func TestAPIListProjects(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser, auth_model.AccessTokenScopeReadOrganization, auth_model.AccessTokenScopeReadRepository, auth_model.AccessTokenScopeReadIssue)

testCase := []struct {
link string
expectedLen int
}{
{fmt.Sprintf("/api/v1/user/%s/projects", user.Name), 1},
{fmt.Sprintf("/api/v1/orgs/%s/projects", org.Name), 1},
{fmt.Sprintf("/api/v1/repos/%s/%s/projects", user.Name, repo.Name), 1},
}

for _, test := range testCase {
link, _ := url.Parse(test.link)
link.RawQuery = url.Values{"token": {token}}.Encode()

var apiProjects []*api.Project
req := NewRequest(t, "GET", link.String())
resp := session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiProjects)
assert.Len(t, apiProjects, test.expectedLen)
}
}

func TestAPIListOrgProjects(t *testing.T) {
func TestAPICreateProject(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 17})

session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadOrganization, auth_model.AccessTokenScopeReadIssue)
link, _ := url.Parse(fmt.Sprintf("/api/v1/orgs/%s/projects", org.Name))
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteIssue)

payload := api.NewProjectPayload{
Title: "Test Project",
Description: "Test Project Description",
BoardType: uint8(1),
}

expectedProject := api.Project{
Title: "Test Project",
Description: "Test Project Description",
BoardType: uint8(1),
}

testCase := []struct {
link string
}{
{fmt.Sprintf("/api/v1/user/%s/projects", user.Name)},
{fmt.Sprintf("/api/v1/repos/%s/%s/projects", user.Name, repo.Name)},
{fmt.Sprintf("/api/v1/orgs/%s/projects", org.Name)},
}

for _, test := range testCase {
link, _ := url.Parse(test.link)
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequestWithJSON(t, "POST", link.String(), payload)
resp := session.MakeRequest(t, req, http.StatusCreated)

var apiProject api.Project
DecodeJSON(t, resp, &apiProject)
assert.Equal(t, expectedProject.Title, apiProject.Title)
assert.Equal(t, expectedProject.Description, apiProject.Description)
assert.Equal(t, expectedProject.BoardType, apiProject.BoardType)
}
}

link.RawQuery = url.Values{"token": { token}}.Encode()
func TestAPIGetProject(t *testing.T) {
defer tests.PrepareTestEnv(t)()

req := NewRequest(t, "GET", link.String())
var apiProjects []*api.Project
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser, auth_model.AccessTokenScopeReadRepository, auth_model.AccessTokenScopeReadIssue)

testCase := []struct {
projectID int
expectedProject api.Project
}{
{1, api.Project{ID: 1, Title: "First project"}},
{2, api.Project{ID: 2, Title: "Second project"}},
}

for _, test := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d", test.projectID))
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequest(t, "GET", link.String())
resp := session.MakeRequest(t, req, http.StatusOK)

var apiProject api.Project
DecodeJSON(t, resp, &apiProject)
assert.Equal(t, test.expectedProject.ID, apiProject.ID)
assert.Equal(t, test.expectedProject.Title, apiProject.Title)
}
}

resp := session.MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiProjects)
assert.Len(t, apiProjects, 1)
func TestAPIUpdateProject(t *testing.T) {
defer tests.PrepareTestEnv(t)()

}
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteIssue)

func TestAPIListRepoProjects(t *testing.T) {
}
payload := api.UpdateProjectPayload{
Title: "Edited test Project",
Description: "Edited test Project Description",
}

func TestAPICreateUserProject(t *testing.T) {
}
expectedProject := api.Project{
Title: "Edited test Project",
Description: "Edited test Project Description",
}

func TestAPICreateOrgProject(t *testing.T) {
}
testCase := []int{1, 2}

func TestAPICreateRepoProject(t *testing.T) {
}
for _, test := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d", test))
link.RawQuery = url.Values{"token": {token}}.Encode()

func TestAPIGetProject(t *testing.T) {
}
req := NewRequestWithJSON(t, "PATCH", link.String(), payload)
resp := session.MakeRequest(t, req, http.StatusOK)

func TestAPIUpdateProject(t *testing.T) {
var apiProject api.Project
DecodeJSON(t, resp, &apiProject)
assert.Equal(t, expectedProject.Title, apiProject.Title)
assert.Equal(t, expectedProject.Description, apiProject.Description)
}
}

func TestAPIDeleteProject(t *testing.T) {
defer tests.PrepareTestEnv(t)()

user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteIssue)

testCase := []int{1, 2}

for _, test := range testCase {
link, _ := url.Parse(fmt.Sprintf("/api/v1/projects/%d", test))
link.RawQuery = url.Values{"token": {token}}.Encode()

req := NewRequest(t, "DELETE", link.String())
session.MakeRequest(t, req, http.StatusNoContent)

link, _ = url.Parse(fmt.Sprintf("/api/v1/projects/%d", test))
req = NewRequest(t, "GET", link.String())
session.MakeRequest(t, req, http.StatusNotFound)
}
}