| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2021-09-27 22:43:16 +08:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2020-05-12 19:04:18 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							|  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2020-05-12 19:04:18 +08:00
										 |  |  | 	"testing" | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	"github.com/stretchr/testify/mock" | 
					
						
							| 
									
										
										
										
											2022-05-18 02:52:22 +08:00
										 |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 21:43:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/routing" | 
					
						
							| 
									
										
										
										
											2022-10-19 21:02:15 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/db" | 
					
						
							| 
									
										
										
										
											2023-01-18 23:01:25 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/db/dbtest" | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/fs" | 
					
						
							| 
									
										
										
										
											2022-09-14 15:13:10 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/localcache" | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/log" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/remotecache" | 
					
						
							| 
									
										
										
										
											2022-01-20 18:10:12 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2021-08-24 17:36:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol" | 
					
						
							| 
									
										
										
										
											2022-09-06 00:15:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol/acimpl" | 
					
						
							| 
									
										
										
										
											2021-08-25 02:12:48 +08:00
										 |  |  | 	accesscontrolmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/accesscontrol/ossaccesscontrol" | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/annotations/annotationstest" | 
					
						
							| 
									
										
										
										
											2022-11-18 16:56:06 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/auth/authtest" | 
					
						
							| 
									
										
										
										
											2023-01-21 02:11:06 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/auth/jwt" | 
					
						
							| 
									
										
										
										
											2022-12-02 22:10:03 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/authn/authntest" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/contexthandler" | 
					
						
							| 
									
										
										
										
											2022-03-30 23:01:24 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/contexthandler/authproxy" | 
					
						
							| 
									
										
										
										
											2022-05-21 00:45:18 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/contexthandler/ctxkey" | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/dashboards" | 
					
						
							|  |  |  | 	dashboardsstore "github.com/grafana/grafana/pkg/services/dashboards/database" | 
					
						
							| 
									
										
										
										
											2022-05-18 02:52:22 +08:00
										 |  |  | 	dashboardservice "github.com/grafana/grafana/pkg/services/dashboards/service" | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	dashver "github.com/grafana/grafana/pkg/services/dashboardversion" | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | 
					
						
							| 
									
										
										
										
											2023-02-01 21:43:21 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/folder/folderimpl" | 
					
						
							| 
									
										
										
										
											2023-01-26 16:21:10 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/folder/foldertest" | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/guardian" | 
					
						
							| 
									
										
										
										
											2023-02-11 02:01:55 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/ldap/service" | 
					
						
							| 
									
										
										
										
											2022-05-25 19:43:58 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/licensing" | 
					
						
							| 
									
										
										
										
											2022-11-29 22:20:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login" | 
					
						
							| 
									
										
										
										
											2022-03-30 23:01:24 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login/loginservice" | 
					
						
							| 
									
										
										
										
											2022-04-05 02:36:15 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login/logintest" | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							| 
									
										
										
										
											2022-09-20 15:55:40 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org/orgtest" | 
					
						
							| 
									
										
										
										
											2022-04-21 21:03:17 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/preference/preftest" | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota/quotatest" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/rendering" | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/search" | 
					
						
							| 
									
										
										
										
											2023-01-30 22:17:53 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/search/model" | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/searchusers" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/searchusers/filters" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/sqlstore" | 
					
						
							| 
									
										
										
										
											2023-02-07 00:50:03 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest" | 
					
						
							| 
									
										
										
										
											2022-09-21 20:04:01 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/tag/tagimpl" | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/team" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/team/teamimpl" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/team/teamtest" | 
					
						
							| 
									
										
										
										
											2022-08-02 22:58:05 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user" | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user/userimpl" | 
					
						
							| 
									
										
										
										
											2022-08-04 19:22:43 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user/usertest" | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/web" | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/web/webtest" | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | func loggedInUserScenario(t *testing.T, desc string, url string, routePattern string, fn scenarioFunc, sqlStore db.DB) { | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	loggedInUserScenarioWithRole(t, desc, "GET", url, routePattern, org.RoleEditor, fn, sqlStore) | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | func loggedInUserScenarioWithRole(t *testing.T, desc string, method string, url string, routePattern string, role org.RoleType, fn scenarioFunc, sqlStore db.DB) { | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { | 
					
						
							|  |  |  | 		sc := setupScenarioContext(t, url) | 
					
						
							| 
									
										
										
										
											2022-02-03 16:20:20 +08:00
										 |  |  | 		sc.sqlStore = sqlStore | 
					
						
							| 
									
										
										
										
											2022-08-04 19:22:43 +08:00
										 |  |  | 		sc.userService = usertest.NewUserServiceFake() | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 		sc.defaultHandler = routing.Wrap(func(c *contextmodel.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 			sc.context = c | 
					
						
							| 
									
										
										
										
											2022-08-11 19:28:55 +08:00
										 |  |  | 			sc.context.UserID = testUserID | 
					
						
							|  |  |  | 			sc.context.OrgID = testOrgID | 
					
						
							| 
									
										
										
										
											2020-11-24 19:10:32 +08:00
										 |  |  | 			sc.context.Login = testUserLogin | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 			sc.context.OrgRole = role | 
					
						
							|  |  |  | 			if sc.handlerFunc != nil { | 
					
						
							|  |  |  | 				return sc.handlerFunc(sc.context) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch method { | 
					
						
							|  |  |  | 		case "GET": | 
					
						
							|  |  |  | 			sc.m.Get(routePattern, sc.defaultHandler) | 
					
						
							|  |  |  | 		case "DELETE": | 
					
						
							|  |  |  | 			sc.m.Delete(routePattern, sc.defaultHandler) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | func anonymousUserScenario(t *testing.T, desc string, method string, url string, routePattern string, fn scenarioFunc) { | 
					
						
							|  |  |  | 	t.Run(fmt.Sprintf("%s %s", desc, url), func(t *testing.T) { | 
					
						
							|  |  |  | 		sc := setupScenarioContext(t, url) | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 		sc.defaultHandler = routing.Wrap(func(c *contextmodel.ReqContext) response.Response { | 
					
						
							| 
									
										
										
										
											2018-05-24 14:55:16 +08:00
										 |  |  | 			sc.context = c | 
					
						
							|  |  |  | 			if sc.handlerFunc != nil { | 
					
						
							|  |  |  | 				return sc.handlerFunc(sc.context) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch method { | 
					
						
							|  |  |  | 		case "GET": | 
					
						
							|  |  |  | 			sc.m.Get(routePattern, sc.defaultHandler) | 
					
						
							|  |  |  | 		case "DELETE": | 
					
						
							|  |  |  | 			sc.m.Delete(routePattern, sc.defaultHandler) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		fn(sc) | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | func (sc *scenarioContext) fakeReq(method, url string) *scenarioContext { | 
					
						
							|  |  |  | 	sc.resp = httptest.NewRecorder() | 
					
						
							|  |  |  | 	req, err := http.NewRequest(method, url, nil) | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 	require.NoError(sc.t, err) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 	req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	sc.req = req | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (sc *scenarioContext) fakeReqWithParams(method, url string, queryParams map[string]string) *scenarioContext { | 
					
						
							|  |  |  | 	sc.resp = httptest.NewRecorder() | 
					
						
							|  |  |  | 	req, err := http.NewRequest(method, url, nil) | 
					
						
							| 
									
										
										
										
											2020-05-12 19:04:18 +08:00
										 |  |  | 	// TODO: Depend on sc.t
 | 
					
						
							|  |  |  | 	if sc.t != nil { | 
					
						
							|  |  |  | 		require.NoError(sc.t, err) | 
					
						
							|  |  |  | 	} else if err != nil { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("Making request failed: %s", err)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 	req.Header.Add("Content-Type", "application/json") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	q := req.URL.Query() | 
					
						
							|  |  |  | 	for k, v := range queryParams { | 
					
						
							|  |  |  | 		q.Add(k, v) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	req.URL.RawQuery = q.Encode() | 
					
						
							|  |  |  | 	sc.req = req | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-09 14:37:24 +08:00
										 |  |  | func (sc *scenarioContext) fakeReqNoAssertions(method, url string) *scenarioContext { | 
					
						
							|  |  |  | 	sc.resp = httptest.NewRecorder() | 
					
						
							|  |  |  | 	req, _ := http.NewRequest(method, url, nil) | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 	req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2019-07-09 14:37:24 +08:00
										 |  |  | 	sc.req = req | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (sc *scenarioContext) fakeReqNoAssertionsWithCookie(method, url string, cookie http.Cookie) *scenarioContext { | 
					
						
							|  |  |  | 	sc.resp = httptest.NewRecorder() | 
					
						
							|  |  |  | 	http.SetCookie(sc.resp, &cookie) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	req, _ := http.NewRequest(method, url, nil) | 
					
						
							|  |  |  | 	req.Header = http.Header{"Cookie": sc.resp.Header()["Set-Cookie"]} | 
					
						
							| 
									
										
										
										
											2022-02-09 20:44:38 +08:00
										 |  |  | 	req.Header.Add("Content-Type", "application/json") | 
					
						
							| 
									
										
										
										
											2019-07-09 14:37:24 +08:00
										 |  |  | 	sc.req = req | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | type scenarioContext struct { | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	t                       *testing.T | 
					
						
							|  |  |  | 	cfg                     *setting.Cfg | 
					
						
							|  |  |  | 	m                       *web.Mux | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	context                 *contextmodel.ReqContext | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	resp                    *httptest.ResponseRecorder | 
					
						
							|  |  |  | 	handlerFunc             handlerFunc | 
					
						
							|  |  |  | 	defaultHandler          web.Handler | 
					
						
							|  |  |  | 	req                     *http.Request | 
					
						
							|  |  |  | 	url                     string | 
					
						
							| 
									
										
										
										
											2022-11-18 16:56:06 +08:00
										 |  |  | 	userAuthTokenService    *authtest.FakeUserAuthTokenService | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | 	sqlStore                db.DB | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	authInfoService         *logintest.AuthInfoServiceFake | 
					
						
							|  |  |  | 	dashboardVersionService dashver.Service | 
					
						
							| 
									
										
										
										
											2022-08-02 22:58:05 +08:00
										 |  |  | 	userService             user.Service | 
					
						
							| 
									
										
										
										
											2023-01-25 17:36:26 +08:00
										 |  |  | 	dashboardService        dashboards.DashboardService | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (sc *scenarioContext) exec() { | 
					
						
							|  |  |  | 	sc.m.ServeHTTP(sc.resp, sc.req) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type scenarioFunc func(c *scenarioContext) | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | type handlerFunc func(c *contextmodel.ReqContext) response.Response | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | func getContextHandler(t *testing.T, cfg *setting.Cfg) *contexthandler.ContextHandler { | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	if cfg == nil { | 
					
						
							|  |  |  | 		cfg = setting.NewCfg() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-19 21:02:15 +08:00
										 |  |  | 	sqlStore := db.InitTestDB(t) | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	remoteCacheSvc := &remotecache.RemoteCache{} | 
					
						
							|  |  |  | 	cfg.RemoteCacheOptions = &setting.RemoteCacheOptions{ | 
					
						
							|  |  |  | 		Name: "database", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-11-18 16:56:06 +08:00
										 |  |  | 	userAuthTokenSvc := authtest.NewFakeUserAuthTokenService() | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	renderSvc := &fakeRenderService{} | 
					
						
							| 
									
										
										
										
											2023-01-21 02:11:06 +08:00
										 |  |  | 	authJWTSvc := jwt.NewFakeJWTService() | 
					
						
							| 
									
										
										
										
											2022-06-15 18:40:41 +08:00
										 |  |  | 	tracer := tracing.InitializeTracerForTest() | 
					
						
							| 
									
										
										
										
											2023-02-11 02:01:55 +08:00
										 |  |  | 	authProxy := authproxy.ProvideAuthProxy(cfg, remoteCacheSvc, loginservice.LoginServiceMock{}, &usertest.FakeUserService{}, sqlStore, service.NewLDAPFakeService()) | 
					
						
							| 
									
										
										
										
											2022-04-08 16:33:19 +08:00
										 |  |  | 	loginService := &logintest.LoginServiceFake{} | 
					
						
							|  |  |  | 	authenticator := &logintest.AuthenticatorFake{} | 
					
						
							| 
									
										
										
										
											2022-12-02 22:10:03 +08:00
										 |  |  | 	ctxHdlr := contexthandler.ProvideService(cfg, userAuthTokenSvc, authJWTSvc, remoteCacheSvc, renderSvc, sqlStore, tracer, authProxy, loginService, nil, authenticator, usertest.NewUserServiceFake(), orgtest.NewOrgServiceFake(), nil, featuremgmt.WithFeatures(), &authntest.FakeService{}) | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return ctxHdlr | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | func setupScenarioContext(t *testing.T, url string) *scenarioContext { | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	cfg := setting.NewCfg() | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	sc := &scenarioContext{ | 
					
						
							|  |  |  | 		url: url, | 
					
						
							| 
									
										
										
										
											2020-11-13 16:52:38 +08:00
										 |  |  | 		t:   t, | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 		cfg: cfg, | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 	viewsPath, err := filepath.Abs("../../public/views") | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	exists, err := fs.Exists(viewsPath) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	require.Truef(t, exists, "Views should be in %q", viewsPath) | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 20:30:59 +08:00
										 |  |  | 	sc.m = web.New() | 
					
						
							|  |  |  | 	sc.m.UseMiddleware(web.Renderer(viewsPath, "[[", "]]")) | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	sc.m.Use(getContextHandler(t, cfg).Middleware) | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type fakeRenderService struct { | 
					
						
							|  |  |  | 	rendering.Service | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *fakeRenderService) Init() error { | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-11 21:58:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | // accessControlScenarioContext contains the setups for accesscontrol tests
 | 
					
						
							|  |  |  | type accessControlScenarioContext struct { | 
					
						
							|  |  |  | 	// server we registered hs routes on.
 | 
					
						
							|  |  |  | 	server *web.Mux | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// initCtx is used in a middleware to set the initial context
 | 
					
						
							|  |  |  | 	// of the request server side. Can be used to pretend sign in.
 | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	initCtx *contextmodel.ReqContext | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// hs is a minimal HTTPServer for the accesscontrol tests to pass.
 | 
					
						
							|  |  |  | 	hs *HTTPServer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// acmock is an accesscontrol mock used to fake users rights.
 | 
					
						
							|  |  |  | 	acmock *accesscontrolmock.Mock | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// db is a test database initialized with InitTestDB
 | 
					
						
							| 
									
										
										
										
											2022-09-27 16:34:31 +08:00
										 |  |  | 	db *sqlstore.SQLStore | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// cfg is the setting provider
 | 
					
						
							|  |  |  | 	cfg *setting.Cfg | 
					
						
							| 
									
										
										
										
											2022-02-16 21:15:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-15 22:34:17 +08:00
										 |  |  | 	dashboardsStore             dashboards.Store | 
					
						
							|  |  |  | 	teamService                 team.Service | 
					
						
							|  |  |  | 	userService                 user.Service | 
					
						
							|  |  |  | 	folderPermissionsService    *accesscontrolmock.MockPermissionsService | 
					
						
							|  |  |  | 	dashboardPermissionsService *accesscontrolmock.MockPermissionsService | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | func userWithPermissions(orgID int64, permissions []accesscontrol.Permission) *user.SignedInUser { | 
					
						
							| 
									
										
										
										
											2023-01-09 19:23:24 +08:00
										 |  |  | 	return &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}} | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | // setInitCtxSignedInUser sets a copy of the user in initCtx
 | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | func setInitCtxSignedInUser(initCtx *contextmodel.ReqContext, user user.SignedInUser) { | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	initCtx.IsSignedIn = true | 
					
						
							|  |  |  | 	initCtx.SignedInUser = &user | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | func setupSimpleHTTPServer(features *featuremgmt.FeatureManager) *HTTPServer { | 
					
						
							|  |  |  | 	if features == nil { | 
					
						
							|  |  |  | 		features = featuremgmt.WithFeatures() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	cfg := setting.NewCfg() | 
					
						
							| 
									
										
										
										
											2022-08-11 21:37:31 +08:00
										 |  |  | 	cfg.RBACEnabled = false | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	cfg.IsFeatureToggleEnabled = features.IsEnabled | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &HTTPServer{ | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 		Cfg:             cfg, | 
					
						
							|  |  |  | 		Features:        features, | 
					
						
							|  |  |  | 		License:         &licensing.OSSLicensingService{}, | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | 		AccessControl:   acimpl.ProvideAccessControl(cfg), | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 		annotationsRepo: annotationstest.NewFakeAnnotationsRepo(), | 
					
						
							| 
									
										
										
										
											2022-11-29 22:20:28 +08:00
										 |  |  | 		authInfoService: &logintest.AuthInfoServiceFake{ | 
					
						
							|  |  |  | 			ExpectedLabels: map[int64]string{int64(1): login.GetAuthProviderLabel(login.LDAPAuthModule)}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | func setupHTTPServer(t *testing.T, useFakeAccessControl bool, options ...APITestServerOption) accessControlScenarioContext { | 
					
						
							|  |  |  | 	return setupHTTPServerWithCfg(t, useFakeAccessControl, setting.NewCfg(), options...) | 
					
						
							| 
									
										
										
										
											2022-01-11 01:05:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | func setupHTTPServerWithCfg(t *testing.T, useFakeAccessControl bool, cfg *setting.Cfg, options ...APITestServerOption) accessControlScenarioContext { | 
					
						
							| 
									
										
										
										
											2022-10-19 21:02:15 +08:00
										 |  |  | 	db := db.InitTestDB(t, db.InitTestDBOpt{}) | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | 	return setupHTTPServerWithCfgDb(t, useFakeAccessControl, cfg, db, db, featuremgmt.WithFeatures(), options...) | 
					
						
							| 
									
										
										
										
											2022-03-08 02:33:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | func setupHTTPServerWithCfgDb( | 
					
						
							|  |  |  | 	t *testing.T, useFakeAccessControl bool, cfg *setting.Cfg, db *sqlstore.SQLStore, | 
					
						
							| 
									
										
										
										
											2022-12-13 18:03:36 +08:00
										 |  |  | 	store db.DB, features *featuremgmt.FeatureManager, options ...APITestServerOption, | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | ) accessControlScenarioContext { | 
					
						
							| 
									
										
										
										
											2022-01-11 01:05:53 +08:00
										 |  |  | 	t.Helper() | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	license := &licensing.OSSLicensingService{} | 
					
						
							| 
									
										
										
										
											2022-01-26 22:48:41 +08:00
										 |  |  | 	routeRegister := routing.NewRouteRegister() | 
					
						
							| 
									
										
										
										
											2022-09-23 01:16:21 +08:00
										 |  |  | 	teamService := teamimpl.ProvideService(db, cfg) | 
					
						
							| 
									
										
										
										
											2022-10-15 03:33:06 +08:00
										 |  |  | 	cfg.IsFeatureToggleEnabled = features.IsEnabled | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 	quotaService := quotatest.New(false, nil) | 
					
						
							|  |  |  | 	dashboardsStore, err := dashboardsstore.ProvideDashboardStore(db, cfg, featuremgmt.WithFeatures(), tagimpl.ProvideService(db, cfg), quotaService) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-03-08 02:33:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	var acmock *accesscontrolmock.Mock | 
					
						
							|  |  |  | 	var ac accesscontrol.AccessControl | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 	var acService accesscontrol.Service | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 	var userSvc user.Service | 
					
						
							| 
									
										
										
										
											2022-10-05 02:48:02 +08:00
										 |  |  | 	userMock := usertest.NewUserServiceFake() | 
					
						
							|  |  |  | 	userMock.ExpectedUser = &user.User{ID: 1} | 
					
						
							|  |  |  | 	orgMock := orgtest.NewOrgServiceFake() | 
					
						
							|  |  |  | 	orgMock.ExpectedOrg = &org.Org{} | 
					
						
							| 
									
										
										
										
											2023-01-09 16:54:33 +08:00
										 |  |  | 	orgMock.ExpectedSearchOrgUsersResult = &org.SearchOrgUsersQueryResult{} | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	// Defining the accesscontrol service has to be done before registering routes
 | 
					
						
							|  |  |  | 	if useFakeAccessControl { | 
					
						
							|  |  |  | 		acmock = accesscontrolmock.New() | 
					
						
							| 
									
										
										
										
											2022-08-11 21:37:31 +08:00
										 |  |  | 		if !cfg.RBACEnabled { | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 			acmock = acmock.WithDisabled() | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		ac = acmock | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 		acService = acmock | 
					
						
							| 
									
										
										
										
											2022-10-05 02:48:02 +08:00
										 |  |  | 		userSvc = userMock | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		var err error | 
					
						
							| 
									
										
										
										
											2022-09-09 15:07:45 +08:00
										 |  |  | 		ac = acimpl.ProvideAccessControl(cfg) | 
					
						
							| 
									
										
										
										
											2023-02-07 00:50:03 +08:00
										 |  |  | 		userSvc, err = userimpl.ProvideService(db, nil, cfg, teamimpl.ProvideService(db, cfg), localcache.ProvideService(), quotatest.New(false, nil), supportbundlestest.NewFakeBundleService()) | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 		require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2022-11-30 22:38:49 +08:00
										 |  |  | 		acService, err = acimpl.ProvideService(cfg, db, routeRegister, localcache.ProvideService(), ac, featuremgmt.WithFeatures()) | 
					
						
							|  |  |  | 		require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2021-11-17 17:12:28 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 	teamPermissionService, err := ossaccesscontrol.ProvideTeamPermissions(cfg, routeRegister, db, ac, license, acService, teamService, userSvc) | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-15 22:34:17 +08:00
										 |  |  | 	folderPermissionsService := accesscontrolmock.NewMockedPermissionsService() | 
					
						
							|  |  |  | 	dashboardPermissionsService := accesscontrolmock.NewMockedPermissionsService() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-26 16:21:10 +08:00
										 |  |  | 	folderSvc := foldertest.NewFakeService() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	// Create minimal HTTP Server
 | 
					
						
							|  |  |  | 	hs := &HTTPServer{ | 
					
						
							|  |  |  | 		Cfg:                    cfg, | 
					
						
							|  |  |  | 		Features:               features, | 
					
						
							|  |  |  | 		Live:                   newTestLive(t, db), | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 		QuotaService:           quotaService, | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		RouteRegister:          routeRegister, | 
					
						
							|  |  |  | 		SQLStore:               store, | 
					
						
							|  |  |  | 		License:                &licensing.OSSLicensingService{}, | 
					
						
							|  |  |  | 		AccessControl:          ac, | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 		accesscontrolService:   acService, | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		teamPermissionsService: teamPermissionService, | 
					
						
							| 
									
										
										
										
											2022-08-16 20:24:57 +08:00
										 |  |  | 		searchUsersService:     searchusers.ProvideUsersService(filters.ProvideOSSSearchUserFilter(), usertest.NewUserServiceFake()), | 
					
						
							| 
									
										
										
										
											2022-07-07 02:42:39 +08:00
										 |  |  | 		DashboardService: dashboardservice.ProvideDashboardService( | 
					
						
							| 
									
										
										
										
											2023-02-01 21:43:21 +08:00
										 |  |  | 			cfg, dashboardsStore, folderimpl.ProvideDashboardFolderStore(db), nil, features, | 
					
						
							| 
									
										
										
										
											2022-12-15 22:34:17 +08:00
										 |  |  | 			folderPermissionsService, dashboardPermissionsService, ac, | 
					
						
							| 
									
										
										
										
											2023-01-26 16:21:10 +08:00
										 |  |  | 			folderSvc, | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 		), | 
					
						
							|  |  |  | 		preferenceService: preftest.NewPreferenceServiceFake(), | 
					
						
							| 
									
										
										
										
											2022-09-27 19:58:49 +08:00
										 |  |  | 		userService:       userSvc, | 
					
						
							| 
									
										
										
										
											2022-10-05 02:48:02 +08:00
										 |  |  | 		orgService:        orgMock, | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 		teamService:       teamService, | 
					
						
							| 
									
										
										
										
											2022-09-19 15:54:37 +08:00
										 |  |  | 		annotationsRepo:   annotationstest.NewFakeAnnotationsRepo(), | 
					
						
							| 
									
										
										
										
											2022-11-29 22:20:28 +08:00
										 |  |  | 		authInfoService: &logintest.AuthInfoServiceFake{ | 
					
						
							|  |  |  | 			ExpectedLabels: map[int64]string{int64(1): login.GetAuthProviderLabel(login.LDAPAuthModule)}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:08:59 +08:00
										 |  |  | 	for _, o := range options { | 
					
						
							|  |  |  | 		o(hs) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 	require.NoError(t, hs.declareFixedRoles()) | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 	require.NoError(t, hs.accesscontrolService.(accesscontrol.RoleRegistry).RegisterFixedRoles(context.Background())) | 
					
						
							| 
									
										
										
										
											2022-06-07 17:02:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	// Instantiate a new Server
 | 
					
						
							|  |  |  | 	m := web.New() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// middleware to set the test initial context
 | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	initCtx := &contextmodel.ReqContext{} | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	m.Use(func(c *web.Context) { | 
					
						
							|  |  |  | 		initCtx.Context = c | 
					
						
							|  |  |  | 		initCtx.Logger = log.New("api-test") | 
					
						
							| 
									
										
										
										
											2022-05-21 00:45:18 +08:00
										 |  |  | 		c.Req = c.Req.WithContext(ctxkey.Set(c.Req.Context(), initCtx)) | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-24 19:29:17 +08:00
										 |  |  | 	m.Use(accesscontrol.LoadPermissionsMiddleware(hs.accesscontrolService)) | 
					
						
							| 
									
										
										
										
											2022-01-13 21:40:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	// Register all routes
 | 
					
						
							|  |  |  | 	hs.registerRoutes() | 
					
						
							|  |  |  | 	hs.RouteRegister.Register(m.Router) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return accessControlScenarioContext{ | 
					
						
							| 
									
										
										
										
											2022-12-15 22:34:17 +08:00
										 |  |  | 		server:                      m, | 
					
						
							|  |  |  | 		initCtx:                     initCtx, | 
					
						
							|  |  |  | 		hs:                          hs, | 
					
						
							|  |  |  | 		acmock:                      acmock, | 
					
						
							|  |  |  | 		db:                          db, | 
					
						
							|  |  |  | 		cfg:                         cfg, | 
					
						
							|  |  |  | 		dashboardsStore:             dashboardsStore, | 
					
						
							|  |  |  | 		teamService:                 teamService, | 
					
						
							|  |  |  | 		userService:                 userSvc, | 
					
						
							|  |  |  | 		dashboardPermissionsService: dashboardPermissionsService, | 
					
						
							|  |  |  | 		folderPermissionsService:    folderPermissionsService, | 
					
						
							| 
									
										
										
										
											2021-10-27 19:13:59 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func callAPI(server *web.Mux, method, path string, body io.Reader, t *testing.T) *httptest.ResponseRecorder { | 
					
						
							|  |  |  | 	req, err := http.NewRequest(method, path, body) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	req.Header.Set("Content-Type", "application/json") | 
					
						
							|  |  |  | 	recorder := httptest.NewRecorder() | 
					
						
							|  |  |  | 	server.ServeHTTP(recorder, req) | 
					
						
							|  |  |  | 	return recorder | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func mockRequestBody(v interface{}) io.ReadCloser { | 
					
						
							|  |  |  | 	b, _ := json.Marshal(v) | 
					
						
							|  |  |  | 	return io.NopCloser(bytes.NewReader(b)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // APITestServerOption option func for customizing HTTPServer configuration
 | 
					
						
							|  |  |  | // when setting up an API test server via SetupAPITestServer.
 | 
					
						
							|  |  |  | type APITestServerOption func(hs *HTTPServer) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetupAPITestServer sets up a webtest.Server ready for testing all
 | 
					
						
							|  |  |  | // routes registered via HTTPServer.registerRoutes().
 | 
					
						
							|  |  |  | // Optionally customize HTTPServer configuration by providing APITestServerOption
 | 
					
						
							|  |  |  | // option(s).
 | 
					
						
							|  |  |  | func SetupAPITestServer(t *testing.T, opts ...APITestServerOption) *webtest.Server { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hs := &HTTPServer{ | 
					
						
							|  |  |  | 		RouteRegister:      routing.NewRouteRegister(), | 
					
						
							| 
									
										
										
										
											2022-05-26 02:40:41 +08:00
										 |  |  | 		License:            &licensing.OSSLicensingService{}, | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 		Features:           featuremgmt.WithFeatures(), | 
					
						
							| 
									
										
										
										
											2022-11-15 03:08:10 +08:00
										 |  |  | 		QuotaService:       quotatest.New(false, nil), | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 		searchUsersService: &searchusers.OSSService{}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, opt := range opts { | 
					
						
							|  |  |  | 		opt(hs) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | 	if hs.Cfg == nil { | 
					
						
							|  |  |  | 		hs.Cfg = setting.NewCfg() | 
					
						
							|  |  |  | 		hs.Cfg.RBACEnabled = false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if hs.AccessControl == nil { | 
					
						
							|  |  |  | 		hs.AccessControl = acimpl.ProvideAccessControl(hs.Cfg) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	hs.registerRoutes() | 
					
						
							| 
									
										
										
										
											2023-01-23 20:09:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	s := webtest.NewServer(t, hs.RouteRegister) | 
					
						
							|  |  |  | 	return s | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	viewerRole = org.RoleViewer | 
					
						
							|  |  |  | 	editorRole = org.RoleEditor | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type setUpConf struct { | 
					
						
							| 
									
										
										
										
											2023-01-20 21:58:47 +08:00
										 |  |  | 	aclMockResp []*dashboards.DashboardACLInfoDTO | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-30 22:17:53 +08:00
										 |  |  | type mockSearchService struct{ ExpectedResult model.HitList } | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (mss *mockSearchService) SearchHandler(_ context.Context, q *search.Query) error { | 
					
						
							|  |  |  | 	q.Result = mss.ExpectedResult | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-01-30 22:17:53 +08:00
										 |  |  | func (mss *mockSearchService) SortOptions() []model.SortOption { return nil } | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func setUp(confs ...setUpConf) *HTTPServer { | 
					
						
							| 
									
										
										
										
											2023-01-18 23:01:25 +08:00
										 |  |  | 	store := dbtest.NewFakeDB() | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	hs := &HTTPServer{SQLStore: store, SearchService: &mockSearchService{}} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-20 21:58:47 +08:00
										 |  |  | 	aclMockResp := []*dashboards.DashboardACLInfoDTO{} | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	for _, c := range confs { | 
					
						
							|  |  |  | 		if c.aclMockResp != nil { | 
					
						
							|  |  |  | 			aclMockResp = c.aclMockResp | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	teamSvc := &teamtest.FakeService{} | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	dashSvc := &dashboards.FakeDashboardService{} | 
					
						
							| 
									
										
										
										
											2023-01-25 17:36:26 +08:00
										 |  |  | 	qResult := aclMockResp | 
					
						
							|  |  |  | 	dashSvc.On("GetDashboardACLInfoList", mock.Anything, mock.AnythingOfType("*dashboards.GetDashboardACLInfoListQuery")).Return(qResult, nil) | 
					
						
							| 
									
										
										
										
											2022-09-21 00:58:04 +08:00
										 |  |  | 	guardian.InitLegacyGuardian(store, dashSvc, teamSvc) | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | 	return hs | 
					
						
							|  |  |  | } |