LibreChat/api/server/routes/admin/langfuse.test.js
Ravi Kumar L 9980b6221f
🪢 feat: add Langfuse session links (#14776)
* feat: add Langfuse session links

* fix: tighten Langfuse session link resolution

* fix: clear stale Langfuse session links

* test: verify tenant Langfuse session links

* fix: align Langfuse link with client conventions
2026-08-12 22:25:23 -04:00

118 lines
4 KiB
JavaScript

const express = require('express');
const request = require('supertest');
let deniedCapability;
let canManageLangfuse;
const middlewareCalls = [];
const mockHasConfigCapability = jest.fn(() => Promise.resolve(canManageLangfuse));
const mockRequireJwtAuth = jest.fn((req, _res, next) => {
req.user = { id: 'user-1', role: 'DELEGATED_ADMIN', tenantId: 'tenant-a' };
middlewareCalls.push('jwt');
next();
});
const mockRequireCapability = jest.fn((capability) => (req, res, next) => {
middlewareCalls.push(capability);
if (deniedCapability === capability) {
return res.status(403).json({ message: 'Forbidden' });
}
next();
});
const mockHandlers = {
getConnection: jest.fn((_req, res) => res.status(200).json({ handler: 'get' })),
getSessionLink: jest.fn((_req, res) => res.status(200).json({ handler: 'session' })),
updateConnection: jest.fn((_req, res) => res.status(200).json({ handler: 'update' })),
testConnection: jest.fn((_req, res) => res.status(200).json({ handler: 'test' })),
};
jest.mock('@librechat/data-schemas', () => ({
SystemCapabilities: { ACCESS_ADMIN: 'access:admin' },
}));
jest.mock('@librechat/api', () => ({
createAdminLangfuseHandlers: jest.fn(() => mockHandlers),
}));
jest.mock('~/server/middleware/roles/capabilities', () => ({
requireCapability: mockRequireCapability,
hasConfigCapability: mockHasConfigCapability,
}));
jest.mock('~/server/middleware', () => ({
requireJwtAuth: mockRequireJwtAuth,
}));
jest.mock('~/server/services/Config', () => ({
invalidateConfigCaches: jest.fn(),
}));
jest.mock('~/models', () => ({
findConfigByPrincipal: jest.fn(),
patchConfigFields: jest.fn(),
toggleConfigActive: jest.fn(),
getMessages: jest.fn(),
}));
describe('admin Langfuse routes', () => {
function createApp() {
delete require.cache[require.resolve('./langfuse')];
const router = require('./langfuse');
const app = express();
app.use(express.json());
app.use('/api/admin/langfuse', router);
return app;
}
beforeEach(() => {
deniedCapability = undefined;
canManageLangfuse = true;
middlewareCalls.length = 0;
jest.clearAllMocks();
});
it('requires admin access and Langfuse manage access for connection reads', async () => {
const response = await request(createApp()).get('/api/admin/langfuse/connection').expect(200);
expect(response.body).toEqual({ handler: 'get' });
expect(middlewareCalls).toEqual(['jwt', 'access:admin']);
expect(mockHasConfigCapability).toHaveBeenCalledWith(
{
id: 'user-1',
role: 'DELEGATED_ADMIN',
tenantId: 'tenant-a',
idOnTheSource: null,
},
'langfuse',
);
expect(mockHandlers.getConnection).toHaveBeenCalledTimes(1);
});
it.each([
['GET', '/api/admin/langfuse/connection/session/conversation-1', 'getSessionLink'],
['PUT', '/api/admin/langfuse/connection', 'updateConnection'],
['POST', '/api/admin/langfuse/connection/test', 'testConnection'],
])('requires Langfuse manage access for %s %s', async (method, path, handlerName) => {
const app = createApp();
const response = await request(app)[method.toLowerCase()](path).send({}).expect(200);
const expectedHandlers = {
getSessionLink: 'session',
updateConnection: 'update',
testConnection: 'test',
};
expect(response.body).toEqual({ handler: expectedHandlers[handlerName] });
expect(middlewareCalls).toEqual(['jwt', 'access:admin']);
expect(mockHandlers[handlerName]).toHaveBeenCalledTimes(1);
});
it.each([
['GET', '/api/admin/langfuse/connection/session/conversation-1', 'getSessionLink'],
['PUT', '/api/admin/langfuse/connection', 'updateConnection'],
['POST', '/api/admin/langfuse/connection/test', 'testConnection'],
])('blocks %s %s without Langfuse manage access', async (method, path, handlerName) => {
canManageLangfuse = false;
await request(createApp())[method.toLowerCase()](path).send({}).expect(403);
expect(mockHandlers[handlerName]).not.toHaveBeenCalled();
});
});