Files
wownerogue/test/addressManager.test.js
T

51 lines
2.2 KiB
JavaScript

const AddressManager = require('../src/network/addressManager');
const { AppError } = require('../src/utils/errors');
describe('AddressManager', () => {
const sampleAddress = 'WW3UyJFX6GPKdM21APyVYjGhfX3ebyHvPPgtFC3wHxkYTCGg8k2UM9DLTCzcgoaLHSKnvJKRtCPgJ1sxvgYiFCoK19vLk83Jn';
function createManager({ existingAddress = null } = {}) {
const emitMock = jest.fn();
const toMock = jest.fn().mockReturnValue({ emit: emitMock });
const broadcastMock = { sendStatusUpdate: jest.fn() };
const gameModeManager = {
setUserPayoutAddress: jest.fn().mockResolvedValue(true),
getOrCreateUser: jest.fn().mockResolvedValue({ payout_address: existingAddress })
};
const manager = new AddressManager({
gameModeManager,
broadcastManager: broadcastMock,
io: { to: toMock },
debugManager: { CONSOLE_LOGGING: false },
onConfirmed: jest.fn()
});
return { manager, emitMock, toMock, broadcastMock, gameModeManager };
}
test('saveAddress persists and emits confirmation', async () => {
const { manager, emitMock, gameModeManager } = createManager();
await manager.saveAddress('socket-1', sampleAddress);
expect(gameModeManager.setUserPayoutAddress).toHaveBeenCalledWith('socket-1', sampleAddress);
expect(emitMock).toHaveBeenCalledWith('address_confirmed', expect.objectContaining({ address: sampleAddress }));
});
test('saveAddress rejects invalid address input', async () => {
const { manager } = createManager();
await expect(manager.saveAddress('socket-2', 'not-an-address')).rejects.toBeInstanceOf(AppError);
});
test('handleDetection skips confirmation when address already set', async () => {
const { manager, emitMock, gameModeManager } = createManager({ existingAddress: sampleAddress });
await manager.handleDetection('socket-3', sampleAddress);
expect(gameModeManager.getOrCreateUser).toHaveBeenCalled();
expect(manager.pending.has('socket-3')).toBe(false);
expect(emitMock).toHaveBeenCalledWith('address_confirmed', expect.objectContaining({ message: expect.stringContaining('already set') }));
});
});