153 lines
4.6 KiB
TypeScript
153 lines
4.6 KiB
TypeScript
import { QqbotMessageTargetOptionsService } from '../../../../src/modules/qqbot/core/application/message-push/qqbot-message-target-options.service';
|
|
|
|
describe('QqbotMessageTargetOptionsService', () => {
|
|
it('preserves large IDs, normalizes searchable labels, and keeps group/private IDs independent', async () => {
|
|
const accountService = {
|
|
findBySelfId: jest.fn().mockResolvedValue({ id: '1' }),
|
|
};
|
|
const reverseWsService = {
|
|
sendAction: jest
|
|
.fn()
|
|
.mockResolvedValueOnce({
|
|
data: [
|
|
{ group_id: '20000000000000001', group_name: ' KT 群 ' },
|
|
{ group_id: '20000000000000001', group_name: 'KT 群' },
|
|
],
|
|
status: 'ok',
|
|
})
|
|
.mockResolvedValueOnce({
|
|
data: [
|
|
{ nickname: ' 阿雪 ', user_id: '20000000000000001' },
|
|
{ remark: ' 备注 ', user_id: '30000000000000001' },
|
|
],
|
|
status: 'ok',
|
|
}),
|
|
};
|
|
const service = new QqbotMessageTargetOptionsService(
|
|
accountService as never,
|
|
reverseWsService as never,
|
|
);
|
|
|
|
await expect(
|
|
service.listTargetOptions('10000000000000001'),
|
|
).resolves.toEqual({
|
|
available: true,
|
|
options: [
|
|
{
|
|
label: 'KT 群 (20000000000000001)',
|
|
targetId: '20000000000000001',
|
|
targetType: 'group',
|
|
},
|
|
{
|
|
label: '备注 (30000000000000001)',
|
|
targetId: '30000000000000001',
|
|
targetType: 'private',
|
|
},
|
|
{
|
|
label: '阿雪 (20000000000000001)',
|
|
targetId: '20000000000000001',
|
|
targetType: 'private',
|
|
},
|
|
],
|
|
reasonCode: null,
|
|
});
|
|
expect(reverseWsService.sendAction).toHaveBeenNthCalledWith(
|
|
1,
|
|
'10000000000000001',
|
|
'get_group_list',
|
|
{},
|
|
);
|
|
expect(reverseWsService.sendAction).toHaveBeenNthCalledWith(
|
|
2,
|
|
'10000000000000001',
|
|
'get_friend_list',
|
|
{},
|
|
);
|
|
});
|
|
|
|
it('returns safe unavailable responses for a missing account, rejected action, and malformed payload', async () => {
|
|
const accountService = { findBySelfId: jest.fn() };
|
|
const reverseWsService = { sendAction: jest.fn() };
|
|
const service = new QqbotMessageTargetOptionsService(
|
|
accountService as never,
|
|
reverseWsService as never,
|
|
);
|
|
|
|
accountService.findBySelfId.mockResolvedValueOnce(null);
|
|
await expect(service.listTargetOptions('10001')).resolves.toEqual({
|
|
available: false,
|
|
options: [],
|
|
reasonCode: 'account_unavailable',
|
|
});
|
|
expect(reverseWsService.sendAction).not.toHaveBeenCalled();
|
|
|
|
accountService.findBySelfId.mockResolvedValue({ id: '1' });
|
|
reverseWsService.sendAction.mockRejectedValueOnce(new Error('offline'));
|
|
await expect(service.listTargetOptions('10001')).resolves.toEqual({
|
|
available: false,
|
|
options: [],
|
|
reasonCode: 'onebot_unavailable',
|
|
});
|
|
|
|
reverseWsService.sendAction
|
|
.mockResolvedValueOnce({ data: [{ group_id: 'bad' }], status: 'ok' })
|
|
.mockResolvedValueOnce({ data: [], status: 'ok' });
|
|
await expect(service.listTargetOptions('10001')).resolves.toEqual({
|
|
available: false,
|
|
options: [],
|
|
reasonCode: 'onebot_unavailable',
|
|
});
|
|
});
|
|
|
|
it('deduplicates equivalent OneBot candidates deterministically without discarding known names', async () => {
|
|
const responses = [
|
|
{
|
|
data: [
|
|
{ group_id: '20000000000000001' },
|
|
{ group_id: '20000000000000001', group_name: 'Beta' },
|
|
{ group_id: '20000000000000001', group_name: 'Alpha' },
|
|
],
|
|
status: 'ok',
|
|
},
|
|
{ data: [], status: 'ok' },
|
|
];
|
|
const accountService = {
|
|
findBySelfId: jest.fn().mockResolvedValue({ id: '1' }),
|
|
};
|
|
const reverseWsService = {
|
|
sendAction: jest.fn(async () => responses.shift()),
|
|
};
|
|
const service = new QqbotMessageTargetOptionsService(
|
|
accountService as never,
|
|
reverseWsService as never,
|
|
);
|
|
|
|
const first = await service.listTargetOptions('10001');
|
|
responses.push(
|
|
{
|
|
data: [
|
|
{ group_id: '20000000000000001', group_name: 'Alpha' },
|
|
{ group_id: '20000000000000001', group_name: 'Beta' },
|
|
{ group_id: '20000000000000001' },
|
|
],
|
|
status: 'ok',
|
|
},
|
|
{ data: [], status: 'ok' },
|
|
);
|
|
const second = await service.listTargetOptions('10001');
|
|
|
|
expect(first).toEqual({
|
|
available: true,
|
|
options: [
|
|
{
|
|
label: 'Alpha (20000000000000001)',
|
|
targetId: '20000000000000001',
|
|
targetType: 'group',
|
|
},
|
|
],
|
|
reasonCode: null,
|
|
});
|
|
expect(second).toEqual(first);
|
|
});
|
|
});
|