Files
api_tmpl/internal/db/sqlc/user_test.go
FernandoJVideira c4ee0ce4dc chore: rename simple_bank to api_tmpl and clean up for template use
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
2026-08-25 03:02:37 +01:00

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)
}