mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-07 08:52:26 +00:00
总: 增加明确的订阅撤销接口,修复撤销后的缓存失效和管理端 revoked 展示。 分: 同步失效订阅 L1 与 billing cache,补跨实例失效通知、soft-delete-aware 列表查询、revoked_at DTO 字段和回归测试。
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
//go:build unit
|
|
|
|
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/config"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type revokeCacheUserSubRepoStub struct {
|
|
userSubRepoNoop
|
|
|
|
sub *UserSubscription
|
|
deleted bool
|
|
getActiveCalls int
|
|
}
|
|
|
|
func (r *revokeCacheUserSubRepoStub) GetByID(_ context.Context, id int64) (*UserSubscription, error) {
|
|
if r.sub == nil || r.sub.ID != id || r.deleted {
|
|
return nil, ErrSubscriptionNotFound
|
|
}
|
|
cp := *r.sub
|
|
return &cp, nil
|
|
}
|
|
|
|
func (r *revokeCacheUserSubRepoStub) Delete(_ context.Context, id int64) error {
|
|
if r.sub == nil || r.sub.ID != id || r.deleted {
|
|
return ErrSubscriptionNotFound
|
|
}
|
|
r.deleted = true
|
|
return nil
|
|
}
|
|
|
|
func (r *revokeCacheUserSubRepoStub) GetActiveByUserIDAndGroupID(_ context.Context, userID, groupID int64) (*UserSubscription, error) {
|
|
r.getActiveCalls++
|
|
if r.deleted || r.sub == nil || r.sub.UserID != userID || r.sub.GroupID != groupID {
|
|
return nil, ErrSubscriptionNotFound
|
|
}
|
|
cp := *r.sub
|
|
return &cp, nil
|
|
}
|
|
|
|
func TestRevokeSubscription_InvalidatesL1CacheSynchronously(t *testing.T) {
|
|
repo := &revokeCacheUserSubRepoStub{
|
|
sub: &UserSubscription{
|
|
ID: 1,
|
|
UserID: 10,
|
|
GroupID: 20,
|
|
Status: SubscriptionStatusActive,
|
|
ExpiresAt: time.Now().Add(time.Hour),
|
|
},
|
|
}
|
|
svc := NewSubscriptionService(groupRepoNoop{}, repo, nil, nil, &config.Config{
|
|
SubscriptionCache: config.SubscriptionCacheConfig{
|
|
L1Size: 16,
|
|
L1TTLSeconds: 60,
|
|
},
|
|
})
|
|
t.Cleanup(svc.Stop)
|
|
|
|
_, err := svc.GetActiveSubscription(context.Background(), 10, 20)
|
|
require.NoError(t, err)
|
|
svc.subCacheL1.Wait()
|
|
require.Equal(t, 1, repo.getActiveCalls)
|
|
|
|
err = svc.RevokeSubscription(context.Background(), 1)
|
|
require.NoError(t, err)
|
|
|
|
_, err = svc.GetActiveSubscription(context.Background(), 10, 20)
|
|
require.ErrorIs(t, err, ErrSubscriptionNotFound)
|
|
require.Equal(t, 2, repo.getActiveCalls, "撤销后应回源确认订阅已不存在,不能命中旧 L1")
|
|
}
|