import { describe, it, expect, vi, beforeEach } from 'vitest';
import { screen, fireEvent, waitFor } from '@testing-library/react';
import { render } from '../utils';
import { WeightDisplay } from '../../components/spoolbuddy/WeightDisplay';
const mockTare = vi.fn();
vi.mock('../../api/client', () => ({
api: {
getSettings: vi.fn().mockResolvedValue({}),
getAuthStatus: vi.fn().mockResolvedValue({ auth_enabled: false }),
},
spoolbuddyApi: {
tare: (...args: unknown[]) => mockTare(...args),
},
}));
const defaultProps = {
weight: 823.4,
weightStable: true,
deviceOnline: true,
deviceId: 'sb-0001',
};
describe('WeightDisplay', () => {
beforeEach(() => {
vi.clearAllMocks();
mockTare.mockResolvedValue({ status: 'ok' });
});
it('renders weight value with 1 decimal place', () => {
render();
expect(screen.getByText('823.5')).toBeInTheDocument();
});
it('shows green dot when stable and online', () => {
const { container } = render(
);
const dot = container.querySelector('.bg-green-500');
expect(dot).toBeInTheDocument();
expect(screen.getByText('Stable')).toBeInTheDocument();
});
it('shows amber dot when unstable', () => {
const { container } = render(
);
const dot = container.querySelector('.bg-amber-500');
expect(dot).toBeInTheDocument();
expect(screen.getByText('Measuring...')).toBeInTheDocument();
});
it('shows gray dot when offline', () => {
const { container } = render(
);
const dot = container.querySelector('.bg-zinc-600');
expect(dot).toBeInTheDocument();
expect(screen.getByText('No reading')).toBeInTheDocument();
});
it('tare button calls spoolbuddyApi.tare(deviceId)', async () => {
render();
const tareButton = screen.getByText('Tare');
fireEvent.click(tareButton);
await waitFor(() => {
expect(mockTare).toHaveBeenCalledWith('sb-0001');
});
});
it('tare button is disabled when no deviceId', () => {
render();
const tareButton = screen.getByText('Tare');
expect(tareButton).toBeDisabled();
});
});