SpoolBuddyTopBar.test.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. * Tests for SpoolBuddyTopBar component:
  3. * - Renders the logo image
  4. * - Renders the printer selector
  5. * - Shows backend status indicator
  6. */
  7. import { describe, it, expect, vi } from 'vitest';
  8. import { render, screen } from '@testing-library/react';
  9. import React from 'react';
  10. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  11. import { SpoolBuddyTopBar } from '../../../components/spoolbuddy/SpoolBuddyTopBar';
  12. vi.mock('react-i18next', () => ({
  13. useTranslation: () => ({
  14. t: (_key: string, fallback: string) => fallback,
  15. i18n: { language: 'en', changeLanguage: vi.fn() },
  16. }),
  17. }));
  18. vi.mock('../../../api/client', () => ({
  19. api: {
  20. getPrinters: vi.fn().mockResolvedValue([]),
  21. getPrinterStatus: vi.fn().mockResolvedValue({ connected: false }),
  22. getSettings: vi.fn().mockResolvedValue({ time_format: 'system' }),
  23. },
  24. }));
  25. vi.mock('../../../utils/date', () => ({
  26. formatTimeOnly: () => '12:00',
  27. }));
  28. vi.mock('lucide-react', () => ({
  29. WifiOff: (props: Record<string, unknown>) => <span data-testid="wifi-off" {...props} />,
  30. }));
  31. function renderTopBar(deviceOnline = false) {
  32. const qc = new QueryClient({ defaultOptions: { queries: { retry: false, gcTime: 0 } } });
  33. return render(
  34. <QueryClientProvider client={qc}>
  35. <SpoolBuddyTopBar
  36. selectedPrinterId={null}
  37. onPrinterChange={vi.fn()}
  38. deviceOnline={deviceOnline}
  39. />
  40. </QueryClientProvider>
  41. );
  42. }
  43. describe('SpoolBuddyTopBar', () => {
  44. it('renders the logo image', () => {
  45. renderTopBar();
  46. const img = screen.getByAltText('SpoolBuddy');
  47. expect(img).toBeDefined();
  48. expect(img.getAttribute('src')).toBe('/img/spoolbuddy_logo_dark_small.png');
  49. });
  50. it('renders the printer selector', () => {
  51. renderTopBar();
  52. // Select element with "No printers online" fallback
  53. const select = screen.getByRole('combobox');
  54. expect(select).toBeDefined();
  55. });
  56. it('shows offline status when device is offline', () => {
  57. renderTopBar(false);
  58. expect(screen.getByText('Offline')).toBeDefined();
  59. expect(screen.getByTestId('wifi-off')).toBeDefined();
  60. });
  61. it('shows backend status when device is online', () => {
  62. renderTopBar(true);
  63. expect(screen.getByText('Backend')).toBeDefined();
  64. });
  65. it('shows clock time', () => {
  66. renderTopBar();
  67. expect(screen.getByText('12:00')).toBeDefined();
  68. });
  69. });