added event selection function (#25)
This commit is contained in:
parent
40919a994f
commit
d89659735d
|
@ -36,11 +36,6 @@ class EventSelectionStrategy(ABC):
|
||||||
|
|
||||||
|
|
||||||
class SelectNextEventStrategy(EventSelectionStrategy):
|
class SelectNextEventStrategy(EventSelectionStrategy):
|
||||||
def __init__(self, minimum_break_between_events_in_minutes: int):
|
|
||||||
self.minimum_break_between_events_in_minutes = (
|
|
||||||
minimum_break_between_events_in_minutes
|
|
||||||
)
|
|
||||||
|
|
||||||
def _select(
|
def _select(
|
||||||
self,
|
self,
|
||||||
published_events: List[MobilizonEvent],
|
published_events: List[MobilizonEvent],
|
||||||
|
@ -58,7 +53,9 @@ class SelectNextEventStrategy(EventSelectionStrategy):
|
||||||
)
|
)
|
||||||
if (
|
if (
|
||||||
last_published_event.publication_time[publisher_name].shift(
|
last_published_event.publication_time[publisher_name].shift(
|
||||||
minutes=self.minimum_break_between_events_in_minutes
|
minutes=settings[
|
||||||
|
"selection.strategy_options.break_between_events_in_minutes"
|
||||||
|
]
|
||||||
)
|
)
|
||||||
> now
|
> now
|
||||||
):
|
):
|
||||||
|
@ -82,3 +79,14 @@ class EventSelector:
|
||||||
self, strategy: EventSelectionStrategy
|
self, strategy: EventSelectionStrategy
|
||||||
) -> Optional[MobilizonEvent]:
|
) -> Optional[MobilizonEvent]:
|
||||||
return strategy._select(self.published_events, self.unpublished_events)
|
return strategy._select(self.published_events, self.unpublished_events)
|
||||||
|
|
||||||
|
|
||||||
|
STRATEGY_NAME_TO_STRATEGY_CLASS = {"next_event": SelectNextEventStrategy}
|
||||||
|
|
||||||
|
|
||||||
|
def select_event_to_publish(
|
||||||
|
published_events: List[MobilizonEvent], unpublished_events: List[MobilizonEvent],
|
||||||
|
):
|
||||||
|
|
||||||
|
strategy = STRATEGY_NAME_TO_STRATEGY_CLASS[settings["selection"]["strategy"]]()
|
||||||
|
return strategy.select(published_events, unpublished_events)
|
||||||
|
|
|
@ -2,8 +2,28 @@ import arrow
|
||||||
import pytest
|
import pytest
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
|
||||||
from mobilizon_bots.config.config import settings
|
from mobilizon_bots.config.config import settings
|
||||||
from mobilizon_bots.event.event_selection_strategies import SelectNextEventStrategy
|
from mobilizon_bots.event.event_selection_strategies import (
|
||||||
|
SelectNextEventStrategy,
|
||||||
|
select_event_to_publish,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def set_break_window_config(desired_break_window_days):
|
||||||
|
settings.update(
|
||||||
|
{
|
||||||
|
"selection.strategy_options.break_between_events_in_minutes": desired_break_window_days
|
||||||
|
* 24
|
||||||
|
* 60
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def set_strategy(strategy_name):
|
||||||
|
settings.update({"selection.strategy": strategy_name})
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -16,10 +36,11 @@ def mock_publication_window(publication_window):
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"desired_break_window_days,days_passed_from_publication", [[2, 1], [3, 2]]
|
"desired_break_window_days,days_passed_from_publication", [[2, 1], [3, 2]]
|
||||||
)
|
)
|
||||||
def test_break_window_simple_no_event(
|
def test_window_simple_no_event(
|
||||||
event_generator,
|
event_generator,
|
||||||
desired_break_window_days,
|
desired_break_window_days,
|
||||||
days_passed_from_publication,
|
days_passed_from_publication,
|
||||||
|
set_break_window_config,
|
||||||
mock_arrow_now,
|
mock_arrow_now,
|
||||||
):
|
):
|
||||||
"Testing that the break between events is respected"
|
"Testing that the break between events is respected"
|
||||||
|
@ -38,9 +59,9 @@ def test_break_window_simple_no_event(
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
selected_event = SelectNextEventStrategy(
|
selected_event = SelectNextEventStrategy().select(
|
||||||
minimum_break_between_events_in_minutes=desired_break_window_days * 24 * 60
|
published_events, unpublished_events
|
||||||
).select(published_events, unpublished_events)
|
)
|
||||||
assert selected_event is None
|
assert selected_event is None
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,10 +69,13 @@ def test_break_window_simple_no_event(
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"desired_break_window_days,days_passed_from_publication", [[1, 2], [2, 10], [4, 4]]
|
"desired_break_window_days,days_passed_from_publication", [[1, 2], [2, 10], [4, 4]]
|
||||||
)
|
)
|
||||||
def test_break_window_simple_event_found(
|
@pytest.mark.parametrize("strategy_name", ["next_event"])
|
||||||
|
def test_window_simple_event_found(
|
||||||
event_generator,
|
event_generator,
|
||||||
desired_break_window_days,
|
desired_break_window_days,
|
||||||
days_passed_from_publication,
|
days_passed_from_publication,
|
||||||
|
set_break_window_config,
|
||||||
|
set_strategy,
|
||||||
mock_arrow_now,
|
mock_arrow_now,
|
||||||
):
|
):
|
||||||
"Testing that the break between events is respected and an event is found"
|
"Testing that the break between events is respected and an event is found"
|
||||||
|
@ -70,10 +94,7 @@ def test_break_window_simple_event_found(
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
selected_event = SelectNextEventStrategy(
|
selected_event = select_event_to_publish(published_events, unpublished_events)
|
||||||
minimum_break_between_events_in_minutes=desired_break_window_days * 24 * 60
|
|
||||||
).select(published_events, unpublished_events)
|
|
||||||
|
|
||||||
assert selected_event is unpublished_events[0]
|
assert selected_event is unpublished_events[0]
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,10 +102,13 @@ def test_break_window_simple_event_found(
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"desired_break_window_days,days_passed_from_publication", [[1, 2], [2, 10], [4, 4]]
|
"desired_break_window_days,days_passed_from_publication", [[1, 2], [2, 10], [4, 4]]
|
||||||
)
|
)
|
||||||
def test_break_window_multi_event_found(
|
@pytest.mark.parametrize("strategy_name", ["next_event"])
|
||||||
|
def test_window_multi_event_found(
|
||||||
event_generator,
|
event_generator,
|
||||||
desired_break_window_days,
|
desired_break_window_days,
|
||||||
days_passed_from_publication,
|
days_passed_from_publication,
|
||||||
|
set_break_window_config,
|
||||||
|
set_strategy,
|
||||||
mock_arrow_now,
|
mock_arrow_now,
|
||||||
):
|
):
|
||||||
"Testing that the break between events is respected when there are multiple events"
|
"Testing that the break between events is respected when there are multiple events"
|
||||||
|
@ -123,9 +147,7 @@ def test_break_window_multi_event_found(
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
selected_event = SelectNextEventStrategy(
|
selected_event = select_event_to_publish(published_events, unpublished_events)
|
||||||
minimum_break_between_events_in_minutes=desired_break_window_days * 24 * 60
|
|
||||||
).select(published_events, unpublished_events)
|
|
||||||
assert selected_event is unpublished_events[0]
|
assert selected_event is unpublished_events[0]
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,9 +166,7 @@ def test_publishing_inner_window_true(mock_arrow_now, mock_publication_window):
|
||||||
"""
|
"""
|
||||||
Testing that the window check correctly returns True when in an inner publishing window.
|
Testing that the window check correctly returns True when in an inner publishing window.
|
||||||
"""
|
"""
|
||||||
assert SelectNextEventStrategy(
|
assert SelectNextEventStrategy().is_in_publishing_window()
|
||||||
minimum_break_between_events_in_minutes=1
|
|
||||||
).is_in_publishing_window()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("current_hour", [2, 10, 11, 19])
|
@pytest.mark.parametrize("current_hour", [2, 10, 11, 19])
|
||||||
|
@ -155,9 +175,7 @@ def test_publishing_inner_window_false(mock_arrow_now, mock_publication_window):
|
||||||
"""
|
"""
|
||||||
Testing that the window check correctly returns False when not in an inner publishing window.
|
Testing that the window check correctly returns False when not in an inner publishing window.
|
||||||
"""
|
"""
|
||||||
assert not SelectNextEventStrategy(
|
assert not SelectNextEventStrategy().is_in_publishing_window()
|
||||||
minimum_break_between_events_in_minutes=1
|
|
||||||
).is_in_publishing_window()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("current_hour", [2, 10, 11, 19])
|
@pytest.mark.parametrize("current_hour", [2, 10, 11, 19])
|
||||||
|
@ -166,9 +184,7 @@ def test_publishing_outer_window_true(mock_arrow_now, mock_publication_window):
|
||||||
"""
|
"""
|
||||||
Testing that the window check correctly returns True when in an outer publishing window.
|
Testing that the window check correctly returns True when in an outer publishing window.
|
||||||
"""
|
"""
|
||||||
assert SelectNextEventStrategy(
|
assert SelectNextEventStrategy().is_in_publishing_window()
|
||||||
minimum_break_between_events_in_minutes=1
|
|
||||||
).is_in_publishing_window()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("current_hour", [14, 15, 16, 18])
|
@pytest.mark.parametrize("current_hour", [14, 15, 16, 18])
|
||||||
|
@ -177,6 +193,4 @@ def test_publishing_outer_window_false(mock_arrow_now, mock_publication_window):
|
||||||
"""
|
"""
|
||||||
Testing that the window check correctly returns False when not in an outer publishing window.
|
Testing that the window check correctly returns False when not in an outer publishing window.
|
||||||
"""
|
"""
|
||||||
assert not SelectNextEventStrategy(
|
assert not SelectNextEventStrategy().is_in_publishing_window()
|
||||||
minimum_break_between_events_in_minutes=1
|
|
||||||
).is_in_publishing_window()
|
|
||||||
|
|
Loading…
Reference in New Issue