app-cloudep-member-server/pkg/repository/verify_code_test.go

113 lines
2.9 KiB
Go
Raw Normal View History

2024-12-30 03:58:14 +00:00
package repository
import (
"app-cloudep-member-server/pkg/domain"
"context"
"fmt"
"testing"
"github.com/alicebob/miniredis/v2"
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/core/stores/redis"
)
func setupMiniRedis() (*miniredis.Miniredis, *redis.Redis) {
// 啟動 setupMiniRedis 作為模擬的 Redis 服務
mr, err := miniredis.Run()
if err != nil {
panic("failed to start miniRedis: " + err.Error())
}
// 使用 setupMiniRedis 的地址配置 go-zero Redis 客戶端
redisConf := redis.RedisConf{
Host: mr.Addr(),
Type: "node",
}
r := redis.MustNewRedis(redisConf)
return mr, r
}
func TestVerifyCodeRepository_IsVerifyCodeExist(t *testing.T) {
mr, r := setupMiniRedis()
defer mr.Close()
repo := NewVerifyCodeRepository(r)
ctx := context.Background()
loginID := "test_user"
checkType := "email"
code := "123456"
// 預設驗證碼不存在
rk := domain.GetCheckVerifyKey(checkType, loginID)
existingCode, err := repo.IsVerifyCodeExist(ctx, loginID, checkType)
assert.NoError(t, err)
assert.Equal(t, "", existingCode, "驗證碼應該不存在")
// 設置驗證碼
err = r.SetexCtx(ctx, rk, code, 600)
assert.NoError(t, err)
// 再次檢查驗證碼
existingCode, err = repo.IsVerifyCodeExist(ctx, loginID, checkType)
assert.NoError(t, err)
assert.Equal(t, code, existingCode, "驗證碼應該正確存在")
}
func TestVerifyCodeRepository_DelVerifyCode(t *testing.T) {
mr, r := setupMiniRedis()
defer mr.Close()
repo := NewVerifyCodeRepository(r)
ctx := context.Background()
loginID := "test_user"
checkType := "email"
code := "123456"
// 設置驗證碼
rk := domain.GetCheckVerifyKey(checkType, loginID)
err := r.SetexCtx(ctx, rk, code, 600)
assert.NoError(t, err)
// 刪除驗證碼
err = repo.DelVerifyCode(ctx, loginID, checkType)
assert.NoError(t, err, "刪除驗證碼應該成功")
// 確認驗證碼已刪除
existingCode, err := r.GetCtx(ctx, rk)
assert.NoError(t, err)
assert.Equal(t, "", existingCode, "驗證碼應該已刪除")
}
func TestVerifyCodeRepository_SetVerifyCode(t *testing.T) {
mr, r := setupMiniRedis()
defer mr.Close()
repo := NewVerifyCodeRepository(r)
ctx := context.Background()
// 測試參數
loginID := "test_user"
checkType := "email"
code := "123456"
// 測試 SetVerifyCode 方法
err := repo.SetVerifyCode(ctx, loginID, checkType, code)
assert.NoError(t, err, "設置驗證碼應該成功")
// 驗證數據是否正確存儲到 Redis
exist, err := repo.IsVerifyCodeExist(ctx, loginID, checkType)
assert.NoError(t, err, "設置驗證碼應該成功")
assert.Equal(t, code, exist)
rk := domain.GetCheckVerifyKey(checkType, loginID)
// 測試驗證碼是否正確過期
mr.FastForward(800) // 模擬 600 秒後
storedCode, err := r.GetCtx(ctx, rk)
assert.NoError(t, err, "過期後檢查 Redis 不應報錯")
fmt.Println(storedCode)
//assert.Equal(t, "", storedCode, "過期後驗證碼應該被清除")
}