storj/certificate/authorization/endpoint_test.go
Egon Elbre ff22fc7ddd all: fix deprecated ioutil commands
Change-Id: I59db35116ec7215a1b8e2ae7dbd319fa099adfac
2022-10-11 15:27:29 +00:00

140 lines
3.0 KiB
Go

// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package authorization
import (
"io"
"net"
"net/http"
"testing"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"
"storj.io/common/errs2"
"storj.io/common/testcontext"
)
func TestEndpoint_Run_httpSuccess(t *testing.T) {
ctx := testcontext.New(t)
defer ctx.Cleanup()
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
require.NotNil(t, listener)
log := zaptest.NewLogger(t)
authDB := newTestAuthDB(t, ctx)
defer ctx.Check(authDB.Close)
service := NewService(log, authDB)
endpoint := NewEndpoint(log, service, listener)
require.NotNil(t, endpoint)
ctx.Go(func() error {
return errs2.IgnoreCanceled(endpoint.Run(ctx))
})
defer ctx.Check(endpoint.Close)
userID := "user@mail.test"
url := "http://" + listener.Addr().String() + "/v1/authorizations/" + userID
req, err := http.NewRequestWithContext(ctx, http.MethodPut, url, nil)
require.NoError(t, err)
require.NotNil(t, req)
client := http.Client{}
res, err := client.Do(req)
require.NoError(t, err)
require.NotNil(t, res)
require.Equal(t, http.StatusCreated, res.StatusCode)
tokenBytes, err := io.ReadAll(res.Body)
require.NoError(t, err)
require.NotEmpty(t, tokenBytes)
require.NoError(t, res.Body.Close())
token, err := ParseToken(string(tokenBytes))
require.NoError(t, err)
require.NotNil(t, token)
require.Equal(t, userID, token.UserID)
}
func TestEndpoint_Run_httpErrors(t *testing.T) {
ctx := testcontext.New(t)
defer ctx.Cleanup()
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(t, err)
require.NotNil(t, listener)
log := zaptest.NewLogger(t)
authDB := newTestAuthDB(t, ctx)
defer ctx.Check(authDB.Close)
service := NewService(log, authDB)
endpoint := NewEndpoint(log, service, listener)
require.NotNil(t, endpoint)
ctx.Go(func() error {
return errs2.IgnoreCanceled(endpoint.Run(ctx))
})
defer ctx.Check(endpoint.Close)
baseURL := "http://" + listener.Addr().String()
testCases := []struct {
name string
userID string
urlPath string
httpMethod string
statusCode int
}{
{
"missing user ID",
"",
"/v1/authorizations/",
http.MethodPut,
http.StatusUnprocessableEntity,
},
{
"unsupported http method (GET)",
"user@mail.test",
"/v1/authorizations/",
http.MethodGet,
http.StatusMethodNotAllowed,
},
{
"unsupported http method (PUT)",
"user@mail.test",
"/v1/authorizations/",
http.MethodPost,
http.StatusMethodNotAllowed,
},
{
"not found",
"",
"/",
http.MethodPut,
http.StatusNotFound,
},
}
for _, testCase := range testCases {
t.Log(testCase.name)
url := baseURL + testCase.urlPath + testCase.userID
req, err := http.NewRequestWithContext(ctx, testCase.httpMethod, url, nil)
require.NoError(t, err)
client := http.Client{}
res, err := client.Do(req)
require.NoError(t, err)
require.NotNil(t, res)
require.NoError(t, res.Body.Close())
require.Equal(t, testCase.statusCode, res.StatusCode)
}
}