test: create shared fixtures and mock configuration for all tests
This commit is contained in:
@@ -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()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user