Browse Source

Refactoring

pull/3901/head
Thomas Kaul 11 months ago
parent
commit
32452a5d22
  1. 6
      apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts
  2. 51
      apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts

6
apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts

@ -1,3 +1,5 @@
import { readFileSync } from 'fs';
export const activityDummyData = { export const activityDummyData = {
accountId: undefined, accountId: undefined,
accountUserId: undefined, accountUserId: undefined,
@ -29,3 +31,7 @@ export const symbolProfileDummyData = {
export const userDummyData = { export const userDummyData = {
id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
}; };
export function loadActivityExportFile(filePath: string) {
return JSON.parse(readFileSync(filePath, 'utf8')).activities;
}

51
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-dynamic-buy-and-sell.spec.ts

@ -1,5 +1,11 @@
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; import {
activityDummyData,
loadActivityExportFile,
symbolProfileDummyData,
userDummyData
} from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils';
import { import {
PerformanceCalculationType, PerformanceCalculationType,
PortfolioCalculatorFactory PortfolioCalculatorFactory
@ -15,7 +21,6 @@ import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/po
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { existsSync, readFileSync } from 'fs';
import { last } from 'lodash'; import { last } from 'lodash';
import { join } from 'path'; import { join } from 'path';
@ -50,6 +55,8 @@ jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => {
}); });
describe('PortfolioCalculator', () => { describe('PortfolioCalculator', () => {
let activityDtos: CreateOrderDto[];
let configurationService: ConfigurationService; let configurationService: ConfigurationService;
let currentRateService: CurrentRateService; let currentRateService: CurrentRateService;
let exchangeRateDataService: ExchangeRateDataService; let exchangeRateDataService: ExchangeRateDataService;
@ -57,6 +64,15 @@ describe('PortfolioCalculator', () => {
let portfolioSnapshotService: PortfolioSnapshotService; let portfolioSnapshotService: PortfolioSnapshotService;
let redisCacheService: RedisCacheService; let redisCacheService: RedisCacheService;
beforeAll(() => {
activityDtos = loadActivityExportFile(
join(
__dirname,
'../../../../../../../test/import/ok-novn-buy-and-sell.json'
)
);
});
beforeEach(() => { beforeEach(() => {
configurationService = new ConfigurationService(); configurationService = new ConfigurationService();
@ -82,40 +98,25 @@ describe('PortfolioCalculator', () => {
); );
}); });
//read from activities json
let activities: any[];
beforeAll(() => {
const jsonFilePath = join(
__dirname,
'../../../../../../../test/import/ok-novn-buy-and-sell.json'
);
if (!existsSync(jsonFilePath))
throw new Error('JSON file not found at: ' + jsonFilePath);
const jsonData = readFileSync(jsonFilePath, 'utf8');
activities = JSON.parse(jsonData).activities;
});
describe('get current positions', () => { describe('get current positions', () => {
it.only('with NOVN.SW buy and sell', async () => { it.only('with NOVN.SW buy and sell', async () => {
jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime()); jest.useFakeTimers().setSystemTime(parseDate('2022-04-11').getTime());
//map activity with json const activities: Activity[] = activityDtos.map((activity) => ({
const mappedactivities: Activity[] = activities.map((activity) => ({ ...activityDummyData,
...activity, ...activity,
date: new Date(activity.date), date: new Date(activity.date),
SymbolProfile: { SymbolProfile: {
currency: activity.currency || 'CHF', ...symbolProfileDummyData,
dataSource: activity.dataSource || 'YAHOO', currency: activity.currency,
name: activity.name || 'Default Name', // provide a default name if missing dataSource: activity.dataSource,
symbol: activity.symbol || 'UNKNOWN' // provide a default symbol if missing name: 'Novartis AG',
symbol: activity.symbol
} }
})); }));
const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ const portfolioCalculator = portfolioCalculatorFactory.createCalculator({
activities: mappedactivities, activities,
calculationType: PerformanceCalculationType.TWR, calculationType: PerformanceCalculationType.TWR,
currency: 'CHF', currency: 'CHF',
userId: userDummyData.id userId: userDummyData.id

Loading…
Cancel
Save