// Copyright 2023 The Gitea Authors. All rights reserved. // Copyright 2026 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration import ( "fmt" "net/http" "testing" "forgejo.org/models/db" project_model "forgejo.org/models/project" repo_model "forgejo.org/models/repo" "forgejo.org/models/unittest" "forgejo.org/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestPrivateRepoProject(t *testing.T) { defer tests.PrepareTestEnv(t)() // not logged in user req := NewRequest(t, "GET", "/user31/-/projects") MakeRequest(t, req, http.StatusNotFound) sess := loginUser(t, "user1") req = NewRequest(t, "GET", "/user31/-/projects") sess.MakeRequest(t, req, http.StatusOK) } func TestMoveRepoProjectColumns(t *testing.T) { defer tests.PrepareTestEnv(t)() repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) project1 := project_model.Project{ Title: "new created project", RepoID: repo2.ID, Type: project_model.TypeRepository, TemplateType: project_model.TemplateTypeNone, } err := project_model.NewProject(db.DefaultContext, &project1) require.NoError(t, err) for i := 0; i < 3; i++ { err = project_model.NewColumn(db.DefaultContext, &project_model.Column{ Title: fmt.Sprintf("column %d", i+1), ProjectID: project1.ID, }) require.NoError(t, err) } columns, err := project1.GetColumns(db.DefaultContext) require.NoError(t, err) assert.Len(t, columns, 3) assert.EqualValues(t, 0, columns[0].Sorting) assert.EqualValues(t, 1, columns[1].Sorting) assert.EqualValues(t, 2, columns[2].Sorting) sess := loginUser(t, "user1") req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/%s/projects/%d/move", repo2.FullName(), project1.ID), map[string]any{ "columns": []map[string]any{ {"columnID": columns[1].ID, "sorting": 0}, {"columnID": columns[2].ID, "sorting": 1}, {"columnID": columns[0].ID, "sorting": 2}, }, }) sess.MakeRequest(t, req, http.StatusOK) columnsAfter, err := project1.GetColumns(db.DefaultContext) require.NoError(t, err) assert.Len(t, columns, 3) assert.Equal(t, columns[1].ID, columnsAfter[0].ID) assert.Equal(t, columns[2].ID, columnsAfter[1].ID) assert.Equal(t, columns[0].ID, columnsAfter[2].ID) require.NoError(t, project_model.DeleteProjectByID(db.DefaultContext, project1.ID)) } func TestChangeStatusProject(t *testing.T) { defer tests.PrepareTestEnv(t)() user5 := loginUser(t, "user5") user2 := loginUser(t, "user2") t.Run("User", func(t *testing.T) { project4CloseURL := "/user2/-/projects/4/close" t.Run("Doer is not context user", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user5.MakeRequest(t, NewRequest(t, "POST", project4CloseURL), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 4}, "is_closed = false") }) t.Run("Wrong ID", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user5.MakeRequest(t, NewRequest(t, "POST", "/user5/-/projects/4/close"), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 4}, "is_closed = false") user5.MakeRequest(t, NewRequest(t, "POST", "/user5/-/projects/1/close"), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 1}, "is_closed = false") user5.MakeRequest(t, NewRequest(t, "POST", "/user5/-/projects/7/close"), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 7}, "is_closed = false") }) t.Run("Normal", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user2.MakeRequest(t, NewRequest(t, "POST", project4CloseURL), http.StatusOK) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 4}, "is_closed = true") }) }) t.Run("Organization", func(t *testing.T) { project7CloseURL := "/org3/-/projects/7/close" t.Run("Doer does not have permission", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user5.MakeRequest(t, NewRequest(t, "POST", project7CloseURL), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 7}, "is_closed = false") }) t.Run("Normal", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user2.MakeRequest(t, NewRequest(t, "POST", project7CloseURL), http.StatusOK) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 7}, "is_closed = true") }) }) t.Run("Repository", func(t *testing.T) { project1CloseURL := "/user2/repo1/projects/1/close" t.Run("Doer does not have permission", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user5.MakeRequest(t, NewRequest(t, "POST", project1CloseURL), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 1}, "is_closed = false") }) t.Run("Wrong ID", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user5.MakeRequest(t, NewRequest(t, "POST", "/user5/repo4/projects/1/close"), http.StatusNotFound) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 1}, "is_closed = false") }) t.Run("Normal", func(t *testing.T) { defer tests.PrintCurrentTest(t)() user2.MakeRequest(t, NewRequest(t, "POST", project1CloseURL), http.StatusOK) unittest.AssertExistsIf(t, true, &project_model.Project{ID: 1}, "is_closed = true") }) }) }