diff --git a/__tests__/home.test.tsx b/__tests__/home.test.tsx index fb89915..9a8e20d 100644 --- a/__tests__/home.test.tsx +++ b/__tests__/home.test.tsx @@ -1,22 +1,19 @@ import React from 'react'; import { useRouter } from 'next/navigation'; import { useAuth } from '@clerk/nextjs'; -import { render, screen, waitFor } from '@testing-library/react'; -import { mockServer } from '../__mocks__/data'; +import { act, render, screen, waitFor } from '@testing-library/react'; import HomeClient from '@/app/client-page'; const signInUrl = process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL; jest.mock('next/navigation', () => ({ useRouter: jest.fn().mockReturnValue({ push: jest.fn(), - replace: jest.fn(), - back: jest.fn() - }), - useParams: jest.fn() + }) })); jest.mock('@clerk/nextjs', () => ({ useAuth: jest.fn().mockReturnValue({ - isSignedIn: false + isSignedIn: false, + isLoaded: true }), ClerkProvider: ({ children }: { children: React.ReactNode }) =>
{children}
})); @@ -26,8 +23,13 @@ jest.mock('next-themes', () => ({ jest.mock('@/hooks/use-modal-store', () => ({ useModal: jest.fn().mockReturnValue({ onOpen: jest.fn() }) })); +global.fetch = jest.fn(); describe('Home page', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + it('should redirect to ' + signInUrl + ' if the user is not signed in', async () => { const mockRouterPush = jest.fn(); (useRouter as jest.Mock).mockReturnValue({ @@ -35,46 +37,72 @@ describe('Home page', () => { }); (useAuth as jest.Mock).mockReturnValue({ - isSignedIn: false + isSignedIn: false, + isLoaded: true }); - render(); + await act(async () => { + render(); + }); await waitFor(() => { expect(mockRouterPush).toHaveBeenCalledWith(signInUrl); }); }); - it('should render welcome message if the user is signed in', () => { + it('should render welcome message if the user is signed in', async () => { (useRouter as jest.Mock).mockReturnValue({ push: jest.fn() }); (useAuth as jest.Mock).mockReturnValue({ - isSignedIn: true + isSignedIn: true, + isLoaded: true }); - render(); + (fetch as jest.Mock).mockResolvedValue({ + json: jest.fn().mockResolvedValue({ serverUrl: null }) + }); + + await act(async () => { + render(); + }); expect(screen.getByText(/Get started by editing/i)).toBeInTheDocument(); }); - it('should render "Create your first server" button when serverUrl is null', () => { + it('should render "Create your first server" button when serverUrl is null', async () => { (useAuth as jest.Mock).mockReturnValue({ - isSignedIn: true + isSignedIn: true, + isLoaded: true }); - render(); + (fetch as jest.Mock).mockResolvedValue({ + json: jest.fn().mockResolvedValue({ serverUrl: null }) + }); - expect(screen.getByText('Create your first server')).toBeInTheDocument(); + await act(async () => { + render(); + }); + + await waitFor(() => { + expect(screen.getByText('Create your first server')).toBeInTheDocument(); + }); }); - it('should render "Start now" button when serverUrl is provided', () => { + it('should render "Start now" button when serverUrl is provided', async () => { (useAuth as jest.Mock).mockReturnValue({ - isSignedIn: true + isSignedIn: true, + isLoaded: true }); - render(); + (fetch as jest.Mock).mockResolvedValue({ + json: jest.fn().mockResolvedValue({ serverUrl: '/servers/12345' }) + }); + + await act(async () => { + render(); + }); - const startNowButton = screen.getByText('Start now'); + const startNowButton = await screen.findByText('Start now'); expect(startNowButton).toBeInTheDocument(); - expect(startNowButton).toHaveAttribute('href', `/servers/${mockServer.id}`); + expect(startNowButton).toHaveAttribute('href', '/servers/12345'); }); });