Files
mcpctl/src/mcplocal/tests/proxymodel-endpoint.test.ts

81 lines
2.7 KiB
TypeScript
Raw Normal View History

import { describe, it, expect } from 'vitest';
import Fastify from 'fastify';
import { registerProxymodelEndpoint } from '../src/http/proxymodel-endpoint.js';
describe('ProxyModel endpoint', () => {
it('GET /proxymodels returns built-in models', async () => {
const app = Fastify({ logger: false });
registerProxymodelEndpoint(app);
await app.ready();
const res = await app.inject({ method: 'GET', url: '/proxymodels' });
expect(res.statusCode).toBe(200);
const body = res.json<Array<{ name: string; source: string }>>();
expect(Array.isArray(body)).toBe(true);
const names = body.map((m) => m.name);
expect(names).toContain('default');
expect(names).toContain('subindex');
// Each entry has required fields
for (const model of body) {
expect(model).toHaveProperty('name');
expect(model).toHaveProperty('source');
expect(model).toHaveProperty('controller');
expect(model).toHaveProperty('stages');
expect(model).toHaveProperty('cacheable');
}
await app.close();
});
it('GET /proxymodels/:name returns a specific model', async () => {
const app = Fastify({ logger: false });
registerProxymodelEndpoint(app);
await app.ready();
const res = await app.inject({ method: 'GET', url: '/proxymodels/default' });
expect(res.statusCode).toBe(200);
const body = res.json<{ name: string; source: string; controller: string; stages: unknown[] }>();
expect(body.name).toBe('default');
expect(body.source).toBe('built-in');
expect(body.controller).toBe('gate');
expect(Array.isArray(body.stages)).toBe(true);
expect(body.stages.length).toBeGreaterThan(0);
await app.close();
});
it('GET /proxymodels/:name returns 404 for unknown model', async () => {
const app = Fastify({ logger: false });
registerProxymodelEndpoint(app);
await app.ready();
const res = await app.inject({ method: 'GET', url: '/proxymodels/nonexistent' });
expect(res.statusCode).toBe(404);
const body = res.json<{ error: string }>();
expect(body.error).toContain('nonexistent');
await app.close();
});
it('GET /proxymodels/subindex returns subindex model details', async () => {
const app = Fastify({ logger: false });
registerProxymodelEndpoint(app);
await app.ready();
const res = await app.inject({ method: 'GET', url: '/proxymodels/subindex' });
expect(res.statusCode).toBe(200);
const body = res.json<{ name: string; cacheable: boolean; stages: Array<{ type: string }> }>();
expect(body.name).toBe('subindex');
expect(body.cacheable).toBe(true);
expect(body.stages.some((s) => s.type === 'section-split')).toBe(true);
await app.close();
});
});