const fs = require('fs'); const path = require('path'); const request = require('supertest'); const { MongoMemoryServer } = require('mongodb-memory-server'); const mongoose = require('mongoose'); jest.mock('~/server/services/Config', () => ({ syncStaticTools: jest.fn().mockResolvedValue(undefined), mergeAppTools: jest.fn().mockResolvedValue(undefined), loadCustomConfig: jest.fn(() => Promise.resolve({})), getAppConfig: jest.fn().mockResolvedValue({ paths: { uploads: '/tmp', dist: '/tmp/dist', fonts: '/tmp/fonts', assets: '/tmp/assets', }, fileStrategy: 'local', imageOutputType: 'PNG', }), setCachedTools: jest.fn(), })); jest.mock('~/app/clients/tools', () => ({ createOpenAIImageTools: jest.fn(() => []), createYouTubeTools: jest.fn(() => []), manifestToolMap: {}, toolkits: [], })); jest.mock('~/config', () => ({ createMCPServersRegistry: jest.fn(), createMCPManager: jest.fn().mockResolvedValue({ getAppToolFunctions: jest.fn().mockResolvedValue({}), }), })); jest.mock('~/server/services/Agents/triggers', () => ({ initializeAgentTriggerService: jest.fn().mockResolvedValue(undefined), })); jest.mock('~/server/services/Schedules', () => ({ initializeScheduleEngine: jest.fn().mockResolvedValue(undefined), })); jest.mock( '@librechat/api/telemetry', () => ({ initializeTelemetry: jest.fn(() => ({ enabled: false, status: 'disabled', shutdown: jest.fn(), })), telemetryMiddleware: jest.fn((_req, _res, next) => next()), telemetryErrorMiddleware: jest.fn((err, _req, _res, next) => next(err)), }), { virtual: true }, ); describe('Telemetry wiring', () => { const source = fs.readFileSync(path.join(__dirname, 'index.js'), 'utf8'); it('loads credentials before telemetry and other server imports', () => { const firstStatements = source .split('\n') .map((line) => line.trim()) .filter(Boolean) .slice(0, 2); expect(firstStatements).toEqual([ "require('../config/credentials');", "const telemetry = require('./telemetry');", ]); }); it('mounts telemetry middleware after static assets and before routes', () => { const telemetryMiddlewareIndex = source.indexOf('app.use(telemetry.telemetryMiddleware);'); const staticAssetsIndex = source.indexOf('app.use(staticCache(appConfig.paths.assets));'); const apiRoutesIndex = source.indexOf("app.use('/api/auth'"); expect(telemetryMiddlewareIndex).toBeGreaterThan(-1); expect(staticAssetsIndex).toBeGreaterThan(-1); expect(apiRoutesIndex).toBeGreaterThan(-1); expect(staticAssetsIndex).toBeLessThan(telemetryMiddlewareIndex); expect(telemetryMiddlewareIndex).toBeLessThan(apiRoutesIndex); }); it('mounts telemetry error middleware before ErrorController', () => { const telemetryErrorMiddlewareIndex = source.indexOf( 'app.use(telemetry.telemetryErrorMiddleware);', ); const errorControllerIndex = source.indexOf('app.use(ErrorController);'); expect(telemetryErrorMiddlewareIndex).toBeGreaterThan(-1); expect(errorControllerIndex).toBeGreaterThan(-1); expect(telemetryErrorMiddlewareIndex).toBeLessThan(errorControllerIndex); }); it('captures agent ingress before parsing and creates its recorder before auth routes', () => { const ingressIndex = source.indexOf( "app.use('/api/agents/chat', agentStartupIngressMiddleware);", ); const jsonParserIndex = source.indexOf("app.use(express.json({ limit: '3mb' }));"); const recorderIndex = source.indexOf( "app.use('/api/agents/chat', agentStartupTelemetryMiddleware);", ); const tracingIndex = source.indexOf('app.use(telemetry.telemetryMiddleware);'); const agentsRouteIndex = source.indexOf("app.use('/api/agents', routes.agents);"); expect(ingressIndex).toBeGreaterThan(-1); expect(recorderIndex).toBeGreaterThan(-1); expect(ingressIndex).toBeLessThan(jsonParserIndex); expect(tracingIndex).toBeLessThan(recorderIndex); expect(recorderIndex).toBeLessThan(agentsRouteIndex); }); }); describe('Startup readiness wiring', () => { const source = fs.readFileSync(path.join(__dirname, 'index.js'), 'utf8'); it('awaits the shared Redis client before startup cache access', () => { const redisReadyIndex = source.indexOf('await waitForKeyvRedisClient();'); const connectDbIndex = source.indexOf('await connectDb();'); const appConfigIndex = source.indexOf('await getAppConfig({ baseOnly: true });'); expect(redisReadyIndex).toBeGreaterThan(-1); expect(connectDbIndex).toBeGreaterThan(redisReadyIndex); expect(appConfigIndex).toBeGreaterThan(redisReadyIndex); }); it('configures generation streams before the server accepts requests', () => { const streamConfigIndex = source.indexOf('configureGenerationStreams();'); const listenIndex = source.indexOf('const server = app.listen'); const postListenMcpIndex = source.indexOf('await initializeMCPs();'); expect(streamConfigIndex).toBeGreaterThan(-1); expect(listenIndex).toBeGreaterThan(-1); expect(postListenMcpIndex).toBeGreaterThan(-1); expect(streamConfigIndex).toBeLessThan(listenIndex); expect(streamConfigIndex).toBeLessThan(postListenMcpIndex); }); it('configures subagent task routing before the server accepts requests', () => { const routingIndex = source.indexOf('await configureSubagentTaskRouting();'); const listenIndex = source.indexOf('const server = app.listen'); expect(routingIndex).toBeGreaterThan(-1); expect(listenIndex).toBeGreaterThan(routingIndex); }); it('registers generation stream cleanup with the graceful shutdown coordinator', () => { const shutdownRegistrationIndex = source.indexOf( "registerShutdownTask('generation job manager'", ); const listenIndex = source.indexOf('const server = app.listen'); expect(shutdownRegistrationIndex).toBeGreaterThan(-1); expect(shutdownRegistrationIndex).toBeLessThan(listenIndex); }); it('configures HTTP timeouts before graceful shutdown handling', () => { const listenIndex = source.indexOf('const server = app.listen'); const timeoutConfigIndex = source.indexOf('configureServerTimeouts(server);'); const shutdownIndex = source.indexOf('setupGracefulShutdown(server);'); expect(listenIndex).toBeGreaterThan(-1); expect(timeoutConfigIndex).toBeGreaterThan(-1); expect(shutdownIndex).toBeGreaterThan(-1); expect(listenIndex).toBeLessThan(timeoutConfigIndex); expect(timeoutConfigIndex).toBeLessThan(shutdownIndex); }); it('mounts the chat-start readiness gate before agent routes', () => { const readinessGateIndex = source.indexOf( "app.use('/api/agents/chat', rejectChatStartsUntilReady);", ); const agentsRouteIndex = source.indexOf("app.use('/api/agents', routes.agents);"); expect(readinessGateIndex).toBeGreaterThan(-1); expect(agentsRouteIndex).toBeGreaterThan(-1); expect(readinessGateIndex).toBeLessThan(agentsRouteIndex); }); it('awaits durable trigger delivery before reporting readiness', () => { const triggerDeliveryIndex = source.indexOf('await initializeAgentTriggerService('); const readyIndex = source.indexOf('serverReady = true;'); expect(triggerDeliveryIndex).toBeGreaterThan(-1); expect(readyIndex).toBeGreaterThan(triggerDeliveryIndex); }); }); describe('Server Configuration', () => { // Increase the default timeout to allow for Mongo cleanup jest.setTimeout(30_000); let mongoServer; let app; /** Mocked fs.readFileSync for index.html */ const originalReadFileSync = fs.readFileSync; beforeAll(() => { fs.readFileSync = function (filepath, options) { if (filepath.includes('index.html')) { return '