Barazo default frontend
barazo.forum
1/**
2 * Tests for new topic page.
3 */
4
5import { describe, it, expect, vi, beforeAll, beforeEach, afterAll, afterEach } from 'vitest'
6import { render, screen, cleanup } from '@testing-library/react'
7import { setupServer } from 'msw/node'
8import { handlers } from '@/mocks/handlers'
9import { createMockOnboardingContext } from '@/test/mock-onboarding'
10import NewTopicPage from './page'
11
12vi.mock('@/context/onboarding-context', () => ({
13 useOnboardingContext: () => createMockOnboardingContext(),
14}))
15
16const server = setupServer(...handlers)
17
18const mockStorage: Record<string, string> = {}
19
20beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
21beforeEach(() => {
22 vi.stubGlobal('localStorage', {
23 getItem: vi.fn((key: string) => mockStorage[key] ?? null),
24 setItem: vi.fn((key: string, value: string) => {
25 mockStorage[key] = value
26 }),
27 removeItem: vi.fn((key: string) => {
28 delete mockStorage[key]
29 }),
30 clear: vi.fn(),
31 length: 0,
32 key: vi.fn(),
33 })
34 mockStorage['accessToken'] = 'test-token'
35})
36afterEach(() => {
37 cleanup()
38 server.resetHandlers()
39})
40afterAll(() => server.close())
41
42// Mock next/navigation
43vi.mock('next/navigation', () => ({
44 useRouter: () => ({
45 push: vi.fn(),
46 replace: vi.fn(),
47 back: vi.fn(),
48 }),
49 useSearchParams: () => new URLSearchParams(),
50 redirect: vi.fn(),
51}))
52
53vi.mock('@/hooks/use-auth', () => ({
54 useAuth: () => ({
55 user: {
56 did: 'did:plc:user-jay-001',
57 handle: 'jay.bsky.team',
58 displayName: 'Jay',
59 avatarUrl: null,
60 },
61 isAuthenticated: true,
62 isLoading: false,
63 getAccessToken: () => 'mock-access-token',
64 login: vi.fn(),
65 logout: vi.fn(),
66 setSessionFromCallback: vi.fn(),
67 authFetch: vi.fn(),
68 }),
69}))
70
71describe('NewTopicPage', () => {
72 it('renders create topic heading', () => {
73 render(<NewTopicPage />)
74 expect(screen.getByRole('heading', { name: 'Create new topic' })).toBeInTheDocument()
75 })
76
77 it('renders topic form', () => {
78 render(<NewTopicPage />)
79 expect(screen.getByRole('textbox', { name: 'Title' })).toBeInTheDocument()
80 expect(screen.getByRole('textbox', { name: 'Content' })).toBeInTheDocument()
81 expect(screen.getByRole('button', { name: 'Create Topic' })).toBeInTheDocument()
82 })
83
84 it('renders breadcrumbs', () => {
85 render(<NewTopicPage />)
86 const nav = screen.getByRole('navigation', { name: /breadcrumb/i })
87 expect(nav).toHaveTextContent('Home')
88 expect(nav).toHaveTextContent('New topic')
89 })
90})