auth/internal/token/delivery/http/token_http_test.go

102 lines
3.1 KiB
Go

package http_test
import (
"context"
"strings"
"sync"
"testing"
"github.com/brianvoe/gofakeit"
"github.com/goccy/go-json"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
http "github.com/valyala/fasthttp"
"source.toby3d.me/website/oauth/internal/common"
"source.toby3d.me/website/oauth/internal/model"
delivery "source.toby3d.me/website/oauth/internal/token/delivery/http"
repository "source.toby3d.me/website/oauth/internal/token/repository/memory"
"source.toby3d.me/website/oauth/internal/token/usecase"
"source.toby3d.me/website/oauth/internal/util"
)
func TestVerification(t *testing.T) {
t.Parallel()
require := require.New(t)
assert := assert.New(t)
store := new(sync.Map)
repo := repository.NewMemoryTokenRepository(store)
accessToken := model.Token{
AccessToken: gofakeit.Password(true, true, true, true, false, 32),
Type: "Bearer",
ClientID: "https://app.example.com/",
Me: "https://user.example.net/",
Scopes: []string{"create", "update", "delete"},
Profile: nil,
}
require.NoError(repo.Create(context.TODO(), &accessToken))
req := http.AcquireRequest()
defer http.ReleaseRequest(req)
req.Header.SetMethod(http.MethodGet)
req.SetRequestURI("http://localhost/token")
req.Header.Set(http.HeaderAccept, common.MIMEApplicationJSON)
req.Header.Set(http.HeaderAuthorization, "Bearer "+accessToken.AccessToken)
resp := http.AcquireResponse()
defer http.ReleaseResponse(resp)
require.NoError(util.Serve(delivery.NewRequestHandler(usecase.NewTokenUseCase(repo)).Read, req, resp))
assert.Equal(http.StatusOK, resp.StatusCode())
token := new(delivery.VerificationResponse)
require.NoError(json.Unmarshal(resp.Body(), token))
assert.Equal(&delivery.VerificationResponse{
Me: accessToken.Me,
ClientID: accessToken.ClientID,
Scope: strings.Join(accessToken.Scopes, " "),
}, token)
}
func TestRevocation(t *testing.T) {
t.Parallel()
require := require.New(t)
assert := assert.New(t)
store := new(sync.Map)
repo := repository.NewMemoryTokenRepository(store)
accessToken := gofakeit.Password(true, true, true, true, false, 32)
require.NoError(repo.Create(context.TODO(), &model.Token{
AccessToken: accessToken,
Type: "Bearer",
ClientID: "https://app.example.com/",
Me: "https://user.example.net/",
Scopes: []string{"create", "update", "delete"},
Profile: nil,
}))
req := http.AcquireRequest()
defer http.ReleaseRequest(req)
req.Header.SetMethod(http.MethodPost)
req.SetRequestURI("http://localhost/token")
req.Header.SetContentType(common.MIMEApplicationXWWWFormUrlencoded)
req.Header.Set(http.HeaderAccept, common.MIMEApplicationJSON)
req.PostArgs().Set("action", "revoke")
req.PostArgs().Set("token", accessToken)
resp := http.AcquireResponse()
defer http.ReleaseResponse(resp)
require.NoError(util.Serve(delivery.NewRequestHandler(usecase.NewTokenUseCase(repo)).Update, req, resp))
assert.Equal(http.StatusOK, resp.StatusCode())
assert.Equal(`{}`, strings.TrimSpace(string(resp.Body())))
token, err := repo.Get(context.TODO(), accessToken)
require.NoError(err)
assert.Nil(token)
}