mirror of https://github.com/ghostfolio/ghostfolio
committed by
GitHub
7 changed files with 294 additions and 50 deletions
@ -0,0 +1,96 @@ |
|||||
|
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; |
||||
|
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; |
||||
|
import { EnhancedAssetProfile } from '@ghostfolio/common/interfaces'; |
||||
|
|
||||
|
import { DataSource } from '@prisma/client'; |
||||
|
|
||||
|
import { ManualService } from './manual.service'; |
||||
|
|
||||
|
jest.mock('@ghostfolio/api/services/fetch/fetch.service', () => { |
||||
|
return { |
||||
|
FetchService: jest.fn() |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
describe('ManualService', () => { |
||||
|
let manualService: ManualService; |
||||
|
let prismaService: { |
||||
|
marketData: { |
||||
|
findFirst: jest.Mock; |
||||
|
}; |
||||
|
}; |
||||
|
let symbolProfileService: SymbolProfileService; |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
prismaService = { |
||||
|
marketData: { |
||||
|
findFirst: jest.fn() |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
symbolProfileService = new SymbolProfileService(null); |
||||
|
|
||||
|
manualService = new ManualService( |
||||
|
null, |
||||
|
null, |
||||
|
prismaService as unknown as PrismaService, |
||||
|
symbolProfileService |
||||
|
); |
||||
|
}); |
||||
|
|
||||
|
describe('getQuotes', () => { |
||||
|
it('should use the latest market price of each symbol of the manual data source', async () => { |
||||
|
const latestMarketPrices: { [symbol: string]: number } = { |
||||
|
A: 13, |
||||
|
B: 22 |
||||
|
}; |
||||
|
|
||||
|
prismaService.marketData.findFirst.mockImplementation( |
||||
|
({ where: { symbol } }) => { |
||||
|
return Promise.resolve( |
||||
|
latestMarketPrices[symbol] |
||||
|
? { symbol, marketPrice: latestMarketPrices[symbol] } |
||||
|
: null |
||||
|
); |
||||
|
} |
||||
|
); |
||||
|
|
||||
|
jest.spyOn(symbolProfileService, 'getSymbolProfiles').mockResolvedValue( |
||||
|
['A', 'B', 'C'].map((symbol) => { |
||||
|
return { symbol, currency: 'USD' }; |
||||
|
}) as EnhancedAssetProfile[] |
||||
|
); |
||||
|
|
||||
|
const quotes = await manualService.getQuotes({ |
||||
|
symbols: ['A', 'B', 'C'] |
||||
|
}); |
||||
|
|
||||
|
expect(prismaService.marketData.findFirst).toHaveBeenCalledWith({ |
||||
|
orderBy: { date: 'desc' }, |
||||
|
where: { dataSource: DataSource.MANUAL, symbol: 'A' } |
||||
|
}); |
||||
|
|
||||
|
expect(quotes).toEqual({ |
||||
|
A: { |
||||
|
currency: 'USD', |
||||
|
dataSource: DataSource.MANUAL, |
||||
|
marketPrice: 13, |
||||
|
marketState: 'delayed' |
||||
|
}, |
||||
|
B: { |
||||
|
currency: 'USD', |
||||
|
dataSource: DataSource.MANUAL, |
||||
|
marketPrice: 22, |
||||
|
marketState: 'delayed' |
||||
|
}, |
||||
|
// Without market data
|
||||
|
C: { |
||||
|
currency: 'USD', |
||||
|
dataSource: DataSource.MANUAL, |
||||
|
marketPrice: 0, |
||||
|
marketState: 'delayed' |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
Loading…
Reference in new issue