Files
api_tmpl/internal/db/sqlc/user_test.go
T
2026-01-08 01:15:07 +00:00

147 lines
4.2 KiB
Go

package db
import (
"context"
"testing"
"time"
"github.com/FernandoJVideira/simple_bank/internal/security"
"github.com/FernandoJVideira/simple_bank/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)
}