createRoleLogic_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package role
  2. import (
  3. "context"
  4. "errors"
  5. "sync"
  6. "testing"
  7. "time"
  8. productModel "perms-system-server/internal/model/product"
  9. roleModel "perms-system-server/internal/model/role"
  10. "perms-system-server/internal/response"
  11. "perms-system-server/internal/svc"
  12. "perms-system-server/internal/testutil"
  13. "perms-system-server/internal/testutil/ctxhelper"
  14. "perms-system-server/internal/types"
  15. "github.com/stretchr/testify/assert"
  16. "github.com/stretchr/testify/require"
  17. )
  18. func mustInsertEnabledProduct(t *testing.T, ctx context.Context, svcCtx *svc.ServiceContext, code string) int64 {
  19. t.Helper()
  20. now := time.Now().Unix()
  21. res, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{
  22. Code: code, Name: "test_prod_" + code, AppKey: code + "_k", AppSecret: "s",
  23. Status: 1, CreateTime: now, UpdateTime: now,
  24. })
  25. require.NoError(t, err)
  26. id, err := res.LastInsertId()
  27. require.NoError(t, err)
  28. return id
  29. }
  30. // TC-0117: 正常创建
  31. func TestCreateRole_Normal(t *testing.T) {
  32. ctx := ctxhelper.SuperAdminCtx()
  33. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  34. conn := testutil.GetTestSqlConn()
  35. pc := testutil.UniqueId()
  36. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  37. logic := NewCreateRoleLogic(ctx, svcCtx)
  38. resp, err := logic.CreateRole(&types.CreateRoleReq{
  39. ProductCode: pc,
  40. Name: testutil.UniqueId(),
  41. Remark: "test role",
  42. PermsLevel: 1,
  43. })
  44. require.NoError(t, err)
  45. assert.Greater(t, resp.Id, int64(0))
  46. t.Cleanup(func() {
  47. testutil.CleanTable(ctx, conn, "`sys_role`", resp.Id)
  48. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  49. })
  50. role, err := svcCtx.SysRoleModel.FindOne(ctx, resp.Id)
  51. require.NoError(t, err)
  52. assert.Equal(t, pc, role.ProductCode)
  53. assert.Equal(t, int64(1), role.Status)
  54. assert.Equal(t, int64(1), role.PermsLevel)
  55. }
  56. // TC-0118: 重复角色名
  57. func TestCreateRole_DuplicateName(t *testing.T) {
  58. ctx := ctxhelper.SuperAdminCtx()
  59. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  60. conn := testutil.GetTestSqlConn()
  61. pc := testutil.UniqueId()
  62. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  63. name := testutil.UniqueId()
  64. now := time.Now().Unix()
  65. res, err := svcCtx.SysRoleModel.Insert(ctx, &roleModel.SysRole{
  66. ProductCode: pc, Name: name, Status: 1, PermsLevel: 1,
  67. CreateTime: now, UpdateTime: now,
  68. })
  69. require.NoError(t, err)
  70. existingId, _ := res.LastInsertId()
  71. t.Cleanup(func() {
  72. testutil.CleanTable(ctx, conn, "`sys_role`", existingId)
  73. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  74. })
  75. logic := NewCreateRoleLogic(ctx, svcCtx)
  76. resp, err := logic.CreateRole(&types.CreateRoleReq{
  77. ProductCode: pc,
  78. Name: name,
  79. PermsLevel: 1,
  80. })
  81. assert.Nil(t, resp)
  82. require.Error(t, err)
  83. var ce *response.CodeError
  84. require.True(t, errors.As(err, &ce))
  85. assert.Equal(t, 409, ce.Code())
  86. assert.Equal(t, "该产品下角色名已存在", ce.Error())
  87. }
  88. // TC-0119: 并发同名创建
  89. func TestCreateRole_ConcurrentSameName(t *testing.T) {
  90. ctx := ctxhelper.SuperAdminCtx()
  91. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  92. conn := testutil.GetTestSqlConn()
  93. pc := testutil.UniqueId()
  94. pid := mustInsertEnabledProduct(t, ctx, svcCtx, pc)
  95. name := testutil.UniqueId()
  96. t.Cleanup(func() {
  97. testutil.CleanTableByField(ctx, conn, "`sys_role`", "productCode", pc)
  98. testutil.CleanTable(ctx, conn, "`sys_product`", pid)
  99. })
  100. var wg sync.WaitGroup
  101. results := make(chan error, 2)
  102. for i := 0; i < 2; i++ {
  103. wg.Add(1)
  104. go func() {
  105. defer wg.Done()
  106. logic := NewCreateRoleLogic(ctx, svcCtx)
  107. _, err := logic.CreateRole(&types.CreateRoleReq{
  108. ProductCode: pc,
  109. Name: name,
  110. PermsLevel: 1,
  111. })
  112. results <- err
  113. }()
  114. }
  115. wg.Wait()
  116. close(results)
  117. var errs []error
  118. for err := range results {
  119. errs = append(errs, err)
  120. }
  121. require.Len(t, errs, 2)
  122. successCount := 0
  123. failCount := 0
  124. for _, err := range errs {
  125. if err == nil {
  126. successCount++
  127. } else {
  128. failCount++
  129. var codeErr *response.CodeError
  130. require.True(t, errors.As(err, &codeErr))
  131. assert.Equal(t, 409, codeErr.Code())
  132. }
  133. }
  134. assert.Equal(t, 1, successCount)
  135. assert.Equal(t, 1, failCount)
  136. }
  137. // TC-0538: createRole非管理员拒绝
  138. func TestCreateRole_MemberRejected(t *testing.T) {
  139. ctx := ctxhelper.MemberCtx("test_product")
  140. svcCtx := svc.NewServiceContext(testutil.GetTestConfig())
  141. logic := NewCreateRoleLogic(ctx, svcCtx)
  142. _, err := logic.CreateRole(&types.CreateRoleReq{ProductCode: "test", Name: "test", PermsLevel: 1})
  143. require.Error(t, err)
  144. var ce *response.CodeError
  145. require.True(t, errors.As(err, &ce))
  146. assert.Equal(t, 403, ce.Code())
  147. }