test(bf-5klc): fix vitest mock hoisting errors
Some checks are pending
CI / test (18.x) (push) Waiting to run
CI / test (20.x) (push) Waiting to run
CI / test (22.x) (push) Waiting to run

Use vi.hoisted() to declare mock classes before the factory runs,
preventing "Cannot access X before initialization" errors that occur
when vitest hoists vi.mock() calls but the factory captures references
to variables not yet initialized.

Fixes errors in:
- src/tui/components/CrossReferencePanel.test.ts (MockCrossReferenceManager)
- src/tui/components/WorkerAnalyticsPanel.test.ts (MockWorkerAnalytics)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
jedarden 2026-05-22 17:49:36 -04:00
parent 1cc5e8de60
commit 0004e51a02
2 changed files with 40 additions and 32 deletions

View file

@ -63,29 +63,33 @@ vi.mock('../utils/colors.js', () => ({
},
}));
// Mock crossReferenceManager module - define everything inline to avoid hoisting issues
// Mock crossReferenceManager module - use vi.hoisted() to avoid hoisting issues
vi.mock('../../crossReferenceManager.js', () => {
let mockManagerInstance: any = null;
const { MockCrossReferenceManager, MockConstructor } = vi.hoisted(() => {
let mockManagerInstance: any = null;
class MockCrossReferenceManager {
getEntity = vi.fn(function() { return null; });
getLinksForEntity = vi.fn(function() { return []; });
getStats = vi.fn(function() { return ({
totalLinks: 0,
totalEntities: 0,
byRelationship: {},
byEntityType: {},
mostLinked: [],
recentLinks: [],
});});
findPath = vi.fn(function() { return null; });
}
const MockConstructor = vi.fn(function() {
if (!mockManagerInstance) {
mockManagerInstance = new MockCrossReferenceManager();
class MockCrossReferenceManager {
getEntity = vi.fn(function() { return null; });
getLinksForEntity = vi.fn(function() { return []; });
getStats = vi.fn(function() { return ({
totalLinks: 0,
totalEntities: 0,
byRelationship: {},
byEntityType: {},
mostLinked: [],
recentLinks: [],
});});
findPath = vi.fn(function() { return null; });
}
return mockManagerInstance;
const MockConstructor = vi.fn(function() {
if (!mockManagerInstance) {
mockManagerInstance = new MockCrossReferenceManager();
}
return mockManagerInstance;
});
return { MockCrossReferenceManager, MockConstructor };
});
return {

View file

@ -71,19 +71,23 @@ vi.mock('../utils/colors.js', () => ({
},
}));
// Mock workerAnalytics module - define everything inline to avoid hoisting issues
// Mock workerAnalytics module - use vi.hoisted() to avoid hoisting issues
vi.mock('../../workerAnalytics.js', () => {
class MockWorkerAnalytics {
compareWorkers = vi.fn(() => ({
worker1: { workerId: 'w-1', beadsCompleted: 10, beadsPerHour: 5, avgCompletionTimeMs: 1000, errorRate: 0.1, costPerBead: 0.5, totalCostUsd: 5, efficiencyScore: 0.8, activeTimeMs: 10000, idlePercentage: 0.2, errorCount: 1, totalTokens: 1000, trend: undefined },
worker2: { workerId: 'w-2', beadsCompleted: 15, beadsPerHour: 7, avgCompletionTimeMs: 800, errorRate: 0.05, costPerBead: 0.3, totalCostUsd: 4.5, efficiencyScore: 0.9, activeTimeMs: 15000, idlePercentage: 0.1, errorCount: 0, totalTokens: 900, trend: undefined },
differences: { beadsCompleted: -5, beadsPerHour: -2, avgCompletionTimeMs: 200, errorRate: 0.05, costPerBead: 0.2, efficiencyScore: -0.1, activeTimeMs: -5000, idlePercentage: 0.1, totalCostUsd: 0.5, totalTokens: 100 },
percentDifferences: { beadsCompleted: -33.3, beadsPerHour: -28.6, avgCompletionTimeMs: 25, errorRate: 100, costPerBead: 66.7, efficiencyScore: -12.5, activeTimeMs: -33.3, idlePercentage: 100, totalCostUsd: 11.1, totalTokens: 11.1 },
betterWorker: { beadsCompleted: 'worker2', beadsPerHour: 'worker2', avgCompletionTimeMs: 'worker2', errorRate: 'worker2', costPerBead: 'worker2', efficiencyScore: 'worker2', activeTimeMs: 'worker2', idlePercentage: 'worker2', totalCostUsd: 'worker2' },
score: { worker1: 0, worker2: 9 },
overallWinner: 'worker2',
}));
}
const { MockWorkerAnalytics } = vi.hoisted(() => {
class MockWorkerAnalytics {
compareWorkers = vi.fn(() => ({
worker1: { workerId: 'w-1', beadsCompleted: 10, beadsPerHour: 5, avgCompletionTimeMs: 1000, errorRate: 0.1, costPerBead: 0.5, totalCostUsd: 5, efficiencyScore: 0.8, activeTimeMs: 10000, idlePercentage: 0.2, errorCount: 1, totalTokens: 1000, trend: undefined },
worker2: { workerId: 'w-2', beadsCompleted: 15, beadsPerHour: 7, avgCompletionTimeMs: 800, errorRate: 0.05, costPerBead: 0.3, totalCostUsd: 4.5, efficiencyScore: 0.9, activeTimeMs: 15000, idlePercentage: 0.1, errorCount: 0, totalTokens: 900, trend: undefined },
differences: { beadsCompleted: -5, beadsPerHour: -2, avgCompletionTimeMs: 200, errorRate: 0.05, costPerBead: 0.2, efficiencyScore: -0.1, activeTimeMs: -5000, idlePercentage: 0.1, totalCostUsd: 0.5, totalTokens: 100 },
percentDifferences: { beadsCompleted: -33.3, beadsPerHour: -28.6, avgCompletionTimeMs: 25, errorRate: 100, costPerBead: 66.7, efficiencyScore: -12.5, activeTimeMs: -33.3, idlePercentage: 100, totalCostUsd: 11.1, totalTokens: 11.1 },
betterWorker: { beadsCompleted: 'worker2', beadsPerHour: 'worker2', avgCompletionTimeMs: 'worker2', errorRate: 'worker2', costPerBead: 'worker2', efficiencyScore: 'worker2', activeTimeMs: 'worker2', idlePercentage: 'worker2', totalCostUsd: 'worker2' },
score: { worker1: 0, worker2: 9 },
overallWinner: 'worker2',
}));
}
return { MockWorkerAnalytics };
});
return {
WorkerAnalytics: MockWorkerAnalytics,