Загрузка данных


import { IMoexChart, MoexChart } from '@core/MoexChart';

import type { ReactElement } from 'react';

describe('MoexChart', () => {
  it('должен очищать основной инструмент через EventManager', () => {
    const clearSymbol = jest.fn();
    const chart = Object.create(MoexChart.prototype) as MoexChart;

    (chart as unknown as { eventManager: { clearSymbol: () => void } }).eventManager = {
      clearSymbol,
    };

    chart.clearSymbol();

    expect(clearSymbol).toHaveBeenCalledTimes(1);
  });

  it('должен устанавливать основной инструмент через EventManager', () => {
    const setSymbol = jest.fn();
    const chart = Object.create(MoexChart.prototype) as MoexChart;

    (chart as unknown as { eventManager: { setSymbol: typeof setSymbol } }).eventManager = {
      setSymbol,
    };

    chart.setSymbol({
      symbolId: 'SBER',
      symbol: 'SBER',
      symbolName: 'Sberbank',
    });

    expect(setSymbol).toHaveBeenCalledWith({
      symbolId: 'SBER',
      symbol: 'SBER',
      symbolName: 'Sberbank',
    });
  });

  function renderHeader(showSnapshotButton?: boolean) {
    const copyImage = jest.fn().mockResolvedValue(undefined);
    const headerRenderer = { renderComponent: jest.fn() };
    const drawingToolbarRenderer = { renderComponent: jest.fn() };

    const drawingsCollectionManager = {
      selectedDrawing: jest.fn(),
      updateSelectedDrawingSettings: jest.fn(),
      toggleSelectedDrawingLock: jest.fn(),
      openSelectedDrawingSettings: jest.fn(),
      deleteSelectedDrawing: jest.fn(),
    };

    const chart = Object.create(MoexChart.prototype) as MoexChart;

    const internals = chart as unknown as {
      chart: {
        copyImage: () => Promise<void>;
        getDrawingsCollectionManager: () => typeof drawingsCollectionManager;
      };
      drawingToolbarRenderer: typeof drawingToolbarRenderer;
      headerRenderer: typeof headerRenderer;
      toolbarRenderer: undefined;
      controlBarRenderer: undefined;
      footerRenderer: undefined;
      eventManager: {
        getTimeframeObs: jest.Mock;
        setTimeframe: jest.Mock;
        getSelectedSeries: jest.Mock;
        setSeriesSelected: jest.Mock;
      };
      modalRenderer: object;
      fullscreen: object;
      renderAttachments: (config: IMoexChart, toggleToolbar: () => boolean) => void;
    };

    internals.chart = {
      copyImage,
      getDrawingsCollectionManager: () => drawingsCollectionManager,
    };

    internals.drawingToolbarRenderer = drawingToolbarRenderer;
    internals.headerRenderer = headerRenderer;
    internals.toolbarRenderer = undefined;
    internals.controlBarRenderer = undefined;
    internals.footerRenderer = undefined;
    internals.modalRenderer = {};
    internals.fullscreen = {};

    internals.eventManager = {
      getTimeframeObs: jest.fn(),
      setTimeframe: jest.fn(),
      getSelectedSeries: jest.fn(),
      setSeriesSelected: jest.fn(),
    };

    const config = {
      chartCollectionPreset: {
        supportedTimeframes: [],
        supportedChartSeriesTypes: [],
        showSettingsButton: false,
        showMenuButton: false,
        showFullscreenButton: false,
        undoRedoEnabled: false,
        showCompareButton: false,
        showSnapshotButton,
        openCompareModal: undefined,
        openSymbolSearchModal: undefined,
        theme: 'tr',
      },
    } as unknown as IMoexChart;

    internals.renderAttachments(config, jest.fn(() => false));

    const header = headerRenderer.renderComponent.mock.calls[0][0] as ReactElement<{
      copyImage?: () => Promise<void>;
    }>;

    return { header, copyImage };
  }

  it('должен передавать copyImage в Header, если снимок включён', async () => {
    const { header, copyImage } = renderHeader(true);

    expect(header.props.copyImage).toBeDefined();

    await header.props.copyImage!();

    expect(copyImage).toHaveBeenCalledTimes(1);
  });

  it('должен передавать copyImage в Header, если настройка снимка не задана', async () => {
    const { header, copyImage } = renderHeader();

    expect(header.props.copyImage).toBeDefined();

    await header.props.copyImage!();

    expect(copyImage).toHaveBeenCalledTimes(1);
  });

  it('не должен передавать copyImage в Header, если снимок отключён', () => {
    const { header, copyImage } = renderHeader(false);

    expect(header.props.copyImage).toBeUndefined();
    expect(copyImage).not.toHaveBeenCalled();
  });
});