From b086fb172e0cbfdb00223336367a2920a36a780f Mon Sep 17 00:00:00 2001 From: Daniel Bedeleanu Date: Sat, 18 Apr 2026 17:43:09 +0000 Subject: [PATCH] test: create shared fixtures and mock configuration for all tests --- frontend/tests/setup.ts | 171 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 4 deletions(-) diff --git a/frontend/tests/setup.ts b/frontend/tests/setup.ts index 8cceff44..b4e0a404 100644 --- a/frontend/tests/setup.ts +++ b/frontend/tests/setup.ts @@ -1,6 +1,169 @@ -import { expect, afterEach } from 'vitest' -import { cleanup } from '@testing-library/react' +import { vi, beforeEach } from 'vitest' +import '@testing-library/jest-dom' -afterEach(() => { - cleanup() +// ============================================================================ +// 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], + })) + }, +})) + +// ============================================================================ +// 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() })