Files
heicode-mananger/heicode/model/subscription_swarm_enabled_test.go
T
chenchenandClaude Opus 4.8 a0616eaebf feat(swarm): 按订阅套餐控制蜂群使用权(管理员可配)
需求:管理员在 HM 控制台按订阅套餐控制谁能用蜂群。照搬现有 MaxAgents(#8)模式
(per-plan、管理员设、不硬编码 tier)。

后端:
- model SubscriptionPlan 加 SwarmEnabled bool(default false;AutoMigrate 加列,跨三库)。
- model GetUserSwarmEnabled(userId):用户任一活跃套餐 SwarmEnabled=true 即放行(镜像
  GetUserMaxAgents);无套餐/DB 不可用 => false(opt-in)。
- controller AgentCreateUserSwarm gate:普通用户须有开通套餐,管理员(role>=admin)绕过(测试/运维)。
- controller 套餐 admin upsert 字段映射加 swarm_enabled(create 整结构已自动带)。

前端(web/default 套餐编辑):
- plan-form schema/defaults/映射 + types 加 swarm_enabled。
- 套餐编辑抽屉加「蜂群使用权」Switch(镜像 enabled)。
- zh.json 加 "Swarm Access" → 蜂群使用权(en 用 key 兜底)。

默认关闭(opt-in)、管理员逐套餐勾选;gate 在 swarm 创建入口,与 swarm 运行时是否启用无关。
测试 TestGetUserSwarmEnabled(无套餐/开通/未开通/过期/多套餐/非法 user)。build+vet+model 测试全绿。

影响面:HM 订阅模型(加字段)+ swarm 创建鉴权 + admin UI;不涉计费扣费/密钥/swarm 契约。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:55:55 +08:00

48 lines
1.4 KiB
Go

package model
import (
"testing"
"github.com/heicode/manager/common"
"github.com/stretchr/testify/require"
)
// GetUserSwarmEnabled gates swarm access per subscription plan (admin-set,
// opt-in): true iff the user has any ACTIVE plan with SwarmEnabled=true.
func TestGetUserSwarmEnabled(t *testing.T) {
now := common.GetTimestamp()
future := now + 100000
onPlan := SubscriptionPlan{Title: "swarm-on", SwarmEnabled: true}
require.NoError(t, DB.Create(&onPlan).Error)
offPlan := SubscriptionPlan{Title: "swarm-off", SwarmEnabled: false}
require.NoError(t, DB.Create(&offPlan).Error)
mkSub := func(uid, planId int, end int64) {
require.NoError(t, DB.Create(&UserSubscription{UserId: uid, PlanId: planId, Status: "active", EndTime: end}).Error)
}
// 1. no subscription -> false (opt-in default)
require.False(t, GetUserSwarmEnabled(991001))
// 2. active plan with swarm on -> true
mkSub(991002, onPlan.Id, future)
require.True(t, GetUserSwarmEnabled(991002))
// 3. active plan with swarm off -> false
mkSub(991003, offPlan.Id, future)
require.False(t, GetUserSwarmEnabled(991003))
// 4. expired swarm-on plan -> false (not active)
mkSub(991004, onPlan.Id, now-100)
require.False(t, GetUserSwarmEnabled(991004))
// 5. multiple active plans, one on -> true
mkSub(991005, offPlan.Id, future)
mkSub(991005, onPlan.Id, future)
require.True(t, GetUserSwarmEnabled(991005))
// guard: invalid user -> false
require.False(t, GetUserSwarmEnabled(0))
}