Example #1
0
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),
    ], )
Example #2
0
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),
    ]
Example #3
0
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,
    )
Example #4
0
    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
        ]
Example #5
0
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")
Example #6
0
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")
Example #7
0
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,
    ),
)