2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								import  {  expect ,  tap  }  from  '@git.zone/tstest/tapbundle' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  *  as  opendata  from  '../ts/index.js' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  *  as  paths  from  '../ts/paths.js' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  *  as  plugins  from  '../ts/plugins.js' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 12:12:29 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Test configuration - explicit paths required
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  testNogitDir  =  plugins . path . join ( paths . packageDir ,  '.nogit' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								// Test data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  testTickers  =  [ 'AAPL' ,  'MSFT' ,  'GOOGL' ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  invalidTicker  =  'INVALID_TICKER_XYZ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let  stockService : opendata.StockPriceService ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let  marketstackProvider : opendata.MarketstackProvider ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let  testQenv : plugins.qenv.Qenv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should create StockPriceService instance' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  stockService  =  new  opendata . StockPriceService ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ttl : 30000 ,  // 30 seconds cache
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maxEntries : 100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockService ) . toBeInstanceOf ( opendata . StockPriceService ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should create MarketstackProvider instance' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // Create qenv and get API key
 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 12:12:29 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    testQenv  =  new  plugins . qenv . Qenv ( paths . packageDir ,  testNogitDir ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    const  apiKey  =  await  testQenv . getEnvVarOnDemand ( 'MARKETSTACK_COM_TOKEN' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    marketstackProvider  =  new  opendata . MarketstackProvider ( apiKey ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      enabled : true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      timeout : 10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      retryAttempts : 2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      retryDelay : 500 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( marketstackProvider ) . toBeInstanceOf ( opendata . MarketstackProvider ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( marketstackProvider . name ) . toEqual ( 'Marketstack' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( marketstackProvider . requiresAuth ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( marketstackProvider . priority ) . toEqual ( 80 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }  catch  ( error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( error . message . includes ( 'MARKETSTACK_COM_TOKEN' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      console . log ( '⚠️  MARKETSTACK_COM_TOKEN not set - skipping Marketstack tests' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      tap . test ( 'Marketstack token not available' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        expect ( true ) . toEqual ( true ) ;  // Skip gracefully
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    throw  error ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should register Marketstack provider with the service' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  stockService . register ( marketstackProvider ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  providers  =  stockService . getAllProviders ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( providers ) . toContainEqual ( marketstackProvider ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockService . getProvider ( 'Marketstack' ) ) . toEqual ( marketstackProvider ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should check provider health' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  health  =  await  stockService . checkProvidersHealth ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( health . get ( 'Marketstack' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should fetch single stock price' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'ticker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'price' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'currency' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'change' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'changePercent' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'previousClose' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'timestamp' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'provider' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . toHaveProperty ( 'marketState' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . ticker ) . toEqual ( 'AAPL' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . price ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . provider ) . toEqual ( 'Marketstack' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . timestamp ) . toBeInstanceOf ( Date ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . marketState ) . toEqual ( 'CLOSED' ) ;  // EOD data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Fetched AAPL:  $ ${ price . price }  ( ${ price . changePercent  >=  0  ?  '+'  :  '' } ${ price . changePercent . toFixed ( 2 ) } %) ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should fetch multiple stock prices' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices  =  await  stockService . getPrices ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    tickers : testTickers 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices ) . toBeArray ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices . length ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices . length ) . toBeLessThanOrEqual ( testTickers . length ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  prices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( testTickers ) . toContain ( price . ticker ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . price ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . provider ) . toEqual ( 'Marketstack' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . marketState ) . toEqual ( 'CLOSED' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( `    ${ price . ticker } :  $ ${ price . price } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should serve cached prices on subsequent requests' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // First request - should hit the API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  firstRequest  =  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Second request - should be served from cache
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  secondRequest  =  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( secondRequest . ticker ) . toEqual ( firstRequest . ticker ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( secondRequest . price ) . toEqual ( firstRequest . price ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( secondRequest . timestamp ) . toEqual ( firstRequest . timestamp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '✓ Cache working correctly' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should handle invalid ticker gracefully' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    await  stockService . getPrice ( {  ticker : invalidTicker  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    throw  new  Error ( 'Should have thrown an error for invalid ticker' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }  catch  ( error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    expect ( error . message ) . toInclude ( 'Failed to fetch' ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '✓ Invalid ticker handled correctly' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should support market checking' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsMarket ( 'US' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsMarket ( 'UK' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsMarket ( 'DE' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsMarket ( 'JP' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsMarket ( 'INVALID' ) ) . toEqual ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '✓ Market support check working' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should validate ticker format' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsTicker ( 'AAPL' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsTicker ( 'MSFT' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsTicker ( 'BRK.B' ) ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsTicker ( '123456789012' ) ) . toEqual ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackProvider . supportsTicker ( 'invalid@ticker' ) ) . toEqual ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '✓ Ticker validation working' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should get provider statistics' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  stats  =  stockService . getProviderStats ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  marketstackStats  =  stats . get ( 'Marketstack' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackStats ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackStats . successCount ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( marketstackStats . errorCount ) . toBeGreaterThanOrEqual ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Provider stats:  ${ marketstackStats . successCount }  successes,  ${ marketstackStats . errorCount }  errors ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should test direct provider methods' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🔍 Testing direct provider methods:' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Test isAvailable
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  available  =  await  marketstackProvider . isAvailable ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( available ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '  ✓ isAvailable() returned true' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // Test fetchData for single ticker
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  marketstackProvider . fetchData ( {  type :  'current' ,  ticker :  'MSFT'  } )  as  opendata . IStockPrice ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . ticker ) . toEqual ( 'MSFT' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . provider ) . toEqual ( 'Marketstack' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . price ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  console . log ( `   ✓ fetchData (current) for MSFT:  $ ${ price . price } ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  // Test fetchData for batch
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices  =  await  marketstackProvider . fetchData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'batch' , 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    tickers :  [ 'AAPL' ,  'GOOGL' ] 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  } )  as  opendata . IStockPrice [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices . length ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  console . log ( `   ✓ fetchData (batch) returned  ${ prices . length }  prices ` ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  p  of  prices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( `      ${ p . ticker } :  $ ${ p . price } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should fetch sample EOD data' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n📊 Sample EOD Stock Data from Marketstack:' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '═' . repeat ( 65 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  sampleTickers  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {  ticker :  'AAPL' ,  name :  'Apple Inc.'  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {  ticker :  'MSFT' ,  name :  'Microsoft Corp.'  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {  ticker :  'GOOGL' ,  name :  'Alphabet Inc.'  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {  ticker :  'AMZN' ,  name :  'Amazon.com Inc.'  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {  ticker :  'TSLA' ,  name :  'Tesla Inc.'  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  try  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    const  prices  =  await  marketstackProvider . fetchData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      type :  'batch' , 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								      tickers : sampleTickers.map ( t  = >  t . ticker ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } )  as  opendata . IStockPrice [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const  priceMap  =  new  Map ( prices . map ( p  = >  [ p . ticker ,  p ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    for  ( const  stock  of  sampleTickers )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      const  price  =  priceMap . get ( stock . ticker ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  ( price )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        const  changeSymbol  =  price . change  >=  0  ?  '↑'  :  '↓' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        const  changeColor  =  price . change  >=  0  ?  '\x1b[32m'  :  '\x1b[31m' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        const  resetColor  =  '\x1b[0m' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        console . log ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          ` ${ stock . name . padEnd ( 20 ) }   ${ price . price . toLocaleString ( 'en-US' ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            minimumFractionDigits : 2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            maximumFractionDigits : 2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          } ) . padStart ( 10 ) }  $ { changeColor } $ { changeSymbol }  $ { price . change  >=  0  ?  '+'  :  '' } $ { price . change . toFixed ( 2 ) }  ( $ { price . changePercent  >=  0  ?  '+'  :  '' } $ { price . changePercent . toFixed ( 2 ) } % ) $ { resetColor } ` 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '═' . repeat ( 65 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( ` Provider: Marketstack (EOD Data) ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( ` Last updated:  ${ new  Date ( ) . toLocaleString ( ) } \ n ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }  catch  ( error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( 'Error fetching sample data:' ,  error . message ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( true ) . toEqual ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should clear cache' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Ensure we have something in cache
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Clear cache
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  stockService . clearCache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '✓ Cache cleared' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Next request should hit the API again
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 14:00:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Phase 1 Feature Tests
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should fetch data using new unified API (current price)' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🎯 Testing Phase 1: Unified getData API' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'current' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'MSFT' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( ( price  as  opendata . IStockPrice ) . ticker ) . toEqual ( 'MSFT' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( ( price  as  opendata . IStockPrice ) . dataType ) . toEqual ( 'eod' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( ( price  as  opendata . IStockPrice ) . fetchedAt ) . toBeInstanceOf ( Date ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Fetched current price:  $ ${ ( price  as  opendata . IStockPrice ) . price } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should fetch historical data with date range' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n📅 Testing Phase 1: Historical Data Retrieval' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  fromDate  =  new  Date ( '2024-12-01' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  toDate  =  new  Date ( '2024-12-31' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'historical' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'AAPL' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from :  fromDate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    to : toDate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sort :  'DESC' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices ) . toBeArray ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( ( prices  as  opendata . IStockPrice [ ] ) . length ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Fetched  ${ ( prices  as  opendata . IStockPrice [ ] ) . length }  historical prices ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Verify all data types are 'eod'
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  ( prices  as  opendata . IStockPrice [ ] ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . dataType ) . toEqual ( 'eod' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . ticker ) . toEqual ( 'AAPL' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '✓ All prices have correct dataType' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should include OHLCV data in responses' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n📊 Testing Phase 1: OHLCV Data' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'current' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'GOOGL' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  stockPrice  =  price  as  opendata . IStockPrice ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Verify OHLCV fields are present
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockPrice . open ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockPrice . high ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockPrice . low ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockPrice . price ) . not . toEqual ( undefined ) ;  // close
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( stockPrice . volume ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ OHLCV Data: ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Open:    $ ${ stockPrice . open } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   High:    $ ${ stockPrice . high } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Low:     $ ${ stockPrice . low } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Close:   $ ${ stockPrice . price } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Volume:  ${ stockPrice . volume ? . toLocaleString ( ) } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should support exchange filtering' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🌍 Testing Phase 1: Exchange Filtering' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Note: This test may fail if the exchange doesn't have data for the ticker
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // In production, you'd test with tickers known to exist on specific exchanges
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const  price  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      type :  'current' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      ticker :  'AAPL' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      exchange :  'XNAS'  // NASDAQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( ` ✓ Successfully filtered by exchange:  ${ ( price  as  opendata . IStockPrice ) . exchange } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }  catch  ( error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Exchange filtering test inconclusive (may need tier upgrade)' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( true ) . toEqual ( true ) ;  // Don't fail test
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should verify smart caching with historical data' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n💾 Testing Phase 1: Smart Caching' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  fromDate  =  new  Date ( '2024-11-01' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  toDate  =  new  Date ( '2024-11-30' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // First request - should hit API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  start1  =  Date . now ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices1  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'historical' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'TSLA' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from :  fromDate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    to : toDate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  duration1  =  Date . now ( )  -  start1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Second request - should be cached (historical data cached forever)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  start2  =  Date . now ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices2  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'historical' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'TSLA' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from :  fromDate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    to : toDate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  duration2  =  Date . now ( )  -  start2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( ( prices1  as  opendata . IStockPrice [ ] ) . length ) . toEqual ( ( prices2  as  opendata . IStockPrice [ ] ) . length ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( duration2 ) . toBeLessThan ( duration1 ) ;  // Cached should be much faster
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ First request:   ${ duration1 } ms (API call) ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Second request:  ${ duration2 } ms (cached) ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Speed improvement:  ${ Math . round ( ( duration1  /  duration2 )  *  10 )  /  10 } x faster ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-31 15:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Company Name Feature Tests
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should include company name in single price request' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🏢 Testing Company Name Feature: Single Request' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  price  =  await  stockService . getPrice ( {  ticker :  'AAPL'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . companyName ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( typeof  price . companyName ) . toEqual ( 'string' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( price . companyName ) . toInclude ( 'Apple' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Company name retrieved: " ${ price . companyName } " ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Ticker:  ${ price . ticker } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Price:  $ ${ price . price } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Company:  ${ price . companyName } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should include company names in batch price request' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🏢 Testing Company Name Feature: Batch Request' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices  =  await  stockService . getPrices ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    tickers :  [ 'AAPL' ,  'MSFT' ,  'GOOGL' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices ) . toBeArray ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices . length ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Fetched  ${ prices . length }  prices with company names: ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  prices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . companyName ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( typeof  price . companyName ) . toEqual ( 'string' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( `    ${ price . ticker . padEnd ( 6 ) }  -  ${ price . companyName } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should include company name in historical data' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n🏢 Testing Company Name Feature: Historical Data' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  prices  =  await  stockService . getData ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    type :  'historical' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ticker :  'TSLA' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    from :  new  Date ( '2025-10-01' ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    to : new  Date ( '2025-10-05' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( prices ) . toBeArray ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  historicalPrices  =  prices  as  opendata . IStockPrice [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( historicalPrices . length ) . toBeGreaterThan ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // All historical records should have the same company name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  historicalPrices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . companyName ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( typeof  price . companyName ) . toEqual ( 'string' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  firstPrice  =  historicalPrices [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Historical records include company name: " ${ firstPrice . companyName } " ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Ticker:  ${ firstPrice . ticker } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Records:  ${ historicalPrices . length } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Date range:  ${ historicalPrices [ historicalPrices . length  -  1 ] . timestamp . toISOString ( ) . split ( 'T' ) [ 0 ] }  to  ${ firstPrice . timestamp . toISOString ( ) . split ( 'T' ) [ 0 ] } ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tap . test ( 'should verify company name is included with zero extra API calls' ,  async  ( )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! marketstackProvider )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( '⚠️  Skipping - Marketstack provider not initialized' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( '\n⚡ Testing Company Name Efficiency: Zero Extra API Calls' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Clear cache to ensure we're making fresh API calls
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  stockService . clearCache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Single request timing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  start1  =  Date . now ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  singlePrice  =  await  stockService . getPrice ( {  ticker :  'AMZN'  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  duration1  =  Date . now ( )  -  start1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expect ( singlePrice . companyName ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Batch request timing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  stockService . clearCache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  start2  =  Date . now ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  batchPrices  =  await  stockService . getPrices ( {  tickers :  [ 'NVDA' ,  'AMD' ,  'INTC' ]  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  duration2  =  Date . now ( )  -  start2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  batchPrices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    expect ( price . companyName ) . not . toEqual ( undefined ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Single request (with company name):  ${ duration1 } ms ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Batch request (with company names):  ${ duration2 } ms ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( ` ✓ Company names included in standard EOD response - zero extra calls! ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  console . log ( `   Single:  ${ singlePrice . ticker }  - " ${ singlePrice . companyName } " ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( const  price  of  batchPrices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    console . log ( `   Batch:   ${ price . ticker }  - " ${ price . companyName } " ` ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-10-11 15:21:57 +00:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								export  default  tap . start ( ) ;