- Update/BulkUpdate 按不可调度字段触发缓存刷新 - GatewayCache 支持多前缀会话键清理 - 模型路由与混合调度优化粘性会话处理 - 补充调度与缓存相关测试覆盖
69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
//go:build integration
|
|
|
|
package repository
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/config"
|
|
"github.com/Wei-Shaw/sub2api/internal/service"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSchedulerSnapshotOutboxReplay(t *testing.T) {
|
|
ctx := context.Background()
|
|
rdb := testRedis(t)
|
|
client := testEntClient(t)
|
|
|
|
_, _ = integrationDB.ExecContext(ctx, "TRUNCATE scheduler_outbox")
|
|
|
|
accountRepo := newAccountRepositoryWithSQL(client, integrationDB, nil)
|
|
outboxRepo := NewSchedulerOutboxRepository(integrationDB)
|
|
cache := NewSchedulerCache(rdb)
|
|
|
|
cfg := &config.Config{
|
|
RunMode: config.RunModeStandard,
|
|
Gateway: config.GatewayConfig{
|
|
Scheduling: config.GatewaySchedulingConfig{
|
|
OutboxPollIntervalSeconds: 1,
|
|
FullRebuildIntervalSeconds: 0,
|
|
DbFallbackEnabled: true,
|
|
},
|
|
},
|
|
}
|
|
|
|
account := &service.Account{
|
|
Name: "outbox-replay-" + time.Now().Format("150405.000000"),
|
|
Platform: service.PlatformOpenAI,
|
|
Type: service.AccountTypeAPIKey,
|
|
Status: service.StatusActive,
|
|
Schedulable: true,
|
|
Concurrency: 3,
|
|
Priority: 1,
|
|
Credentials: map[string]any{},
|
|
Extra: map[string]any{},
|
|
}
|
|
require.NoError(t, accountRepo.Create(ctx, account))
|
|
require.NoError(t, cache.SetAccount(ctx, account))
|
|
|
|
svc := service.NewSchedulerSnapshotService(cache, outboxRepo, accountRepo, nil, cfg)
|
|
svc.Start()
|
|
t.Cleanup(svc.Stop)
|
|
|
|
require.NoError(t, accountRepo.UpdateLastUsed(ctx, account.ID))
|
|
updated, err := accountRepo.GetByID(ctx, account.ID)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, updated.LastUsedAt)
|
|
expectedUnix := updated.LastUsedAt.Unix()
|
|
|
|
require.Eventually(t, func() bool {
|
|
cached, err := cache.GetAccount(ctx, account.ID)
|
|
if err != nil || cached == nil || cached.LastUsedAt == nil {
|
|
return false
|
|
}
|
|
return cached.LastUsedAt.Unix() == expectedUnix
|
|
}, 5*time.Second, 100*time.Millisecond)
|
|
}
|