grafana/pkg/web/webtest/webtest_test.go
idafurjes a14621fff6
Chore: Add user service method SetUsingOrg and GetSignedInUserWithCacheCtx (#53343)
* Chore: Add user service method SetUsingOrg

* Chore: Add user service method GetSignedInUserWithCacheCtx

* Use method GetSignedInUserWithCacheCtx from user service

* Fix lint after rebase

* Fix lint

* Fix lint error

* roll back some changes

* Roll back changes in api and middleware

* Add xorm tags to SignedInUser ID fields
2022-08-11 13:28:55 +02:00

132 lines
3.8 KiB
Go

package webtest
import (
"encoding/json"
"io"
"net/http"
"strings"
"testing"
"github.com/grafana/grafana/pkg/api/response"
"github.com/grafana/grafana/pkg/api/routing"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/user"
"github.com/stretchr/testify/require"
)
func TestServer(t *testing.T) {
routeRegister := routing.NewRouteRegister()
var actualRequest *http.Request
routeRegister.Post("/api", routing.Wrap(func(c *models.ReqContext) response.Response {
actualRequest = c.Req
return response.JSON(http.StatusOK, c.SignedInUser)
}))
s := NewServer(t, routeRegister)
require.NotNil(t, s)
t.Run("NewRequest: GET api should set expected properties", func(t *testing.T) {
req := s.NewRequest(http.MethodGet, "api", nil)
verifyRequest(t, s, req, "")
})
t.Run("NewGetRequest: GET /api should set expected properties", func(t *testing.T) {
req := s.NewGetRequest("/api")
verifyRequest(t, s, req, "")
})
t.Run("NewPostRequest: POST api should set expected properties", func(t *testing.T) {
payload := strings.NewReader("test")
req := s.NewPostRequest("api", payload)
verifyRequest(t, s, req, "test")
t.Run("SendJSON should set expected Content-Type header", func(t *testing.T) {
payload.Reset("test")
resp, err := s.SendJSON(req)
require.NoError(t, err)
require.NotNil(t, resp)
require.NoError(t, resp.Body.Close())
require.NotNil(t, actualRequest)
require.Equal(t, "application/json", actualRequest.Header.Get("Content-Type"))
})
})
}
func verifyRequest(t *testing.T, s *Server, req *http.Request, expectedBody string) {
require.NotNil(t, req)
require.Equal(t, s.TestServer.URL+"/api", req.URL.String())
if expectedBody == "" {
require.Equal(t, http.MethodGet, req.Method)
require.Equal(t, http.NoBody, req.Body)
} else {
require.Equal(t, http.MethodPost, req.Method)
require.NotNil(t, req.Body)
bytes, err := io.ReadAll(req.Body)
require.NoError(t, err)
require.Equal(t, expectedBody, string(bytes))
}
require.NotEmpty(t, requestIdentifierFromRequest(req))
req = RequestWithWebContext(req, &models.ReqContext{
IsSignedIn: true,
})
require.NotNil(t, req)
ctx := requestContextFromRequest(req)
require.NotNil(t, ctx)
require.True(t, ctx.IsSignedIn)
}
func TestServerClient(t *testing.T) {
routeRegister := routing.NewRouteRegister()
routeRegister.Get("/test", routing.Wrap(func(c *models.ReqContext) response.Response {
return response.JSON(http.StatusOK, c.SignedInUser)
}))
s := NewServer(t, routeRegister)
t.Run("Making a request with user 1 should return user 1 as signed in user", func(t *testing.T) {
req := s.NewRequest(http.MethodGet, "/test", nil)
req = RequestWithWebContext(req, &models.ReqContext{
SignedInUser: &user.SignedInUser{
UserID: 1,
},
})
resp, err := s.Send(req)
require.NoError(t, err)
require.NotNil(t, resp)
require.Equal(t, http.StatusOK, resp.StatusCode)
bytes, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
var user user.SignedInUser
err = json.Unmarshal(bytes, &user)
require.NoError(t, err)
require.NotNil(t, user)
require.Equal(t, int64(1), user.UserID)
})
t.Run("Making a request with user 2 should return user 2 as signed in user", func(t *testing.T) {
req := s.NewRequest(http.MethodGet, "/test", nil)
req = RequestWithWebContext(req, &models.ReqContext{
SignedInUser: &user.SignedInUser{
UserID: 2,
},
})
resp, err := s.Send(req)
require.NoError(t, err)
require.NotNil(t, resp)
require.Equal(t, http.StatusOK, resp.StatusCode)
bytes, err := io.ReadAll(resp.Body)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
var user user.SignedInUser
err = json.Unmarshal(bytes, &user)
require.NoError(t, err)
require.NotNil(t, user)
require.Equal(t, int64(2), user.UserID)
})
}