mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 3 changed files with 151 additions and 1 deletions
			
			
		| @ -0,0 +1,140 @@ | |||
| import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; | |||
| import { | |||
|   activityDummyData, | |||
|   loadExportFile, | |||
|   symbolProfileDummyData, | |||
|   userDummyData | |||
| } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; | |||
| import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; | |||
| import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; | |||
| import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; | |||
| import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; | |||
| import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; | |||
| import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; | |||
| import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; | |||
| import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; | |||
| import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; | |||
| import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; | |||
| import { parseDate } from '@ghostfolio/common/helper'; | |||
| import { ExportResponse } from '@ghostfolio/common/interfaces'; | |||
| import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; | |||
| 
 | |||
| import { Big } from 'big.js'; | |||
| import { join } from 'node:path'; | |||
| 
 | |||
| jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { | |||
|   return { | |||
|     CurrentRateService: jest.fn().mockImplementation(() => { | |||
|       return CurrentRateServiceMock; | |||
|     }) | |||
|   }; | |||
| }); | |||
| 
 | |||
| jest.mock( | |||
|   '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', | |||
|   () => { | |||
|     return { | |||
|       ExchangeRateDataService: jest.fn().mockImplementation(() => { | |||
|         return ExchangeRateDataServiceMock; | |||
|       }) | |||
|     }; | |||
|   } | |||
| ); | |||
| 
 | |||
| jest.mock( | |||
|   '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', | |||
|   () => { | |||
|     return { | |||
|       PortfolioSnapshotService: jest.fn().mockImplementation(() => { | |||
|         return PortfolioSnapshotServiceMock; | |||
|       }) | |||
|     }; | |||
|   } | |||
| ); | |||
| 
 | |||
| jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { | |||
|   return { | |||
|     RedisCacheService: jest.fn().mockImplementation(() => { | |||
|       return RedisCacheServiceMock; | |||
|     }) | |||
|   }; | |||
| }); | |||
| 
 | |||
| describe('PortfolioCalculator', () => { | |||
|   let exportResponse: ExportResponse; | |||
| 
 | |||
|   let configurationService: ConfigurationService; | |||
|   let currentRateService: CurrentRateService; | |||
|   let exchangeRateDataService: ExchangeRateDataService; | |||
|   let portfolioCalculatorFactory: PortfolioCalculatorFactory; | |||
|   let portfolioSnapshotService: PortfolioSnapshotService; | |||
|   let redisCacheService: RedisCacheService; | |||
| 
 | |||
|   beforeAll(() => { | |||
|     exportResponse = loadExportFile( | |||
|       join(__dirname, '../../../../../../../test/import/ok/btceur.json') | |||
|     ); | |||
|   }); | |||
| 
 | |||
|   beforeEach(() => { | |||
|     configurationService = new ConfigurationService(); | |||
| 
 | |||
|     currentRateService = new CurrentRateService(null, null, null, null); | |||
| 
 | |||
|     exchangeRateDataService = new ExchangeRateDataService( | |||
|       null, | |||
|       null, | |||
|       null, | |||
|       null | |||
|     ); | |||
| 
 | |||
|     portfolioSnapshotService = new PortfolioSnapshotService(null); | |||
| 
 | |||
|     redisCacheService = new RedisCacheService(null, null); | |||
| 
 | |||
|     portfolioCalculatorFactory = new PortfolioCalculatorFactory( | |||
|       configurationService, | |||
|       currentRateService, | |||
|       exchangeRateDataService, | |||
|       portfolioSnapshotService, | |||
|       redisCacheService | |||
|     ); | |||
|   }); | |||
| 
 | |||
|   describe('get current positions', () => { | |||
|     it.only('with BTCUSD buy (in EUR)', async () => { | |||
|       jest.useFakeTimers().setSystemTime(parseDate('2022-01-14').getTime()); | |||
| 
 | |||
|       const activities: Activity[] = exportResponse.activities.map( | |||
|         (activity) => ({ | |||
|           ...activityDummyData, | |||
|           ...activity, | |||
|           date: parseDate(activity.date), | |||
|           feeInAssetProfileCurrency: 4.46, | |||
|           SymbolProfile: { | |||
|             ...symbolProfileDummyData, | |||
|             currency: 'USD', | |||
|             dataSource: activity.dataSource, | |||
|             name: 'Bitcoin', | |||
|             symbol: activity.symbol | |||
|           }, | |||
|           unitPriceInAssetProfileCurrency: 44558.42 | |||
|         }) | |||
|       ); | |||
| 
 | |||
|       const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ | |||
|         activities, | |||
|         calculationType: PerformanceCalculationType.ROAI, | |||
|         currency: 'EUR', | |||
|         userId: userDummyData.id | |||
|       }); | |||
| 
 | |||
|       const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); | |||
| 
 | |||
|       expect(portfolioSnapshot.positions[0].fee).toEqual(new Big(4.46)); | |||
|       expect( | |||
|         portfolioSnapshot.positions[0].feeInBaseCurrency.toNumber() | |||
|       ).toBeCloseTo(3.94, 1); | |||
|     }); | |||
|   }); | |||
| }); | |||
					Loading…
					
					
				
		Reference in new issue