113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
|
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, "過期後驗證碼應該被清除")
|
||
|
}
|