import { describe, it, expect, vi, beforeEach } from 'vitest'; import { screen, fireEvent } from '@testing-library/react'; import { render } from '../utils'; import { InventorySpoolInfoCard } from '../../components/spoolbuddy/InventorySpoolInfoCard'; import type { InventorySpool } from '../../api/client'; vi.mock('../../api/client', () => ({ api: { getSettings: vi.fn().mockResolvedValue({}), getAuthStatus: vi.fn().mockResolvedValue({ auth_enabled: false }), getSpoolKProfiles: vi.fn().mockResolvedValue([]), }, spoolbuddyApi: { updateSpoolWeight: vi.fn().mockResolvedValue({ status: 'ok', weight_used: 300 }), }, })); const mockSpool: InventorySpool = { id: 42, material: 'PLA', subtype: 'Matte', color_name: 'Jade White', rgba: 'E8F5E9FF', extra_colors: null, effect_type: null, brand: 'Bambu', label_weight: 1000, core_weight: 250, core_weight_catalog_id: null, weight_used: 200, slicer_filament: null, slicer_filament_name: null, nozzle_temp_min: null, nozzle_temp_max: null, note: null, added_full: null, last_used: null, encode_time: null, tag_uid: 'AABBCCDD11223344', tray_uuid: null, data_origin: 'local', tag_type: null, archived_at: null, created_at: '2024-01-01T00:00:00Z', updated_at: '2024-01-01T00:00:00Z', cost_per_kg: null, last_scale_weight: null, last_weighed_at: null, category: null, low_stock_threshold_pct: null, k_profiles: [], }; describe('InventorySpoolInfoCard', () => { beforeEach(() => { vi.clearAllMocks(); }); it('disables "Assign to AMS" button when isAssigned=true', () => { render( ); expect(screen.getByText('Assign to AMS')).toBeDisabled(); }); it('enables "Assign to AMS" button when isAssigned=false', () => { render( ); expect(screen.getByText('Assign to AMS')).not.toBeDisabled(); }); it('shows Unassign button when isAssigned=true and onUnassignFromAms is provided', () => { render( ); expect(screen.getByText(/unassign/i)).toBeInTheDocument(); }); it('does not show Unassign button when onUnassignFromAms is not provided', () => { render( ); expect(screen.queryByText(/unassign/i)).not.toBeInTheDocument(); }); it('calls onUnassignFromAms when Unassign button is clicked', () => { const onUnassign = vi.fn(); render( ); fireEvent.click(screen.getByText(/unassign/i)); expect(onUnassign).toHaveBeenCalledTimes(1); }); });