feat(pagination): add generic typed pagination with ordering to all list endpoints

- add PaginationQueryDto<TOrderBy> generic with orderBy and orderDir fields
- add SessionOrderBy, EnvironmentOrderBy, ScenarioOrderBy type aliases
- update session, environment, scenario services and controllers to use typed pagination
- update MCP list_sessions, list_environments, list_scenarios tools to expose orderBy/orderDir
- update tests for all list endpoints to cover page, limit, ordering, and invalid param rejection
This commit is contained in:
2026-04-07 17:54:23 +03:00
parent d9cdb64ee2
commit 36f8b8c0ca
16 changed files with 337 additions and 81 deletions
+8 -4
View File
@@ -83,22 +83,26 @@ describe('McpController', () => {
// ── list_sessions tool ─────────────────────────────────────────────────────
describe('list_sessions', () => {
it('returns a result with text content containing a JSON array', async () => {
it('returns a paginated result with a data array', async () => {
const { status, rpc } = await mcpCall('list_sessions');
expect(status).toBe(200);
const result = rpc.result as { content: { text: string }[] };
expect(Array.isArray(JSON.parse(result.content[0].text))).toBe(true);
const body = JSON.parse(result.content[0].text) as { data: unknown[]; total: number };
expect(Array.isArray(body.data)).toBe(true);
expect(typeof body.total).toBe('number');
});
});
// ── list_environments tool ─────────────────────────────────────────────────
describe('list_environments', () => {
it('returns a result with text content containing a JSON array', async () => {
it('returns a paginated result with a data array', async () => {
const { status, rpc } = await mcpCall('list_environments');
expect(status).toBe(200);
const result = rpc.result as { content: { text: string }[] };
expect(Array.isArray(JSON.parse(result.content[0].text))).toBe(true);
const body = JSON.parse(result.content[0].text) as { data: unknown[]; total: number };
expect(Array.isArray(body.data)).toBe(true);
expect(typeof body.total).toBe('number');
});
});