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(); }); });