import { TaskRunnersConfig } from '@n8n/config'; import { Container } from '@n8n/di'; import { InternalTaskRunnerDisconnectAnalyzer } from '@/task-runners/internal-task-runner-disconnect-analyzer'; import { TaskBrokerWsServer } from '@/task-runners/task-broker/task-broker-ws-server'; import { TaskRunnerModule } from '@/task-runners/task-runner-module'; import { PyTaskRunnerProcess } from '@/task-runners/task-runner-process-py'; // Direct method replacement (not jest.spyOn) because the root jest config // enables `restoreMocks: true` which restores spies between tests, but // `module.start()` calls `checkRequirements` and we need the stub to remain // active throughout the file. const originalCheckRequirements = PyTaskRunnerProcess.checkRequirements; beforeAll(() => { PyTaskRunnerProcess.checkRequirements = async () => 'python'; }); afterAll(() => { PyTaskRunnerProcess.checkRequirements = originalCheckRequirements; }); describe('TaskRunnerModule in internal mode', () => { const runnerConfig = Container.get(TaskRunnersConfig); runnerConfig.port = 0; // Random port runnerConfig.mode = 'internal'; const module = Container.get(TaskRunnerModule); afterEach(async () => { await module.stop(); }); describe('start', () => { it('should start the task runner', async () => { // Act await module.start(); }); it('should use InternalTaskRunnerDisconnectAnalyzer', () => { const wsServer = Container.get(TaskBrokerWsServer); expect(wsServer.getDisconnectAnalyzer()).toBeInstanceOf(InternalTaskRunnerDisconnectAnalyzer); }); }); });