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 }