aboutsummaryrefslogtreecommitdiff
path: root/tests/managers/leaderboard.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/managers/leaderboard.py')
-rw-r--r--tests/managers/leaderboard.py177
1 files changed, 106 insertions, 71 deletions
diff --git a/tests/managers/leaderboard.py b/tests/managers/leaderboard.py
index 4d32dd0..fad0b6b 100644
--- a/tests/managers/leaderboard.py
+++ b/tests/managers/leaderboard.py
@@ -1,8 +1,12 @@
+from __future__ import annotations
+
import os
import time
import zoneinfo
-from datetime import datetime, timezone
+from collections.abc import Callable
+from datetime import UTC, datetime
from decimal import Decimal
+from typing import TYPE_CHECKING
from uuid import uuid4
import pytest
@@ -10,9 +14,6 @@ import pytest
from generalresearch.managers.leaderboard.manager import LeaderboardManager
from generalresearch.managers.leaderboard.tasks import hit_leaderboards
from generalresearch.models.thl.definitions import Status
-from generalresearch.models.thl.user import User
-from generalresearch.models.thl.product import Product
-from generalresearch.models.thl.session import Session
from generalresearch.models.thl.leaderboard import (
LeaderboardCode,
LeaderboardFrequency,
@@ -22,7 +23,13 @@ from generalresearch.models.thl.product import (
PayoutConfig,
PayoutTransformation,
PayoutTransformationPercentArgs,
+ Product,
)
+from generalresearch.models.thl.session import Session
+from generalresearch.models.thl.user import User
+
+if TYPE_CHECKING:
+ from generalresearch.redis_helper import RedisConfig
# random uuid for leaderboard tests
product_id = uuid4().hex
@@ -44,7 +51,9 @@ def session_factory():
def _create_session(
- product_user_id="aaa", country_iso="us", user_payout=Decimal("1.00")
+ product_user_id: str = "aaa",
+ country_iso: str = "us",
+ user_payout: Decimal = Decimal("1.00"),
):
user = User(
product_id=product_id,
@@ -63,7 +72,7 @@ def _create_session(
)
session = Session(
user=user,
- started=datetime(2025, 2, 5, 6, tzinfo=timezone.utc),
+ started=datetime(2025, 2, 5, 6, tzinfo=UTC),
id=1,
country_iso=country_iso,
status=Status.COMPLETE,
@@ -74,59 +83,68 @@ def _create_session(
@pytest.fixture(scope="function")
-def setup_leaderboards(thl_redis):
- complete_count = {
- "aaa": 10,
- "bbb": 6,
- "ccc": 6,
- "ddd": 6,
- "eee": 2,
- "fff": 1,
- "ggg": 1,
- }
- sum_payout = {"aaa": 345, "bbb": 100, "ccc": 100}
- max_payout = sum_payout
- country_iso = "us"
- for freq in [
- LeaderboardFrequency.DAILY,
- LeaderboardFrequency.WEEKLY,
- LeaderboardFrequency.MONTHLY,
- ]:
- m = LeaderboardManager(
- redis_client=thl_redis,
- board_code=LeaderboardCode.COMPLETE_COUNT,
- freq=freq,
- product_id=product_id,
- country_iso=country_iso,
- within_time=datetime(2025, 2, 5, 12, 12, 12),
- )
- thl_redis.delete(m.key)
- thl_redis.zadd(m.key, complete_count)
- m = LeaderboardManager(
- redis_client=thl_redis,
- board_code=LeaderboardCode.SUM_PAYOUTS,
- freq=freq,
- product_id=product_id,
- country_iso=country_iso,
- within_time=datetime(2025, 2, 5, 12, 12, 12),
- )
- thl_redis.delete(m.key)
- thl_redis.zadd(m.key, sum_payout)
- m = LeaderboardManager(
- redis_client=thl_redis,
- board_code=LeaderboardCode.LARGEST_PAYOUT,
- freq=freq,
- product_id=product_id,
- country_iso=country_iso,
- within_time=datetime(2025, 2, 5, 12, 12, 12),
- )
- thl_redis.delete(m.key)
- thl_redis.zadd(m.key, max_payout)
+def setup_leaderboards(thl_redis_config: RedisConfig) -> Callable[..., None]:
+ thl_redis = thl_redis_config.create_redis_client()
+
+ def _inner():
+ complete_count = {
+ "aaa": 10,
+ "bbb": 6,
+ "ccc": 6,
+ "ddd": 6,
+ "eee": 2,
+ "fff": 1,
+ "ggg": 1,
+ }
+ sum_payout = {"aaa": 345, "bbb": 100, "ccc": 100}
+ max_payout = sum_payout
+ country_iso = "us"
+ for freq in [
+ LeaderboardFrequency.DAILY,
+ LeaderboardFrequency.WEEKLY,
+ LeaderboardFrequency.MONTHLY,
+ ]:
+ m = LeaderboardManager(
+ redis_client=thl_redis,
+ board_code=LeaderboardCode.COMPLETE_COUNT,
+ freq=freq,
+ product_id=product_id,
+ country_iso=country_iso,
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
+ )
+ thl_redis.delete(m.key)
+ thl_redis.zadd(m.key, complete_count)
+ m = LeaderboardManager(
+ redis_client=thl_redis,
+ board_code=LeaderboardCode.SUM_PAYOUTS,
+ freq=freq,
+ product_id=product_id,
+ country_iso=country_iso,
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
+ )
+ thl_redis.delete(m.key)
+ thl_redis.zadd(m.key, sum_payout)
+ m = LeaderboardManager(
+ redis_client=thl_redis,
+ board_code=LeaderboardCode.LARGEST_PAYOUT,
+ freq=freq,
+ product_id=product_id,
+ country_iso=country_iso,
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
+ )
+ thl_redis.delete(m.key)
+ thl_redis.zadd(m.key, max_payout)
+
+ return _inner
class TestLeaderboards:
+ def test_leaderboard_manager(
+ self, setup_leaderboards: Callable[..., None], thl_redis_config: RedisConfig
+ ):
+ thl_redis = thl_redis_config.create_redis_client()
+ setup_leaderboards()
- def test_leaderboard_manager(self, setup_leaderboards, thl_redis):
country_iso = "us"
board_code = LeaderboardCode.COMPLETE_COUNT
freq = LeaderboardFrequency.DAILY
@@ -136,6 +154,7 @@ class TestLeaderboards:
freq=freq,
product_id=product_id,
country_iso=country_iso,
+ # This is supposed to not have a timezone. @max don't change it
within_time=datetime(2025, 2, 5, 0, 0, 0),
)
lb = m.get_leaderboard()
@@ -152,7 +171,7 @@ class TestLeaderboards:
999999,
tzinfo=zoneinfo.ZoneInfo(key="America/New_York"),
)
- assert lb.period_start_utc == datetime(2025, 2, 5, 5, tzinfo=timezone.utc)
+ assert lb.period_start_utc == datetime(2025, 2, 5, 5, tzinfo=UTC)
assert lb.row_count == 7
assert lb.rows == [
LeaderboardRow(bpuid="aaa", rank=1, value=10),
@@ -164,7 +183,12 @@ class TestLeaderboards:
LeaderboardRow(bpuid="ggg", rank=6, value=1),
]
- def test_leaderboard_manager_bpuid(self, setup_leaderboards, thl_redis):
+ def test_leaderboard_manager_bpuid(
+ self, setup_leaderboards: Callable[..., None], thl_redis_config: RedisConfig
+ ):
+ thl_redis = thl_redis_config.create_redis_client()
+ setup_leaderboards()
+
country_iso = "us"
board_code = LeaderboardCode.COMPLETE_COUNT
freq = LeaderboardFrequency.DAILY
@@ -174,7 +198,7 @@ class TestLeaderboards:
freq=freq,
product_id=product_id,
country_iso=country_iso,
- within_time=datetime(2025, 2, 5, 12, 12, 12),
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
)
lb = m.get_leaderboard(bp_user_id="fff", limit=1)
@@ -191,7 +215,15 @@ class TestLeaderboards:
lb.censor()
assert lb.rows[0].bpuid == "ee*"
- def test_leaderboard_hit(self, setup_leaderboards, session_factory, thl_redis):
+ def test_leaderboard_hit(
+ self,
+ setup_leaderboards: Callable[..., None],
+ session_factory: Callable[..., Session],
+ thl_redis_config: RedisConfig,
+ ):
+ thl_redis = thl_redis_config.create_redis_client()
+ setup_leaderboards()
+
hit_leaderboards(redis_client=thl_redis, session=session_factory())
for freq in [
@@ -205,7 +237,7 @@ class TestLeaderboards:
freq=freq,
product_id=product_id,
country_iso="us",
- within_time=datetime(2025, 2, 5, 12, 12, 12),
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
)
lb = m.get_leaderboard(limit=1)
assert lb.row_count == 7
@@ -216,7 +248,7 @@ class TestLeaderboards:
freq=freq,
product_id=product_id,
country_iso="us",
- within_time=datetime(2025, 2, 5, 12, 12, 12),
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
)
lb = m.get_leaderboard(limit=1)
assert lb.row_count == 3
@@ -227,15 +259,21 @@ class TestLeaderboards:
freq=freq,
product_id=product_id,
country_iso="us",
- within_time=datetime(2025, 2, 5, 12, 12, 12),
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
)
lb = m.get_leaderboard(limit=1)
assert lb.row_count == 3
assert lb.rows == [LeaderboardRow(bpuid="aaa", rank=1, value=345 + 100)]
def test_leaderboard_hit_new_row(
- self, setup_leaderboards, session_factory, thl_redis
+ self,
+ setup_leaderboards: Callable[..., None],
+ session_factory: Callable[..., None],
+ thl_redis_config: RedisConfig,
):
+ thl_redis = thl_redis_config.create_redis_client()
+ setup_leaderboards()
+
session = session_factory(product_user_id="zzz")
hit_leaderboards(redis_client=thl_redis, session=session)
m = LeaderboardManager(
@@ -244,24 +282,21 @@ class TestLeaderboards:
freq=LeaderboardFrequency.DAILY,
product_id=product_id,
country_iso="us",
- within_time=datetime(2025, 2, 5, 12, 12, 12),
+ within_time=datetime(2025, 2, 5, 12, 12, 12, tzinfo=UTC),
)
lb = m.get_leaderboard()
assert lb.row_count == 8
assert LeaderboardRow(bpuid="zzz", value=1, rank=6) in lb.rows
- def test_leaderboard_country(self, thl_redis):
+ def test_leaderboard_country(self, thl_redis_config: RedisConfig):
+ thl_redis = thl_redis_config.create_redis_client()
m = LeaderboardManager(
redis_client=thl_redis,
board_code=LeaderboardCode.COMPLETE_COUNT,
freq=LeaderboardFrequency.DAILY,
product_id=product_id,
country_iso="jp",
- within_time=datetime(
- 2025,
- 2,
- 1,
- ),
+ within_time=datetime(2025, 2, 1, tzinfo=UTC),
)
lb = m.get_leaderboard()
assert lb.row_count == 0
@@ -270,5 +305,5 @@ class TestLeaderboards:
)
assert lb.local_start_time == "2025-02-01T00:00:00+09:00"
assert lb.local_end_time == "2025-02-01T23:59:59.999999+09:00"
- assert lb.period_start_utc == datetime(2025, 1, 31, 15, tzinfo=timezone.utc)
+ assert lb.period_start_utc == datetime(2025, 1, 31, 15, tzinfo=UTC)
print(lb.model_dump(mode="json"))