refactor: organize backend by business responsibility
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
import { MoexClient } from './moex.client';
|
||||
|
||||
describe('MoexClient', () => {
|
||||
afterEach(() => jest.restoreAllMocks());
|
||||
it('uses effective yield only for the exact ISIN and board and preserves its own price and date', async () => {
|
||||
jest.spyOn(global, 'fetch').mockResolvedValue({
|
||||
ok: true,
|
||||
json: () =>
|
||||
Promise.resolve({
|
||||
securities: {
|
||||
columns: ['SECID', 'ISIN', 'BOARDID'],
|
||||
data: [['BOND', 'RU000TEST', 'TQOB']],
|
||||
},
|
||||
marketdata_yields: {
|
||||
columns: [
|
||||
'SECID',
|
||||
'BOARDID',
|
||||
'EFFECTIVEYIELD',
|
||||
'PRICE',
|
||||
'YIELDDATE',
|
||||
'YIELDDATETYPE',
|
||||
'TRADEMOMENT',
|
||||
],
|
||||
data: [
|
||||
[
|
||||
'BOND',
|
||||
'OTHER',
|
||||
99,
|
||||
20,
|
||||
'2028-12-01',
|
||||
'OFFERDATE',
|
||||
'2026-09-10 18:49:00',
|
||||
],
|
||||
[
|
||||
'BOND',
|
||||
'TQOB',
|
||||
-0.5,
|
||||
101,
|
||||
'2028-12-01',
|
||||
'OFFERDATE',
|
||||
'2026-09-10 18:49:00',
|
||||
],
|
||||
],
|
||||
},
|
||||
}),
|
||||
} as Response);
|
||||
const client = new MoexClient();
|
||||
expect(await client.bondYield('BOND', 'RU000TEST', 'TQOB')).toEqual({
|
||||
value: '-0.5',
|
||||
pricePercent: '101',
|
||||
date: '2028-12-01',
|
||||
dateType: 'OFFERDATE',
|
||||
tradeAt: '2026-09-10T15:49:00.000Z',
|
||||
});
|
||||
expect(await client.bondYield('BOND', 'WRONG', 'TQOB')).toBeNull();
|
||||
expect(await client.bondYield('BOND', 'RU000TEST', 'OTHER')).toBeNull();
|
||||
});
|
||||
it.each([null, 0])(
|
||||
'does not report unknown yield as zero: %s',
|
||||
async (value) => {
|
||||
jest.spyOn(global, 'fetch').mockResolvedValue({
|
||||
ok: true,
|
||||
json: () =>
|
||||
Promise.resolve({
|
||||
securities: {
|
||||
columns: ['SECID', 'ISIN', 'BOARDID'],
|
||||
data: [['BOND', 'ISIN', 'TQOB']],
|
||||
},
|
||||
marketdata_yields: {
|
||||
columns: [
|
||||
'SECID',
|
||||
'BOARDID',
|
||||
'EFFECTIVEYIELD',
|
||||
'PRICE',
|
||||
'YIELDDATE',
|
||||
'TRADEMOMENT',
|
||||
],
|
||||
data: [
|
||||
[
|
||||
'BOND',
|
||||
'TQOB',
|
||||
value,
|
||||
100,
|
||||
'2030-01-01',
|
||||
'2026-09-10 12:00:00',
|
||||
],
|
||||
],
|
||||
},
|
||||
}),
|
||||
} as Response);
|
||||
const result = await new MoexClient().bondYield('BOND', 'ISIN', 'TQOB');
|
||||
expect(result?.value ?? null).toBe(value === null ? null : '0');
|
||||
},
|
||||
);
|
||||
it('treats a successful response without the requested block as no events', async () => {
|
||||
const fetchMock = jest.spyOn(global, 'fetch').mockResolvedValue({
|
||||
ok: true,
|
||||
json: () =>
|
||||
Promise.resolve({
|
||||
description: { columns: ['name', 'value'], data: [] },
|
||||
boards: { columns: ['secid'], data: [] },
|
||||
}),
|
||||
} as Response);
|
||||
|
||||
await expect(new MoexClient().bondEvents('BOND')).resolves.toEqual([]);
|
||||
fetchMock.mockRestore();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user