151 lines
3.8 KiB
Go
151 lines
3.8 KiB
Go
package usecase_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"source.toby3d.me/toby3d/auth/internal/domain"
|
|
"source.toby3d.me/toby3d/auth/internal/profile"
|
|
profilerepo "source.toby3d.me/toby3d/auth/internal/profile/repository/memory"
|
|
"source.toby3d.me/toby3d/auth/internal/session"
|
|
sessionrepo "source.toby3d.me/toby3d/auth/internal/session/repository/memory"
|
|
"source.toby3d.me/toby3d/auth/internal/token"
|
|
tokenrepo "source.toby3d.me/toby3d/auth/internal/token/repository/memory"
|
|
usecase "source.toby3d.me/toby3d/auth/internal/token/usecase"
|
|
)
|
|
|
|
type Dependencies struct {
|
|
config *domain.Config
|
|
profile *domain.Profile
|
|
profiles profile.Repository
|
|
session *domain.Session
|
|
sessions session.Repository
|
|
token *domain.Token
|
|
tokens token.Repository
|
|
}
|
|
|
|
func TestExchange(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
deps := NewDependencies(t)
|
|
|
|
if err := deps.profiles.Create(context.Background(), deps.session.Me, *deps.profile); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := deps.sessions.Create(context.Background(), *deps.session); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
opts := token.ExchangeOptions{
|
|
ClientID: deps.session.ClientID,
|
|
Code: deps.session.Code,
|
|
CodeVerifier: deps.session.CodeChallenge,
|
|
RedirectURI: deps.session.RedirectURI,
|
|
}
|
|
|
|
tkn, userInfo, err := usecase.NewTokenUseCase(usecase.Config{
|
|
Config: deps.config,
|
|
Profiles: deps.profiles,
|
|
Sessions: deps.sessions,
|
|
Tokens: deps.tokens,
|
|
}).Exchange(context.Background(), opts)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if tkn == nil {
|
|
t.Errorf("Exchange(ctx, %v) = nil, want not nil", opts)
|
|
}
|
|
|
|
if userInfo == nil {
|
|
t.Errorf("Exchange(ctx, %v) = nil, want not nil", opts)
|
|
}
|
|
}
|
|
|
|
func TestVerify(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
deps := NewDependencies(t)
|
|
ucase := usecase.NewTokenUseCase(usecase.Config{
|
|
Config: deps.config,
|
|
Profiles: deps.profiles,
|
|
Sessions: deps.sessions,
|
|
Tokens: deps.tokens,
|
|
})
|
|
|
|
t.Run("valid", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testToken := domain.TestToken(t)
|
|
result, _, err := ucase.Verify(context.Background(), testToken.AccessToken)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if testToken.AccessToken != result.AccessToken ||
|
|
testToken.Scope.String() != result.Scope.String() ||
|
|
testToken.ClientID.String() != result.ClientID.String() ||
|
|
testToken.Me.String() != result.Me.String() {
|
|
t.Errorf("Verify(%s) = %v, want %v", testToken.AccessToken, result, testToken)
|
|
}
|
|
})
|
|
|
|
t.Run("revoked", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testToken := domain.TestToken(t)
|
|
if err := deps.tokens.Create(context.Background(), *testToken); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
result, _, err := ucase.Verify(context.Background(), testToken.AccessToken)
|
|
if err == nil {
|
|
t.Errorf("Verify(%s) = %v, want error", testToken.AccessToken, err)
|
|
}
|
|
|
|
if result != nil {
|
|
t.Errorf("Verify(%s) = %v, want nil", testToken.AccessToken, result)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestRevoke(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
deps := NewDependencies(t)
|
|
if err := usecase.NewTokenUseCase(usecase.Config{
|
|
Config: deps.config,
|
|
Profiles: deps.profiles,
|
|
Sessions: deps.sessions,
|
|
Tokens: deps.tokens,
|
|
}).Revoke(context.Background(), deps.token.AccessToken); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
result, err := deps.tokens.Get(context.Background(), deps.token.AccessToken)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if result.AccessToken != deps.token.AccessToken {
|
|
t.Errorf("Get(%s) = %s, want %s", deps.token.AccessToken, result.AccessToken, deps.token.AccessToken)
|
|
}
|
|
}
|
|
|
|
func NewDependencies(tb testing.TB) Dependencies {
|
|
tb.Helper()
|
|
|
|
config := domain.TestConfig(tb)
|
|
|
|
return Dependencies{
|
|
config: config,
|
|
profile: domain.TestProfile(tb),
|
|
profiles: profilerepo.NewMemoryProfileRepository(),
|
|
session: domain.TestSession(tb),
|
|
sessions: sessionrepo.NewMemorySessionRepository(*config),
|
|
token: domain.TestToken(tb),
|
|
tokens: tokenrepo.NewMemoryTokenRepository(),
|
|
}
|
|
}
|