vikunja/pkg/integrations/project_test.go

442 lines
22 KiB
Go
Raw Normal View History

2020-02-07 16:27:45 +00:00
// Vikunja is a to-do list application to facilitate your life.
2021-02-02 19:19:13 +00:00
// Copyright 2018-2021 Vikunja and contributors. All rights reserved.
2019-04-21 18:18:17 +00:00
//
// This program is free software: you can redistribute it and/or modify
2020-12-23 15:41:52 +00:00
// it under the terms of the GNU Affero General Public Licensee as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
2019-04-21 18:18:17 +00:00
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2020-12-23 15:41:52 +00:00
// GNU Affero General Public Licensee for more details.
2019-04-21 18:18:17 +00:00
//
2020-12-23 15:41:52 +00:00
// You should have received a copy of the GNU Affero General Public Licensee
// along with this program. If not, see <https://www.gnu.org/licenses/>.
2019-04-21 18:18:17 +00:00
package integrations
import (
"net/url"
"testing"
2019-04-21 18:18:17 +00:00
"code.vikunja.io/api/pkg/models"
"code.vikunja.io/web/handler"
2019-05-07 19:42:24 +00:00
"github.com/labstack/echo/v4"
2019-04-21 18:18:17 +00:00
"github.com/stretchr/testify/assert"
)
2022-11-13 16:07:01 +00:00
func TestProject(t *testing.T) {
2019-04-21 18:18:17 +00:00
testHandler := webHandlerTest{
user: &testuser1,
strFunc: func() handler.CObject {
2022-11-13 16:07:01 +00:00
return &models.Project{}
2019-04-21 18:18:17 +00:00
},
t: t,
}
t.Run("ReadAll", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
rec, err := testHandler.testReadAllWithUser(nil, nil)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `Test1`)
assert.NotContains(t, rec.Body.String(), `Test2"`)
2023-01-12 16:00:40 +00:00
assert.Contains(t, rec.Body.String(), `Test3`) // Shared directly via users_project
assert.Contains(t, rec.Body.String(), `Test12`) // Shared via parent project
2019-04-21 18:18:17 +00:00
assert.NotContains(t, rec.Body.String(), `Test5`)
assert.NotContains(t, rec.Body.String(), `Test21`) // Archived through parent project
assert.NotContains(t, rec.Body.String(), `Test22`) // Archived directly
2019-04-21 18:18:17 +00:00
})
t.Run("Search", func(t *testing.T) {
rec, err := testHandler.testReadAllWithUser(url.Values{"s": []string{"Test1"}}, nil)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `Test1`)
assert.NotContains(t, rec.Body.String(), `Test2`)
assert.NotContains(t, rec.Body.String(), `Test3`)
assert.NotContains(t, rec.Body.String(), `Test4`)
assert.NotContains(t, rec.Body.String(), `Test5`)
})
2022-11-13 16:07:01 +00:00
t.Run("Normal with archived projects", func(t *testing.T) {
rec, err := testHandler.testReadAllWithUser(url.Values{"is_archived": []string{"true"}}, nil)
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `Test1`)
assert.NotContains(t, rec.Body.String(), `Test2"`)
2023-01-12 16:00:40 +00:00
assert.Contains(t, rec.Body.String(), `Test3`) // Shared directly via users_project
assert.Contains(t, rec.Body.String(), `Test12`) // Shared via parent project
assert.NotContains(t, rec.Body.String(), `Test5`)
assert.Contains(t, rec.Body.String(), `Test21`) // Archived through project
assert.Contains(t, rec.Body.String(), `Test22`) // Archived directly
})
2019-04-21 18:18:17 +00:00
})
t.Run("ReadOne", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "1"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test1"`)
assert.NotContains(t, rec.Body.String(), `"title":"Test2"`)
2020-11-21 20:51:55 +00:00
assert.Contains(t, rec.Body.String(), `"owner":{"id":1,"name":"","username":"user1",`)
assert.NotContains(t, rec.Body.String(), `"owner":{"id":2,"name":"","username":"user2",`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2023-01-12 16:00:40 +00:00
assert.Equal(t, "2", rec.Result().Header.Get("x-max-right")) // User 1 is owner, so they should have admin rights.
2019-04-21 18:18:17 +00:00
})
t.Run("Nonexisting", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "9999"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
2022-11-13 16:07:01 +00:00
assertHandlerErrorCode(t, err, models.ErrCodeProjectDoesNotExist)
2019-04-21 18:18:17 +00:00
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
2019-08-14 20:19:04 +00:00
// Owned by user13
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "20"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `You don't have the right to see this`)
assert.Empty(t, rec.Result().Header.Get("x-max-rights"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "6"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test6"`)
assert.Equal(t, "0", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via Team write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "7"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test7"`)
assert.Equal(t, "1", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via Team admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "8"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test8"`)
assert.Equal(t, "2", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "9"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test9"`)
assert.Equal(t, "0", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via User write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "10"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test10"`)
assert.Equal(t, "1", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
t.Run("Shared Via User admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "11"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test11"`)
assert.Equal(t, "2", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "12"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test12"`)
assert.Equal(t, "0", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "13"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test13"`)
assert.Equal(t, "1", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "14"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test14"`)
assert.Equal(t, "2", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "15"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test15"`)
assert.Equal(t, "0", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "16"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test16"`)
assert.Equal(t, "1", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testReadOneWithUser(nil, map[string]string{"project": "17"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Test17"`)
assert.Equal(t, "2", rec.Result().Header.Get("x-max-right"))
2019-04-21 18:18:17 +00:00
})
})
})
t.Run("Update", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
// Check the project was loaded successfully afterwards, see testReadOneWithUser
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "1"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
// The description should not be updated but returned correctly
assert.Contains(t, rec.Body.String(), `description":"Lorem Ipsum`)
})
t.Run("Nonexisting", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "9999"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
2022-11-13 16:07:01 +00:00
assertHandlerErrorCode(t, err, models.ErrCodeProjectDoesNotExist)
2019-04-21 18:18:17 +00:00
})
t.Run("Normal with updating the description", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "1"}, `{"title":"TestLoremIpsum","description":"Lorem Ipsum dolor sit amet"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
assert.Contains(t, rec.Body.String(), `"description":"Lorem Ipsum dolor sit amet`)
})
t.Run("Empty title", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "1"}, `{"title":""}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message.(models.ValidationHTTPError).InvalidFields, "title: non zero value required")
})
t.Run("Title too long", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "1"}, `{"title":"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea taki"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message.(models.ValidationHTTPError).InvalidFields[0], "does not validate as runelength(1|250)")
2019-04-21 18:18:17 +00:00
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
2019-08-14 20:19:04 +00:00
// Owned by user13
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "20"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "6"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via Team write", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "7"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
t.Run("Shared Via Team admin", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "8"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
t.Run("Shared Via User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "9"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via User write", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "10"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
t.Run("Shared Via User admin", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "11"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "12"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team write", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "13"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team admin", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "14"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "15"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User write", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "16"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User admin", func(t *testing.T) {
rec, err := testHandler.testUpdateWithUser(nil, map[string]string{"project": "17"}, `{"title":"TestLoremIpsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"TestLoremIpsum"`)
})
})
})
t.Run("Delete", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "1"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"message":"Successfully deleted."`)
})
t.Run("Nonexisting", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "999"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
2022-11-13 16:07:01 +00:00
assertHandlerErrorCode(t, err, models.ErrCodeProjectDoesNotExist)
2019-04-21 18:18:17 +00:00
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
2019-08-14 20:19:04 +00:00
// Owned by user13
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "20"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "6"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via Team write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "7"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via Team admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "8"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"message":"Successfully deleted."`)
})
t.Run("Shared Via User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "9"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via User write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "10"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
t.Run("Shared Via User admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "11"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"message":"Successfully deleted."`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "12"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "13"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "14"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"message":"Successfully deleted."`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User readonly", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "15"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User write", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
_, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "16"})
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User admin", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
rec, err := testHandler.testDeleteWithUser(nil, map[string]string{"project": "17"})
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"message":"Successfully deleted."`)
})
})
})
t.Run("Create", func(t *testing.T) {
t.Run("Normal", func(t *testing.T) {
2022-11-13 16:07:01 +00:00
// Check the project was loaded successfully after update, see testReadOneWithUser
rec, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":""`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
t.Run("Normal with description", func(t *testing.T) {
rec, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","description":"Lorem Ipsum"}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":"Lorem Ipsum"`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
t.Run("Nonexisting parent project", func(t *testing.T) {
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":99999}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assertHandlerErrorCode(t, err, models.ErrCodeProjectDoesNotExist)
2019-04-21 18:18:17 +00:00
})
t.Run("Empty title", func(t *testing.T) {
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":""}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message.(models.ValidationHTTPError).InvalidFields, "title: non zero value required")
})
t.Run("Title too long", func(t *testing.T) {
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea taki"}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message.(models.ValidationHTTPError).InvalidFields[0], "does not validate as runelength(1|250)")
2019-04-21 18:18:17 +00:00
})
t.Run("Rights check", func(t *testing.T) {
t.Run("Forbidden", func(t *testing.T) {
2019-08-14 20:19:04 +00:00
// Owned by user13
2023-01-12 16:00:40 +00:00
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":20}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team readonly", func(t *testing.T) {
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":32}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team write", func(t *testing.T) {
rec, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":33}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":""`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project Team admin", func(t *testing.T) {
rec, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":34}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":""`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User readonly", func(t *testing.T) {
_, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":9}`)
2019-04-21 18:18:17 +00:00
assert.Error(t, err)
assert.Contains(t, err.(*echo.HTTPError).Message, `Forbidden`)
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User write", func(t *testing.T) {
rec, err := testHandler.testCreateWithUser(nil, nil, `{"title":"Lorem","parent_project_id":10}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":""`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
2023-01-12 16:00:40 +00:00
t.Run("Shared Via Parent Project User admin", func(t *testing.T) {
rec, err := testHandler.testCreateWithUser(nil, map[string]string{"namespace": "12"}, `{"title":"Lorem","parent_project_id":11}`)
2019-04-21 18:18:17 +00:00
assert.NoError(t, err)
assert.Contains(t, rec.Body.String(), `"title":"Lorem"`)
assert.Contains(t, rec.Body.String(), `"description":""`)
assert.Contains(t, rec.Body.String(), `"owner":{"id":1`)
2019-12-01 13:38:11 +00:00
assert.NotContains(t, rec.Body.String(), `"tasks":`)
2019-04-21 18:18:17 +00:00
})
})
})
}