adminLoginLogic_captcha_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package pub
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "testing"
  7. "time"
  8. "perms-system-server/internal/config"
  9. userModel "perms-system-server/internal/model/user"
  10. "perms-system-server/internal/response"
  11. "perms-system-server/internal/svc"
  12. "perms-system-server/internal/testutil"
  13. "perms-system-server/internal/types"
  14. "github.com/stretchr/testify/assert"
  15. "github.com/stretchr/testify/require"
  16. )
  17. func newAdminCaptchaDisabledSvcCtx() *svc.ServiceContext {
  18. cfg := testutil.GetTestConfig()
  19. cfg.Capjs = config.CapjsConf{Enable: 0}
  20. return svc.NewServiceContext(cfg)
  21. }
  22. func insertSuperAdmin(t *testing.T, ctx context.Context, svcCtx *svc.ServiceContext, username, password string) (int64, func()) {
  23. t.Helper()
  24. conn := testutil.GetTestSqlConn()
  25. now := time.Now().Unix()
  26. hashed := testutil.HashPassword(password)
  27. res, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{
  28. Username: username,
  29. Password: hashed,
  30. Nickname: username,
  31. Avatar: sql.NullString{},
  32. Email: username + "@test.com",
  33. Phone: "13800000000",
  34. Remark: "",
  35. DeptId: 0,
  36. IsSuperAdmin: 1,
  37. MustChangePassword: 2,
  38. Status: 1,
  39. CreateTime: now,
  40. UpdateTime: now,
  41. })
  42. require.NoError(t, err)
  43. id, _ := res.LastInsertId()
  44. cleanup := func() {
  45. testutil.CleanTable(ctx, conn, "`sys_user`", id)
  46. }
  47. return id, cleanup
  48. }
  49. // TC-1216: cap.js 未启用 + 验证码为空
  50. func TestAdminLogin_CaptchaDisabled_EmptyCaptcha(t *testing.T) {
  51. svcCtx := newAdminCaptchaDisabledSvcCtx()
  52. logic := NewAdminLoginLogic(context.Background(), svcCtx)
  53. resp, err := logic.AdminLogin(&types.AdminLoginReq{
  54. Username: "admin",
  55. Password: "pass",
  56. ManagementKey: "test-management-key",
  57. CaptchaId: "",
  58. CaptchaCode: "",
  59. })
  60. require.Nil(t, resp)
  61. require.Error(t, err)
  62. var codeErr *response.CodeError
  63. require.True(t, errors.As(err, &codeErr))
  64. assert.Equal(t, 400, codeErr.Code())
  65. assert.Contains(t, codeErr.Error(), "验证码不能为空")
  66. }
  67. // TC-1217: cap.js 未启用 + 验证码错误/过期
  68. func TestAdminLogin_CaptchaDisabled_WrongCaptcha(t *testing.T) {
  69. svcCtx := newAdminCaptchaDisabledSvcCtx()
  70. logic := NewAdminLoginLogic(context.Background(), svcCtx)
  71. resp, err := logic.AdminLogin(&types.AdminLoginReq{
  72. Username: "admin",
  73. Password: "pass",
  74. ManagementKey: "test-management-key",
  75. CaptchaId: "bad_id",
  76. CaptchaCode: "0000",
  77. })
  78. require.Nil(t, resp)
  79. require.Error(t, err)
  80. var codeErr *response.CodeError
  81. require.True(t, errors.As(err, &codeErr))
  82. assert.Equal(t, 400, codeErr.Code())
  83. assert.Contains(t, codeErr.Error(), "验证码错误或已过期")
  84. }
  85. // TC-1218: cap.js 未启用 + 验证码正确 → 超管正常登录
  86. func TestAdminLogin_CaptchaDisabled_CorrectCaptcha(t *testing.T) {
  87. ctx := context.Background()
  88. svcCtx := newAdminCaptchaDisabledSvcCtx()
  89. username := testutil.UniqueId()
  90. password := "SuperPass123"
  91. _, cleanUser := insertSuperAdmin(t, ctx, svcCtx, username, password)
  92. t.Cleanup(cleanUser)
  93. captchaId := "test_admin_captcha_" + testutil.UniqueId()
  94. captchaCode := "4321"
  95. defaultCaptchaStore.Set(captchaId, captchaCode)
  96. logic := NewAdminLoginLogic(ctx, svcCtx)
  97. resp, err := logic.AdminLogin(&types.AdminLoginReq{
  98. Username: username,
  99. Password: password,
  100. ManagementKey: "test-management-key",
  101. CaptchaId: captchaId,
  102. CaptchaCode: captchaCode,
  103. })
  104. require.NoError(t, err)
  105. require.NotNil(t, resp)
  106. assert.NotEmpty(t, resp.AccessToken)
  107. assert.NotEmpty(t, resp.RefreshToken)
  108. assert.Equal(t, int64(1), resp.UserInfo.IsSuperAdmin)
  109. }