147 lines
4.2 KiB
Go
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)
|
|
}
|