| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -61,6 +61,9 @@ function mockGetValue(symbol: string, date: Date) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (dateEqual(parse('2021-07-26', 'yyyy-MM-dd', new Date()), date)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      return { marketPrice: 657.62 }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (dateEqual(parse('2021-01-02', 'yyyy-MM-dd', new Date()), date)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      return { marketPrice: 666.66 }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return { marketPrice: 0 }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return { marketPrice: 0 }; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -615,7 +618,7 @@ describe('PortfolioCalculator', () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  describe('get current positions', () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    it('with single TSLA', async () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    it('with single TSLA and early start', async () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const portfolioCalculator = new PortfolioCalculator( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currentRateService, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Currency.USD | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -650,6 +653,76 @@ describe('PortfolioCalculator', () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    it('with single TSLA and buy day start', async () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const portfolioCalculator = new PortfolioCalculator( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currentRateService, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Currency.USD | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      portfolioCalculator.setTransactionPoints(orderTslaTransactionPoint); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const spy = jest | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .spyOn(Date, 'now') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .mockImplementation(() => new Date(Date.UTC(2021, 6, 26)).getTime()); // 2021-07-26
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const currentPositions = await portfolioCalculator.getCurrentPositions( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        parse('2021-01-01', 'yyyy-MM-dd', new Date()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      spy.mockRestore(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      expect(currentPositions).toEqual({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        hasErrors: false, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        positions: [ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            averagePrice: new Big('719.46'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            currency: 'USD', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            firstBuyDate: '2021-01-01', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            grossPerformance: new Big('-61.84'), // 657.62-719.46=-61.84
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            grossPerformancePercentage: new Big('-0.08595335390431712673'), // (657.62-719.46)/719.46=-0.085953353904317
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            investment: new Big('719.46'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            marketPrice: 657.62, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            name: 'Tesla, Inc.', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            quantity: new Big('1'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            symbol: 'TSLA', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            transactionCount: 1 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    it('with single TSLA and late start', async () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const portfolioCalculator = new PortfolioCalculator( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currentRateService, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Currency.USD | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      portfolioCalculator.setTransactionPoints(orderTslaTransactionPoint); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const spy = jest | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .spyOn(Date, 'now') | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        .mockImplementation(() => new Date(Date.UTC(2021, 6, 26)).getTime()); // 2021-07-26
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const currentPositions = await portfolioCalculator.getCurrentPositions( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        parse('2021-01-02', 'yyyy-MM-dd', new Date()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      spy.mockRestore(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      expect(currentPositions).toEqual({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        hasErrors: false, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        positions: [ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            averagePrice: new Big('719.46'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            currency: 'USD', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            firstBuyDate: '2021-01-01', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            grossPerformance: new Big('-9.04'), // 657.62-666.66=-9.04
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            grossPerformancePercentage: new Big('-0.01356013560135601356'), // 657.62/666.66-1=-0.013560136
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            investment: new Big('719.46'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            marketPrice: 657.62, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            name: 'Tesla, Inc.', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            quantity: new Big('1'), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            symbol: 'TSLA', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            transactionCount: 1 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    it('with VTI only', async () => { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const portfolioCalculator = new PortfolioCalculator( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        currentRateService, | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |