import { describe, it, expect, vi, beforeEach } from 'vitest';
import { createInnodbResource } from '../innodb.js';
import type { MySQLAdapter } from '../../MySQLAdapter.js';
import { createMockMySQLAdapter, createMockRequestContext, createMockQueryResult } from '../../../../__tests__/mocks/index.js';
describe('InnoDB Resource', () => {
let mockAdapter: ReturnType<typeof createMockMySQLAdapter>;
let mockContext: ReturnType<typeof createMockRequestContext>;
beforeEach(() => {
vi.clearAllMocks();
mockAdapter = createMockMySQLAdapter();
mockContext = createMockRequestContext();
});
it('should return buffer pool statistics', async () => {
// Mock buffer pool status
mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([
{ Variable_name: 'Innodb_buffer_pool_read_requests', Value: '10000' },
{ Variable_name: 'Innodb_buffer_pool_reads', Value: '100' },
{ Variable_name: 'Innodb_buffer_pool_pages_total', Value: '8192' },
{ Variable_name: 'Innodb_buffer_pool_pages_free', Value: '1000' },
{ Variable_name: 'Innodb_buffer_pool_pages_data', Value: '7000' },
{ Variable_name: 'Innodb_buffer_pool_pages_dirty', Value: '50' },
{ Variable_name: 'Innodb_buffer_pool_write_requests', Value: '5000' }
]));
// Mock config
mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([
{ Variable_name: 'innodb_buffer_pool_size', Value: '134217728' },
{ Variable_name: 'innodb_buffer_pool_instances', Value: '1' }
]));
// Mock row operations
mockAdapter.executeQuery.mockResolvedValueOnce(createMockQueryResult([
{ Variable_name: 'Innodb_rows_read', Value: '50000' },
{ Variable_name: 'Innodb_rows_inserted', Value: '1000' }
]));
const resource = createInnodbResource(mockAdapter as unknown as MySQLAdapter);
const result = await resource.handler('mysql://innodb', mockContext) as { buffer_pool: { hit_ratio_percent: number } };
expect(result).toHaveProperty('io');
});
it('should handle missing buffer pool stats (division by zero protection)', async () => {
// Mock empty stats
mockAdapter.executeQuery.mockResolvedValue(createMockQueryResult([]));
const resource = createInnodbResource(mockAdapter as unknown as MySQLAdapter);
const result = await resource.handler('mysql://innodb', mockContext) as any;
expect(result.buffer_pool.hit_ratio_percent).toBe(100); // Default when requests=0
expect(result.buffer_pool.pages.dirty_percent).toBe(0); // Default when total=0
expect(result.buffer_pool.size_bytes).toBe(0);
});
it('should parse configuration integers correctly', async () => {
mockAdapter.executeQuery
.mockResolvedValueOnce(createMockQueryResult([])) // buffer pool stats
.mockResolvedValueOnce(createMockQueryResult([ // config
{ Variable_name: 'innodb_buffer_pool_size', Value: '1024' },
{ Variable_name: 'innodb_buffer_pool_instances', Value: '2' }
]))
.mockResolvedValueOnce(createMockQueryResult([])); // row ops
const resource = createInnodbResource(mockAdapter as unknown as MySQLAdapter);
const result = await resource.handler('mysql://innodb', mockContext) as any;
expect(result.buffer_pool.size_bytes).toBe(1024);
expect(result.buffer_pool.instances).toBe(2);
});
});