async def test_prepare_df_div_ext(div_ext_table, mocker): """Проверка агрегации данных.""" event = events.UpdateDivCommand( ticker="GAZP", type_=col.ORDINARY, usd=pd.DataFrame( [2, 1], columns=[col.CLOSE], index=[datetime(2020, 12, 4), datetime(2020, 12, 5)], ), ) fake_gateway = mocker.AsyncMock() fake_gateway.return_value = pd.DataFrame( [[3, col.RUR], [5, col.RUR]], columns=["GAZP", col.CURRENCY], index=[datetime(2020, 12, 4), datetime(2020, 12, 5)], ) div_ext_table._gateways = ( dividends.GateWayDesc("Dohod", col.ORDINARY, fake_gateway), dividends.GateWayDesc("NASDAQ", col.FOREIGN, fake_gateway), ) df = await div_ext_table._prepare_df(event) pd.testing.assert_frame_equal( df, pd.DataFrame( [[3, 3], [5, 5]], columns=["Dohod", "MEDIAN"], index=[datetime(2020, 12, 4), datetime(2020, 12, 5)], ), check_dtype=False, )
def dividends_validation(ticker: str) -> pd.DataFrame: """Проверяет корректности данных о дивидендах для тикера. Запускает принудительное обновление, сравнивает основные данные по дивидендам с альтернативными источниками и распечатывает результаты. """ bootstrap.BUS.handle_event(events.UpdateDivCommand(ticker)) df_local = div.dividends(ticker) df_local.columns = ["LOCAL"] div_ex = div.div_ext(ticker) df_comp = _compare(div_ex.iloc[:, -1:], df_local) df_comp = pd.concat( [div_ex.iloc[:, :-1], df_comp], axis=1, ) first_quote = not_div.quotes((ticker, ))[0].index[0] df_comp = df_comp.loc[first_quote:] comp_str = f"\nСравнение интернет источников с локальными данными - {ticker}\n\n{df_comp}" LOGGER.info(comp_str) # noqa: WPS421 return df_comp
async def test_update_div(mocker): """Требуется обновить таблицу с внутренними и внешними данными по дивидендам.""" dispatcher = handlers.EventHandlersDispatcher() event = events.UpdateDivCommand("TICKER3") fake_repo = mocker.AsyncMock() mocker.patch.object(handlers, "_load_by_id_and_handle_event", side_effect=[["event1"], ["event2"]]) new_events = await dispatcher.handle_event(event, fake_repo) assert new_events == ["event1", "event2"]
def test_div_ext(): """Информации о внешних дивидендах содержит медианное значение и корректно обрезается. Перед тестом подается команда загрузки, так как данные могут отсутствовать. """ command = events.UpdateDivCommand("AKRN") bootstrap.BUS.handle_event(command) df = div.div_ext("AKRN") assert df.columns.tolist()[-1] == "MEDIAN" assert df.index[0] >= bootstrap.START_DATE assert df.loc["2015-06-02", "MEDIAN"] == pytest.approx(139) assert df.loc["2020-06-09", "MEDIAN"] == pytest.approx(275)
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, ), ) @pytest.mark.parametrize("df, event, rez", DIV_UPDATE_CASES) def test_update_cond(div_table, df, event, rez): """Если дивиденды отсутствуют и поступила команда обновления, то их надо загрузить.""" div_table._df = df