增加 L1/L2 缓存、负缓存与单飞回源 使用 key+owner 轻量查询替代全量加载并清理旧接口 补充缓存失效与余额更新测试,修复随机抖动 lint 测试: make test
98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
//go:build unit
|
|
|
|
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type balanceUserRepoStub struct {
|
|
*userRepoStub
|
|
updateErr error
|
|
updated []*User
|
|
}
|
|
|
|
func (s *balanceUserRepoStub) Update(ctx context.Context, user *User) error {
|
|
if s.updateErr != nil {
|
|
return s.updateErr
|
|
}
|
|
if user == nil {
|
|
return nil
|
|
}
|
|
clone := *user
|
|
s.updated = append(s.updated, &clone)
|
|
if s.userRepoStub != nil {
|
|
s.userRepoStub.user = &clone
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type balanceRedeemRepoStub struct {
|
|
*redeemRepoStub
|
|
created []*RedeemCode
|
|
}
|
|
|
|
func (s *balanceRedeemRepoStub) Create(ctx context.Context, code *RedeemCode) error {
|
|
if code == nil {
|
|
return nil
|
|
}
|
|
clone := *code
|
|
s.created = append(s.created, &clone)
|
|
return nil
|
|
}
|
|
|
|
type authCacheInvalidatorStub struct {
|
|
userIDs []int64
|
|
groupIDs []int64
|
|
keys []string
|
|
}
|
|
|
|
func (s *authCacheInvalidatorStub) InvalidateAuthCacheByKey(ctx context.Context, key string) {
|
|
s.keys = append(s.keys, key)
|
|
}
|
|
|
|
func (s *authCacheInvalidatorStub) InvalidateAuthCacheByUserID(ctx context.Context, userID int64) {
|
|
s.userIDs = append(s.userIDs, userID)
|
|
}
|
|
|
|
func (s *authCacheInvalidatorStub) InvalidateAuthCacheByGroupID(ctx context.Context, groupID int64) {
|
|
s.groupIDs = append(s.groupIDs, groupID)
|
|
}
|
|
|
|
func TestAdminService_UpdateUserBalance_InvalidatesAuthCache(t *testing.T) {
|
|
baseRepo := &userRepoStub{user: &User{ID: 7, Balance: 10}}
|
|
repo := &balanceUserRepoStub{userRepoStub: baseRepo}
|
|
redeemRepo := &balanceRedeemRepoStub{redeemRepoStub: &redeemRepoStub{}}
|
|
invalidator := &authCacheInvalidatorStub{}
|
|
svc := &adminServiceImpl{
|
|
userRepo: repo,
|
|
redeemCodeRepo: redeemRepo,
|
|
authCacheInvalidator: invalidator,
|
|
}
|
|
|
|
_, err := svc.UpdateUserBalance(context.Background(), 7, 5, "add", "")
|
|
require.NoError(t, err)
|
|
require.Equal(t, []int64{7}, invalidator.userIDs)
|
|
require.Len(t, redeemRepo.created, 1)
|
|
}
|
|
|
|
func TestAdminService_UpdateUserBalance_NoChangeNoInvalidate(t *testing.T) {
|
|
baseRepo := &userRepoStub{user: &User{ID: 7, Balance: 10}}
|
|
repo := &balanceUserRepoStub{userRepoStub: baseRepo}
|
|
redeemRepo := &balanceRedeemRepoStub{redeemRepoStub: &redeemRepoStub{}}
|
|
invalidator := &authCacheInvalidatorStub{}
|
|
svc := &adminServiceImpl{
|
|
userRepo: repo,
|
|
redeemCodeRepo: redeemRepo,
|
|
authCacheInvalidator: invalidator,
|
|
}
|
|
|
|
_, err := svc.UpdateUserBalance(context.Background(), 7, 10, "set", "")
|
|
require.NoError(t, err)
|
|
require.Empty(t, invalidator.userIDs)
|
|
require.Empty(t, redeemRepo.created)
|
|
}
|