AdvisorPanel.utils.test.ts 2.4 KB

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