97 lines
2.8 KiB
Go
97 lines
2.8 KiB
Go
package usecase_test
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/lestrrat-go/jwx/jwt"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
configrepo "source.toby3d.me/website/indieauth/internal/config/repository/viper"
|
|
configucase "source.toby3d.me/website/indieauth/internal/config/usecase"
|
|
"source.toby3d.me/website/indieauth/internal/domain"
|
|
"source.toby3d.me/website/indieauth/internal/token"
|
|
repository "source.toby3d.me/website/indieauth/internal/token/repository/memory"
|
|
ucase "source.toby3d.me/website/indieauth/internal/token/usecase"
|
|
)
|
|
|
|
func TestGenerate(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
configer := configucase.NewConfigUseCase(configrepo.NewViperConfigRepository(domain.TestConfig(t)))
|
|
options := token.GenerateOptions{
|
|
ClientID: "https://app.example.com/",
|
|
Me: "https://user.example.net/",
|
|
Scopes: []string{"create", "update", "delete"},
|
|
NonceLength: 42,
|
|
}
|
|
|
|
result, err := ucase.NewTokenUseCase(ucase.Config{
|
|
Configer: configer,
|
|
Tokens: nil,
|
|
}).Generate(context.TODO(), options)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, options.ClientID, result.ClientID)
|
|
assert.Equal(t, options.Me, result.Me)
|
|
assert.Equal(t, options.Scopes, result.Scopes)
|
|
|
|
token, err := jwt.ParseString(result.AccessToken)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, options.Me, token.Subject())
|
|
assert.Equal(t, options.ClientID, token.Issuer())
|
|
|
|
scope, ok := token.Get("scope")
|
|
require.True(t, ok)
|
|
assert.Equal(t, strings.Join(options.Scopes, " "), scope)
|
|
}
|
|
|
|
func TestVerify(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
repo := repository.NewMemoryTokenRepository(new(sync.Map))
|
|
useCase := ucase.NewTokenUseCase(repo, configucase.NewConfigUseCase(configrepo.NewViperConfigRepository(v)))
|
|
|
|
t.Run("valid", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
accessToken := domain.TestToken(t)
|
|
|
|
result, err := useCase.Verify(context.TODO(), accessToken.AccessToken)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, accessToken, result)
|
|
})
|
|
|
|
t.Run("revoke", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
accessToken := domain.TestToken(t)
|
|
require.NoError(t, repo.Create(context.TODO(), accessToken))
|
|
|
|
result, err := useCase.Verify(context.TODO(), accessToken.AccessToken)
|
|
require.ErrorIs(t, err, token.ErrRevoke)
|
|
assert.Nil(t, result)
|
|
})
|
|
}
|
|
|
|
func TestRevoke(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
v := viper.New()
|
|
v.Set("indieauth.jwtSigningAlgorithm", "HS256")
|
|
v.Set("indieauth.jwtSecret", "hackme")
|
|
|
|
repo := repository.NewMemoryTokenRepository(new(sync.Map))
|
|
accessToken := domain.TestToken(t)
|
|
|
|
require.NoError(t, ucase.NewTokenUseCase(
|
|
repo, configucase.NewConfigUseCase(configrepo.NewViperConfigRepository(v)),
|
|
).Revoke(context.TODO(), accessToken.AccessToken))
|
|
|
|
result, err := repo.Get(context.TODO(), accessToken.AccessToken)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, accessToken.AccessToken, result.AccessToken)
|
|
}
|