109 lines
3.2 KiB
TypeScript
109 lines
3.2 KiB
TypeScript
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();
|
|
});
|
|
});
|