mirror of https://github.com/grafana/grafana
Hackaton: Add more unit tests, take 3 (#101525)
* serviceaccounts/secretscan: test Service more thoroughly * middleware/cookies: add tests for CookieOptions * anonymous/anonimpl: cover a couple more methods * components/imguploader: Implement WebDAV integration tests * components/apikeygen: also check IsValid method * bus: cover invalid callback signature cases * cloudmigration/objectstorage: add basic unit tests * login/social/connectors: add test case for GitHub OAuth fetch emails+orgs * expr/classic: cover more evaluator types in testspull/101606/head^2
parent
dc2defd84f
commit
3539764008
@ -0,0 +1,37 @@ |
||||
package cookies |
||||
|
||||
import ( |
||||
"net/http" |
||||
"net/http/httptest" |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func TestCookieOptions(t *testing.T) { |
||||
rr := httptest.NewRecorder() |
||||
|
||||
expectedName := "cookie-name" |
||||
expectedValue := "cookie-value" |
||||
|
||||
WriteCookie(rr, expectedName, expectedValue, 100, nil) |
||||
|
||||
cookie, err := http.ParseSetCookie(rr.Header().Get("Set-Cookie")) |
||||
require.NoError(t, err) |
||||
require.NotNil(t, cookie) |
||||
|
||||
require.Equal(t, expectedName, cookie.Name) |
||||
require.Equal(t, expectedValue, cookie.Value) |
||||
require.GreaterOrEqual(t, cookie.MaxAge, 0) |
||||
|
||||
// Does not override but appends to the `Set-Cookie` header.
|
||||
DeleteCookie(rr, expectedName, nil) |
||||
|
||||
cookieHeader := rr.Header().Values("Set-Cookie") |
||||
require.Len(t, cookieHeader, 2) |
||||
|
||||
cookie, err = http.ParseSetCookie(cookieHeader[1]) |
||||
require.NoError(t, err) |
||||
require.NotNil(t, cookie) |
||||
require.NoError(t, cookie.Valid()) |
||||
} |
@ -0,0 +1,103 @@ |
||||
package objectstorage |
||||
|
||||
import ( |
||||
"bytes" |
||||
"context" |
||||
"io" |
||||
"math" |
||||
"mime/multipart" |
||||
"net/http" |
||||
"net/http/httptest" |
||||
"net/url" |
||||
"strings" |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/infra/tracing" |
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
func TestPresignedURLUpload(t *testing.T) { |
||||
t.Parallel() |
||||
|
||||
t.Run("successfully send data to the server", func(t *testing.T) { |
||||
t.Parallel() |
||||
|
||||
ctx := context.Background() |
||||
|
||||
key := "snapshot/uuid/key" |
||||
data := "sending-some-data" |
||||
|
||||
reader := bytes.NewBufferString(data) |
||||
|
||||
qs, err := url.ParseQuery("one=a&two=b") |
||||
require.NoError(t, err) |
||||
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
contentType := r.Header.Get("Content-Type") |
||||
_, boundary, found := strings.Cut(contentType, "boundary=") |
||||
require.True(t, found) |
||||
|
||||
mpr := multipart.NewReader(r.Body, boundary) |
||||
|
||||
form, err := mpr.ReadForm(math.MaxInt64) |
||||
require.NoError(t, err) |
||||
require.NotNil(t, form) |
||||
require.NotNil(t, form.Value) |
||||
|
||||
require.Equal(t, key, form.Value["key"][0]) |
||||
require.Equal(t, qs.Get("one"), form.Value["one"][0]) |
||||
require.Equal(t, qs.Get("two"), form.Value["two"][0]) |
||||
|
||||
require.Len(t, form.File, 1) |
||||
require.Len(t, form.File["file"], 1) |
||||
|
||||
fileHeader := form.File["file"][0] |
||||
require.Equal(t, "file", fileHeader.Filename) |
||||
|
||||
file, err := fileHeader.Open() |
||||
require.NoError(t, err) |
||||
|
||||
contents, err := io.ReadAll(file) |
||||
require.NoError(t, err) |
||||
require.EqualValues(t, data, string(contents)) |
||||
|
||||
require.NoError(t, file.Close()) |
||||
})) |
||||
t.Cleanup(server.Close) |
||||
|
||||
s3 := NewS3(http.DefaultClient, tracing.NewNoopTracerService()) |
||||
|
||||
presignedURL, err := url.Parse(server.URL + "?" + qs.Encode()) |
||||
require.NoError(t, err) |
||||
|
||||
err = s3.PresignedURLUpload(ctx, presignedURL.String(), key, reader) |
||||
require.NoError(t, err) |
||||
}) |
||||
|
||||
t.Run("when the request to the server returns an error, it is propagated", func(t *testing.T) { |
||||
t.Parallel() |
||||
|
||||
ctx := context.Background() |
||||
|
||||
key := "snapshot/uuid/key" |
||||
data := "sending-some-data" |
||||
|
||||
reader := bytes.NewBufferString(data) |
||||
|
||||
body := "test error" |
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
w.WriteHeader(http.StatusInternalServerError) |
||||
_, _ = w.Write([]byte(`{"message": "` + body + `}`)) |
||||
})) |
||||
t.Cleanup(server.Close) |
||||
|
||||
s3 := NewS3(http.DefaultClient, tracing.NewNoopTracerService()) |
||||
|
||||
presignedURL, err := url.Parse(server.URL) |
||||
require.NoError(t, err) |
||||
|
||||
err = s3.PresignedURLUpload(ctx, presignedURL.String(), key, reader) |
||||
require.Error(t, err) |
||||
require.Contains(t, err.Error(), body) |
||||
}) |
||||
} |
Loading…
Reference in new issue