SettingsMenu.utils.test.tsx91 lines · main
1import { renderHook } from '@testing-library/react'
2import { useFlag } from 'common'
3import { describe, expect, it, vi } from 'vitest'
4
5import { useGenerateSettingsMenu } from './SettingsMenu.utils'
6import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
7
8vi.mock('@/lib/constants', async () => {
9 const actual = await vi.importActual<Record<string, unknown>>('@/lib/constants')
10 return {
11 ...actual,
12 IS_PLATFORM: true,
13 }
14})
15
16vi.mock('common', () => ({
17 useFlag: vi.fn().mockReturnValue(false),
18 useParams: vi.fn().mockReturnValue({ ref: 'project-ref' }),
19}))
20
21vi.mock('@/hooks/misc/useSelectedOrganization', () => ({
22 useSelectedOrganizationQuery: vi.fn().mockReturnValue({ data: { slug: 'my-org' } }),
23}))
24
25vi.mock('@/hooks/misc/useSelectedProject', () => ({
26 useSelectedProjectQuery: vi.fn().mockReturnValue({ data: { status: 'ACTIVE_HEALTHY' } }),
27}))
28
29vi.mock('@/hooks/misc/useIsFeatureEnabled', () => ({
30 useIsFeatureEnabled: vi
31 .fn()
32 .mockReturnValue({ projectSettingsLegacyJwtKeys: false, billingAll: true }),
33}))
34
35vi.mock('@/components/interfaces/App/FeaturePreview/FeaturePreviewContext', () => ({
36 useIsPlatformWebhooksEnabled: vi.fn().mockReturnValue(true),
37}))
38
39describe('useGenerateSettingsMenu', () => {
40 it('includes webhooks when platformWebhooks feature is enabled', () => {
41 vi.mocked(useIsPlatformWebhooksEnabled).mockReturnValue(true)
42
43 const { result } = renderHook(() => useGenerateSettingsMenu())
44 const configurationGroup = result.current.find((group) => group.title === 'Configuration')
45 const hasWebhooks = configurationGroup?.items.some(
46 (item) => item.name === 'Webhooks' && item.url === '/project/project-ref/settings/webhooks'
47 )
48
49 expect(hasWebhooks).toBe(true)
50 })
51
52 it('hides webhooks when platformWebhooks feature is disabled', () => {
53 vi.mocked(useIsPlatformWebhooksEnabled).mockReturnValue(false)
54
55 const { result } = renderHook(() => useGenerateSettingsMenu())
56 const configurationGroup = result.current.find((group) => group.title === 'Configuration')
57 const hasWebhooks = configurationGroup?.items.some((item) => item.name === 'Webhooks')
58
59 expect(hasWebhooks).toBe(false)
60 })
61
62 it('does not include members link in project settings navigation', () => {
63 const { result } = renderHook(() => useGenerateSettingsMenu())
64 const configurationGroup = result.current.find((group) => group.title === 'Configuration')
65 const hasMembers = configurationGroup?.items.some((item) => item.name === 'Members')
66
67 expect(hasMembers).toBe(false)
68 })
69
70 it('includes dashboard in configuration when flag is enabled', () => {
71 vi.mocked(useFlag).mockReturnValue(true)
72
73 const { result } = renderHook(() => useGenerateSettingsMenu())
74 const configurationGroup = result.current.find((group) => group.title === 'Configuration')
75 const hasDashboardPreferences = configurationGroup?.items.some(
76 (item) => item.name === 'Dashboard' && item.url === '/project/project-ref/settings/dashboard'
77 )
78
79 expect(hasDashboardPreferences).toBe(true)
80 expect(result.current.find((group) => group.title === 'Preferences')).toBeUndefined()
81 })
82
83 it('hides dashboard in configuration when flag is disabled', () => {
84 vi.mocked(useFlag).mockReturnValue(false)
85
86 const { result } = renderHook(() => useGenerateSettingsMenu())
87 const configurationGroup = result.current.find((group) => group.title === 'Configuration')
88
89 expect(configurationGroup?.items.some((item) => item.name === 'Dashboard')).toBe(false)
90 })
91})