178 lines
4.5 KiB
TypeScript
178 lines
4.5 KiB
TypeScript
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()
|
|
})
|