| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import { safeSql } from '@supabase/pg-meta'
- import { describe, expect, it, vi } from 'vitest'
- import { hasIndexRecommendations } from '../../QueryPerformance/IndexAdvisor/index-advisor.utils'
- import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types'
- import { classifyQuery } from './useQueryInsightsIssues.utils'
- vi.mock('../../QueryPerformance/IndexAdvisor/index-advisor.utils', () => ({
- hasIndexRecommendations: vi.fn(),
- }))
- const baseRow: QueryPerformanceRow = {
- query: safeSql`SELECT * FROM users`,
- calls: 10,
- mean_time: 50,
- min_time: 10,
- max_time: 200,
- total_time: 500,
- prop_total_time: 5,
- rows_read: 100,
- cache_hit_rate: 1,
- rolname: 'postgres',
- application_name: 'test',
- index_advisor_result: null,
- _total_cache_hits: 0,
- _total_cache_misses: 0,
- }
- describe('classifyQuery', () => {
- it('returns error when index_advisor_result has errors', () => {
- const row = {
- ...baseRow,
- index_advisor_result: {
- errors: ['some error'],
- index_statements: [],
- startup_cost_before: 0,
- startup_cost_after: 0,
- total_cost_before: 0,
- total_cost_after: 0,
- },
- }
- const result = classifyQuery(row)
- expect(result.issueType).toBe('error')
- expect(result.hint).toBe('some error')
- })
- it('returns index when hasIndexRecommendations is true', () => {
- vi.mocked(hasIndexRecommendations).mockReturnValue(true)
- const row = {
- ...baseRow,
- index_advisor_result: {
- errors: [],
- index_statements: [safeSql`CREATE INDEX ...`],
- startup_cost_before: 0,
- startup_cost_after: 0,
- total_cost_before: 0,
- total_cost_after: 0,
- },
- }
- const result = classifyQuery(row)
- expect(result.issueType).toBe('index')
- expect(result.hint).toContain('Missing index')
- vi.mocked(hasIndexRecommendations).mockReset()
- })
- it('returns slow when mean_time exceeds threshold', () => {
- vi.mocked(hasIndexRecommendations).mockReturnValue(false)
- const row = { ...baseRow, mean_time: 300 }
- const result = classifyQuery(row)
- expect(result.issueType).toBe('slow')
- expect(result.hint).toBe('Abnormally slow query detected')
- vi.mocked(hasIndexRecommendations).mockReset()
- })
- it('returns null issue for healthy queries', () => {
- vi.mocked(hasIndexRecommendations).mockReturnValue(false)
- const row = { ...baseRow, mean_time: 50 }
- const result = classifyQuery(row)
- expect(result.issueType).toBeNull()
- expect(result.hint).toBe('')
- vi.mocked(hasIndexRecommendations).mockReset()
- })
- it('errors take priority over index recommendations', () => {
- vi.mocked(hasIndexRecommendations).mockReturnValue(true)
- const row = {
- ...baseRow,
- index_advisor_result: {
- errors: ['critical error'],
- index_statements: [safeSql`CREATE INDEX ...`],
- startup_cost_before: 0,
- startup_cost_after: 0,
- total_cost_before: 0,
- total_cost_after: 0,
- },
- }
- const result = classifyQuery(row)
- expect(result.issueType).toBe('error')
- vi.mocked(hasIndexRecommendations).mockReset()
- })
- })
|