Files
hermes-web-ui/tests/server/lan-peer-tools.test.ts
2026-06-11 12:29:05 +08:00

59 lines
1.8 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest'
describe('LAN peer tools service', () => {
afterEach(() => {
vi.resetModules()
vi.doUnmock('../../packages/server/src/services/lan-peer-socket')
})
it('rejects remote tool calls on passive server-side peer connections', async () => {
const execRemoteCommand = vi.fn()
vi.doMock('../../packages/server/src/services/lan-peer-socket', () => ({
getLanPeerSocketManager: () => ({
getConnection: () => ({
info: () => ({ role: 'server' }),
execRemoteCommand,
}),
}),
}))
const { getLanPeerToolsService } = await import('../../packages/server/src/services/lan-peer-tools')
expect(() => getLanPeerToolsService().exec({
connectionId: 'server-side-connection',
command: 'id',
})).toThrow('Peer connection is not authorized for remote tools')
expect(execRemoteCommand).not.toHaveBeenCalled()
})
it('allows remote tool calls on active client-side peer connections', async () => {
const execRemoteCommand = vi.fn(async () => ({
stdout: 'ok',
stderr: '',
exit_code: 0,
timed_out: false,
}))
vi.doMock('../../packages/server/src/services/lan-peer-socket', () => ({
getLanPeerSocketManager: () => ({
getConnection: () => ({
info: () => ({ role: 'client' }),
execRemoteCommand,
}),
}),
}))
const { getLanPeerToolsService } = await import('../../packages/server/src/services/lan-peer-tools')
const result = await getLanPeerToolsService().exec({
connectionId: 'client-side-connection',
command: 'id',
args: ['-u'],
})
expect(result.stdout).toBe('ok')
expect(execRemoteCommand).toHaveBeenCalledWith(expect.objectContaining({
command: 'id',
args: ['-u'],
}))
})
})