b2e8b1cfb3
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
122 lines
3.5 KiB
Go
122 lines
3.5 KiB
Go
package handler
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neofs-s3-gw/api/layer"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestParseContinuationToken(t *testing.T) {
|
|
var err error
|
|
|
|
t.Run("empty token", func(t *testing.T) {
|
|
var queryValues = map[string][]string{
|
|
"continuation-token": {""},
|
|
}
|
|
_, err = parseContinuationToken(queryValues)
|
|
require.Error(t, err)
|
|
})
|
|
|
|
t.Run("invalid not empty token", func(t *testing.T) {
|
|
var queryValues = map[string][]string{
|
|
"continuation-token": {"asd"},
|
|
}
|
|
_, err = parseContinuationToken(queryValues)
|
|
require.Error(t, err)
|
|
})
|
|
|
|
t.Run("valid token", func(t *testing.T) {
|
|
tokenStr := "75BTT5Z9o79XuKdUeGqvQbqDnxu6qWcR5EhxW8BXFf8t"
|
|
var queryValues = map[string][]string{
|
|
"continuation-token": {tokenStr},
|
|
}
|
|
token, err := parseContinuationToken(queryValues)
|
|
require.NoError(t, err)
|
|
require.Equal(t, tokenStr, token)
|
|
})
|
|
}
|
|
|
|
func TestListObjectNullVersions(t *testing.T) {
|
|
ctx := context.Background()
|
|
hc := prepareHandlerContext(t)
|
|
|
|
bktName := "bucket-versioning-enabled"
|
|
createTestBucket(ctx, t, hc, bktName)
|
|
|
|
objName := "object"
|
|
|
|
body := bytes.NewReader([]byte("content"))
|
|
w, r := prepareTestPayloadRequest(bktName, objName, body)
|
|
hc.Handler().PutObjectHandler(w, r)
|
|
assertStatus(t, w, http.StatusOK)
|
|
|
|
versioning := &VersioningConfiguration{Status: "Enabled"}
|
|
w, r = prepareTestRequest(t, bktName, objName, versioning)
|
|
hc.Handler().PutBucketVersioningHandler(w, r)
|
|
assertStatus(t, w, http.StatusOK)
|
|
|
|
body2 := bytes.NewReader([]byte("content2"))
|
|
w, r = prepareTestPayloadRequest(bktName, objName, body2)
|
|
hc.Handler().PutObjectHandler(w, r)
|
|
assertStatus(t, w, http.StatusOK)
|
|
|
|
w, r = prepareTestRequest(t, bktName, objName, nil)
|
|
hc.Handler().ListBucketObjectVersionsHandler(w, r)
|
|
|
|
result := &ListObjectsVersionsResponse{}
|
|
parseTestResponse(t, w, result)
|
|
|
|
require.Len(t, result.Version, 2)
|
|
require.Equal(t, layer.UnversionedObjectVersionID, result.Version[1].VersionID)
|
|
}
|
|
|
|
func TestS3CompatibilityBucketListV2BothContinuationTokenStartAfter(t *testing.T) {
|
|
tc := prepareHandlerContext(t)
|
|
|
|
bktName := "bucket-for-listing"
|
|
objects := []string{"bar", "baz", "foo", "quxx"}
|
|
bktInfo, _ := createBucketAndObject(t, tc, bktName, objects[0])
|
|
|
|
for _, objName := range objects[1:] {
|
|
createTestObject(tc.Context(), t, tc, bktInfo, objName)
|
|
}
|
|
|
|
listV2Response1 := listObjectsV2(t, tc, bktName, "bar", "", 1)
|
|
nextContinuationToken := listV2Response1.NextContinuationToken
|
|
require.Equal(t, "baz", listV2Response1.Contents[0].Key)
|
|
|
|
listV2Response2 := listObjectsV2(t, tc, bktName, "bar", nextContinuationToken, -1)
|
|
|
|
require.Equal(t, nextContinuationToken, listV2Response2.ContinuationToken)
|
|
require.Equal(t, "bar", listV2Response2.StartAfter)
|
|
require.False(t, listV2Response2.IsTruncated)
|
|
|
|
require.Equal(t, "foo", listV2Response2.Contents[0].Key)
|
|
require.Equal(t, "quxx", listV2Response2.Contents[1].Key)
|
|
}
|
|
|
|
func listObjectsV2(t *testing.T, tc *handlerContext, bktName, startAfter, continuationToken string, maxKeys int) *ListObjectsV2Response {
|
|
query := make(url.Values)
|
|
if len(startAfter) != 0 {
|
|
query.Add("start-after", startAfter)
|
|
}
|
|
if len(continuationToken) != 0 {
|
|
query.Add("continuation-token", continuationToken)
|
|
}
|
|
if maxKeys != -1 {
|
|
query.Add("max-keys", strconv.Itoa(maxKeys))
|
|
}
|
|
|
|
w, r := prepareTestFullRequest(t, bktName, "", query, nil)
|
|
tc.Handler().ListObjectsV2Handler(w, r)
|
|
assertStatus(t, w, http.StatusOK)
|
|
res := &ListObjectsV2Response{}
|
|
parseTestResponse(t, w, res)
|
|
return res
|
|
}
|