package role import ( "errors" "sync" "testing" "time" roleModel "perms-system-server/internal/model/role" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/testutil" "perms-system-server/internal/testutil/ctxhelper" "perms-system-server/internal/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TC-0084: 正常创建 func TestCreateRole_Normal(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() pc := testutil.UniqueId() logic := NewCreateRoleLogic(ctx, svcCtx) resp, err := logic.CreateRole(&types.CreateRoleReq{ ProductCode: pc, Name: testutil.UniqueId(), Remark: "test role", PermsLevel: 1, }) require.NoError(t, err) assert.Greater(t, resp.Id, int64(0)) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_role`", resp.Id) }) role, err := svcCtx.SysRoleModel.FindOne(ctx, resp.Id) require.NoError(t, err) assert.Equal(t, pc, role.ProductCode) assert.Equal(t, int64(1), role.Status) assert.Equal(t, int64(1), role.PermsLevel) } // TC-0085: 重复角色名 func TestCreateRole_DuplicateName(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() pc := testutil.UniqueId() name := testutil.UniqueId() now := time.Now().Unix() res, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{ ProductCode: pc, Name: name, Status: 1, PermsLevel: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) existingId, _ := res.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_role`", existingId) }) logic := NewCreateRoleLogic(ctx, svcCtx) resp, err := logic.CreateRole(&types.CreateRoleReq{ ProductCode: pc, Name: name, PermsLevel: 1, }) assert.Nil(t, resp) require.Error(t, err) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 409, ce.Code()) assert.Equal(t, "该产品下角色名已存在", ce.Error()) } // TC-0086: 并发同名创建 func TestCreateRole_ConcurrentSameName(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() pc := testutil.UniqueId() name := testutil.UniqueId() t.Cleanup(func() { testutil.CleanTableByField(ctx, conn, "`sys_role`", "productCode", pc) }) var wg sync.WaitGroup results := make(chan error, 2) for i := 0; i < 2; i++ { wg.Add(1) go func() { defer wg.Done() logic := NewCreateRoleLogic(ctx, svcCtx) _, err := logic.CreateRole(&types.CreateRoleReq{ ProductCode: pc, Name: name, PermsLevel: 1, }) results <- err }() } wg.Wait() close(results) var errs []error for err := range results { errs = append(errs, err) } require.Len(t, errs, 2) successCount := 0 failCount := 0 for _, err := range errs { if err == nil { successCount++ } else { failCount++ var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 409, codeErr.Code()) } } assert.Equal(t, 1, successCount) assert.Equal(t, 1, failCount) } // TC-0487: createRole非管理员拒绝 func TestCreateRole_MemberRejected(t *testing.T) { ctx := ctxhelper.MemberCtx("test_product") svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewCreateRoleLogic(ctx, svcCtx) _, err := logic.CreateRole(&types.CreateRoleReq{ProductCode: "test", Name: "test", PermsLevel: 1}) require.Error(t, err) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 403, ce.Code()) }