AdvisorPanel.utils.test.ts74 lines · main
1import { describe, expect, it } from 'vitest'
2
3import type { AdvisorSignalItem } from './AdvisorPanel.types'
4import {
5 createAdvisorLintItems,
6 createAdvisorNotificationItems,
7 getAdvisorItemSecondaryText,
8 sortAdvisorItems,
9} from './AdvisorPanel.utils'
10import type { Lint } from '@/data/lint/lint-query'
11import type { Notification } from '@/data/notifications/notifications-v2-query'
12
13const createLint = (overrides: Partial<Lint> = {}): Lint =>
14 ({
15 cache_key: 'lint-1',
16 name: 'unknown_lint',
17 detail: 'Critical lint detail',
18 level: 'ERROR',
19 categories: ['SECURITY'],
20 metadata: {},
21 ...overrides,
22 }) as Lint
23
24const createNotification = (overrides: Partial<Notification> = {}): Notification =>
25 ({
26 id: 'notification-1',
27 inserted_at: '2026-03-01T00:00:00.000Z',
28 priority: 'Info',
29 status: 'seen',
30 data: {
31 title: 'Notification title',
32 message: 'Notification body',
33 actions: [],
34 },
35 ...overrides,
36 }) as Notification
37
38const createBannedIPSignalItem = (ip: string): AdvisorSignalItem => ({
39 id: `signal:banned-ip:${ip}:v1`,
40 dismissalKey: `signal:banned-ip:${ip}:v1`,
41 source: 'signal',
42 type: 'banned-ip',
43 severity: 'warning',
44 tab: 'security',
45 title: 'Banned IP address',
46 summary: `The IP address \`${ip}\` is temporarily blocked.`,
47 docsUrl: 'https://supabase.com/docs/reference/cli/supabase-network-bans',
48 actions: [],
49 sourceData: { type: 'banned-ip', ip },
50})
51
52describe('AdvisorPanel.utils', () => {
53 it('orders mixed lint, signal and notification items by severity and recency', () => {
54 const lintItems = createAdvisorLintItems([
55 createLint({ cache_key: 'lint-critical', detail: 'Critical lint detail' }),
56 ])
57 const signalItems = [createBannedIPSignalItem('203.0.113.10')]
58 const notificationItems = createAdvisorNotificationItems([
59 createNotification({
60 id: 'notification-info',
61 data: { title: 'Notification title', message: 'Body', actions: [] },
62 }),
63 ])
64
65 const sorted = sortAdvisorItems([...notificationItems, ...signalItems, ...lintItems])
66
67 expect(sorted.map((item) => item.source)).toEqual(['lint', 'signal', 'notification'])
68 })
69
70 it('uses database surface-area metadata and the IP address for banned IP signals', () => {
71 const bannedIpSignal = createBannedIPSignalItem('203.0.113.10')
72 expect(getAdvisorItemSecondaryText(bannedIpSignal)).toBe('Database · 203.0.113.10')
73 })
74})