Files
heicode-mananger/heicode/model/subscription_max_agents_test.go
T
7d56b54324 feat(agent): 部署上限按订阅档动态化,闭合 #8 个人5/团队8 (#21)
沿用订阅体系现成先例 MaxPurchasePerUser,给 SubscriptionPlan 加 MaxAgents:

- model: SubscriptionPlan.MaxAgents(0=回退全局默认)+ GetUserMaxAgents(取用户
  active 订阅档最高 MaxAgents,无则回退默认)。
- HeicodeDeployAgent: 部署上限改 model.GetUserMaxAgents(userID, 环境默认5)。
  团队8=管理员把团队档配成8;个人5=默认;代码不硬编码 tier。
- subscription 控制器: Create/Update 校验 MaxAgents>=0;Update updateMap 补 max_agents。
- 前端管理端套餐表单(plan-form/types/drawer)加「Agent 部署上限」字段 + zh i18n。

测试 model/subscription_max_agents_test.go 全过(无订阅/团队档/0回退/过期/多档取最高/非法用户)。
go build、go vet、前端 tsc 干净。

Fixes #8

Co-authored-by: chenchen <chenchen@xinghanlab.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 14:28:19 +08:00

53 lines
1.8 KiB
Go

package model
import (
"testing"
"github.com/heicode/manager/common"
"github.com/stretchr/testify/require"
)
// GetUserMaxAgents drives the tier-aware deploy cap (#8): highest MaxAgents among
// the user's ACTIVE subscription plans, else the caller's default.
func TestGetUserMaxAgents(t *testing.T) {
// SubscriptionPlan / UserSubscription are migrated by the package TestMain
// (task_cas_test.go); the table already carries the new max_agents column.
now := common.GetTimestamp()
future := now + 100000
const def = 5
teamPlan := SubscriptionPlan{Title: "team-cap", MaxAgents: 8}
require.NoError(t, DB.Create(&teamPlan).Error)
soloPlan := SubscriptionPlan{Title: "solo-cap", MaxAgents: 0} // 0 => fall back to default
require.NoError(t, DB.Create(&soloPlan).Error)
midPlan := SubscriptionPlan{Title: "mid-cap", MaxAgents: 5}
require.NoError(t, DB.Create(&midPlan).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 -> default
require.Equal(t, def, GetUserMaxAgents(990001, def))
// 2. active team plan -> its cap (8)
mkSub(990002, teamPlan.Id, future)
require.Equal(t, 8, GetUserMaxAgents(990002, def))
// 3. active plan with MaxAgents=0 -> default
mkSub(990003, soloPlan.Id, future)
require.Equal(t, def, GetUserMaxAgents(990003, def))
// 4. expired (end_time in the past) -> default, even if row still says active
mkSub(990004, teamPlan.Id, now-100)
require.Equal(t, def, GetUserMaxAgents(990004, def))
// 5. multiple active plans -> highest cap wins (5 and 8 -> 8)
mkSub(990005, midPlan.Id, future)
mkSub(990005, teamPlan.Id, future)
require.Equal(t, 8, GetUserMaxAgents(990005, def))
// guard: invalid user -> default
require.Equal(t, def, GetUserMaxAgents(0, def))
}