package auth import ( "testing" "time" "github.com/FernandoJVideira/simple_bank/internal/config" "github.com/FernandoJVideira/simple_bank/internal/domain/role" "github.com/FernandoJVideira/simple_bank/pkg/testutil" "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/require" ) func TestJWTMaker(t *testing.T) { config, err := config.LoadTestConfig("../../") require.NoError(t, err) maker, err := NewJWTMaker(config) require.NoError(t, err) username := testutil.RandomOwner() duration := time.Minute role := role.MemberRole issuedAt := time.Now() expiredAt := issuedAt.Add(duration) token, payload, err := maker.CreateToken(username, role, duration) require.NoError(t, err) require.NotEmpty(t, token) require.NotEmpty(t, payload) payload, err = maker.VerifyToken(token) require.NoError(t, err) require.NotEmpty(t, payload) require.NotZero(t, payload.ID) require.Equal(t, username, payload.Username) require.Equal(t, role, payload.Role) require.WithinDuration(t, issuedAt, payload.IssuedAt, time.Second) require.WithinDuration(t, expiredAt, payload.ExpiredAt, time.Second) } func TestExpiredJWTToken(t *testing.T) { config, err := config.LoadTestConfig("../../") require.NoError(t, err) maker, err := NewJWTMaker(config) require.NoError(t, err) username := testutil.RandomOwner() duration := -time.Minute token, payload, err := maker.CreateToken(username, role.MemberRole, duration) require.NoError(t, err) require.NotEmpty(t, token) require.NotEmpty(t, payload) payload, err = maker.VerifyToken(token) require.Error(t, err) require.EqualError(t, err, ErrExpiredToken.Error()) require.Nil(t, payload) } func TestInvalidJWTTokenAlgNone(t *testing.T) { config, err := config.LoadTestConfig("../../") require.NoError(t, err) payload, err := NewPayload(testutil.RandomOwner(), role.MemberRole, time.Minute) require.NoError(t, err) jwtToken := jwt.NewWithClaims(jwt.SigningMethodNone, NewJWTClaims(payload, config)) token, err := jwtToken.SignedString(jwt.UnsafeAllowNoneSignatureType) require.NoError(t, err) maker, err := NewJWTMaker(config) require.NoError(t, err) payload, err = maker.VerifyToken(token) require.Error(t, err) require.EqualError(t, err, ErrInvalidToken.Error()) require.Nil(t, payload) }