SettingsMenu.utils.test.tsx91 lines · main
| 1 | import { renderHook } from '@testing-library/react' |
| 2 | import { useFlag } from 'common' |
| 3 | import { describe, expect, it, vi } from 'vitest' |
| 4 | |
| 5 | import { useGenerateSettingsMenu } from './SettingsMenu.utils' |
| 6 | import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' |
| 7 | |
| 8 | vi.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 | |
| 16 | vi.mock('common', () => ({ |
| 17 | useFlag: vi.fn().mockReturnValue(false), |
| 18 | useParams: vi.fn().mockReturnValue({ ref: 'project-ref' }), |
| 19 | })) |
| 20 | |
| 21 | vi.mock('@/hooks/misc/useSelectedOrganization', () => ({ |
| 22 | useSelectedOrganizationQuery: vi.fn().mockReturnValue({ data: { slug: 'my-org' } }), |
| 23 | })) |
| 24 | |
| 25 | vi.mock('@/hooks/misc/useSelectedProject', () => ({ |
| 26 | useSelectedProjectQuery: vi.fn().mockReturnValue({ data: { status: 'ACTIVE_HEALTHY' } }), |
| 27 | })) |
| 28 | |
| 29 | vi.mock('@/hooks/misc/useIsFeatureEnabled', () => ({ |
| 30 | useIsFeatureEnabled: vi |
| 31 | .fn() |
| 32 | .mockReturnValue({ projectSettingsLegacyJwtKeys: false, billingAll: true }), |
| 33 | })) |
| 34 | |
| 35 | vi.mock('@/components/interfaces/App/FeaturePreview/FeaturePreviewContext', () => ({ |
| 36 | useIsPlatformWebhooksEnabled: vi.fn().mockReturnValue(true), |
| 37 | })) |
| 38 | |
| 39 | describe('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 | }) |