createRoleLogic_test.go 3.7 KB

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