import dotenv from 'dotenv';
import { jest } from '@jest/globals';
// Load test environment variables
dotenv.config({ path: '.env.test' });
// Mock external services by default
jest.mock('../src/services/sonar-benchmark-service.js');
jest.mock('../src/services/benchmark-aggregator.js');
// Set test timeouts
jest.setTimeout(30000);
// Global test utilities
global.testUtils = {
// Create mock Supabase response
mockSupabaseResponse: <T>(data: T | null, error: any = null) => ({
data,
error,
count: null,
status: error ? 400 : 200,
statusText: error ? 'Bad Request' : 'OK',
}),
// Create mock project data
createMockProject: (overrides = {}) => ({
id: 'test-project-id',
client_name: 'Test Client',
project_name: 'Test Project',
industry: 'technology',
description: 'Test project description',
status: 'active',
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
user_id: 'test-user-id',
...overrides,
}),
// Create mock use case data
createMockUseCase: (overrides = {}) => ({
id: 'test-use-case-id',
project_id: 'test-project-id',
name: 'Test Use Case',
category: 'automation',
current_state: {
volume_per_month: 1000,
cost_per_transaction: 10,
time_per_transaction: 5,
error_rate: 0.05,
resource_hours: 100,
},
future_state: {
automation_percentage: 0.8,
error_reduction: 0.9,
time_savings: 0.7,
quality_improvement: 0.95,
},
implementation: {
complexity_score: 5,
integration_points: 3,
training_hours: 20,
},
...overrides,
}),
// Create mock projection data
createMockProjection: (overrides = {}) => ({
id: 'test-projection-id',
project_id: 'test-project-id',
scenario_name: 'Base Case',
metadata: {
confidence_level: 0.95,
assumptions: [],
created_via: 'test',
},
implementation_costs: {
software_licenses: 50000,
development_hours: 500,
training_costs: 10000,
infrastructure: 20000,
ongoing_monthly: 5000,
},
timeline_months: 12,
financial_metrics: {
conservative: { roi: 15, npv: 100000 },
expected: { roi: 25, npv: 150000 },
optimistic: { roi: 40, npv: 200000 },
},
calculations: {
total_investment: 100000,
net_present_value: 150000,
internal_rate_of_return: 0.25,
payback_period_months: 18,
five_year_roi: 250,
break_even_date: '2025-06-01',
},
...overrides,
}),
// Wait for async operations
waitFor: async (condition: () => boolean, timeout = 5000) => {
const start = Date.now();
while (!condition() && Date.now() - start < timeout) {
await new Promise(resolve => setTimeout(resolve, 100));
}
if (!condition()) {
throw new Error('Timeout waiting for condition');
}
},
};
// Declare global test utilities type
declare global {
var testUtils: {
mockSupabaseResponse: <T>(data: T | null, error?: any) => any;
createMockProject: (overrides?: any) => any;
createMockUseCase: (overrides?: any) => any;
createMockProjection: (overrides?: any) => any;
waitFor: (condition: () => boolean, timeout?: number) => Promise<void>;
};
}
// Clean up after each test
afterEach(() => {
jest.clearAllMocks();
});
// Suppress console errors in tests unless explicitly needed
const originalError = console.error;
beforeAll(() => {
console.error = jest.fn();
});
afterAll(() => {
console.error = originalError;
});