- Fixed NodeJS.Timer → NodeJS.Timeout in scheduler.ts line 13 - Fixed NodeJS.Timer[] → NodeJS.Timeout[] in fixtures.ts line 151 - Resolves TypeScript compile errors from iteration 0 review - All 260 tests passing, build succeeds with no errors
109 lines
3.2 KiB
TypeScript
109 lines
3.2 KiB
TypeScript
/**
|
|
* Tests for QueueManager logging serialization
|
|
*
|
|
* Verifies that QueueManager uses logError utility for error serialization
|
|
* instead of console.error which outputs [object Object].
|
|
*/
|
|
|
|
import { describe, test, expect, vi, beforeEach } from 'vitest';
|
|
import { QueueManager } from '$lib/server/queue/QueueManager';
|
|
import * as logger from '$lib/server/utils/logger';
|
|
import type { QueueUpdateCallback } from '$lib/server/queue/types';
|
|
|
|
describe('QueueManager logging', () => {
|
|
let manager: QueueManager;
|
|
let logErrorSpy: any;
|
|
|
|
beforeEach(() => {
|
|
manager = new QueueManager();
|
|
logErrorSpy = vi.spyOn(logger, 'logError').mockImplementation(() => {});
|
|
});
|
|
|
|
test('should use logError when subscriber throws error', () => {
|
|
const failingCallback: QueueUpdateCallback = () => {
|
|
throw new Error('Subscriber failed');
|
|
};
|
|
|
|
manager.subscribe(failingCallback);
|
|
|
|
// Enqueue an item (this will notify subscribers)
|
|
manager.enqueue('https://instagram.com/p/test123');
|
|
|
|
expect(logErrorSpy).toHaveBeenCalledWith(
|
|
'[QueueManager] Subscriber error',
|
|
expect.any(Error)
|
|
);
|
|
});
|
|
|
|
test('should serialize complex error objects', () => {
|
|
const complexError = {
|
|
code: 'ERR_SUBSCRIBER',
|
|
message: 'Callback failed',
|
|
details: { reason: 'Network timeout' }
|
|
};
|
|
|
|
const failingCallback: QueueUpdateCallback = () => {
|
|
throw complexError;
|
|
};
|
|
|
|
manager.subscribe(failingCallback);
|
|
manager.enqueue('https://instagram.com/p/test456');
|
|
|
|
expect(logErrorSpy).toHaveBeenCalledWith(
|
|
'[QueueManager] Subscriber error',
|
|
complexError
|
|
);
|
|
});
|
|
|
|
test('should not prevent other subscribers from being notified on error', () => {
|
|
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
const failingCallback: QueueUpdateCallback = () => {
|
|
throw new Error('First subscriber fails');
|
|
};
|
|
const successCallback = vi.fn();
|
|
|
|
manager.subscribe(failingCallback);
|
|
manager.subscribe(successCallback);
|
|
|
|
manager.enqueue('https://instagram.com/p/test789');
|
|
|
|
// Error should be logged via logError
|
|
expect(logErrorSpy).toHaveBeenCalled();
|
|
|
|
// Second subscriber should still be called
|
|
expect(successCallback).toHaveBeenCalled();
|
|
|
|
// Should not contain [object Object] in console output
|
|
const errorMessages = consoleErrorSpy.mock.calls
|
|
.map(call => call.join(' '));
|
|
|
|
const hasObjectObject = errorMessages.some(msg =>
|
|
msg.includes('[object Object]')
|
|
);
|
|
|
|
expect(hasObjectObject).toBe(false);
|
|
});
|
|
|
|
test('should handle Error instances with custom properties', () => {
|
|
const customError: any = new Error('Custom error');
|
|
customError.statusCode = 500;
|
|
customError.details = { field: 'url', issue: 'invalid' };
|
|
|
|
const failingCallback: QueueUpdateCallback = () => {
|
|
throw customError;
|
|
};
|
|
|
|
manager.subscribe(failingCallback);
|
|
manager.enqueue('https://instagram.com/p/custom');
|
|
|
|
expect(logErrorSpy).toHaveBeenCalledWith(
|
|
'[QueueManager] Subscriber error',
|
|
expect.objectContaining({
|
|
message: 'Custom error',
|
|
statusCode: 500,
|
|
details: { field: 'url', issue: 'invalid' }
|
|
})
|
|
);
|
|
});
|
|
});
|