| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-29 21:50:21 +08:00
										 |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2020-12-16 02:09:04 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/fs" | 
					
						
							| 
									
										
										
										
											2022-01-20 18:10:12 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/infra/tracing" | 
					
						
							| 
									
										
										
										
											2023-08-01 20:04:37 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/models/usertoken" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											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-08-01 20:04:37 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/authn" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2023-01-27 15:50:36 +08:00
										 |  |  | 	contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2023-11-21 21:47:23 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/login/authinfotest" | 
					
						
							| 
									
										
										
										
											2022-08-10 17:56:48 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/org" | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/quota/quotatest" | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2022-08-02 22:58:05 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user" | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2023-08-09 14:54:52 +08:00
										 |  |  | 			sc.context.IsAnonymous = false | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 			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 | 
					
						
							| 
									
										
										
										
											2023-11-21 21:47:23 +08:00
										 |  |  | 	authInfoService         *authinfotest.FakeService | 
					
						
							| 
									
										
										
										
											2022-05-25 16:41:51 +08:00
										 |  |  | 	dashboardVersionService dashver.Service | 
					
						
							| 
									
										
										
										
											2022-08-02 22:58:05 +08:00
										 |  |  | 	userService             user.Service | 
					
						
							| 
									
										
										
										
											2023-08-01 20:04:37 +08:00
										 |  |  | 	ctxHdlr                 *contexthandler.ContextHandler | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-09 21:17:59 +08:00
										 |  |  | 	return contexthandler.ProvideService( | 
					
						
							|  |  |  | 		cfg, | 
					
						
							| 
									
										
										
										
											2023-09-27 15:51:57 +08:00
										 |  |  | 		tracing.InitializeTracerForTest(), | 
					
						
							| 
									
										
										
										
											2023-08-09 21:17:59 +08:00
										 |  |  | 		featuremgmt.WithFeatures(), | 
					
						
							| 
									
										
										
										
											2023-09-29 15:10:33 +08:00
										 |  |  | 		&authntest.FakeService{ExpectedIdentity: &authn.Identity{ID: authn.AnonymousNamespaceID, SessionToken: &usertoken.UserToken{}}}, | 
					
						
							| 
									
										
										
										
											2023-08-09 21:17:59 +08:00
										 |  |  | 	) | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							| 
									
										
										
										
											2023-08-01 20:04:37 +08:00
										 |  |  | 	ctxHdlr := getContextHandler(t, cfg) | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 	sc := &scenarioContext{ | 
					
						
							| 
									
										
										
										
											2023-08-01 20:04:37 +08:00
										 |  |  | 		url:     url, | 
					
						
							|  |  |  | 		t:       t, | 
					
						
							|  |  |  | 		cfg:     cfg, | 
					
						
							|  |  |  | 		ctxHdlr: ctxHdlr, | 
					
						
							| 
									
										
										
										
											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, "[[", "]]")) | 
					
						
							| 
									
										
										
										
											2023-08-01 20:04:37 +08:00
										 |  |  | 	sc.m.Use(ctxHdlr.Middleware) | 
					
						
							| 
									
										
										
										
											2018-01-30 20:17:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-12-11 18:44:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-29 21:50:21 +08:00
										 |  |  | func setupScenarioContextSamlLogout(t *testing.T, url string) *scenarioContext { | 
					
						
							|  |  |  | 	cfg := setting.NewCfg() | 
					
						
							|  |  |  | 	//seed sections and keys
 | 
					
						
							|  |  |  | 	cfg.Raw.DeleteSection("DEFAULT") | 
					
						
							|  |  |  | 	saml, err := cfg.Raw.NewSection("auth.saml") | 
					
						
							|  |  |  | 	assert.NoError(t, err) | 
					
						
							|  |  |  | 	_, err = saml.NewKey("enabled", "true") | 
					
						
							|  |  |  | 	assert.NoError(t, err) | 
					
						
							|  |  |  | 	_, err = saml.NewKey("allow_idp_initiated", "false") | 
					
						
							|  |  |  | 	assert.NoError(t, err) | 
					
						
							|  |  |  | 	_, err = saml.NewKey("single_logout", "true") | 
					
						
							|  |  |  | 	assert.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ctxHdlr := getContextHandler(t, cfg) | 
					
						
							|  |  |  | 	sc := &scenarioContext{ | 
					
						
							|  |  |  | 		url:     url, | 
					
						
							|  |  |  | 		t:       t, | 
					
						
							|  |  |  | 		cfg:     cfg, | 
					
						
							|  |  |  | 		ctxHdlr: ctxHdlr, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	viewsPath, err := filepath.Abs("../../public/views") | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	exists, err := fs.Exists(viewsPath) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	require.Truef(t, exists, "Views should be in %q", viewsPath) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sc.m = web.New() | 
					
						
							|  |  |  | 	sc.m.UseMiddleware(web.Renderer(viewsPath, "[[", "]]")) | 
					
						
							|  |  |  | 	sc.m.Use(ctxHdlr.Middleware) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sc | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FIXME: This user should not be anonymous
 | 
					
						
							| 
									
										
										
										
											2023-08-28 16:42:24 +08:00
										 |  |  | func authedUserWithPermissions(userID, orgID int64, permissions []accesscontrol.Permission) *user.SignedInUser { | 
					
						
							|  |  |  | 	return &user.SignedInUser{UserID: userID, OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-09 18:33:35 +08:00
										 |  |  | // FIXME: This user should not be anonymous
 | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | func userWithPermissions(orgID int64, permissions []accesscontrol.Permission) *user.SignedInUser { | 
					
						
							| 
									
										
										
										
											2023-08-09 18:33:35 +08:00
										 |  |  | 	return &user.SignedInUser{IsAnonymous: true, OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}} | 
					
						
							| 
									
										
										
										
											2022-10-20 15:11:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 02:38:06 +08:00
										 |  |  | func setupSimpleHTTPServer(features featuremgmt.FeatureToggles) *HTTPServer { | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	if features == nil { | 
					
						
							|  |  |  | 		features = featuremgmt.WithFeatures() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-11-13 23:55:15 +08:00
										 |  |  | 	// nolint:staticcheck
 | 
					
						
							| 
									
										
										
										
											2023-11-15 04:50:27 +08:00
										 |  |  | 	cfg := setting.NewCfgWithFeatures(features.IsEnabledGlobally) | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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(), | 
					
						
							| 
									
										
										
										
											2023-11-21 21:47:23 +08:00
										 |  |  | 		authInfoService: &authinfotest.FakeService{ | 
					
						
							| 
									
										
										
										
											2022-11-29 22:20:28 +08:00
										 |  |  | 			ExpectedLabels: map[int64]string{int64(1): login.GetAuthProviderLabel(login.LDAPAuthModule)}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2022-01-27 01:44:20 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 23:46:47 +08:00
										 |  |  | func mockRequestBody(v any) io.ReadCloser { | 
					
						
							| 
									
										
										
										
											2021-11-29 17:18:01 +08:00
										 |  |  | 	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() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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) | 
					
						
							| 
									
										
										
										
											2023-08-09 14:54:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	viewsPath, err := filepath.Abs("../../public/views") | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	s.Mux.UseMiddleware(web.Renderer(viewsPath, "[[", "]]")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 01:38:04 +08:00
										 |  |  | 	return s | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 17:28:12 +08:00
										 |  |  | func (mss *mockSearchService) SearchHandler(_ context.Context, q *search.Query) (model.HitList, error) { | 
					
						
							|  |  |  | 	return mss.ExpectedResult, nil | 
					
						
							| 
									
										
										
										
											2022-08-03 23:17:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 21:37:54 +08:00
										 |  |  | func (mss *mockSearchService) SortOptions() []model.SortOption { return nil } |