mirror of
https://github.com/supabase/supabase.git
synced 2026-05-09 02:09:50 -04:00
5a3fe010cd
## 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
281 lines
8.3 KiB
TypeScript
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',
|
|
])
|
|
})
|
|
})
|