|
|
@ -15,32 +15,14 @@ import { |
|
|
|
differenceInCalendarDays, |
|
|
|
endOfDay, |
|
|
|
isBefore, |
|
|
|
isSameDay, |
|
|
|
parse |
|
|
|
} from 'date-fns'; |
|
|
|
|
|
|
|
function toYearMonthDay(date: Date) { |
|
|
|
const year = date.getFullYear(); |
|
|
|
const month = date.getMonth() + 1; |
|
|
|
const day = date.getDate(); |
|
|
|
|
|
|
|
return [year, month, day]; |
|
|
|
} |
|
|
|
|
|
|
|
function dateEqual(date1: Date, date2: Date) { |
|
|
|
const date1Converted = toYearMonthDay(date1); |
|
|
|
const date2Converted = toYearMonthDay(date2); |
|
|
|
|
|
|
|
return ( |
|
|
|
date1Converted[0] === date2Converted[0] && |
|
|
|
date1Converted[1] === date2Converted[1] && |
|
|
|
date1Converted[2] === date2Converted[2] |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
function mockGetValue(symbol: string, date: Date) { |
|
|
|
const today = new Date(); |
|
|
|
if (symbol === 'VTI') { |
|
|
|
if (dateEqual(today, date)) { |
|
|
|
if (isSameDay(today, date)) { |
|
|
|
return { marketPrice: 213.32 }; |
|
|
|
} else { |
|
|
|
const startDate = parse('2019-02-01', 'yyyy-MM-dd', new Date()); |
|
|
@ -54,10 +36,10 @@ function mockGetValue(symbol: string, date: Date) { |
|
|
|
} else if (symbol === 'AMZN') { |
|
|
|
return { marketPrice: 2021.99 }; |
|
|
|
} else if (symbol === 'TSLA') { |
|
|
|
if (dateEqual(parse('2021-07-26', 'yyyy-MM-dd', new Date()), date)) { |
|
|
|
if (isSameDay(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)) { |
|
|
|
if (isSameDay(parse('2021-01-02', 'yyyy-MM-dd', new Date()), date)) { |
|
|
|
return { marketPrice: 666.66 }; |
|
|
|
} |
|
|
|
return { marketPrice: 0 }; |
|
|
@ -72,9 +54,9 @@ jest.mock('@ghostfolio/api/app/core/current-rate.service', () => { |
|
|
|
CurrentRateService: jest.fn().mockImplementation(() => { |
|
|
|
return { |
|
|
|
getValue: ({ |
|
|
|
currency, |
|
|
|
date, |
|
|
|
symbol, |
|
|
|
currency, |
|
|
|
userCurrency |
|
|
|
}: GetValueParams) => { |
|
|
|
return Promise.resolve(mockGetValue(symbol, date)); |
|
|
@ -144,13 +126,13 @@ describe('PortfolioCalculator', () => { |
|
|
|
const orders = [ |
|
|
|
...ordersVTI, |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
date: '2021-02-01', |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('20'), |
|
|
|
symbol: 'VTI', |
|
|
|
type: OrderType.Buy, |
|
|
|
unitPrice: new Big('197.15'), |
|
|
|
currency: Currency.USD |
|
|
|
unitPrice: new Big('197.15') |
|
|
|
} |
|
|
|
]; |
|
|
|
const portfolioCalculator = new PortfolioCalculator( |
|
|
@ -166,12 +148,12 @@ describe('PortfolioCalculator', () => { |
|
|
|
date: '2019-02-01', |
|
|
|
items: [ |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
investment: new Big('1443.8'), |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('10'), |
|
|
|
symbol: 'VTI', |
|
|
|
investment: new Big('1443.8'), |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
transactionCount: 1 |
|
|
|
} |
|
|
|
] |
|
|
@ -180,12 +162,12 @@ describe('PortfolioCalculator', () => { |
|
|
|
date: '2019-08-03', |
|
|
|
items: [ |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
investment: new Big('2923.7'), |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('20'), |
|
|
|
symbol: 'VTI', |
|
|
|
investment: new Big('2923.7'), |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
transactionCount: 2 |
|
|
|
} |
|
|
|
] |
|
|
@ -194,12 +176,12 @@ describe('PortfolioCalculator', () => { |
|
|
|
date: '2020-02-02', |
|
|
|
items: [ |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
investment: new Big('652.55'), |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('5'), |
|
|
|
symbol: 'VTI', |
|
|
|
investment: new Big('652.55'), |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
transactionCount: 3 |
|
|
|
} |
|
|
|
] |
|
|
@ -208,12 +190,12 @@ describe('PortfolioCalculator', () => { |
|
|
|
date: '2021-02-01', |
|
|
|
items: [ |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
investment: new Big('6627.05'), |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('35'), |
|
|
|
symbol: 'VTI', |
|
|
|
investment: new Big('6627.05'), |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
transactionCount: 5 |
|
|
|
} |
|
|
|
] |
|
|
@ -222,12 +204,12 @@ describe('PortfolioCalculator', () => { |
|
|
|
date: '2021-08-01', |
|
|
|
items: [ |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
investment: new Big('8403.95'), |
|
|
|
name: 'Vanguard Total Stock Market Index Fund ETF Shares', |
|
|
|
quantity: new Big('45'), |
|
|
|
symbol: 'VTI', |
|
|
|
investment: new Big('8403.95'), |
|
|
|
currency: Currency.USD, |
|
|
|
firstBuyDate: '2019-02-01', |
|
|
|
transactionCount: 6 |
|
|
|
} |
|
|
|
] |
|
|
@ -239,13 +221,13 @@ describe('PortfolioCalculator', () => { |
|
|
|
const orders = [ |
|
|
|
...ordersVTI, |
|
|
|
{ |
|
|
|
currency: Currency.USD, |
|
|
|
date: '2019-09-01', |
|
|
|
name: 'Amazon.com, Inc.', |
|
|
|
quantity: new Big('5'), |
|
|
|
symbol: 'AMZN', |
|
|
|
type: OrderType.Buy, |
|
|
|
unitPrice: new Big('2021.99'), |
|
|
|
currency: Currency.USD |
|
|
|
unitPrice: new Big('2021.99') |
|
|
|
} |
|
|
|
]; |
|
|
|
const portfolioCalculator = new PortfolioCalculator( |
|
|
@ -1463,6 +1445,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
const ordersMixedSymbols: PortfolioOrder[] = [ |
|
|
|
{ |
|
|
|
date: '2017-01-03', |
|
|
|