package db import ( "context" "testing" "time" "github.com/FernandoJVideira/api_tmpl/internal/security" "github.com/FernandoJVideira/api_tmpl/pkg/testutil" "github.com/jackc/pgx/v5/pgtype" "github.com/stretchr/testify/require" ) func createRandomUser(t *testing.T) User { hashedPassword, err := security.HashPassword(testutil.RandomString(6)) require.NoError(t, err) // Create the user arg := CreateUserParams{ Username: testutil.RandomOwner(), HashedPassword: hashedPassword, FullName: testutil.RandomOwner(), Email: testutil.RandomEmail(), } user, err := testStore.CreateUser(context.Background(), arg) require.NoError(t, err) // -> Err should be nil require.NotEmpty(t, user) require.Equal(t, arg.Username, user.Username) require.Equal(t, arg.HashedPassword, user.HashedPassword) require.Equal(t, arg.FullName, user.FullName) require.Equal(t, arg.Email, user.Email) require.True(t, user.PasswordChangedAt.IsZero()) require.NotZero(t, user.CreatedAt) return user } func TestCreateUser(t *testing.T) { createRandomUser(t) } func TestGetUser(t *testing.T) { user1 := createRandomUser(t) user2, err := testStore.GetUser(context.Background(), user1.Username) require.NoError(t, err) require.NotEmpty(t, user2) require.Equal(t, user1.Username, user2.Username) require.Equal(t, user1.HashedPassword, user2.HashedPassword) require.Equal(t, user1.FullName, user2.FullName) require.Equal(t, user1.Email, user2.Email) require.WithinDuration(t, user1.CreatedAt, user2.CreatedAt, time.Second) } func TestUpdateUserOnlyFullName(t *testing.T) { oldUser := createRandomUser(t) newFullName := testutil.RandomOwner() updatedUser, err := testStore.UpdateUser(context.Background(), UpdateUserParams{ Username: oldUser.Username, FullName: pgtype.Text{ String: newFullName, Valid: true, }, }) require.NoError(t, err) require.NotEqual(t, oldUser.FullName, updatedUser.FullName) require.Equal(t, newFullName, updatedUser.FullName) require.Equal(t, oldUser.HashedPassword, updatedUser.HashedPassword) require.Equal(t, oldUser.Email, updatedUser.Email) } func TestUpdateUserOnlyEmail(t *testing.T) { oldUser := createRandomUser(t) newEmail := testutil.RandomEmail() updatedUser, err := testStore.UpdateUser(context.Background(), UpdateUserParams{ Username: oldUser.Username, Email: pgtype.Text{ String: newEmail, Valid: true, }, }) require.NoError(t, err) require.NotEqual(t, oldUser.Email, updatedUser.Email) require.Equal(t, newEmail, updatedUser.Email) require.Equal(t, oldUser.HashedPassword, updatedUser.HashedPassword) require.Equal(t, oldUser.FullName, updatedUser.FullName) } func TestUpdateUserOnlyPassword(t *testing.T) { oldUser := createRandomUser(t) newPassword, err := security.HashPassword(testutil.RandomString(6)) require.NoError(t, err) updatedUser, err := testStore.UpdateUser(context.Background(), UpdateUserParams{ Username: oldUser.Username, HashedPassword: pgtype.Text{ String: newPassword, Valid: true, }, }) require.NoError(t, err) require.NotEqual(t, oldUser.HashedPassword, updatedUser.HashedPassword) require.Equal(t, newPassword, updatedUser.HashedPassword) require.Equal(t, oldUser.FullName, updatedUser.FullName) require.Equal(t, oldUser.Email, updatedUser.Email) } func TestUpdateUserAllFields(t *testing.T) { oldUser := createRandomUser(t) newFullName := testutil.RandomOwner() newEmail := testutil.RandomEmail() newPassword, err := security.HashPassword(testutil.RandomString(6)) require.NoError(t, err) updatedUser, err := testStore.UpdateUser(context.Background(), UpdateUserParams{ Username: oldUser.Username, FullName: pgtype.Text{ String: newFullName, Valid: true, }, Email: pgtype.Text{ String: newEmail, Valid: true, }, HashedPassword: pgtype.Text{ String: newPassword, Valid: true, }, }) require.NoError(t, err) require.NotEqual(t, oldUser.FullName, updatedUser.FullName) require.Equal(t, newFullName, updatedUser.FullName) require.NotEqual(t, oldUser.HashedPassword, updatedUser.HashedPassword) require.Equal(t, newPassword, updatedUser.HashedPassword) require.NotEqual(t, oldUser.Email, updatedUser.Email) require.Equal(t, newEmail, updatedUser.Email) }