2022-08-10 12:14:48 -05:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
2022-08-29 16:13:06 -05:00
|
|
|
"context"
|
2022-08-10 12:14:48 -05:00
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
2022-08-29 16:13:06 -05:00
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
2022-08-10 12:14:48 -05:00
|
|
|
"github.com/grafana/grafana/pkg/models"
|
|
|
|
"github.com/grafana/grafana/pkg/services/contexthandler/ctxkey"
|
2022-08-29 16:13:06 -05:00
|
|
|
fakeDatasources "github.com/grafana/grafana/pkg/services/datasources/fakes"
|
2022-08-10 12:14:48 -05:00
|
|
|
"github.com/grafana/grafana/pkg/services/publicdashboards"
|
|
|
|
publicdashboardsService "github.com/grafana/grafana/pkg/services/publicdashboards/service"
|
2022-08-29 16:13:06 -05:00
|
|
|
"github.com/grafana/grafana/pkg/services/query"
|
2022-08-10 12:14:48 -05:00
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
|
"github.com/grafana/grafana/pkg/web"
|
|
|
|
"github.com/stretchr/testify/mock"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRequiresValidAccessToken(t *testing.T) {
|
|
|
|
t.Run("Returns 404 when access token is empty", func(t *testing.T) {
|
|
|
|
request, err := http.NewRequest("GET", "/api/public/ma/events/", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp := runMiddleware(request, mockAccessTokenExistsResponse(false, nil))
|
|
|
|
|
|
|
|
require.Equal(t, http.StatusNotFound, resp.Code)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Returns 200 when public dashboard with access token exists", func(t *testing.T) {
|
|
|
|
request, err := http.NewRequest("GET", "/api/public/ma/events/myAccessToken", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp := runMiddleware(request, mockAccessTokenExistsResponse(true, nil))
|
|
|
|
|
|
|
|
require.Equal(t, http.StatusOK, resp.Code)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Returns 400 when public dashboard with access token does not exist", func(t *testing.T) {
|
|
|
|
request, err := http.NewRequest("GET", "/api/public/ma/events/myAccessToken", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp := runMiddleware(request, mockAccessTokenExistsResponse(false, nil))
|
|
|
|
|
|
|
|
require.Equal(t, http.StatusBadRequest, resp.Code)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("Returns 500 when public dashboard service gives an error", func(t *testing.T) {
|
|
|
|
request, err := http.NewRequest("GET", "/api/public/ma/events/myAccessToken", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
resp := runMiddleware(request, mockAccessTokenExistsResponse(false, fmt.Errorf("error not found")))
|
|
|
|
|
|
|
|
require.Equal(t, http.StatusInternalServerError, resp.Code)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func mockAccessTokenExistsResponse(returnArguments ...interface{}) *publicdashboardsService.PublicDashboardServiceImpl {
|
|
|
|
fakeStore := &publicdashboards.FakePublicDashboardStore{}
|
|
|
|
fakeStore.On("AccessTokenExists", mock.Anything, mock.Anything).Return(returnArguments[0], returnArguments[1])
|
2022-08-29 16:13:06 -05:00
|
|
|
|
|
|
|
qds := query.ProvideService(
|
|
|
|
nil,
|
|
|
|
nil,
|
|
|
|
nil,
|
|
|
|
&fakePluginRequestValidator{},
|
|
|
|
&fakeDatasources.FakeDataSourceService{},
|
|
|
|
&fakePluginClient{
|
|
|
|
QueryDataHandlerFunc: func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
|
|
|
resp := backend.Responses{
|
|
|
|
"A": backend.DataResponse{
|
|
|
|
Error: fmt.Errorf("query failed"),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
return &backend.QueryDataResponse{Responses: resp}, nil
|
|
|
|
},
|
|
|
|
},
|
|
|
|
&fakeOAuthTokenService{},
|
|
|
|
)
|
|
|
|
|
|
|
|
return publicdashboardsService.ProvideService(setting.NewCfg(), fakeStore, qds)
|
2022-08-10 12:14:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func runMiddleware(request *http.Request, pubdashService *publicdashboardsService.PublicDashboardServiceImpl) *httptest.ResponseRecorder {
|
|
|
|
recorder := httptest.NewRecorder()
|
|
|
|
m := web.New()
|
|
|
|
initCtx := &models.ReqContext{}
|
|
|
|
m.Use(func(c *web.Context) {
|
|
|
|
initCtx.Context = c
|
|
|
|
c.Req = c.Req.WithContext(ctxkey.Set(c.Req.Context(), initCtx))
|
|
|
|
})
|
2022-08-10 16:12:25 -05:00
|
|
|
m.Get("/api/public/ma/events/:accessToken", RequiresValidAccessToken(pubdashService), mockValidRequestHandler)
|
2022-08-10 12:14:48 -05:00
|
|
|
m.ServeHTTP(recorder, request)
|
|
|
|
|
|
|
|
return recorder
|
|
|
|
}
|
2022-08-10 16:12:25 -05:00
|
|
|
|
|
|
|
func mockValidRequestHandler(c *models.ReqContext) {
|
|
|
|
resp := make(map[string]interface{})
|
|
|
|
resp["message"] = "Valid request"
|
|
|
|
c.JSON(http.StatusOK, resp)
|
|
|
|
}
|