fix(bot): complete command flow coverage

This commit is contained in:
ShukeBta
2026-06-07 12:42:21 +08:00
parent b38d47a27d
commit a3b4dbf1c1
4 changed files with 312 additions and 17 deletions
+116
View File
@@ -319,6 +319,40 @@ func TestBotAdminCommandsManageDevicePolicy(t *testing.T) {
}
}
func TestBotRegistrationCommandUsesOpenRegQuota(t *testing.T) {
ctx := context.Background()
repos, bot := newBotTestService(t)
admin := &model.User{Username: "root", PasswordHash: "x", Role: "admin", IsActive: true}
if err := repos.User.Create(ctx, admin); err != nil {
t.Fatal(err)
}
if err := repos.Setting.Set(ctx, SettingOpenRegEnabled, "false"); err != nil {
t.Fatal(err)
}
if err := repos.DB.Create(&model.TelegramBinding{
TelegramUserID: 9051,
TelegramName: "@root",
ChatID: 9051,
UserID: admin.ID,
}).Error; err != nil {
t.Fatal(err)
}
channel := &model.NotifyChannel{Name: "Telegram", Type: "telegram", Enabled: true, Config: `{"admin_user_ids":"9051"}`}
msg := &TelegramMessage{From: TelegramUser{ID: 9051, Username: "root"}, Chat: TelegramChat{ID: 9051, Type: "private"}}
reply, err := bot.executeCommand(ctx, channel, msg, "/registration on 2")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "2 个名额") {
t.Fatalf("expected quota feedback, got %q", reply.Text)
}
capacity := bot.loadCapacity(ctx)
if !capacity.OpenRegOn || capacity.OpenRegLimit != 2 || capacity.OpenRegUsed != 0 {
t.Fatalf("registration command should open quota-aware registration, got %+v", capacity)
}
}
func TestBotUserCommandsAndAdminGate(t *testing.T) {
ctx := context.Background()
repos, bot := newBotTestService(t)
@@ -373,3 +407,85 @@ func TestBotUserCommandsAndAdminGate(t *testing.T) {
t.Fatal("device should be marked kicked")
}
}
func TestBotRedeemRegisterRequiresAllowedTelegramUser(t *testing.T) {
ctx := context.Background()
_, bot := newBotTestService(t)
code, err := bot.generateCode(ctx, model.RegistrationCodeRegister, 30, 0, "")
if err != nil {
t.Fatal(err)
}
channel := &model.NotifyChannel{Name: "Telegram", Type: "telegram", Enabled: true, Config: `{"admin_user_ids":"9001"}`}
msg := &TelegramMessage{From: TelegramUser{ID: 9201, Username: "outsider"}, Chat: TelegramChat{ID: 9201, Type: "private"}}
reply, err := bot.executeCommand(ctx, channel, msg, "/redeem_register "+code.Code)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "不在管理员配置") {
t.Fatalf("outsider should not redeem register code, got %q", reply.Text)
}
channel.Config = `{"admin_user_ids":"9201"}`
reply, err = bot.executeCommand(ctx, channel, msg, "/redeem_register "+code.Code)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "兑换成功") {
t.Fatalf("allowed user should redeem register code, got %q", reply.Text)
}
if binding := bot.telegramBinding(ctx, 9201); binding == nil {
t.Fatal("redeemed account should be bound to telegram user")
}
}
func TestBotAdminCodeAndUserCommands(t *testing.T) {
ctx := context.Background()
repos, bot := newBotTestService(t)
admin := &model.User{Username: "root", PasswordHash: "x", Role: "admin", IsActive: true}
user := &model.User{Username: "viewer", PasswordHash: "x", Role: "user", IsActive: true}
if err := repos.User.Create(ctx, admin); err != nil {
t.Fatal(err)
}
if err := repos.User.Create(ctx, user); err != nil {
t.Fatal(err)
}
if err := repos.DB.Create(&model.TelegramBinding{
TelegramUserID: 9301,
TelegramName: "@root",
ChatID: 9301,
UserID: admin.ID,
}).Error; err != nil {
t.Fatal(err)
}
channel := &model.NotifyChannel{Name: "Telegram", Type: "telegram", Enabled: true, Config: `{"admin_user_ids":"9301"}`}
msg := &TelegramMessage{From: TelegramUser{ID: 9301, Username: "root"}, Chat: TelegramChat{ID: 9301, Type: "private"}}
reply, err := bot.executeCommand(ctx, channel, msg, "/gencode renew 90 7")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "已生成续期码") {
t.Fatalf("expected generated renew code, got %q", reply.Text)
}
reply, err = bot.executeCommand(ctx, channel, msg, "/renew_user viewer 30")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "viewer") {
t.Fatalf("renew command should return user actions, got %q", reply.Text)
}
updated, _ := repos.User.FindByID(ctx, user.ID)
if updated.ExpiredAt == nil || updated.ExpiredAt.Before(time.Now()) {
t.Fatalf("renew_user should set future expiry, got %v", updated.ExpiredAt)
}
reply, err = bot.executeCommand(ctx, channel, msg, "/delete_user viewer")
if err != nil {
t.Fatal(err)
}
if !strings.Contains(reply.Text, "需要确认") {
t.Fatalf("delete without confirm should be rejected, got %q", reply.Text)
}
}