| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //go:build unit
- package service
- import (
- "context"
- "testing"
- "github.com/stretchr/testify/require"
- )
- // groupPlatformRepoStub 只实现 UpdateGroup 走到的两个方法,其余靠内嵌接口占位。
- type groupPlatformRepoStub struct {
- GroupRepository
- group *Group
- updated *Group
- }
- func (r *groupPlatformRepoStub) GetByID(_ context.Context, _ int64) (*Group, error) {
- cloned := *r.group
- return &cloned, nil
- }
- func (r *groupPlatformRepoStub) Update(_ context.Context, group *Group) error {
- r.updated = group
- return nil
- }
- type channelCacheInvalidatorSpy struct {
- calls int
- }
- func (s *channelCacheInvalidatorSpy) InvalidateCache() { s.calls++ }
- // 渠道缓存持有 groupID → platform,而渠道定价/模型映射/模型白名单都按平台严格隔离。
- // 改了分组平台却不失效缓存,最长 10 分钟内这些查找仍按旧平台匹配(静默走错价)。
- func TestUpdateGroupInvalidatesChannelCacheOnPlatformChange(t *testing.T) {
- tests := []struct {
- name string
- fromPlatform string
- inputPlatform string
- wantCalls int
- }{
- {
- name: "platform changed invalidates",
- fromPlatform: PlatformAnthropic,
- inputPlatform: PlatformOpenAI,
- wantCalls: 1,
- },
- {
- name: "same platform does not invalidate",
- fromPlatform: PlatformAnthropic,
- inputPlatform: PlatformAnthropic,
- wantCalls: 0,
- },
- {
- // 请求里不带 platform 字段时不应该动缓存
- name: "platform omitted does not invalidate",
- fromPlatform: PlatformAnthropic,
- inputPlatform: "",
- wantCalls: 0,
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- repo := &groupPlatformRepoStub{group: &Group{ID: 7, Name: "g", Platform: tt.fromPlatform}}
- spy := &channelCacheInvalidatorSpy{}
- svc := &adminServiceImpl{groupRepo: repo, channelCacheInvalidator: spy}
- got, err := svc.UpdateGroup(context.Background(), 7, &UpdateGroupInput{Platform: tt.inputPlatform})
- require.NoError(t, err)
- require.NotNil(t, got)
- require.Equal(t, tt.wantCalls, spy.calls)
- })
- }
- }
- // 依赖可以不注入(例如测试或裁剪构建),此时不应 panic——缓存靠 TTL 自然重建。
- func TestUpdateGroupWithoutChannelCacheInvalidator(t *testing.T) {
- repo := &groupPlatformRepoStub{group: &Group{ID: 7, Name: "g", Platform: PlatformAnthropic}}
- svc := &adminServiceImpl{groupRepo: repo}
- got, err := svc.UpdateGroup(context.Background(), 7, &UpdateGroupInput{Platform: PlatformOpenAI})
- require.NoError(t, err)
- require.Equal(t, PlatformOpenAI, got.Platform)
- }
|