WeightDisplay.test.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { screen, fireEvent, waitFor } from '@testing-library/react';
  3. import { render } from '../utils';
  4. import { WeightDisplay } from '../../components/spoolbuddy/WeightDisplay';
  5. const mockTare = vi.fn();
  6. vi.mock('../../api/client', () => ({
  7. api: {
  8. getSettings: vi.fn().mockResolvedValue({}),
  9. getAuthStatus: vi.fn().mockResolvedValue({ auth_enabled: false }),
  10. },
  11. spoolbuddyApi: {
  12. tare: (...args: unknown[]) => mockTare(...args),
  13. },
  14. }));
  15. const defaultProps = {
  16. weight: 823.4,
  17. weightStable: true,
  18. deviceOnline: true,
  19. deviceId: 'sb-0001',
  20. };
  21. describe('WeightDisplay', () => {
  22. beforeEach(() => {
  23. vi.clearAllMocks();
  24. mockTare.mockResolvedValue({ status: 'ok' });
  25. });
  26. it('renders weight value with 1 decimal place', () => {
  27. render(<WeightDisplay {...defaultProps} weight={823.456} />);
  28. expect(screen.getByText('823.5')).toBeInTheDocument();
  29. });
  30. it('shows green dot when stable and online', () => {
  31. const { container } = render(
  32. <WeightDisplay {...defaultProps} weightStable={true} deviceOnline={true} />
  33. );
  34. const dot = container.querySelector('.bg-green-500');
  35. expect(dot).toBeInTheDocument();
  36. expect(screen.getByText('Stable')).toBeInTheDocument();
  37. });
  38. it('shows amber dot when unstable', () => {
  39. const { container } = render(
  40. <WeightDisplay {...defaultProps} weightStable={false} deviceOnline={true} />
  41. );
  42. const dot = container.querySelector('.bg-amber-500');
  43. expect(dot).toBeInTheDocument();
  44. expect(screen.getByText('Measuring...')).toBeInTheDocument();
  45. });
  46. it('shows gray dot when offline', () => {
  47. const { container } = render(
  48. <WeightDisplay {...defaultProps} deviceOnline={false} />
  49. );
  50. const dot = container.querySelector('.bg-zinc-600');
  51. expect(dot).toBeInTheDocument();
  52. expect(screen.getByText('No reading')).toBeInTheDocument();
  53. });
  54. it('tare button calls spoolbuddyApi.tare(deviceId)', async () => {
  55. render(<WeightDisplay {...defaultProps} />);
  56. const tareButton = screen.getByText('Tare');
  57. fireEvent.click(tareButton);
  58. await waitFor(() => {
  59. expect(mockTare).toHaveBeenCalledWith('sb-0001');
  60. });
  61. });
  62. it('tare button is disabled when no deviceId', () => {
  63. render(<WeightDisplay {...defaultProps} deviceId={null} />);
  64. const tareButton = screen.getByText('Tare');
  65. expect(tareButton).toBeDisabled();
  66. });
  67. });