import express from 'express'; import type { BotMode } from '../../src/services/bot-mode.js'; import type { AddressInfo } from 'node:net'; import { describe, expect, it, vi } from 'vitest'; import type { WebContext } from '../../src/web/context.js'; import { createControlRouter } from '../../src/web/routes/control.js'; describe('control route realtime events', () => { it('publishes the authoritative bot state after each successful transition', async () => { let mode: BotMode = 'stopped'; const bot = vi.fn(); const context = { config: { browser: { dryRun: true } }, services: { accountAuth: { isFullyAuthenticated: () => true } }, getBotMode: () => mode, setBotMode: (next: BotMode) => { mode = next; }, activity: { push: vi.fn() }, logger: { info: vi.fn() }, broadcaster: { dashboardEvents: { bot } }, } as unknown as WebContext; const app = express().use('/api', createControlRouter(context)); const server = app.listen(0); await new Promise((resolve) => server.once('listening', resolve)); const port = (server.address() as AddressInfo).port; try { expect((await fetch(`http://127.0.0.1:${port}/api/start`, { method: 'POST' })).status).toBe(200); expect(mode).toBe('running'); expect(bot).toHaveBeenLastCalledWith({ mode: 'running', dryRun: true }); expect((await fetch(`http://127.0.0.1:${port}/api/scan`, { method: 'POST' })).status).toBe(200); expect(mode).toBe('scan'); expect(bot).toHaveBeenLastCalledWith({ mode: 'scan', dryRun: true }); expect((await fetch(`http://127.0.0.1:${port}/api/stop`, { method: 'POST' })).status).toBe(200); expect(mode).toBe('stopped'); expect(bot).toHaveBeenLastCalledWith({ mode: 'stopped', dryRun: true }); } finally { await new Promise((resolve) => server.close(() => resolve())); } }); });