Files
supabase/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.test.tsx
Ali Waseem 5a3fe010cd fix: refactor nav bar to be more testable, add unit tests (#43867)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

- refactor navigation utils to pass in is_platform 
- write unit tests for configuration returns 
- default is always passed from constant IS_PLATFORM
2026-03-18 08:32:16 -06:00

281 lines
8.3 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
generateObservabilityMenuItems,
type ObservabilityMenuSection,
} from './ObservabilityMenu.utils'
const REF = 'test-project-ref'
const QUERY_PARAMS = ''
const sectionTitles = (sections: ObservabilityMenuSection[]) => sections.map((s) => s.title)
const itemKeys = (section: ObservabilityMenuSection | undefined) =>
section?.items.map((i) => i.key) ?? []
const findSection = (sections: ObservabilityMenuSection[], title: string) =>
sections.find((s) => s.title === title)
describe('generateObservabilityMenuItems - PRODUCT section', () => {
it('includes PRODUCT section on platform', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: true,
})
expect(sectionTitles(menu)).toContain('PRODUCT')
const productSection = findSection(menu, 'PRODUCT')
expect(itemKeys(productSection)).toEqual([
'database',
'postgrest',
'auth',
'edge-functions',
'storage',
'realtime',
])
})
it('excludes PRODUCT section in self-hosted mode', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
expect(sectionTitles(menu)).not.toContain('PRODUCT')
expect(menu.length).toBe(1) // Only GENERAL section
})
it('excludes Storage from PRODUCT when storageSupported is false', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: false,
isPlatform: true,
})
const productSection = findSection(menu, 'PRODUCT')
expect(itemKeys(productSection)).not.toContain('storage')
expect(itemKeys(productSection)).toEqual([
'database',
'postgrest',
'auth',
'edge-functions',
'realtime',
])
})
it('includes Storage in PRODUCT when storageSupported is true', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: true,
})
const productSection = findSection(menu, 'PRODUCT')
expect(itemKeys(productSection)).toContain('storage')
})
})
describe('generateObservabilityMenuItems - GENERAL section', () => {
it('always includes GENERAL section', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
expect(sectionTitles(menu)).toContain('GENERAL')
})
it('includes Query Performance when supamonitor is disabled', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).toContain('query-performance')
expect(itemKeys(generalSection)).not.toContain('query-insights')
})
it('includes Query Insights when supamonitor is enabled', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: true,
storageSupported: true,
isPlatform: false,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).toContain('query-insights')
expect(itemKeys(generalSection)).not.toContain('query-performance')
})
it('includes Overview when showOverview is true', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: true,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).toContain('observability')
})
it('excludes Overview when showOverview is false', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).not.toContain('observability')
})
it('includes API Gateway on platform', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: true,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).toContain('api-overview')
})
it('excludes API Gateway in self-hosted mode', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).not.toContain('api-overview')
})
})
describe('generateObservabilityMenuItems - URL construction', () => {
it('constructs correct URLs with preserved query params', () => {
const params = '?its=2024-01-01&ite=2024-01-31'
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: params,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: true,
})
const generalSection = findSection(menu, 'GENERAL')
const queryPerfItem = generalSection?.items.find((i) => i.key === 'query-performance')
expect(queryPerfItem?.url).toBe(`/project/${REF}/observability/query-performance${params}`)
const productSection = findSection(menu, 'PRODUCT')
const databaseItem = productSection?.items.find((i) => i.key === 'database')
expect(databaseItem?.url).toBe(`/project/${REF}/observability/database${params}`)
})
it('handles undefined ref', () => {
const menu = generateObservabilityMenuItems({
ref: undefined,
preservedQueryParams: QUERY_PARAMS,
showOverview: false,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: true,
})
const generalSection = findSection(menu, 'GENERAL')
const queryPerfItem = generalSection?.items.find((i) => i.key === 'query-performance')
expect(queryPerfItem?.url).toBe('/project/undefined/observability/query-performance')
})
})
describe('generateObservabilityMenuItems - complete structure', () => {
it('returns only GENERAL in self-hosted with all standard items', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: true,
isSupamonitorEnabled: false,
storageSupported: true,
isPlatform: false,
})
expect(menu.length).toBe(1)
expect(menu[0].title).toBe('GENERAL')
expect(itemKeys(menu[0])).toEqual([
'observability', // Overview
'query-performance',
// API Gateway excluded
])
})
it('returns GENERAL and PRODUCT on platform with all items', () => {
const menu = generateObservabilityMenuItems({
ref: REF,
preservedQueryParams: QUERY_PARAMS,
showOverview: true,
isSupamonitorEnabled: true,
storageSupported: true,
isPlatform: true,
})
expect(menu.length).toBe(2)
expect(sectionTitles(menu)).toEqual(['GENERAL', 'PRODUCT'])
const generalSection = findSection(menu, 'GENERAL')
expect(itemKeys(generalSection)).toEqual([
'observability', // Overview
'query-insights', // Supamonitor enabled
'api-overview', // Platform only
])
const productSection = findSection(menu, 'PRODUCT')
expect(itemKeys(productSection)).toEqual([
'database',
'postgrest',
'auth',
'edge-functions',
'storage',
'realtime',
])
})
})