| 
									
										
										
										
											2018-01-29 20:51:01 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 01:11:50 +08:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 21:31:54 +08:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/mock" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/dtos" | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							| 
									
										
										
										
											2023-01-18 23:01:25 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/db/dbtest" | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol" | 
					
						
							| 
									
										
										
										
											2022-11-24 22:38:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol/actest" | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" | 
					
						
							| 
									
										
										
										
											2018-03-07 06:59:45 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/dashboards" | 
					
						
							| 
									
										
										
										
											2022-03-03 22:05:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/folder" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/folder/foldertest" | 
					
						
							| 
									
										
										
										
											2022-06-28 16:09:25 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/guardian" | 
					
						
							| 
									
										
										
										
											2022-07-16 00:06:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota/quotatest" | 
					
						
							| 
									
										
										
										
											2023-01-30 22:17:53 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/search/model" | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/team/teamtest" | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user" | 
					
						
							| 
									
										
										
										
											2019-03-06 15:09:34 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/web/webtest" | 
					
						
							| 
									
										
										
										
											2018-02-21 01:11:50 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | func TestFoldersAPIEndpoint(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 	folderService := &foldertest.FakeService{} | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run("Given a correct request for creating a folder", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2023-01-25 16:14:32 +08:00
										 |  |  | 		cmd := folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 			UID:   "uid", | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			Title: "Folder", | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 		folderService.ExpectedFolder = &folder.Folder{ID: 1, UID: "uid", Title: "Folder"} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 		createFolderScenario(t, "When calling POST on", "/api/folders", "/api/folders", folderService, cmd, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 				callCreateFolder(sc) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 				folder := dtos.Folder{} | 
					
						
							|  |  |  | 				err := json.NewDecoder(sc.resp.Body).Decode(&folder) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 				assert.Equal(t, int64(1), folder.Id) | 
					
						
							|  |  |  | 				assert.Equal(t, "uid", folder.Uid) | 
					
						
							|  |  |  | 				assert.Equal(t, "Folder", folder.Title) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run("Given incorrect requests for creating a folder", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 		t.Cleanup(func() { | 
					
						
							|  |  |  | 			folderService.ExpectedError = nil | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		testCases := []struct { | 
					
						
							|  |  |  | 			Error              error | 
					
						
							|  |  |  | 			ExpectedStatusCode int | 
					
						
							|  |  |  | 		}{ | 
					
						
							| 
									
										
										
										
											2022-06-30 21:31:54 +08:00
										 |  |  | 			{Error: dashboards.ErrFolderWithSameUIDExists, ExpectedStatusCode: 409}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderTitleEmpty, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderSameNameExists, ExpectedStatusCode: 409}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrDashboardInvalidUid, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrDashboardUidTooLong, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderAccessDenied, ExpectedStatusCode: 403}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderNotFound, ExpectedStatusCode: 404}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderVersionMismatch, ExpectedStatusCode: 412}, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-25 16:14:32 +08:00
										 |  |  | 		cmd := folder.CreateFolderCommand{ | 
					
						
							|  |  |  | 			UID:   "uid", | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			Title: "Folder", | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		for _, tc := range testCases { | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 			folderService.ExpectedError = tc.Error | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			createFolderScenario(t, fmt.Sprintf("Expect '%s' error when calling POST on", tc.Error.Error()), | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 				"/api/folders", "/api/folders", folderService, cmd, func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 					callCreateFolder(sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equalf(t, tc.ExpectedStatusCode, sc.resp.Code, "Wrong status code for error %s", tc.Error) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run("Given a correct request for updating a folder", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 		title := "Folder upd" | 
					
						
							|  |  |  | 		cmd := folder.UpdateFolderCommand{ | 
					
						
							|  |  |  | 			NewTitle: &title, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 		folderService.ExpectedFolder = &folder.Folder{ID: 1, UID: "uid", Title: "Folder upd"} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 		updateFolderScenario(t, "When calling PUT on", "/api/folders/uid", "/api/folders/:uid", folderService, cmd, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 				callUpdateFolder(sc) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 				folder := dtos.Folder{} | 
					
						
							|  |  |  | 				err := json.NewDecoder(sc.resp.Body).Decode(&folder) | 
					
						
							|  |  |  | 				require.NoError(t, err) | 
					
						
							|  |  |  | 				assert.Equal(t, int64(1), folder.Id) | 
					
						
							|  |  |  | 				assert.Equal(t, "uid", folder.Uid) | 
					
						
							|  |  |  | 				assert.Equal(t, "Folder upd", folder.Title) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run("Given incorrect requests for updating a folder", func(t *testing.T) { | 
					
						
							|  |  |  | 		testCases := []struct { | 
					
						
							|  |  |  | 			Error              error | 
					
						
							|  |  |  | 			ExpectedStatusCode int | 
					
						
							|  |  |  | 		}{ | 
					
						
							| 
									
										
										
										
											2022-06-30 21:31:54 +08:00
										 |  |  | 			{Error: dashboards.ErrFolderWithSameUIDExists, ExpectedStatusCode: 409}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderTitleEmpty, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderSameNameExists, ExpectedStatusCode: 409}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrDashboardInvalidUid, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrDashboardUidTooLong, ExpectedStatusCode: 400}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderAccessDenied, ExpectedStatusCode: 403}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderNotFound, ExpectedStatusCode: 404}, | 
					
						
							|  |  |  | 			{Error: dashboards.ErrFolderVersionMismatch, ExpectedStatusCode: 412}, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 		title := "Folder upd" | 
					
						
							|  |  |  | 		cmd := folder.UpdateFolderCommand{ | 
					
						
							|  |  |  | 			NewTitle: &title, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		for _, tc := range testCases { | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 			folderService.ExpectedError = tc.Error | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 			updateFolderScenario(t, fmt.Sprintf("Expect '%s' error when calling PUT on", tc.Error.Error()), | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 				"/api/folders/uid", "/api/folders/:uid", folderService, cmd, func(sc *scenarioContext) { | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 					callUpdateFolder(sc) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 					assert.Equalf(t, tc.ExpectedStatusCode, sc.resp.Code, "Wrong status code for %s", tc.Error) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | func TestHTTPServer_FolderMetadata(t *testing.T) { | 
					
						
							|  |  |  | 	setUpRBACGuardian(t) | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | 	folderService := &foldertest.FakeService{} | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	server := SetupAPITestServer(t, func(hs *HTTPServer) { | 
					
						
							|  |  |  | 		hs.folderService = folderService | 
					
						
							|  |  |  | 		hs.AccessControl = acmock.New() | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 		hs.QuotaService = quotatest.New(false, nil) | 
					
						
							| 
									
										
										
										
											2023-01-23 20:09:09 +08:00
										 |  |  | 		hs.SearchService = &mockSearchService{ | 
					
						
							| 
									
										
										
										
											2023-01-30 22:17:53 +08:00
										 |  |  | 			ExpectedResult: model.HitList{}, | 
					
						
							| 
									
										
										
										
											2023-01-23 20:09:09 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Should attach access control metadata to multiple folders", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 		folderService.ExpectedFolders = []*folder.Folder{{UID: "1"}, {UID: "2"}, {UID: "3"}} | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		req := server.NewGetRequest("/api/folders?accesscontrol=true") | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 		webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{ | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 			1: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersRead, Scope: dashboards.ScopeFoldersAll}, | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersWrite, Scope: dashboards.ScopeFoldersProvider.GetResourceScopeUID("2")}, | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 		}}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res, err := server.Send(req) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		defer func() { require.NoError(t, res.Body.Close()) }() | 
					
						
							|  |  |  | 		assert.Equal(t, http.StatusOK, res.StatusCode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		body := []dtos.FolderSearchHit{} | 
					
						
							|  |  |  | 		require.NoError(t, json.NewDecoder(res.Body).Decode(&body)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for _, f := range body { | 
					
						
							|  |  |  | 			assert.True(t, f.AccessControl[dashboards.ActionFoldersRead]) | 
					
						
							|  |  |  | 			if f.Uid == "2" { | 
					
						
							|  |  |  | 				assert.True(t, f.AccessControl[dashboards.ActionFoldersWrite]) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				assert.False(t, f.AccessControl[dashboards.ActionFoldersWrite]) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Should attach access control metadata to folder response", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 		folderService.ExpectedFolder = &folder.Folder{UID: "folderUid"} | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		req := server.NewGetRequest("/api/folders/folderUid?accesscontrol=true") | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 		webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{ | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 			1: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersRead, Scope: dashboards.ScopeFoldersAll}, | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersWrite, Scope: dashboards.ScopeFoldersProvider.GetResourceScopeUID("folderUid")}, | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 		}}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res, err := server.Send(req) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, http.StatusOK, res.StatusCode) | 
					
						
							|  |  |  | 		defer func() { require.NoError(t, res.Body.Close()) }() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		body := dtos.Folder{} | 
					
						
							|  |  |  | 		require.NoError(t, json.NewDecoder(res.Body).Decode(&body)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert.True(t, body.AccessControl[dashboards.ActionFoldersRead]) | 
					
						
							|  |  |  | 		assert.True(t, body.AccessControl[dashboards.ActionFoldersWrite]) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Run("Should attach access control metadata to folder response", func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 		folderService.ExpectedFolder = &folder.Folder{UID: "folderUid"} | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		req := server.NewGetRequest("/api/folders/folderUid") | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 		webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{ | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 			1: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersRead, Scope: dashboards.ScopeFoldersAll}, | 
					
						
							|  |  |  | 				{Action: dashboards.ActionFoldersWrite, Scope: dashboards.ScopeFoldersProvider.GetResourceScopeUID("folderUid")}, | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 		}}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res, err := server.Send(req) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							|  |  |  | 		assert.Equal(t, http.StatusOK, res.StatusCode) | 
					
						
							|  |  |  | 		defer func() { require.NoError(t, res.Body.Close()) }() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		body := dtos.Folder{} | 
					
						
							|  |  |  | 		require.NoError(t, json.NewDecoder(res.Body).Decode(&body)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		assert.False(t, body.AccessControl[dashboards.ActionFoldersRead]) | 
					
						
							|  |  |  | 		assert.False(t, body.AccessControl[dashboards.ActionFoldersWrite]) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | func callCreateFolder(sc *scenarioContext) { | 
					
						
							|  |  |  | 	sc.fakeReqWithParams("POST", sc.url, map[string]string{}).exec() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | func createFolderScenario(t *testing.T, desc string, url string, routePattern string, folderService folder.Service, | 
					
						
							| 
									
										
										
										
											2023-01-25 16:14:32 +08:00
										 |  |  | 	cmd folder.CreateFolderCommand, fn scenarioFunc) { | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	setUpRBACGuardian(t) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2023-01-20 21:58:47 +08:00
										 |  |  | 		aclMockResp := []*dashboards.DashboardACLInfoDTO{} | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 		teamSvc := &teamtest.FakeService{} | 
					
						
							| 
									
										
										
										
											2022-06-28 16:09:25 +08:00
										 |  |  | 		dashSvc := &dashboards.FakeDashboardService{} | 
					
						
							| 
									
										
										
										
											2023-01-25 17:36:26 +08:00
										 |  |  | 		qResult1 := aclMockResp | 
					
						
							|  |  |  | 		dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(qResult1, nil) | 
					
						
							|  |  |  | 		qResult := &dashboards.Dashboard{} | 
					
						
							|  |  |  | 		dashSvc.On("GetDashboard", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardQuery")).Return(qResult, nil) | 
					
						
							| 
									
										
										
										
											2023-01-18 23:01:25 +08:00
										 |  |  | 		store := dbtest.NewFakeDB() | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 		guardian.InitLegacyGuardian(store, dashSvc, teamSvc) | 
					
						
							| 
									
										
										
										
											2023-01-30 22:19:42 +08:00
										 |  |  | 		folderPermissions := acmock.NewMockedPermissionsService() | 
					
						
							|  |  |  | 		folderPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) | 
					
						
							| 
									
										
										
										
											2019-03-06 15:09:34 +08:00
										 |  |  | 		hs := HTTPServer{ | 
					
						
							| 
									
										
										
										
											2023-01-30 22:19:42 +08:00
										 |  |  | 			AccessControl:            acmock.New(), | 
					
						
							|  |  |  | 			folderService:            folderService, | 
					
						
							|  |  |  | 			Cfg:                      setting.NewCfg(), | 
					
						
							|  |  |  | 			Features:                 featuremgmt.WithFeatures(), | 
					
						
							|  |  |  | 			accesscontrolService:     actest.FakeService{}, | 
					
						
							|  |  |  | 			folderPermissionsService: folderPermissions, | 
					
						
							| 
									
										
										
										
											2019-03-06 15:09:34 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		sc := setupScenarioContext(t, url) | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 		sc.defaultHandler = routing.Wrap(func(c *contextmodel.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			c.Req.Body = mockRequestBody(cmd) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 			c.Req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 			sc.context = c | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 			sc.context.SignedInUser = &user.SignedInUser{OrgID: testOrgID, UserID: testUserID} | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			return hs.CreateFolder(c) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		sc.m.Post(routePattern, sc.defaultHandler) | 
					
						
							| 
									
										
										
										
											2018-02-20 20:57:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func callUpdateFolder(sc *scenarioContext) { | 
					
						
							|  |  |  | 	sc.fakeReqWithParams("PUT", sc.url, map[string]string{}).exec() | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-02-20 20:57:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 03:47:53 +08:00
										 |  |  | func updateFolderScenario(t *testing.T, desc string, url string, routePattern string, folderService folder.Service, | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 	cmd folder.UpdateFolderCommand, fn scenarioFunc) { | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 	setUpRBACGuardian(t) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 		hs := HTTPServer{ | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 			Cfg:           setting.NewCfg(), | 
					
						
							| 
									
										
										
										
											2022-06-22 16:29:26 +08:00
										 |  |  | 			AccessControl: acmock.New(), | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 			folderService: folderService, | 
					
						
							| 
									
										
										
										
											2021-03-17 23:06:10 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		sc := setupScenarioContext(t, url) | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 		sc.defaultHandler = routing.Wrap(func(c *contextmodel.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			c.Req.Body = mockRequestBody(cmd) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 			c.Req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 			sc.context = c | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 			sc.context.SignedInUser = &user.SignedInUser{OrgID: testOrgID, UserID: testUserID} | 
					
						
							| 
									
										
										
										
											2018-02-20 20:57:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 			return hs.UpdateFolder(c) | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2018-02-20 20:57:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 		sc.m.Put(routePattern, sc.defaultHandler) | 
					
						
							| 
									
										
										
										
											2018-02-20 20:57:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 18:24:54 +08:00
										 |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |