Files
junhong_cmp_fiber/tests/integration/role_permission_test.go
huang 23eb0307bb
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m30s
feat: 实现门店套餐分配功能并统一测试基础设施
新增功能:
- 门店套餐分配管理(shop_package_allocation):支持门店套餐库存管理
- 门店套餐系列分配管理(shop_series_allocation):支持套餐系列分配和佣金层级设置
- 我的套餐查询(my_package):支持门店查询自己的套餐分配情况

测试改进:
- 统一集成测试基础设施,新增 testutils.NewIntegrationTestEnv
- 重构所有集成测试使用新的测试环境设置
- 移除旧的测试辅助函数和冗余测试文件
- 新增 test_helpers_test.go 统一任务测试辅助

技术细节:
- 新增数据库迁移 000025_create_shop_allocation_tables
- 新增 3 个 Handler、Service、Store 和对应的单元测试
- 更新 OpenAPI 文档和文档生成器
- 测试覆盖率:Service 层 > 90%

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-28 10:45:16 +08:00

185 lines
5.3 KiB
Go

package integration
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/break/junhong_cmp_fiber/internal/model"
roleService "github.com/break/junhong_cmp_fiber/internal/service/role"
postgresStore "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/integ"
)
// TestRolePermissionAssociation_AssignPermissions 测试角色权限分配功能
func TestRolePermissionAssociation_AssignPermissions(t *testing.T) {
env := integ.NewIntegrationTestEnv(t)
env.TX.AutoMigrate(
&model.Role{},
&model.Permission{},
&model.RolePermission{},
)
roleStore := postgresStore.NewRoleStore(env.TX)
permStore := postgresStore.NewPermissionStore(env.TX)
rolePermStore := postgresStore.NewRolePermissionStore(env.TX, env.Redis)
roleSvc := roleService.New(roleStore, permStore, rolePermStore)
// 创建测试用户上下文
userCtx := env.GetSuperAdminContext()
t.Run("成功分配单个权限", func(t *testing.T) {
// 创建测试角色
role := &model.Role{
RoleName: "单权限测试角色",
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.TX.Create(role)
// 创建测试权限
perm := &model.Permission{
PermName: "单权限测试",
PermCode: "single:perm:test",
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.TX.Create(perm)
// 分配权限
rps, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
assert.Len(t, rps, 1)
assert.Equal(t, role.ID, rps[0].RoleID)
assert.Equal(t, perm.ID, rps[0].PermID)
})
t.Run("成功分配多个权限", func(t *testing.T) {
// 创建测试角色
role := &model.Role{
RoleName: "多权限测试角色",
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.TX.Create(role)
// 创建多个测试权限
permIDs := make([]uint, 3)
for i := 0; i < 3; i++ {
perm := &model.Permission{
PermName: "多权限测试_" + string(rune('A'+i)),
PermCode: "multi:perm:test:" + string(rune('a'+i)),
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.TX.Create(perm)
permIDs[i] = perm.ID
}
// 分配权限
rps, err := roleSvc.AssignPermissions(userCtx, role.ID, permIDs)
require.NoError(t, err)
assert.Len(t, rps, 3)
})
t.Run("获取角色的权限列表", func(t *testing.T) {
// 创建测试角色
role := &model.Role{
RoleName: "获取权限列表测试角色",
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.TX.Create(role)
// 创建并分配权限
perm := &model.Permission{
PermName: "获取权限列表测试",
PermCode: "get:perm:list:test",
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.TX.Create(perm)
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
// 获取权限列表
perms, err := roleSvc.GetPermissions(userCtx, role.ID)
require.NoError(t, err)
assert.Len(t, perms, 1)
assert.Equal(t, perm.ID, perms[0].ID)
})
t.Run("移除角色的权限", func(t *testing.T) {
// 创建测试角色
role := &model.Role{
RoleName: "移除权限测试角色",
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.TX.Create(role)
// 创建并分配权限
perm := &model.Permission{
PermName: "移除权限测试",
PermCode: "remove:perm:test",
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.TX.Create(perm)
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
// 移除权限
err = roleSvc.RemovePermission(userCtx, role.ID, perm.ID)
require.NoError(t, err)
// 验证权限已被软删除
var rp model.RolePermission
err = env.RawDB().Unscoped().Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rp).Error
require.NoError(t, err)
assert.NotNil(t, rp.DeletedAt)
})
t.Run("重复分配权限不会创建重复记录", func(t *testing.T) {
// 创建测试角色
role := &model.Role{
RoleName: "重复权限测试角色",
RoleType: constants.RoleTypePlatform,
Status: constants.StatusEnabled,
}
env.TX.Create(role)
// 创建测试权限
perm := &model.Permission{
PermName: "重复权限测试",
PermCode: "duplicate:perm:test",
PermType: constants.PermissionTypeMenu,
Status: constants.StatusEnabled,
}
env.TX.Create(perm)
// 第一次分配
_, err := roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
// 第二次分配相同权限
_, err = roleSvc.AssignPermissions(userCtx, role.ID, []uint{perm.ID})
require.NoError(t, err)
// 验证只有一条记录
var count int64
env.RawDB().Model(&model.RolePermission{}).Where("role_id = ?", role.ID).Count(&count)
assert.Equal(t, int64(1), count, "关联记录应该仍然存在,因为没有外键约束")
// 验证可以独立查询关联记录
var rpRecord model.RolePermission
err = env.RawDB().Where("role_id = ? AND perm_id = ?", role.ID, perm.ID).First(&rpRecord).Error
assert.NoError(t, err, "应该能查询到关联记录")
})
}