import * as React from 'react'; import { render, screen, waitFor, cleanup } from '@testing-library/react'; import { FullApp, Embedded } from './TanStackRouterAdmin.stories'; describe('TanStack Router Admin', () => { beforeEach(() => { window.location.hash = ''; window.scrollTo = jest.fn(); }); afterEach(() => { cleanup(); window.location.hash = ''; }); describe('standalone mode', () => { it('renders the dashboard', async () => { render(); await waitFor(() => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }); }); it('navigates to resource list via menu', async () => { render(); await waitFor(() => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }); screen.getAllByText('Posts')[0].click(); await waitFor(() => { expect(screen.getByText('Hello World')).toBeInTheDocument(); }); }); it('navigates between resources', async () => { render(); await waitFor(() => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }); screen.getAllByText('Posts')[0].click(); await waitFor(() => { expect(screen.getByText('Hello World')).toBeInTheDocument(); }); screen.getAllByText('Comments')[0].click(); await waitFor(() => { expect(screen.getByText('Alice')).toBeInTheDocument(); }); }); it('navigates to custom route', async () => { render(); await waitFor(() => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }); screen.getByText('Go to Settings').click(); await waitFor(() => { expect( screen.getByText('Application Settings') ).toBeInTheDocument(); }); }); it('navigates between TabbedForm tabs', async () => { render(); await waitFor(() => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }); // Navigate to comments list screen.getAllByText('Comments')[0].click(); await waitFor(() => { expect(screen.getByText('Alice')).toBeInTheDocument(); }); // Click edit on first comment screen.getAllByRole('link', { name: 'Edit' })[0].click(); // Wait for edit form to load - first tab "Content" should be active await waitFor(() => { expect( screen.getByRole('tab', { name: 'Content' }) ).toHaveAttribute('aria-selected', 'true'); }); // Click on the "Metadata" tab screen.getByRole('tab', { name: 'Metadata' }).click(); // Verify second tab is now selected await waitFor(() => { expect( screen.getByRole('tab', { name: 'Metadata' }) ).toHaveAttribute('aria-selected', 'true'); }); }); }); describe('embedded mode', () => { it('renders the frontend home page initially', async () => { render(); await waitFor(() => { expect( screen.getByText('Welcome to the App') ).toBeInTheDocument(); }); }); it('navigates to admin section', async () => { render(); await waitFor(() => { expect( screen.getByText('Welcome to the App') ).toBeInTheDocument(); }); screen.getByText('Go to Admin Panel').click(); await waitFor( () => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }, { timeout: 3000 } ); }); it('navigates within admin section', async () => { render(); await waitFor(() => { expect( screen.getByText('Welcome to the App') ).toBeInTheDocument(); }); screen.getByText('Go to Admin Panel').click(); await waitFor( () => { expect(screen.getByText('Total Posts')).toBeInTheDocument(); }, { timeout: 3000 } ); screen.getAllByText('Posts')[0].click(); await waitFor( () => { expect(screen.getByText('Hello World')).toBeInTheDocument(); }, { timeout: 3000 } ); }); it('navigates to frontend pages via hash change', async () => { render(); await waitFor(() => { expect( screen.getByText('Welcome to the App') ).toBeInTheDocument(); }); window.location.hash = '#/about'; window.dispatchEvent(new HashChangeEvent('hashchange')); await waitFor(() => { expect( screen.getByText(/This demo shows how to embed react-admin/) ).toBeInTheDocument(); }); }); }); });