Files
junhong_cmp_fiber/tests/unit/account_model_test.go
huang b68e7ec013
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 15s
优化测试数据库连接管理
- 创建全局单例连接池,性能提升 6-7 倍
- 实现 NewTestTransaction/GetTestRedis/CleanTestRedisKeys
- 移除旧的 SetupTestDB/TeardownTestDB API
- 迁移所有测试文件到新方案(47 个文件)
- 添加测试连接管理规范文档
- 更新 AGENTS.md 和 README.md

性能对比:
- 旧方案:~71 秒(204 测试)
- 新方案:~10.5 秒(首次初始化 + 后续复用)
- 内存占用降低约 80%
- 网络连接数从 204 降至 1
2026-01-22 14:38:43 +08:00

278 lines
7.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package unit
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/internal/store/postgres"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/tests/testutils"
)
// TestAccountModel_Create 测试创建账号
func TestAccountModel_Create(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
t.Run("创建 root 账号", func(t *testing.T) {
account := &model.Account{
Username: "root_user",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypeSuperAdmin,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
assert.NotZero(t, account.ID)
assert.NotZero(t, account.CreatedAt)
assert.NotZero(t, account.UpdatedAt)
})
// 注意parent_id 字段已被移除,层级关系通过 shop_id 和 enterprise_id 维护
t.Run("创建带 shop_id 的账号", func(t *testing.T) {
shopID := uint(100)
account := &model.Account{
Username: "shop_user",
Phone: "13800000004",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
ShopID: &shopID,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
assert.NotNil(t, account.ShopID)
assert.Equal(t, uint(100), *account.ShopID)
})
}
// TestAccountModel_GetByID 测试根据 ID 查询账号
func TestAccountModel_GetByID(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建测试账号
account := &model.Account{
Username: "test_user",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
t.Run("查询存在的账号", func(t *testing.T) {
found, err := store.GetByID(ctx, account.ID)
require.NoError(t, err)
assert.Equal(t, account.Username, found.Username)
assert.Equal(t, account.Phone, found.Phone)
assert.Equal(t, account.UserType, found.UserType)
})
t.Run("查询不存在的账号", func(t *testing.T) {
_, err := store.GetByID(ctx, 99999)
assert.Error(t, err)
})
}
// TestAccountModel_GetByUsername 测试根据用户名查询账号
func TestAccountModel_GetByUsername(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建测试账号
account := &model.Account{
Username: "unique_user",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
t.Run("根据用户名查询", func(t *testing.T) {
found, err := store.GetByUsername(ctx, "unique_user")
require.NoError(t, err)
assert.Equal(t, account.ID, found.ID)
})
t.Run("查询不存在的用户名", func(t *testing.T) {
_, err := store.GetByUsername(ctx, "nonexistent")
assert.Error(t, err)
})
}
// TestAccountModel_GetByPhone 测试根据手机号查询账号
func TestAccountModel_GetByPhone(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建测试账号
account := &model.Account{
Username: "phone_user",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
t.Run("根据手机号查询", func(t *testing.T) {
found, err := store.GetByPhone(ctx, "13800000001")
require.NoError(t, err)
assert.Equal(t, account.ID, found.ID)
})
t.Run("查询不存在的手机号", func(t *testing.T) {
_, err := store.GetByPhone(ctx, "99900000000")
assert.Error(t, err)
})
}
// TestAccountModel_Update 测试更新账号
func TestAccountModel_Update(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建测试账号
account := &model.Account{
Username: "update_user",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
t.Run("更新账号状态", func(t *testing.T) {
account.Status = constants.StatusDisabled
account.Updater = 2
err := store.Update(ctx, account)
require.NoError(t, err)
// 验证更新
found, err := store.GetByID(ctx, account.ID)
require.NoError(t, err)
assert.Equal(t, constants.StatusDisabled, found.Status)
assert.Equal(t, uint(2), found.Updater)
})
}
// TestAccountModel_List 测试查询账号列表
func TestAccountModel_List(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建多个测试账号
for i := 1; i <= 5; i++ {
account := &model.Account{
Username: testutils.GenerateUsername("list_user", i),
Phone: testutils.GeneratePhone("138", i),
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
}
t.Run("分页查询", func(t *testing.T) {
accounts, total, err := store.List(ctx, nil, nil)
require.NoError(t, err)
assert.GreaterOrEqual(t, len(accounts), 5)
assert.GreaterOrEqual(t, total, int64(5))
})
t.Run("带过滤条件查询", func(t *testing.T) {
filters := map[string]interface{}{
"user_type": constants.UserTypePlatform,
}
accounts, _, err := store.List(ctx, nil, filters)
require.NoError(t, err)
for _, acc := range accounts {
assert.Equal(t, constants.UserTypePlatform, acc.UserType)
}
})
}
// TestAccountModel_UniqueConstraints 测试唯一约束
func TestAccountModel_UniqueConstraints(t *testing.T) {
tx := testutils.NewTestTransaction(t)
rdb := testutils.GetTestRedis(t)
testutils.CleanTestRedisKeys(t, rdb)
store := postgres.NewAccountStore(tx, rdb)
ctx := context.Background()
// 创建测试账号
account := &model.Account{
Username: "unique_test",
Phone: "13800000001",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, account)
require.NoError(t, err)
t.Run("重复用户名应失败", func(t *testing.T) {
duplicate := &model.Account{
Username: "unique_test", // 重复
Phone: "13800000002",
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, duplicate)
assert.Error(t, err)
})
t.Run("重复手机号应失败", func(t *testing.T) {
duplicate := &model.Account{
Username: "unique_test2",
Phone: "13800000001", // 重复
Password: "hashed_password",
UserType: constants.UserTypePlatform,
Status: constants.StatusEnabled,
}
err := store.Create(ctx, duplicate)
assert.Error(t, err)
})
}