Rename the module, proto service, and all identifiers from simple_bank/ SimpleBank to api_tmpl/ApiTmpl, and regenerate the gRPC/gateway/swagger/ mock code accordingly. - Scrub real secrets (SMTP password, auth token secret) from api.env/ api_test.env, untrack them, and add api.env.example/api_test.env.example - Remove committed build artifacts (tmp/main, tmp/build-errors.log, dbml-error.log) and gitignore them going forward - Fix Dockerfile paths (build target, migrations copy) that referenced a stale project layout - Rewrite README to match the actual cmd/ + internal/ structure and add a "using this as a template" section
147 lines
4.2 KiB
Go
147 lines
4.2 KiB
Go
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)
|
|
}
|