stock-bot/apps/stock/data-ingestion/test/test-qm-operations.ts
2025-07-01 15:35:56 -04:00

163 lines
No EOL
5 KiB
TypeScript

/**
* Test script for QM operations
*/
import { QMHandler } from '../src/handlers/qm/qm.handler';
import type { DataIngestionServices } from '../src/types';
// Mock services for testing
const mockServices: Partial<DataIngestionServices> = {
mongodb: {
batchUpsert: async (collection: string, data: any[], uniqueKeys: string[]) => {
console.log(`Mock: Batch upsert to ${collection}`, {
recordCount: data.length,
uniqueKeys
});
return { insertedCount: data.length, modifiedCount: 0 };
},
find: async (collection: string, query: any, options?: any) => {
console.log(`Mock: Find from ${collection}`, { query, options });
// Return test symbol for testing
if (collection === 'qmSymbols' && query.symbol === 'X') {
return [{
symbol: 'X',
symbolId: 123456,
qmSearchCode: 'X:NYSE',
exchange: 'NYSE',
name: 'United States Steel Corporation'
}];
}
return [];
},
updateOne: async (collection: string, filter: any, update: any, options?: any) => {
console.log(`Mock: Update ${collection}`, { filter, update, options });
return { modifiedCount: 1 };
}
},
cache: {
get: async (key: string) => {
console.log(`Mock: Cache get ${key}`);
return null;
},
set: async (key: string, value: any, ttl?: number) => {
console.log(`Mock: Cache set ${key}`, { ttl });
return true;
}
},
logger: {
info: (message: string, data?: any) => {
console.log(`[INFO] ${message}`, data || '');
},
error: (message: string, data?: any) => {
console.error(`[ERROR] ${message}`, data || '');
},
warn: (message: string, data?: any) => {
console.warn(`[WARN] ${message}`, data || '');
},
debug: (message: string, data?: any) => {
console.debug(`[DEBUG] ${message}`, data || '');
}
},
// Mock operation registry
operationRegistry: {
updateOperation: async (provider: string, symbol: string, operation: string, data: any) => {
console.log(`Mock: Update operation ${provider}/${operation} for ${symbol}`, data);
return true;
},
getStaleSymbols: async (provider: string, operation: string, options: any) => {
console.log(`Mock: Get stale symbols for ${provider}/${operation}`, options);
// Return test symbol
if (options.symbolFilter?.symbol === 'X') {
return ['X:NYSE'];
}
return [];
}
}
} as DataIngestionServices;
async function testQMOperations() {
console.log('=== Testing QM Operations ===\n');
// Create handler instance
const handler = new QMHandler(mockServices);
// Wait a bit for initialization
await new Promise(resolve => setTimeout(resolve, 1000));
// Test 1: Update Insiders for symbol X
console.log('Test 1: Update Insiders for symbol X');
console.log('-------------------------------------');
try {
const insidersResult = await handler.updateInsiders({
symbol: 'X',
symbolId: 123456,
qmSearchCode: 'X:NYSE',
lookbackDays: 30
});
console.log('Result:', JSON.stringify(insidersResult, null, 2));
} catch (error) {
console.error('Failed:', error);
}
console.log('\n');
// Test 2: Update Symbol News for symbol X
console.log('Test 2: Update Symbol News for symbol X');
console.log('----------------------------------------');
try {
const newsResult = await handler.updateSymbolNews({
symbol: 'X',
symbolId: 123456,
qmSearchCode: 'X:NYSE',
lookbackDays: 7
});
console.log('Result:', JSON.stringify(newsResult, null, 2));
} catch (error) {
console.error('Failed:', error);
}
console.log('\n');
// Test 3: Update General News
console.log('Test 3: Update General News');
console.log('---------------------------');
try {
const generalNewsResult = await handler.updateGeneralNews({
categories: ['market', 'economy'],
lookbackMinutes: 60
});
console.log('Result:', JSON.stringify(generalNewsResult, null, 2));
} catch (error) {
console.error('Failed:', error);
}
console.log('\n');
// Test 4: Check available operations
console.log('Test 4: List Available Operations');
console.log('---------------------------------');
const operations = [
'create-session',
'search-symbols',
'update-symbol-info',
'update-financials',
'update-events',
'update-filings',
'update-prices',
'update-intraday-bars',
'crawl-intraday-data',
'update-insiders',
'update-symbol-news',
'update-general-news'
];
for (const op of operations) {
const hasOperation = typeof (handler as any)[op.replace(/-/g, '')] === 'function';
console.log(`${op}: ${hasOperation ? '✓' : '✗'}`);
}
console.log('\n=== Tests Complete ===');
}
// Run tests
testQMOperations().catch(console.error);