async def test_ticker_traded(mocker): """Для торгуемого тикера должны обновляться котировки и дивиденды.""" dispatcher = handlers.EventHandlersDispatcher() event = events.TickerTraded( "ticker", "ISIN", "M1", date(2020, 12, 22), pd.DataFrame([1]), ) fake_repo = mocker.Mock() fake_load_by_id_and_handle_event = mocker.patch.object( handlers, "_load_by_id_and_handle_event", side_effect=[["aa"], ["bb", "cc"]], ) assert await dispatcher.handle_event(event, fake_repo) == ["aa", "bb", "cc"] fake_load_by_id_and_handle_event.assert_has_calls([ mocker.call(fake_repo, base.create_id(ports.QUOTES, "ticker"), event), mocker.call(fake_repo, base.create_id(ports.DIVIDENDS, "ticker"), event), ], )
def test_new_events(table, mocker): """Создание событий для всех торгуемых тикеров.""" table._df = pd.DataFrame( [["YY", 10, "m2"], ["UU", 100, "m1"]], columns=[col.ISIN, col.LOT_SIZE, col.MARKET], index=["GAZP", "AKRN"], ) trading_date = date(2020, 12, 15) fake_usd = mocker.Mock() event = events.USDUpdated(trading_date, fake_usd) assert table._new_events(event) == [ events.TickerTraded("GAZP", "YY", "m2", trading_date, fake_usd.copy.return_value), events.TickerTraded("AKRN", "UU", "m1", trading_date, fake_usd.copy.return_value), ]
async def test_prepare_df(div_table, mocker): """Корректно рассчитываются значения. Курс сдвигается вперед для отсутствующих дат. Рублевые значения не пересчитываются. Для задвоенных дат данные группируются и суммируются. """ div_table._gateway = mocker.AsyncMock() div_table._gateway.return_value = pd.DataFrame( [ [20, col.RUR], [30, col.USD], [40, col.USD], [10, col.RUR], ], index=[ date(2020, 12, 16), date(2020, 12, 16), date(2021, 1, 11), date(2021, 2, 5), ], columns=["TICKER", col.CURRENCY], ) usd = pd.DataFrame( [2, 3, 4], index=[ date(2020, 12, 15), date(2021, 1, 10), date(2021, 2, 5), ], columns=[col.CLOSE], ) event = events.TickerTraded("TICKER", "ISIN", "M1", date(2020, 12, 16), usd) pd.testing.assert_frame_equal( await div_table._prepare_df(event), pd.DataFrame( [80, 120, 10], index=[ date(2020, 12, 16), date(2021, 1, 11), date(2021, 2, 5), ], columns=["TICKER"], ), check_dtype=False, )
def _new_events(self, event: events.USDUpdated) -> List[domain.AbstractEvent]: """События факта торговли конкретных бумаг.""" df: pd.DataFrame = self._df trading_date = event.date return [ events.TickerTraded( ticker, df.at[ticker, col.ISIN], df.at[ticker, col.MARKET], trading_date, event.usd.copy(deep=True), ) for ticker in df.index ]
async def test_load_after_empty(table, mocker): """Загрузка данных для пустых старых.""" table._df = pd.DataFrame() table._aliases = mocker.AsyncMock() table._quotes = mocker.AsyncMock() mocker.patch.object(quotes.pd, "concat") event = events.TickerTraded( "TICKER", "ISIN", "M1", date(2020, 12, 16), mocker.Mock(), ) assert await table._load_df(event) is quotes.pd.concat.return_value assert table._aliases.call_count == 0 table._quotes.assert_called_once_with("TICKER", "M1", None, "2020-12-16")
async def test_load_first(table, mocker): """Загрузка данных в первый раз.""" fake_aliases = mocker.AsyncMock() fake_aliases.return_value = ["ALIAS"] table._aliases = fake_aliases table._quotes = mocker.AsyncMock() mocker.patch.object(quotes.pd, "concat") event = events.TickerTraded( "TICKER", "ISIN", "M1", date(2020, 12, 16), mocker.Mock(), ) assert await table._load_df(event) is quotes.pd.concat.return_value fake_aliases.assert_called_once_with("ISIN") table._quotes.assert_called_once_with("ALIAS", "M1", None, "2020-12-16")
from poptimizer.data.domain import events from poptimizer.data.domain.tables import base, dividends from poptimizer.shared import col @pytest.fixture(scope="function", name="div_table") def create_div_table(): """Создает пустую таблицу дивидендов для тестов.""" id_ = base.create_id(ports.DIVIDENDS) return dividends.Dividends(id_) DIV_UPDATE_CASES = ( ( None, events.TickerTraded("TICKER", "ISIN", "M1", date(2020, 12, 17), pd.DataFrame()), True, ), ( pd.DataFrame(), events.UpdateDivCommand("TICKER"), True, ), ( pd.DataFrame(), events.TickerTraded("TICKER", "ISIN", "M1", date(2020, 12, 17), pd.DataFrame()), False, ), )