mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
	
	
		
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package api | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"context" | ||
|  | 	"encoding/json" | ||
|  | 	"net/http" | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/stretchr/testify/assert" | ||
|  | 	"github.com/stretchr/testify/require" | ||
|  | 
 | ||
|  | 	"github.com/grafana/grafana/pkg/models" | ||
|  | 	"github.com/grafana/grafana/pkg/services/accesscontrol" | ||
|  | 	"github.com/grafana/grafana/pkg/services/dashboards" | ||
|  | ) | ||
|  | 
 | ||
|  | func TestHTTPServer_Search(t *testing.T) { | ||
|  | 	sc := setupHTTPServer(t, true, true) | ||
|  | 	sc.initCtx.IsSignedIn = true | ||
|  | 	sc.initCtx.SignedInUser = &models.SignedInUser{} | ||
|  | 
 | ||
|  | 	sc.hs.SearchService = &mockSearchService{ | ||
|  | 		ExpectedResult: models.HitList{ | ||
|  | 			{ID: 1, UID: "folder1", Title: "folder1", Type: models.DashHitFolder}, | ||
|  | 			{ID: 2, UID: "folder2", Title: "folder2", Type: models.DashHitFolder}, | ||
|  | 			{ID: 3, UID: "dash3", Title: "dash3", FolderUID: "folder2", Type: models.DashHitDB}, | ||
|  | 		}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	sc.acmock.GetUserPermissionsFunc = func(ctx context.Context, user *models.SignedInUser, options accesscontrol.Options) ([]*accesscontrol.Permission, error) { | ||
|  | 		return []*accesscontrol.Permission{ | ||
|  | 			{Action: "folders:read", Scope: "folders:*"}, | ||
|  | 			{Action: "folders:write", Scope: "folders:uid:folder2"}, | ||
|  | 			{Action: "dashboards:read", Scope: "dashboards:*"}, | ||
|  | 			{Action: "dashboards:write", Scope: "folders:uid:folder2"}, | ||
|  | 		}, nil | ||
|  | 	} | ||
|  | 
 | ||
|  | 	type withMeta struct { | ||
|  | 		models.Hit | ||
|  | 		AccessControl accesscontrol.Metadata `json:"accessControl,omitempty"` | ||
|  | 	} | ||
|  | 
 | ||
|  | 	t.Run("should attach access control metadata to response", func(t *testing.T) { | ||
|  | 		recorder := callAPI(sc.server, http.MethodGet, "/api/search?accesscontrol=true", nil, t) | ||
|  | 		assert.Equal(t, http.StatusOK, recorder.Code) | ||
|  | 		var result []withMeta | ||
|  | 		require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &result)) | ||
|  | 
 | ||
|  | 		for _, r := range result { | ||
|  | 			if r.ID == 1 { | ||
|  | 				assert.Len(t, r.AccessControl, 1) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionFoldersRead]) | ||
|  | 			} else if r.ID == 2 { | ||
|  | 				assert.Len(t, r.AccessControl, 3) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionFoldersRead]) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionFoldersWrite]) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionDashboardsWrite]) | ||
|  | 			} else if r.ID == 3 { | ||
|  | 				assert.Len(t, r.AccessControl, 2) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionDashboardsRead]) | ||
|  | 				assert.True(t, r.AccessControl[dashboards.ActionDashboardsWrite]) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	}) | ||
|  | 
 | ||
|  | 	t.Run("should not attach access control metadata to response", func(t *testing.T) { | ||
|  | 		recorder := callAPI(sc.server, http.MethodGet, "/api/search", nil, t) | ||
|  | 		assert.Equal(t, http.StatusOK, recorder.Code) | ||
|  | 		var result []withMeta | ||
|  | 		require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &result)) | ||
|  | 
 | ||
|  | 		for _, r := range result { | ||
|  | 			assert.Len(t, r.AccessControl, 0) | ||
|  | 		} | ||
|  | 	}) | ||
|  | } |