ssgf_utils/sms_tool/sms_client_test.go
2025-06-18 17:37:21 +08:00

222 lines
5.4 KiB
Go

package sms_tool
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/redis/go-redis/v9"
"os"
"strconv"
"testing"
"time"
)
type RedisCacheAdapter struct {
client *redis.Client
}
func NewRedisCacheAdapter(addr string, password string, db int) *RedisCacheAdapter {
rdb := redis.NewClient(&redis.Options{
Addr: addr,
Password: password,
DB: db,
})
return &RedisCacheAdapter{client: rdb}
}
func (r *RedisCacheAdapter) Set(ctx context.Context, key string, value interface{}, expire time.Duration) error {
data, err := json.Marshal(value)
if err != nil {
return err
}
return r.client.Set(ctx, key, data, expire).Err()
}
func (r *RedisCacheAdapter) Get(ctx context.Context, key string) (interface{}, error) {
data, err := r.client.Get(ctx, key).Bytes()
if err != nil {
if errors.Is(err, redis.Nil) {
return nil, nil
}
return nil, err
}
var value interface{}
err = json.Unmarshal(data, &value)
if err != nil {
return nil, err
}
return value, nil
}
func (r *RedisCacheAdapter) Del(ctx context.Context, key string) error {
return r.client.Del(ctx, key).Err()
}
func (r *RedisCacheAdapter) SetNX(ctx context.Context, key string, value interface{}, expire time.Duration) (ok bool, err error) {
data, err := json.Marshal(value)
if err != nil {
return false, err
}
return r.client.SetNX(ctx, key, data, expire).Result()
}
var (
//SMS
accessKeyId = os.Getenv("SMS_ALIBABA_CLOUD_ACCESS_KEY_ID")
accessKeySecret = os.Getenv("SMS_ALIBABA_CLOUD_ACCESS_KEY_SECRET")
phoneNumbers = os.Getenv("SMS_PHONE_NUMBERS")
signName = os.Getenv("SMS_SIGN_NAME")
templateCode = os.Getenv("SMS_TEMPLATE_CODE")
//REDIS
redisHost = os.Getenv("REDIS_HOST")
redisPort = os.Getenv("REDIS_PORT")
redisPassword = os.Getenv("REDIS_PASSWORD")
redisDb = os.Getenv("REDIS_DB")
//redisKeyPrefix = os.Getenv("REDIS_KEY_PREFIX")
codeKey = fmt.Sprintf("User:Login:Code:%v", phoneNumbers)
)
func TestSmsClient_SendSms(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
templateParam := make(map[string]interface{})
templateParam["code"] = "123456"
templateParamStr, err := json.Marshal(templateParam)
if err != nil {
fmt.Println(err.Error())
return
}
params := &SendSmsParams{
PhoneNumbers: phoneNumbers,
SignName: signName,
TemplateCode: templateCode,
TemplateParam: string(templateParamStr),
}
res, err := smsClient.SendSms(params)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(res)
}
func TestSmsClient_GetCode(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
addr := fmt.Sprintf("%s:%s", redisHost, redisPort)
db, _ := strconv.Atoi(redisDb)
goRedis := NewRedisCacheAdapter(addr, redisPassword, db)
smsClient.Cache = goRedis
code, err := smsClient.GetCode(context.Background(), codeKey)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(code)
}
func TestSmsClient_SaveCode(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
addr := fmt.Sprintf("%s:%s", redisHost, redisPort)
db, _ := strconv.Atoi(redisDb)
goRedis := NewRedisCacheAdapter(addr, redisPassword, db)
smsClient.Cache = goRedis
err = smsClient.SaveCode(context.Background(), codeKey, "123456", time.Minute*5)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("保存成功")
}
func TestSmsClient_SaveCodeWithFrequency(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
addr := fmt.Sprintf("%s:%s", redisHost, redisPort)
db, _ := strconv.Atoi(redisDb)
goRedis := NewRedisCacheAdapter(addr, redisPassword, db)
smsClient.Cache = goRedis
err = smsClient.SaveCodeWithFrequency(context.Background(), codeKey, "123456", time.Minute*5, time.Minute)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("保存成功")
}
func TestSmsClient_VerifyCode(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
addr := fmt.Sprintf("%s:%s", redisHost, redisPort)
db, _ := strconv.Atoi(redisDb)
goRedis := NewRedisCacheAdapter(addr, redisPassword, db)
smsClient.Cache = goRedis
ok, err := smsClient.VerifyCode(context.Background(), codeKey, "123456")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(ok)
}
func TestSmsClient_DeleteCode(t *testing.T) {
config := &SmsConfig{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
smsClient, err := NewSmsClient(config)
if err != nil {
fmt.Println(err.Error())
return
}
addr := fmt.Sprintf("%s:%s", redisHost, redisPort)
db, _ := strconv.Atoi(redisDb)
goRedis := NewRedisCacheAdapter(addr, redisPassword, db)
smsClient.Cache = goRedis
err = smsClient.DeleteCode(context.Background(), codeKey)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("删除成功")
}