SpoolCatalogSettings.test.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { screen, waitFor } from '@testing-library/react';
  3. import { render } from '../utils';
  4. import { SpoolCatalogSettings } from '../../components/SpoolCatalogSettings';
  5. vi.mock('react-i18next', () => ({
  6. useTranslation: () => ({
  7. t: (key: string, fallback?: string) => fallback ?? key,
  8. }),
  9. }));
  10. const mockShowToast = vi.fn();
  11. vi.mock('../../contexts/ToastContext', async (importOriginal) => {
  12. const actual = await importOriginal<typeof import('../../contexts/ToastContext')>();
  13. return { ...actual, useToast: () => ({ showToast: mockShowToast }) };
  14. });
  15. vi.mock('../../api/client', () => ({
  16. api: {
  17. getSettings: vi.fn().mockResolvedValue({}),
  18. getSpoolCatalog: vi.fn().mockResolvedValue([]),
  19. },
  20. ApiError: class ApiError extends Error {
  21. status: number;
  22. constructor(message: string, status: number) {
  23. super(message);
  24. this.status = status;
  25. }
  26. },
  27. }));
  28. import { api } from '../../api/client';
  29. describe('SpoolCatalogSettings — local catalog UI', () => {
  30. beforeEach(() => {
  31. vi.clearAllMocks();
  32. vi.mocked(api.getSpoolCatalog).mockResolvedValue([]);
  33. });
  34. it('shows local CRUD buttons regardless of Spoolman state', async () => {
  35. render(<SpoolCatalogSettings />);
  36. await waitFor(() => {
  37. expect(screen.getByText('common.add')).toBeTruthy();
  38. });
  39. expect(screen.getByText('common.export')).toBeTruthy();
  40. expect(screen.getByText('common.import')).toBeTruthy();
  41. expect(screen.getByText('common.reset')).toBeTruthy();
  42. });
  43. it('renders the local Spool Catalog header and column layout', async () => {
  44. render(<SpoolCatalogSettings />);
  45. await waitFor(() => {
  46. expect(screen.getByText('settings.catalog.spoolCatalog')).toBeTruthy();
  47. });
  48. expect(screen.getByText('common.name')).toBeTruthy();
  49. expect(screen.getByText('settings.catalog.weight')).toBeTruthy();
  50. expect(screen.getByText('settings.catalog.type')).toBeTruthy();
  51. // No Spoolman-only columns leak in
  52. expect(screen.queryByText('settings.catalog.material')).toBeNull();
  53. expect(screen.queryByText('settings.catalog.spoolWeight')).toBeNull();
  54. expect(screen.queryByText('settings.spoolmanFilamentCatalogTitle')).toBeNull();
  55. });
  56. });