/** * Tests for the Layout component. */ import { describe, it, expect, beforeEach } from 'vitest'; import { screen, waitFor } from '@testing-library/react'; import { render } from '../utils'; import { Layout } from '../../components/Layout'; import { http, HttpResponse } from 'msw'; import { server } from '../mocks/server'; describe('Layout', () => { beforeEach(() => { server.use( http.get('/api/v1/printers/', () => { return HttpResponse.json([ { id: 1, name: 'X1 Carbon', model: 'X1C', enabled: true }, ]); }), http.get('/api/v1/printers/:id/status', () => { return HttpResponse.json({ connected: true, state: 'IDLE', }); }), http.get('/api/v1/version', () => { return HttpResponse.json({ version: '0.1.6', build: 'test' }); }), http.get('/api/v1/settings/', () => { return HttpResponse.json({ check_updates: false, auto_archive: true, }); }), http.get('/api/v1/external-links/', () => { return HttpResponse.json([]); }), http.get('/api/v1/smart-plugs/', () => { return HttpResponse.json([]); }), http.get('/api/v1/support/debug-logging', () => { return HttpResponse.json({ enabled: false }); }), http.get('/api/v1/queue/', () => { return HttpResponse.json([]); }), http.get('/api/v1/pending-uploads/count', () => { return HttpResponse.json({ count: 0 }); }), http.get('/api/v1/updates/check', () => { return HttpResponse.json({ update_available: false }); }) ); }); describe('rendering', () => { it('renders the sidebar', async () => { render(); // Layout renders as a flex container with sidebar await waitFor(() => { const sidebar = document.querySelector('aside'); expect(sidebar).toBeInTheDocument(); }); }); it('renders navigation links', async () => { render(); await waitFor(() => { // Navigation links should be present const links = document.querySelectorAll('a'); expect(links.length).toBeGreaterThan(0); }); }); }); describe('navigation', () => { it('has navigation items', async () => { render(); await waitFor(() => { // Should have multiple navigation links const navLinks = document.querySelectorAll('a[href]'); expect(navLinks.length).toBeGreaterThan(0); }); }); it('includes settings link', async () => { render(); await waitFor(() => { // Settings link should exist (route /settings) const settingsLink = document.querySelector('a[href="/settings"]'); expect(settingsLink).toBeInTheDocument(); }); }); }); describe('version display', () => { it('shows version info', async () => { render(); await waitFor(() => { // Version info is displayed in sidebar expect(document.body).toBeInTheDocument(); }); }); }); describe('theme toggle', () => { it('has theme toggle button', async () => { render(); await waitFor(() => { // Theme toggle should be present const buttons = document.querySelectorAll('button'); expect(buttons.length).toBeGreaterThan(0); }); }); }); });