import {describe, it, expect, vi, beforeEach} from 'vitest';
import {McpServer} from '@modelcontextprotocol/sdk/server/mcp.js';
import {registerGetFigmaImage} from '../../src/tools/get-figma-image.js';
import {FigmaClient} from '../../src/figma-client.js';
describe('get_figma_image tool', () => {
let server: McpServer;
let client: FigmaClient;
let registeredHandler: (args: Record<string, unknown>) => Promise<unknown>;
beforeEach(() => {
client = new FigmaClient('test-token');
server = {
tool: vi.fn((_name: string, _desc: string, _schema: unknown, handler: unknown) => {
registeredHandler = handler as (args: Record<string, unknown>) => Promise<unknown>;
}),
} as unknown as McpServer;
registerGetFigmaImage(server, client);
});
it('registers the tool with correct name', () => {
expect(server.tool).toHaveBeenCalledWith(
'get_figma_image',
expect.any(String),
expect.any(Object),
expect.any(Function),
);
});
it('returns error when URL has no node-id', async () => {
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test',
format: 'png',
scale: 2,
})) as {isError: boolean; content: Array<{text: string}>};
expect(result.isError).toBe(true);
expect(result.content[0].text).toContain('node-id is required');
});
it('returns image URL on success', async () => {
vi.spyOn(client, 'getImage').mockResolvedValueOnce({
err: null,
images: {'1:2': 'https://figma-cdn.example.com/image.png'},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test?node-id=1-2',
format: 'png',
scale: 2,
})) as {content: Array<{text: string}>};
expect(client.getImage).toHaveBeenCalledWith('AbCdEfGhIjKlMnOpQrStUv', ['1:2'], {
format: 'png',
scale: 2,
});
expect(result.content[0].text).toContain('https://figma-cdn.example.com/image.png');
});
it('returns error when Figma API returns error', async () => {
vi.spyOn(client, 'getImage').mockResolvedValueOnce({
err: 'Node not found',
images: {},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test?node-id=1-2',
format: 'png',
scale: 2,
})) as {isError: boolean; content: Array<{text: string}>};
expect(result.isError).toBe(true);
expect(result.content[0].text).toContain('Node not found');
});
it('returns error when no image URL is returned', async () => {
vi.spyOn(client, 'getImage').mockResolvedValueOnce({
err: null,
images: {'1:2': null},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test?node-id=1-2',
format: 'svg',
scale: 1,
})) as {isError: boolean; content: Array<{text: string}>};
expect(result.isError).toBe(true);
expect(result.content[0].text).toContain('No image returned');
});
});