mirror of https://github.com/ghostfolio/ghostfolio
2 changed files with 5 additions and 145 deletions
@ -1,141 +0,0 @@ |
|||
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; |
|||
import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service'; |
|||
import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; |
|||
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; |
|||
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; |
|||
|
|||
import { BenchmarksService } from './benchmarks.service'; |
|||
|
|||
describe('BenchmarksService', () => { |
|||
let benchmarksService: BenchmarksService; |
|||
|
|||
const mockBenchmarkService = { |
|||
calculateChangeInPercentage: jest.fn( |
|||
(startPrice: number, endPrice: number) => { |
|||
return (endPrice - startPrice) / startPrice; |
|||
} |
|||
) |
|||
}; |
|||
|
|||
const mockExchangeRateDataService = { |
|||
getExchangeRatesByCurrency: jest.fn().mockResolvedValue({}) |
|||
}; |
|||
|
|||
const mockMarketDataService = { |
|||
marketDataItems: jest.fn() |
|||
}; |
|||
|
|||
const mockPortfolioService = { |
|||
getPerformance: jest.fn() |
|||
}; |
|||
|
|||
const mockSymbolService = { |
|||
get: jest.fn() |
|||
}; |
|||
|
|||
beforeEach(() => { |
|||
jest.clearAllMocks(); |
|||
|
|||
benchmarksService = new BenchmarksService( |
|||
mockBenchmarkService as unknown as BenchmarkService, |
|||
mockExchangeRateDataService as unknown as ExchangeRateDataService, |
|||
mockMarketDataService as unknown as MarketDataService, |
|||
mockPortfolioService as unknown as PortfolioService, |
|||
mockSymbolService as unknown as SymbolService |
|||
); |
|||
}); |
|||
|
|||
describe('getMarketDataForUser', () => { |
|||
it('returns benchmark data for a calendar year with the first chart date as baseline', async () => { |
|||
const startDate = new Date(2024, 11, 31, 23, 59, 59, 999); |
|||
const endDate = new Date(2025, 11, 31, 23, 59, 59, 999); |
|||
|
|||
mockPortfolioService.getPerformance.mockResolvedValue({ |
|||
chart: [ |
|||
{ date: '2025-01-01', value: 0 }, |
|||
{ date: '2025-06-30', value: 10 }, |
|||
{ date: '2025-12-31', value: 20 } |
|||
] |
|||
}); |
|||
|
|||
mockSymbolService.get.mockResolvedValue({ |
|||
currency: 'USD', |
|||
marketPrice: 150 |
|||
}); |
|||
|
|||
mockMarketDataService.marketDataItems.mockResolvedValue([ |
|||
{ date: new Date(Date.UTC(2025, 0, 1)), marketPrice: 100 }, |
|||
{ date: new Date(Date.UTC(2025, 5, 30)), marketPrice: 120 }, |
|||
{ date: new Date(Date.UTC(2025, 11, 31)), marketPrice: 150 } |
|||
]); |
|||
|
|||
const result = await benchmarksService.getMarketDataForUser({ |
|||
dataSource: 'YAHOO', |
|||
dateRange: '2025', |
|||
endDate, |
|||
filters: [], |
|||
startDate, |
|||
symbol: 'VOO', |
|||
userId: 'user-1', |
|||
userSettings: { baseCurrency: 'USD' } |
|||
}); |
|||
|
|||
expect(result.marketData.length).toBeGreaterThan(0); |
|||
|
|||
const baselineItem = result.marketData.find( |
|||
({ date }) => date === '2025-01-01' |
|||
); |
|||
expect(baselineItem).toBeDefined(); |
|||
expect(baselineItem.value).toBe(0); |
|||
|
|||
const junItem = result.marketData.find( |
|||
({ date }) => date === '2025-06-30' |
|||
); |
|||
expect(junItem).toEqual({ |
|||
date: '2025-06-30', |
|||
value: expect.closeTo(((120 - 100) / 100) * 100, 10) |
|||
}); |
|||
|
|||
const decItem = result.marketData.find( |
|||
({ date }) => date === '2025-12-31' |
|||
); |
|||
expect(decItem).toEqual({ |
|||
date: '2025-12-31', |
|||
value: expect.closeTo(((150 - 100) / 100) * 100, 10) |
|||
}); |
|||
}); |
|||
|
|||
it('uses resetHours(startDate) as the baseline when the chart is empty', async () => { |
|||
const startDate = new Date(2024, 11, 31, 23, 59, 59, 999); |
|||
|
|||
mockPortfolioService.getPerformance.mockResolvedValue({ |
|||
chart: [] |
|||
}); |
|||
|
|||
mockSymbolService.get.mockResolvedValue({ |
|||
currency: 'USD', |
|||
marketPrice: 150 |
|||
}); |
|||
|
|||
mockMarketDataService.marketDataItems.mockResolvedValue([ |
|||
{ date: new Date(Date.UTC(2024, 11, 31)), marketPrice: 100 } |
|||
]); |
|||
|
|||
const result = await benchmarksService.getMarketDataForUser({ |
|||
dataSource: 'YAHOO', |
|||
dateRange: '2025', |
|||
filters: [], |
|||
startDate, |
|||
symbol: 'VOO', |
|||
userId: 'user-1', |
|||
userSettings: { baseCurrency: 'USD' } |
|||
}); |
|||
|
|||
const baselineItem = result.marketData.find( |
|||
({ date }) => date === '2024-12-31' |
|||
); |
|||
expect(baselineItem).toBeDefined(); |
|||
expect(baselineItem.value).toBe(0); |
|||
}); |
|||
}); |
|||
}); |
|||
Loading…
Reference in new issue