mcporter/tests/cli-output-utils.test.ts
2026-03-02 22:58:07 +00:00

130 lines
3.5 KiB
TypeScript

import { describe, expect, it, vi } from 'vitest';
import { printCallOutput } from '../src/cli/output-utils.js';
import { createCallResult } from '../src/result-utils.js';
describe('printCallOutput format selection', () => {
it.each([
[
'auto prefers json payloads when available',
'auto',
{
content: [
{ type: 'text', text: 'fallback text' },
{ type: 'json', json: { source: 'json' } },
{ type: 'markdown', text: '# heading' },
],
},
(logged: unknown) => {
expect(JSON.parse(String(logged))).toEqual({ source: 'json' });
},
],
[
'text prefers text over markdown/json',
'text',
{
content: [
{ type: 'text', text: 'plain text wins' },
{ type: 'markdown', text: '# heading' },
{ type: 'json', json: { source: 'json' } },
],
},
(logged: unknown) => {
expect(logged).toBe('plain text wins\n# heading');
},
],
[
'markdown prefers markdown content',
'markdown',
{
content: [
{ type: 'text', text: 'plain text' },
{ type: 'markdown', text: '## markdown wins' },
],
},
(logged: unknown) => {
expect(logged).toBe('## markdown wins');
},
],
[
'json falls back to raw output when no JSON candidate exists',
'json',
'raw-only-string',
(logged: unknown) => {
expect(logged).toBe('raw-only-string');
},
],
[
'raw prints inspect output even when json exists',
'raw',
{ content: [{ type: 'json', json: { id: 1 } }] },
(logged: unknown) => {
expect(String(logged)).toContain("type: 'json'");
},
],
] as const)('%s', (_name, format, raw, assertLogged) => {
const wrapped = createCallResult(raw);
const log = vi.spyOn(console, 'log').mockImplementation(() => {});
try {
printCallOutput(wrapped, raw, format);
expect(log).toHaveBeenCalledTimes(1);
const logged = log.mock.calls[0]?.[0];
assertLogged(logged);
} finally {
log.mockRestore();
}
});
});
describe('printCallOutput raw output', () => {
it('does not truncate long strings when printing raw output', () => {
const longText = 'x'.repeat(15000);
const log = vi.spyOn(console, 'log').mockImplementation(() => {});
const raw = { t: longText };
const wrapped = createCallResult(raw);
try {
printCallOutput(wrapped, raw, 'raw');
expect(log).toHaveBeenCalledTimes(1);
const logged = log.mock.calls[0]?.[0];
expect(typeof logged).toBe('string');
expect(logged).not.toContain('... 5000 more characters');
expect(logged).toContain(longText.slice(-50));
} finally {
log.mockRestore();
}
});
it('prints nested values beyond the default inspect depth', () => {
const log = vi.spyOn(console, 'log').mockImplementation(() => {});
const raw = {
level1: {
level2: {
level3: {
level4: {
level5: {
level6: {
leaf: 'done',
},
},
},
},
},
},
};
const wrapped = createCallResult(raw);
try {
printCallOutput(wrapped, raw, 'raw');
expect(log).toHaveBeenCalledTimes(1);
const logged = log.mock.calls[0]?.[0];
expect(typeof logged).toBe('string');
expect(logged).toContain("leaf: 'done'");
} finally {
log.mockRestore();
}
});
});