91 lines
2.9 KiB
Go
91 lines
2.9 KiB
Go
package http_test
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/fasthttp/router"
|
|
json "github.com/goccy/go-json"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
http "github.com/valyala/fasthttp"
|
|
|
|
"source.toby3d.me/website/indieauth/internal/common"
|
|
"source.toby3d.me/website/indieauth/internal/domain"
|
|
sessionrepo "source.toby3d.me/website/indieauth/internal/session/repository/memory"
|
|
"source.toby3d.me/website/indieauth/internal/testing/httptest"
|
|
delivery "source.toby3d.me/website/indieauth/internal/token/delivery/http"
|
|
tokenrepo "source.toby3d.me/website/indieauth/internal/token/repository/memory"
|
|
tokenucase "source.toby3d.me/website/indieauth/internal/token/usecase"
|
|
)
|
|
|
|
func TestVerification(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
store := new(sync.Map)
|
|
config := domain.TestConfig(t)
|
|
token := domain.TestToken(t)
|
|
|
|
r := router.New()
|
|
// TODO(toby3d): provide tickets
|
|
delivery.NewRequestHandler(tokenucase.NewTokenUseCase(tokenrepo.NewMemoryTokenRepository(store),
|
|
sessionrepo.NewMemorySessionRepository(config, store), config)).Register(r)
|
|
|
|
client, _, cleanup := httptest.New(t, r.Handler)
|
|
t.Cleanup(cleanup)
|
|
|
|
req := httptest.NewRequest(http.MethodGet, "https://app.example.com/token", nil)
|
|
defer http.ReleaseRequest(req)
|
|
req.Header.Set(http.HeaderAccept, common.MIMEApplicationJSON)
|
|
token.SetAuthHeader(req)
|
|
|
|
resp := http.AcquireResponse()
|
|
defer http.ReleaseResponse(resp)
|
|
|
|
require.NoError(t, client.Do(req, resp))
|
|
assert.Equal(t, http.StatusOK, resp.StatusCode())
|
|
|
|
result := new(delivery.VerificationResponse)
|
|
require.NoError(t, json.Unmarshal(resp.Body(), result))
|
|
assert.Equal(t, token.ClientID.String(), result.ClientID.String())
|
|
assert.Equal(t, token.Me.String(), result.Me.String())
|
|
assert.Equal(t, token.Scope.String(), result.Scope.String())
|
|
}
|
|
|
|
func TestRevocation(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
config := domain.TestConfig(t)
|
|
store := new(sync.Map)
|
|
tokens := tokenrepo.NewMemoryTokenRepository(store)
|
|
accessToken := domain.TestToken(t)
|
|
|
|
r := router.New()
|
|
delivery.NewRequestHandler(tokenucase.NewTokenUseCase(tokens, sessionrepo.NewMemorySessionRepository(config,
|
|
store), config)).Register(r)
|
|
|
|
client, _, cleanup := httptest.New(t, r.Handler)
|
|
t.Cleanup(cleanup)
|
|
|
|
req := httptest.NewRequest(http.MethodPost, "https://app.example.com/token", nil)
|
|
defer http.ReleaseRequest(req)
|
|
req.Header.Set(http.HeaderAccept, common.MIMEApplicationJSON)
|
|
req.Header.SetContentType(common.MIMEApplicationForm)
|
|
req.PostArgs().Set("action", domain.ActionRevoke.String())
|
|
req.PostArgs().Set("token", accessToken.AccessToken)
|
|
|
|
resp := http.AcquireResponse()
|
|
defer http.ReleaseResponse(resp)
|
|
|
|
require.NoError(t, client.Do(req, resp))
|
|
|
|
assert.Equal(t, http.StatusOK, resp.StatusCode())
|
|
assert.Equal(t, `{}`, strings.TrimSpace(string(resp.Body())))
|
|
|
|
result, err := tokens.Get(context.TODO(), accessToken.AccessToken)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, accessToken.AccessToken, result.AccessToken)
|
|
}
|