qwen-code/packages/channels/base/src/GroupGate.test.ts
tanzhenxin d84675e86f test(channels): add comprehensive test suites for channel adapters
- Add ChannelBase, GroupGate, SenderGate, SessionRouter tests
- Add DingTalk markdown utility tests
- Add Weixin media and send helper tests
- Add CLI channel config-utils and pidfile tests
- Configure vitest for all channel packages
- Exclude test files from TypeScript build

Tests cover attachment handling, block streaming, gating policies,
session routing, markdown conversion, config parsing, and service management.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-03-27 15:26:39 +00:00

115 lines
3.9 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { GroupGate } from './GroupGate.js';
import type { Envelope } from './types.js';
function envelope(overrides: Partial<Envelope> = {}): Envelope {
return {
channelName: 'test',
senderId: 'user1',
senderName: 'User',
chatId: 'chat1',
text: 'hello',
isGroup: false,
isMentioned: false,
isReplyToBot: false,
...overrides,
};
}
describe('GroupGate', () => {
describe('non-group messages', () => {
it('always allows DM messages regardless of policy', () => {
for (const policy of ['disabled', 'allowlist', 'open'] as const) {
const gate = new GroupGate(policy);
expect(gate.check(envelope()).allowed).toBe(true);
}
});
});
describe('disabled policy', () => {
it('rejects all group messages', () => {
const gate = new GroupGate('disabled');
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'disabled' });
});
});
describe('allowlist policy', () => {
it('rejects groups not in allowlist', () => {
const gate = new GroupGate('allowlist', { other: {} });
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'not_allowlisted' });
});
it('does not treat "*" as wildcard allow', () => {
const gate = new GroupGate('allowlist', { '*': {} });
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'not_allowlisted' });
});
it('allows explicitly listed group with mention', () => {
const gate = new GroupGate('allowlist', { chat1: {} });
const result = gate.check(envelope({ isGroup: true, isMentioned: true }));
expect(result.allowed).toBe(true);
});
it('requires mention by default for allowlisted group', () => {
const gate = new GroupGate('allowlist', { chat1: {} });
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'mention_required' });
});
it('allows reply-to-bot as alternative to mention', () => {
const gate = new GroupGate('allowlist', { chat1: {} });
const result = gate.check(
envelope({ isGroup: true, isReplyToBot: true }),
);
expect(result.allowed).toBe(true);
});
it('respects requireMention=false override', () => {
const gate = new GroupGate('allowlist', {
chat1: { requireMention: false },
});
const result = gate.check(envelope({ isGroup: true }));
expect(result.allowed).toBe(true);
});
});
describe('open policy', () => {
it('allows any group with mention', () => {
const gate = new GroupGate('open');
const result = gate.check(envelope({ isGroup: true, isMentioned: true }));
expect(result.allowed).toBe(true);
});
it('requires mention by default', () => {
const gate = new GroupGate('open');
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'mention_required' });
});
it('uses "*" as default config fallback', () => {
const gate = new GroupGate('open', { '*': { requireMention: false } });
const result = gate.check(envelope({ isGroup: true }));
expect(result.allowed).toBe(true);
});
it('per-group config overrides "*" default', () => {
const gate = new GroupGate('open', {
'*': { requireMention: false },
chat1: { requireMention: true },
});
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'mention_required' });
});
});
describe('defaults', () => {
it('defaults to disabled policy', () => {
const gate = new GroupGate();
const result = gate.check(envelope({ isGroup: true }));
expect(result).toEqual({ allowed: false, reason: 'disabled' });
});
});
});