/**
* mysql-mcp - Prompts Unit Tests
*
* Tests for prompt definitions using centralized mocks.
*/
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { getMySQLPrompts } from '../index.js';
import type { MySQLAdapter } from '../../MySQLAdapter.js';
import { createMockMySQLAdapter, createMockRequestContext } from '../../../../__tests__/mocks/index.js';
describe('getMySQLPrompts', () => {
let prompts: ReturnType<typeof getMySQLPrompts>;
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
prompts = getMySQLPrompts(mockAdapter as unknown as MySQLAdapter);
});
it('should return 19 prompts', () => {
expect(prompts).toHaveLength(19);
});
it('should have handler functions for all prompts', () => {
for (const prompt of prompts) {
expect(typeof prompt.handler).toBe('function');
}
});
it('should have descriptions for all prompts', () => {
for (const prompt of prompts) {
expect(prompt.description).toBeDefined();
expect(prompt.description.length).toBeGreaterThan(0);
}
});
it('should have unique names for all prompts', () => {
const names = prompts.map(p => p.name);
const uniqueNames = new Set(names);
expect(uniqueNames.size).toBe(names.length);
});
});
describe('Prompt Handler Execution', () => {
let prompts: ReturnType<typeof getMySQLPrompts>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
const mockAdapter = createMockMySQLAdapter();
prompts = getMySQLPrompts(mockAdapter as unknown as MySQLAdapter);
mockContext = createMockRequestContext();
});
const findPrompt = (name: string) => prompts.find(p => p.name === name);
describe('mysql_query_builder', () => {
it('should return message with query guidance', async () => {
const prompt = findPrompt('mysql_query_builder');
expect(prompt).toBeDefined();
const result = await prompt!.handler({ query_type: 'SELECT', table: 'users' }, mockContext) as string;
expect(typeof result).toBe('string');
expect(result).toContain('query');
expect(result).toContain('table');
});
});
describe('mysql_tool_index', () => {
it('should return tool index content', async () => {
const prompt = findPrompt('mysql_tool_index');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext) as string;
expect(typeof result).toBe('string');
expect(result).toContain('tool');
});
});
describe('mysql_quick_query', () => {
it('should return read query guidance by default', async () => {
const prompt = findPrompt('mysql_quick_query');
const result = await prompt!.handler({ query: 'SELECT * FROM users' }, mockContext) as string;
expect(result).toContain('mysql_read_query');
});
it('should return write query guidance when type is write', async () => {
const prompt = findPrompt('mysql_quick_query');
const result = await prompt!.handler({ sql: 'INSERT INTO users...', type: 'write' }, mockContext) as string;
expect(result).toContain('mysql_write_query');
});
});
describe('mysql_schema_design', () => {
it('should return schema design guidance', async () => {
const prompt = findPrompt('mysql_schema_design');
const result = await prompt!.handler({ entity: 'User' }, mockContext) as string;
expect(result).toContain('CREATE TABLE');
});
it('should include specific requirements if provided', async () => {
const prompt = findPrompt('mysql_schema_design');
const result = await prompt!.handler({ entity: 'User', requirements: 'Must include email indexing' }, mockContext) as string;
expect(result).toContain('Must include email indexing');
});
});
describe('mysql_performance_analysis', () => {
it('should return performance analysis guidance', async () => {
const prompt = findPrompt('mysql_performance_analysis');
const result = await prompt!.handler({ query: 'SELECT * FROM slow_table' }, mockContext) as string;
expect(result).toContain('EXPLAIN');
});
it('should include context if provided', async () => {
const prompt = findPrompt('mysql_performance_analysis');
const result = await prompt!.handler({ query: 'SELECT * FROM slow_table', context: 'Table has 1M rows' }, mockContext) as string;
expect(result).toContain('Table has 1M rows');
});
});
describe('mysql_migration', () => {
it('should return migration guidance', async () => {
const prompt = findPrompt('mysql_migration');
expect(prompt).toBeDefined();
const result = await prompt!.handler({ change: 'Add column', table: 'users' }, mockContext) as string;
expect(typeof result).toBe('string');
expect(result).toContain('migration');
});
});
describe('mysql_database_health_check', () => {
it('should return health check guidance', async () => {
const prompt = findPrompt('mysql_database_health_check');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('health');
});
it('should include focus area if provided', async () => {
const prompt = findPrompt('mysql_database_health_check');
const result = await prompt!.handler({ focus: 'security' }, mockContext) as string;
expect(result).toContain('**Focus area:** security');
});
});
describe('mysql_backup_strategy', () => {
it('should return backup strategy guidance', async () => {
const prompt = findPrompt('mysql_backup_strategy');
expect(prompt).toBeDefined();
const result = await prompt!.handler({ rto: '1 hour', rpo: '15 minutes' }, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('backup');
});
it('should handle missing arguments with defaults', async () => {
const prompt = findPrompt('mysql_backup_strategy');
const result = await prompt!.handler({}, mockContext) as string;
expect(result).toContain('to be determined');
expect(result).toContain('unknown');
});
});
describe('mysql_quick_schema', () => {
it('should return schema exploration guidance (list tables) when no table specified', async () => {
const prompt = findPrompt('mysql_quick_schema');
const result = await prompt!.handler({}, mockContext) as string;
expect(result).toContain('mysql_list_tables');
});
it('should return describe table guidance when table is specified', async () => {
const prompt = findPrompt('mysql_quick_schema');
const result = await prompt!.handler({ table: 'users' }, mockContext) as string;
expect(result).toContain('mysql_describe_table');
expect(result).toContain('users');
});
});
describe('mysql_index_tuning', () => {
it('should return index tuning guidance', async () => {
const prompt = findPrompt('mysql_index_tuning');
expect(prompt).toBeDefined();
const result = await prompt!.handler({ table: 'orders' }, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('orders');
});
});
describe('mysql_setup_router', () => {
it('should return router setup guidance', async () => {
const prompt = findPrompt('mysql_setup_router');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('Router');
});
});
describe('mysql_setup_proxysql', () => {
it('should return proxysql setup guidance', async () => {
const prompt = findPrompt('mysql_setup_proxysql');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('ProxySQL');
});
});
describe('mysql_setup_replication', () => {
it('should return replication setup guidance', async () => {
const prompt = findPrompt('mysql_setup_replication');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('replication');
});
it('should return semisync configuration when requested', async () => {
const prompt = findPrompt('mysql_setup_replication');
const result = await prompt!.handler({ type: 'semisync' }, mockContext) as string;
expect(result).toContain('rpl_semi_sync_replica_enabled');
});
});
describe('mysql_setup_shell', () => {
it('should return shell setup guidance', async () => {
const prompt = findPrompt('mysql_setup_shell');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('MySQL Shell');
});
});
describe('mysql_setup_events', () => {
it('should return event scheduler guidance', async () => {
const prompt = findPrompt('mysql_setup_events');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('event');
});
});
describe('mysql_sys_schema_guide', () => {
it('should return sys schema guidance', async () => {
const prompt = findPrompt('mysql_sys_schema_guide');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('sys');
});
});
describe('mysql_setup_spatial', () => {
it('should return spatial setup guidance', async () => {
const prompt = findPrompt('mysql_setup_spatial');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('spatial');
});
});
describe('mysql_setup_cluster', () => {
it('should return cluster setup guidance', async () => {
const prompt = findPrompt('mysql_setup_cluster');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('cluster');
});
});
describe('mysql_setup_docstore', () => {
it('should return docstore setup guidance', async () => {
const prompt = findPrompt('mysql_setup_docstore');
expect(prompt).toBeDefined();
const result = await prompt!.handler({}, mockContext);
expect(typeof result).toBe('string');
expect(result).toContain('document');
});
});
});