106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
|
package container
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"testing"
|
||
|
|
||
|
"goweb/ent/passwordtoken"
|
||
|
"goweb/ent/user"
|
||
|
|
||
|
"github.com/gorilla/sessions"
|
||
|
"github.com/labstack/echo-contrib/session"
|
||
|
"github.com/labstack/echo/v4"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/stretchr/testify/assert"
|
||
|
)
|
||
|
|
||
|
func TestAuth(t *testing.T) {
|
||
|
// Simulate an HTTP request through the session middleware to initiate the session
|
||
|
mw := session.Middleware(sessions.NewCookieStore([]byte("secret")))
|
||
|
handler := mw(echo.NotFoundHandler)
|
||
|
assert.Error(t, handler(ctx))
|
||
|
|
||
|
assertNoAuth := func() {
|
||
|
_, err := c.Auth.GetAuthenticatedUserID(ctx)
|
||
|
assert.True(t, errors.Is(err, NotAuthenticatedError{}))
|
||
|
_, err = c.Auth.GetAuthenticatedUser(ctx)
|
||
|
assert.True(t, errors.Is(err, NotAuthenticatedError{}))
|
||
|
}
|
||
|
|
||
|
assertNoAuth()
|
||
|
|
||
|
err := c.Auth.Login(ctx, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
uid, err := c.Auth.GetAuthenticatedUserID(ctx)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, usr.ID, uid)
|
||
|
|
||
|
u, err := c.Auth.GetAuthenticatedUser(ctx)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, u.ID, usr.ID)
|
||
|
|
||
|
err = c.Auth.Logout(ctx)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
assertNoAuth()
|
||
|
}
|
||
|
|
||
|
func TestPasswordHashing(t *testing.T) {
|
||
|
pw := "testcheckpassword"
|
||
|
hash, err := c.Auth.HashPassword(pw)
|
||
|
assert.NoError(t, err)
|
||
|
assert.NotEqual(t, hash, pw)
|
||
|
err = c.Auth.CheckPassword(pw, hash)
|
||
|
assert.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
func TestGeneratePasswordResetToken(t *testing.T) {
|
||
|
token, pt, err := c.Auth.GeneratePasswordResetToken(ctx, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
assert.Len(t, token, c.Config.App.PasswordToken.Length)
|
||
|
assert.NoError(t, c.Auth.CheckPassword(token, pt.Hash))
|
||
|
}
|
||
|
|
||
|
func TestGetValidPasswordToken(t *testing.T) {
|
||
|
_, err := c.Auth.GetValidPasswordToken(ctx, "faketoken", usr.ID)
|
||
|
assert.Error(t, err)
|
||
|
|
||
|
token, pt, err := c.Auth.GeneratePasswordResetToken(ctx, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
pt2, err := c.Auth.GetValidPasswordToken(ctx, token, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, pt.ID, pt2.ID)
|
||
|
}
|
||
|
|
||
|
func TestDeletePasswordTokens(t *testing.T) {
|
||
|
for i := 0; i < 3; i++ {
|
||
|
_, _, err := c.Auth.GeneratePasswordResetToken(ctx, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
err := c.Auth.DeletePasswordTokens(ctx, usr.ID)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
count, err := c.ORM.PasswordToken.
|
||
|
Query().
|
||
|
Where(passwordtoken.HasUserWith(user.ID(usr.ID))).
|
||
|
Count(context.Background())
|
||
|
|
||
|
require.NoError(t, err)
|
||
|
assert.Equal(t, 0, count)
|
||
|
}
|
||
|
|
||
|
func TestRandomToken(t *testing.T) {
|
||
|
length := 64
|
||
|
a, err := c.Auth.RandomToken(length)
|
||
|
require.NoError(t, err)
|
||
|
b, err := c.Auth.RandomToken(length)
|
||
|
require.NoError(t, err)
|
||
|
assert.Len(t, a, 64)
|
||
|
assert.Len(t, b, 64)
|
||
|
assert.NotEqual(t, a, b)
|
||
|
}
|