150 lines
3.7 KiB
Go
150 lines
3.7 KiB
Go
package service_test
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"testing"
|
|
|
|
"gitea.michaelthomson.dev/mthomson/habits/internal/auth"
|
|
"gitea.michaelthomson.dev/mthomson/habits/internal/test"
|
|
"gitea.michaelthomson.dev/mthomson/habits/internal/user/repository"
|
|
"gitea.michaelthomson.dev/mthomson/habits/internal/user/service"
|
|
"github.com/gofrs/uuid/v5"
|
|
)
|
|
|
|
func TestRegisterUser(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
logger := slog.Default()
|
|
tdb := test.NewTestDatabase(t)
|
|
defer tdb.TearDown()
|
|
r := repository.NewUserRepository(logger, tdb.Db)
|
|
argon2IdHash := auth.NewArgon2IdHash(1, 32, 64*1024, 32, 256)
|
|
|
|
userService := service.NewUserService(logger, r, argon2IdHash)
|
|
|
|
t.Run("Create user", func(t *testing.T) {
|
|
_, err := userService.Register(ctx, "test@test.com", "supersecurepassword")
|
|
|
|
AssertNoError(t, err)
|
|
})
|
|
}
|
|
|
|
func TestGetUser(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
logger := slog.Default()
|
|
tdb := test.NewTestDatabase(t)
|
|
defer tdb.TearDown()
|
|
r := repository.NewUserRepository(logger, tdb.Db)
|
|
argon2IdHash := auth.NewArgon2IdHash(1, 32, 64*1024, 32, 256)
|
|
|
|
userService := service.NewUserService(logger, r, argon2IdHash)
|
|
|
|
uuid, err := userService.Register(ctx, "test@test.com", "supersecurepassword")
|
|
AssertNoError(t, err)
|
|
|
|
t.Run("Get exisiting user", func(t *testing.T) {
|
|
_, err := userService.GetUser(ctx, uuid)
|
|
|
|
AssertNoError(t, err)
|
|
})
|
|
|
|
t.Run("Get non-existant user", func(t *testing.T) {
|
|
_, err := userService.GetUser(ctx, NewUUID(t))
|
|
|
|
AssertErrors(t, err, service.ErrNotFound)
|
|
})
|
|
}
|
|
|
|
func TestDeleteUser(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
logger := slog.Default()
|
|
tdb := test.NewTestDatabase(t)
|
|
defer tdb.TearDown()
|
|
r := repository.NewUserRepository(logger, tdb.Db)
|
|
argon2IdHash := auth.NewArgon2IdHash(1, 32, 64*1024, 32, 256)
|
|
|
|
userService := service.NewUserService(logger, r, argon2IdHash)
|
|
|
|
uuid, err := userService.Register(ctx, "test@test.com", "supersecurepassword")
|
|
AssertNoError(t, err)
|
|
|
|
t.Run("Delete exisiting user", func(t *testing.T) {
|
|
err := userService.DeleteUser(ctx, uuid)
|
|
|
|
AssertNoError(t, err)
|
|
})
|
|
|
|
t.Run("Delete non-existant user", func(t *testing.T) {
|
|
err := userService.DeleteUser(ctx, uuid)
|
|
|
|
AssertErrors(t, err, service.ErrNotFound)
|
|
})
|
|
}
|
|
|
|
func TestUpdateUserEmail(t *testing.T) {
|
|
t.Parallel()
|
|
ctx := context.Background()
|
|
logger := slog.Default()
|
|
tdb := test.NewTestDatabase(t)
|
|
defer tdb.TearDown()
|
|
r := repository.NewUserRepository(logger, tdb.Db)
|
|
argon2IdHash := auth.NewArgon2IdHash(1, 32, 64*1024, 32, 256)
|
|
|
|
userService := service.NewUserService(logger, r, argon2IdHash)
|
|
|
|
uuid, err := userService.Register(ctx, "test@test.com", "supersecurepassword")
|
|
AssertNoError(t, err)
|
|
|
|
t.Run("Update existing user email", func(t *testing.T) {
|
|
err := userService.UpdateUserEmail(ctx, uuid, "newemail@test.com")
|
|
|
|
AssertNoError(t, err)
|
|
|
|
newUser, err := userService.GetUser(ctx, uuid)
|
|
|
|
AssertNoError(t, err)
|
|
|
|
if newUser.Email != "newemail@test.com" {
|
|
t.Errorf("Emails do not match wanted %q, got %q", "newemail@test.com", newUser.Email)
|
|
}
|
|
})
|
|
|
|
t.Run("Update non-existant user", func(t *testing.T) {
|
|
err := userService.UpdateUserEmail(ctx, NewUUID(t), "newemail@test.com")
|
|
|
|
AssertErrors(t, err, service.ErrNotFound)
|
|
})
|
|
}
|
|
|
|
func AssertErrors(t testing.TB, got, want error) {
|
|
t.Helper()
|
|
if got != want {
|
|
t.Errorf("got error: %v, want error: %v", want, got)
|
|
}
|
|
}
|
|
|
|
func AssertNoError(t testing.TB, err error) {
|
|
t.Helper()
|
|
if err != nil {
|
|
t.Errorf("expected no error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func AssertUsers(t testing.TB, got, want service.User) {
|
|
if !got.Equal(want) {
|
|
t.Errorf("got %+v want %+v", got, want)
|
|
}
|
|
}
|
|
|
|
func NewUUID(t testing.TB) uuid.UUID {
|
|
t.Helper()
|
|
uuid, err := uuid.NewV4()
|
|
if err != nil {
|
|
t.Errorf("error generation uuid: %v", err)
|
|
}
|
|
return uuid
|
|
}
|