import {describe, it, expect, vi, beforeEach} from 'vitest';
import {McpServer} from '@modelcontextprotocol/sdk/server/mcp.js';
import {registerGetFigmaContext} from '../../src/tools/get-figma-context.js';
import {FigmaClient} from '../../src/figma-client.js';
import {sampleFrameNode} from '../fixtures/figma-responses.js';
describe('get_figma_context tool', () => {
let server: McpServer;
let client: FigmaClient;
let registeredHandler: (args: Record<string, unknown>) => Promise<unknown>;
beforeEach(() => {
client = new FigmaClient('test-token');
// Capture the tool handler when it's registered
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;
registerGetFigmaContext(server, client);
});
it('registers the tool with correct name', () => {
expect(server.tool).toHaveBeenCalledWith(
'get_figma_context',
expect.any(String),
expect.any(Object),
expect.any(Function),
);
});
it('fetches file nodes when URL has node-id', async () => {
vi.spyOn(client, 'getFileNodes').mockResolvedValueOnce({
nodes: {
'1:2': {document: sampleFrameNode},
},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test?node-id=1-2',
depth: 3,
})) as {content: Array<{text: string}>};
expect(client.getFileNodes).toHaveBeenCalledWith('AbCdEfGhIjKlMnOpQrStUv', ['1:2'], 3);
const parsed = JSON.parse(result.content[0].text);
expect(parsed).toHaveLength(1);
expect(parsed[0].name).toBe('Card');
});
it('fetches full file when URL has no node-id', async () => {
vi.spyOn(client, 'getFile').mockResolvedValueOnce({
document: {
id: '0:0',
name: 'Document',
type: 'DOCUMENT',
children: [],
},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test',
depth: 3,
})) as {content: Array<{text: string}>};
expect(client.getFile).toHaveBeenCalledWith('AbCdEfGhIjKlMnOpQrStUv', undefined, 3);
const parsed = JSON.parse(result.content[0].text);
expect(parsed).toHaveLength(1);
});
it('returns message when no visible nodes found', async () => {
vi.spyOn(client, 'getFileNodes').mockResolvedValueOnce({
nodes: {},
});
const result = (await registeredHandler({
figmaUrl: 'https://www.figma.com/design/AbCdEfGhIjKlMnOpQrStUv/Test?node-id=1-2',
depth: 3,
})) as {content: Array<{text: string}>};
expect(result.content[0].text).toContain('No visible nodes');
});
});