| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import { describe, expect, it } from 'vitest'
- import { PRESET_CONFIG } from './Reports.constants'
- import { Presets } from './Reports.types'
- const queries = PRESET_CONFIG[Presets.QUERY_PERFORMANCE].queries as Record<
- string,
- { safeSql: (...args: any[]) => string }
- >
- const queryNames = [
- 'mostFrequentlyInvoked',
- 'mostTimeConsuming',
- 'slowestExecutionTime',
- 'unified',
- 'slowQueriesCount',
- 'queryMetrics',
- ] as const
- describe('QUERY_PERFORMANCE SQL queries', () => {
- describe('calls > 0 base filter', () => {
- it.each(queryNames)('%s includes calls > 0 without user filters', (name) => {
- const sql = queries[name].safeSql([], undefined, undefined)
- expect(sql).toContain('calls > 0')
- })
- it.each(queryNames)('%s still includes calls > 0 when user filters are provided', (name) => {
- const sql = queries[name].safeSql([], "WHERE auth.rolname in ('postgres')", undefined)
- expect(sql).toContain('calls > 0')
- })
- })
- describe('WHERE clause composition with user filters', () => {
- const userWhere = "WHERE auth.rolname in ('postgres')"
- it.each([
- 'mostFrequentlyInvoked',
- 'mostTimeConsuming',
- 'slowestExecutionTime',
- 'unified',
- ] as const)('%s: user filters appended with AND (no duplicate WHERE)', (name) => {
- const sql = queries[name].safeSql([], userWhere, undefined)
- // Should not have two WHERE keywords in a row / duplicate WHERE
- expect(sql).not.toMatch(/WHERE\s+.*WHERE/s)
- // User filter condition should be present
- expect(sql).toContain("auth.rolname in ('postgres')")
- // Should use AND to join base filter and user filter
- expect(sql).toMatch(/calls > 0\s+AND/)
- })
- it('queryMetrics: user filters appended with AND (no duplicate WHERE in FROM clause)', () => {
- const sql = queries.queryMetrics.safeSql([], userWhere, undefined)
- // queryMetrics uses COUNT(*) FILTER (WHERE ...) which is valid SQL and not a duplicate
- // Just verify the base filter + user filter are correctly composed
- expect(sql).toContain("auth.rolname in ('postgres')")
- expect(sql).toMatch(/calls > 0\s+AND/)
- // Should not have two WHERE keywords after the FROM keyword
- expect(sql).not.toMatch(/FROM[\s\S]*WHERE[\s\S]*WHERE[\s\S]*WHERE/s)
- })
- it.each([
- 'mostFrequentlyInvoked',
- 'mostTimeConsuming',
- 'slowestExecutionTime',
- 'unified',
- 'queryMetrics',
- ] as const)('%s: no trailing junk when no user filters', (name) => {
- const sql = queries[name].safeSql([], undefined, undefined)
- // Should not have a dangling undefined or 'WHERE' with nothing after the base filter
- expect(sql).not.toContain('undefined')
- expect(sql).not.toMatch(/calls > 0\s+AND\s+(ORDER|LIMIT|$)/im)
- })
- })
- describe('slowQueriesCount bug fix', () => {
- it('uses table alias "statements"', () => {
- const sql = queries.slowQueriesCount.safeSql()
- expect(sql).toContain('pg_stat_statements as statements')
- })
- it('filters by mean_exec_time using the alias', () => {
- const sql = queries.slowQueriesCount.safeSql()
- expect(sql).toContain('statements.mean_exec_time > 1000')
- })
- })
- describe('window function elimination', () => {
- it('unified uses grand_total CTE instead of OVER()', () => {
- const sql = queries.unified.safeSql([], undefined, undefined)
- expect(sql).toContain('grand_total')
- expect(sql).not.toContain('OVER()')
- })
- it('mostTimeConsuming uses grand_total CTE instead of OVER()', () => {
- const sql = queries.mostTimeConsuming.safeSql([], undefined, undefined)
- expect(sql).toContain('grand_total')
- expect(sql).not.toContain('OVER()')
- })
- it('grand_total CTE references calls > 0', () => {
- const sql = queries.unified.safeSql([], undefined, undefined)
- expect(sql).toMatch(/grand_total[\s\S]*calls > 0/)
- })
- })
- describe('multiple user filters', () => {
- it('handles multiple user filter conditions', () => {
- const multiWhere = "WHERE auth.rolname in ('postgres') AND statements.calls >= 10"
- const sql = queries.mostFrequentlyInvoked.safeSql([], multiWhere, undefined)
- expect(sql).toContain('calls > 0')
- expect(sql).toContain("auth.rolname in ('postgres')")
- expect(sql).toContain('statements.calls >= 10')
- expect(sql).not.toMatch(/WHERE\s+.*WHERE/s)
- })
- })
- })
|