@meyer/hyperdeck-emulator
Version:
Typescript Node.js library for emulating a Blackmagic Hyperdeck
98 lines (83 loc) • 2.41 kB
text/typescript
import type { Socket } from 'net';
import { EventEmitter } from 'events';
import { getTestLogger } from './utils';
import { invariant } from '../invariant';
const noop = (): any => {
return;
};
class MockSocket extends EventEmitter implements Pick<Socket, 'destroy' | 'setEncoding' | 'write'> {
destroy = noop;
setEncoding = noop;
write = jest.fn();
}
jest.mock('net', () => ({
createServer: (connectionListener?: (socket: MockSocket) => void) => {
const mockSocket = new MockSocket();
invariant(connectionListener, 'Missing connectionListener');
connectionListener(mockSocket);
return {
listen: noop,
on: noop,
unref: noop,
};
},
}));
describe('HyperdeckServer', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('sends output back to the ATEM', async () => {
expect.assertions(3);
const logger = getTestLogger();
const server = await import('../HyperDeckServer');
const hyperdeck = new server.HyperDeckServer({ ip: '0.0.0.0' }, logger.logger);
const socketEntries = Object.entries(hyperdeck['sockets']);
expect(socketEntries.length).toBe(1);
const hyperdeckSocket = socketEntries[0][1];
const socket = hyperdeckSocket['socket'];
socket.emit('data', 'banana');
hyperdeck.close();
await new Promise((resolve) => setTimeout(() => resolve(), 500));
expect((socket.write as jest.Mock).mock.calls).toMatchInlineSnapshot(`
Array [
Array [
"500 connection info:
protocol version: 1.11
model: NodeJS HyperDeck Server Library
",
],
]
`);
expect(logger.getLoggedOutput()).toMatchInlineSnapshot(`
Array [
Object {
"level": 30,
"msg": "connection",
},
Object {
"cmd": undefined,
"level": 30,
"msg": "---> send response to client",
"responseText": "500 connection info:
protocol version: 1.11
model: NodeJS HyperDeck Server Library
",
},
Object {
"data": "banana",
"level": 30,
"msg": "<--- received message from client",
},
Object {
"level": 50,
"msg": "Invalid command: \`'banana'\`",
},
Object {
"cmds": Array [],
"level": 30,
"msg": "parsed commands",
},
]
`);
});
});