import { vi, beforeEach } from 'vitest' import '@testing-library/jest-dom' // ============================================================================ // VITEST GLOBALS // ============================================================================ // Globals are configured in vitest.config.ts (globals: true) // describe, it, expect, beforeEach, afterEach available without imports // ============================================================================ // MOCK AXIOS // ============================================================================ vi.mock('axios', () => ({ default: { create: vi.fn(() => ({ get: vi.fn(), post: vi.fn(), put: vi.fn(), delete: vi.fn(), interceptors: { request: { use: vi.fn() }, response: { use: vi.fn() }, }, })), get: vi.fn(), post: vi.fn(), put: vi.fn(), delete: vi.fn(), }, })) // ============================================================================ // MOCK HTML5-QRCODE // ============================================================================ vi.mock('html5-qrcode', () => ({ Html5Qrcode: class { constructor() {} static getCameras = vi.fn().mockResolvedValue([ { id: 'camera-1', label: 'Front Camera' }, ]) requestCameraPermissions = vi.fn().mockResolvedValue(true) start = vi.fn().mockResolvedValue(undefined) stop = vi.fn().mockResolvedValue(undefined) getState = vi.fn(() => 2) // SCANNING state setZoom = vi.fn() getZoomSettings = vi.fn(() => ({ maxZoom: 4, zoomRatios: [1, 2, 3, 4], })) }, Html5QrcodeSupportedFormats: { QR_CODE: 'QR_CODE', CODE_128: 'CODE_128', CODE_39: 'CODE_39', EAN_13: 'EAN_13', UPC_A: 'UPC_A', DATA_MATRIX: 'DATA_MATRIX', }, })) // ============================================================================ // MOCK DEXIE (IndexedDB) // ============================================================================ vi.mock('dexie', () => ({ default: class Database { constructor() { this.pending_operations = { add: vi.fn().mockResolvedValue(1), toArray: vi.fn().mockResolvedValue([]), clear: vi.fn().mockResolvedValue(undefined), where: vi.fn(function () { return { toArray: vi.fn().mockResolvedValue([]), delete: vi.fn().mockResolvedValue(0), } }), } } }, })) // ============================================================================ // MOCK NEXT/ROUTER // ============================================================================ vi.mock('next/router', () => ({ useRouter: () => ({ push: vi.fn(), pathname: '/', route: '/', query: {}, asPath: '/', }), })) // ============================================================================ // SHARED FIXTURES // ============================================================================ export const mockUserToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' export const mockInvalidToken = 'invalid-token' export const mockItemListResponse = [ { id: 'item-1', name: 'Widget A', category: 'Electronics', quantity: 10, barcode: '1234567890', partNumber: 'PART-001', }, { id: 'item-2', name: 'Widget B', category: 'Electronics', quantity: 5, barcode: '0987654321', partNumber: 'PART-002', }, { id: 'item-3', name: 'Component C', category: 'Parts', quantity: 0, barcode: 'QR-12345', partNumber: 'PART-003', }, ] export const mockAIExtractionResponseGemini = { name: 'Widget A', category: 'Electronics', quantity: 10, partNumber: 'PART-001', confidence: 0.95, } export const mockAIExtractionResponseClaude = { name: 'Widget A', category: 'Electronics', quantity: 10, partNumber: 'PART-001', confidence: 0.92, } export const mockAdminConfig = { identity: { ldap_enabled: true, ldap_server: 'ldap://example.com', }, ai_provider: 'gemini', api_key: 'mock-key', } export const mockOfflineSyncQueue = [ { id: 1, operation: 'checkin', itemId: 'item-1', quantity: 5, timestamp: Date.now(), }, ] // ============================================================================ // CLEANUP // ============================================================================ beforeEach(() => { // Reset all mocks before each test vi.clearAllMocks() })