Panno-AI-API / src /tests /Navbar.test.tsx
GitHub Actions Bot
Sync: Thu Feb 12 07:00:42 UTC 2026
dce7eca
import { render, screen, fireEvent } from '@testing-library/react'
import Navbar from '@/components/Navbar'
import { useSession, signIn, signOut } from 'next-auth/react'
// Mocks are already setup in global or hoisted.
// But we need to control useSession specifically here.
// In jest.setup.js? No, I mocked it globally?
// No, I mocked it in Navbar.test.tsx previously.
// But jest resets mocks.
// So I mock it here again.
jest.mock('next-auth/react', () => ({
useSession: jest.fn(() => ({ data: null, status: 'unauthenticated' })),
signIn: jest.fn(),
signOut: jest.fn(),
}))
describe('Navbar', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('renders logo and sign in button when logged out', () => {
(useSession as jest.Mock).mockReturnValue({ data: null, status: 'unauthenticated' })
render(<Navbar />)
expect(screen.getByText('PanoAI')).toBeInTheDocument()
const signInBtn = screen.getByText('Sign In')
expect(signInBtn).toBeInTheDocument()
fireEvent.click(signInBtn)
expect(signIn).toHaveBeenCalledWith('google')
})
it('renders user info and sign out button when logged in', () => {
const mockUser = { name: 'Test User', email: 'test@example.com', image: 'test.jpg' };
(useSession as jest.Mock).mockReturnValue({
data: { user: mockUser },
status: 'authenticated'
})
render(<Navbar />)
expect(screen.getByText('Test User')).toBeInTheDocument()
expect(screen.getByText('test@example.com')).toBeInTheDocument()
// Sign out button is an icon button. LogOut icon mocked as icon-LogOut
// Find by icon testid
const signOutBtn = screen.getByTestId('icon-LogOut').closest('button')
fireEvent.click(signOutBtn!)
expect(signOut).toHaveBeenCalled()
})
})