aboutsummaryrefslogtreecommitdiff
path: root/test_utils/managers
diff options
context:
space:
mode:
authorstuppie2026-09-07 11:47:43 -0600
committerstuppie2026-09-07 11:47:43 -0600
commit092960233652cce1f4dc7841856034a6635e9cd9 (patch)
tree46e5fcd4d1e1b7ed0b987980c6c67ffa6e6b45c7 /test_utils/managers
parent80fd8aab4c7271ddb619b0de18741d7ac77b490b (diff)
parent242579a44855873d5e054e375440e9d3492cd682 (diff)
downloadgeneralresearch-092960233652cce1f4dc7841856034a6635e9cd9.tar.gz
generalresearch-092960233652cce1f4dc7841856034a6635e9cd9.zip
Merge branch 'master' into dev-greg
Diffstat (limited to 'test_utils/managers')
-rw-r--r--test_utils/managers/cashout_methods.py75
-rw-r--r--test_utils/managers/conftest.py269
-rw-r--r--test_utils/managers/contest/conftest.py10
-rw-r--r--test_utils/managers/gr/conftest.py87
-rw-r--r--test_utils/managers/ledger/conftest.py14
-rw-r--r--test_utils/managers/network/__init__.py0
-rw-r--r--test_utils/managers/network/conftest.py0
-rw-r--r--test_utils/managers/thl/conftest.py189
-rw-r--r--test_utils/managers/upk/conftest.py3
9 files changed, 357 insertions, 290 deletions
diff --git a/test_utils/managers/cashout_methods.py b/test_utils/managers/cashout_methods.py
index b201e8c..e69de29 100644
--- a/test_utils/managers/cashout_methods.py
+++ b/test_utils/managers/cashout_methods.py
@@ -1,75 +0,0 @@
-import random
-from uuid import uuid4
-
-from generalresearch.models.thl.wallet import Currency, PayoutType
-from generalresearch.models.thl.wallet.cashout_method import (
- CashoutMethod,
- TangoCashoutMethodData,
-)
-
-
-def random_ext_id(base: str = "U02"):
- suffix = random.randint(0, 99999)
- return f"{base}{suffix:05d}"
-
-
-EXAMPLE_TANGO_CASHOUT_METHODS = [
- CashoutMethod(
- id=uuid4().hex,
- last_updated="2021-06-23T20:45:38.239182Z",
- is_live=True,
- type=PayoutType.TANGO,
- ext_id=random_ext_id(),
- name="Safeway eGift Card $25",
- data=TangoCashoutMethodData(
- value_type="fixed", countries=["US"], utid=random_ext_id()
- ),
- user=None,
- image_url="https://d30s7yzk2az89n.cloudfront.net/images/brands/b694446-1200w-326ppi.png",
- original_currency=Currency.USD,
- min_value=2500,
- max_value=2500,
- ),
- CashoutMethod(
- id=uuid4().hex,
- last_updated="2021-06-23T20:45:38.239182Z",
- is_live=True,
- type=PayoutType.TANGO,
- ext_id=random_ext_id(),
- name="Amazon.it Gift Certificate",
- data=TangoCashoutMethodData(
- value_type="variable", countries=["IT"], utid="U006961"
- ),
- user=None,
- image_url="https://d30s7yzk2az89n.cloudfront.net/images/brands/b405753-1200w-326ppi.png",
- original_currency=Currency.EUR,
- min_value=1,
- max_value=10000,
- ),
-]
-
-# AMT_ASSIGNMENT_CASHOUT_METHOD = CashoutMethod(
-# id=uuid4().hex,
-# last_updated="2021-06-23T20:45:38.239182Z",
-# is_live=True,
-# type=PayoutType.AMT,
-# ext_id=None,
-# name="AMT Assignment",
-# data=AmtCashoutMethodData(),
-# user=None,
-# min_value=1,
-# max_value=5,
-# )
-
-# AMT_BONUS_CASHOUT_METHOD = CashoutMethod(
-# id=uuid4().hex,
-# last_updated="2021-06-23T20:45:38.239182Z",
-# is_live=True,
-# type=PayoutType.AMT,
-# ext_id=None,
-# name="AMT Bonus",
-# data=AmtCashoutMethodData(),
-# user=None,
-# min_value=7,
-# max_value=4000,
-# )
diff --git a/test_utils/managers/conftest.py b/test_utils/managers/conftest.py
index d2e5d20..391e6bf 100644
--- a/test_utils/managers/conftest.py
+++ b/test_utils/managers/conftest.py
@@ -1,39 +1,42 @@
from __future__ import annotations
-from typing import Callable
+import random
+from collections.abc import Callable
+from datetime import datetime
+from typing import TYPE_CHECKING
+from uuid import uuid4
import pytest
-from generalresearch.managers.gr.business import (
- BusinessAddressManager,
- BusinessBankAccountManager,
- BusinessManager,
+from generalresearch.managers.thl.cashout_method import (
+ CashoutMethodManager,
)
-from generalresearch.managers.gr.team import (
- MembershipManager,
- TeamManager,
+from generalresearch.managers.thl.user_streak import (
+ UserStreakManager,
)
-from generalresearch.managers.spectrum.survey import SpectrumSurveyManager
-from generalresearch.managers.thl.buyer import BuyerManager
-from generalresearch.managers.thl.ipinfo import (
- GeoIpInfoManager,
- IPGeonameManager,
- IPInformationManager,
-)
-from generalresearch.managers.thl.profiling.uqa import UQAManager
-from generalresearch.managers.thl.userhealth import (
- AuditLogManager,
- IPRecordManager,
- UserIpHistoryManager,
-)
-from generalresearch.models import Source
-from generalresearch.models.thl.user import User
-from generalresearch.pg_helper import PostgresConfig
-from generalresearch.redis_helper import RedisConfig
-from generalresearch.sql_helper import SqlHelper
-from test_utils.managers.cashout_methods import (
- EXAMPLE_TANGO_CASHOUT_METHODS,
+from generalresearch.models.definitions import Source
+from generalresearch.models.thl.wallet.cashout_method import (
+ CashoutMethod,
+ TangoCashoutMethodData,
)
+from generalresearch.models.thl.wallet.definitions import Currency, PayoutType
+
+if TYPE_CHECKING:
+ from generalresearch.managers.spectrum.survey import SpectrumSurveyManager
+ from generalresearch.managers.thl.buyer import BuyerManager
+ from generalresearch.managers.thl.ipinfo import (
+ GeoIpInfoManager,
+ IPGeonameManager,
+ )
+ from generalresearch.managers.thl.userhealth import (
+ AuditLogManager,
+ IPRecordManager,
+ UserIpHistoryManager,
+ )
+ from generalresearch.models.thl.user import User
+ from generalresearch.pg_helper import PostgresConfig
+ from generalresearch.redis_helper import RedisConfig
+ from generalresearch.sql_helper import SqlHelper
# === THL ===
@@ -59,16 +62,6 @@ def ip_geoname_manager(thl_web_rw: PostgresConfig) -> IPGeonameManager:
@pytest.fixture(scope="session")
-def ip_information_manager(thl_web_rw: PostgresConfig) -> IPInformationManager:
- assert thl_web_rw.dsn.path
- assert "/unittest-" in thl_web_rw.dsn.path
-
- from generalresearch.managers.thl.ipinfo import IPInformationManager
-
- return IPInformationManager(pg_config=thl_web_rw)
-
-
-@pytest.fixture(scope="session")
def ip_record_manager(
thl_web_rw: PostgresConfig, thl_redis_config: RedisConfig
) -> IPRecordManager:
@@ -95,7 +88,7 @@ def user_iphistory_manager(
@pytest.fixture(scope="function")
-def user_iphistory_manager_clear_cache(user_iphistory_manager, user):
+def user_iphistory_manager_clear_cache(user_iphistory_manager, user: User):
# On successive py-test/jenkins runs, the cache may contain
# the previous run's info (keyed under the same user_id)
user_iphistory_manager.delete_user_ip_history_cache(user_id=user.user_id)
@@ -116,12 +109,9 @@ def geoipinfo_manager(
@pytest.fixture(scope="session")
-def cashout_method_manager(thl_web_rw: PostgresConfig):
+def cashout_method_manager(thl_web_rw: PostgresConfig) -> CashoutMethodManager:
assert thl_web_rw.dsn.path
assert "/unittest-" in thl_web_rw.dsn.path
- from generalresearch.managers.thl.cashout_method import (
- CashoutMethodManager,
- )
return CashoutMethodManager(pg_config=thl_web_rw)
@@ -134,12 +124,9 @@ def event_manager(thl_redis_config: RedisConfig):
@pytest.fixture(scope="session")
-def user_streak_manager(thl_web_rw: PostgresConfig):
+def user_streak_manager(thl_web_rw: PostgresConfig) -> UserStreakManager:
assert thl_web_rw.dsn.path
assert "/unittest-" in thl_web_rw.dsn.path
- from generalresearch.managers.thl.user_streak import (
- UserStreakManager,
- )
return UserStreakManager(pg_config=thl_web_rw)
@@ -171,123 +158,117 @@ def delete_cashoutmethod_db(thl_web_rw: PostgresConfig) -> Callable[..., None]:
@pytest.fixture(scope="session")
-def setup_cashoutmethod_db(cashout_method_manager, delete_cashoutmethod_db):
- delete_cashoutmethod_db()
- for x in EXAMPLE_TANGO_CASHOUT_METHODS:
- cashout_method_manager.create(x)
-
- # TODO: convert these ids into instances to use.
- # settings.amt_bonus_cashout_method_id
- # settings.amt_assignment_cashout_method_id
-
- # cashout_method_manager.create(AMT_ASSIGNMENT_CASHOUT_METHOD)
- # cashout_method_manager.create(AMT_BONUS_CASHOUT_METHOD)
- raise NotImplementedError("Need to implement setup_cashoutmethod_db")
-
-
-# === THL: Marketplaces ===
+def setup_cashoutmethod_db(
+ cashout_method_manager: CashoutMethodManager,
+ delete_cashoutmethod_db: Callable[..., None],
+ example_tango_cashout_methods: list[CashoutMethod],
+) -> Callable[..., None]:
+ def _inner():
+ delete_cashoutmethod_db()
-@pytest.fixture(scope="session")
-def spectrum_manager(spectrum_rw: SqlHelper) -> SpectrumSurveyManager:
- from generalresearch.managers.spectrum.survey import (
- SpectrumSurveyManager,
- )
+ for x in example_tango_cashout_methods:
+ cashout_method_manager.create(x)
- return SpectrumSurveyManager(sql_helper=spectrum_rw)
+ return _inner
-# === GR ===
@pytest.fixture(scope="session")
-def business_manager(
- gr_db: PostgresConfig, gr_redis_config: RedisConfig
-) -> BusinessManager:
- from generalresearch.redis_helper import RedisConfig
+def random_ext_id_factory(base: str = "U02") -> Callable[..., str]:
- assert gr_db.dsn.path
- assert "/unittest-" in gr_db.dsn.path
- assert isinstance(gr_redis_config, RedisConfig)
+ def _inner() -> str:
+ suffix = random.randint(0, 99999)
+ return f"{base}{suffix:05d}"
- from generalresearch.managers.gr.business import BusinessManager
-
- return BusinessManager(
- pg_config=gr_db,
- redis_config=gr_redis_config,
- )
+ return _inner
@pytest.fixture(scope="session")
-def business_address_manager(gr_db: PostgresConfig) -> BusinessAddressManager:
- assert gr_db.dsn.path
- assert "/unittest-" in gr_db.dsn.path
+def example_tango_cashout_methods(
+ random_ext_id_factory: Callable[..., str],
+) -> list[CashoutMethod]:
+ return [
+ CashoutMethod(
+ id=uuid4().hex,
+ last_updated=datetime.fromisoformat("2021-06-23T20:45:38.239182Z"),
+ is_live=True,
+ type=PayoutType.TANGO,
+ ext_id='U025035',
+ name="Safeway eGift Card $25",
+ data=TangoCashoutMethodData(
+ value_type="fixed", countries=["US"], utid='U025035'
+ ),
+ user=None,
+ image_url="https://d30s7yzk2az89n.cloudfront.net/images/brands/b694446-1200w-326ppi.png",
+ original_currency=Currency.USD,
+ min_value=2500,
+ max_value=2500,
+ ),
+ CashoutMethod(
+ id=uuid4().hex,
+ last_updated=datetime.fromisoformat("2021-06-23T20:45:38.239182Z"),
+ is_live=True,
+ type=PayoutType.TANGO,
+ ext_id='U006961',
+ name="Amazon.it Gift Certificate",
+ data=TangoCashoutMethodData(
+ value_type="variable", countries=["IT"], utid="U006961"
+ ),
+ user=None,
+ image_url="https://d30s7yzk2az89n.cloudfront.net/images/brands/b405753-1200w-326ppi.png",
+ original_currency=Currency.EUR,
+ min_value=1,
+ max_value=10000,
+ ),
+ ]
- from generalresearch.managers.gr.business import BusinessAddressManager
- return BusinessAddressManager(pg_config=gr_db)
+# === THL: Marketplaces ===
@pytest.fixture(scope="session")
-def business_bank_account_manager(
- gr_db: PostgresConfig,
-) -> BusinessBankAccountManager:
- assert gr_db.dsn.path
- assert "/unittest-" in gr_db.dsn.path
-
- from generalresearch.managers.gr.business import (
- BusinessBankAccountManager,
+def spectrum_survey_manager(spectrum_rw: SqlHelper) -> SpectrumSurveyManager:
+ from generalresearch.managers.spectrum.survey import (
+ SpectrumSurveyManager,
)
- return BusinessBankAccountManager(pg_config=gr_db)
-
-
-@pytest.fixture(scope="session")
-def team_manager(gr_db: PostgresConfig, gr_redis_config: RedisConfig) -> TeamManager:
- assert gr_db.dsn.path
- assert "/unittest-" in gr_db.dsn.path
-
- from generalresearch.managers.gr.team import TeamManager
-
- return TeamManager(pg_config=gr_db, redis_config=gr_redis_config)
+ return SpectrumSurveyManager(sql_helper=spectrum_rw)
@pytest.fixture(scope="session")
-def membership_manager(gr_db: PostgresConfig) -> MembershipManager:
- assert gr_db.dsn.path
- assert "/unittest-" in gr_db.dsn.path
-
- from generalresearch.managers.gr.team import MembershipManager
-
- return MembershipManager(pg_config=gr_db)
+def delete_buyers_surveys(
+ thl_web_rw: PostgresConfig, buyer_manager: BuyerManager
+) -> Callable[..., None]:
+ def _inner():
+ # assert "/unittest-" in thl_web_rw.dsn.path
+ thl_web_rw.execute_write(
+ """
+ DELETE FROM marketplace_surveystat
+ WHERE survey_id IN (
+ SELECT id
+ FROM marketplace_survey
+ WHERE source = %(source)s
+ );""",
+ params={"source": Source.TESTING.value},
+ )
+ thl_web_rw.execute_write(
+ """
+ DELETE FROM marketplace_survey
+ WHERE buyer_id IN (
+ SELECT id
+ FROM marketplace_buyer
+ WHERE source = %(source)s
+ );""",
+ params={"source": Source.TESTING.value},
+ )
+ thl_web_rw.execute_write(
+ """
+ DELETE from marketplace_buyer
+ WHERE source=%(source)s;
+ """,
+ params={"source": Source.TESTING.value},
+ )
+ buyer_manager.populate_caches()
-@pytest.fixture(scope="session")
-def delete_buyers_surveys(thl_web_rw: PostgresConfig, buyer_manager: BuyerManager):
- # assert "/unittest-" in thl_web_rw.dsn.path
- thl_web_rw.execute_write(
- """
- DELETE FROM marketplace_surveystat
- WHERE survey_id IN (
- SELECT id
- FROM marketplace_survey
- WHERE source = %(source)s
- );""",
- params={"source": Source.TESTING.value},
- )
- thl_web_rw.execute_write(
- """
- DELETE FROM marketplace_survey
- WHERE buyer_id IN (
- SELECT id
- FROM marketplace_buyer
- WHERE source = %(source)s
- );""",
- params={"source": Source.TESTING.value},
- )
- thl_web_rw.execute_write(
- """
- DELETE from marketplace_buyer
- WHERE source=%(source)s;
- """,
- params={"source": Source.TESTING.value},
- )
- buyer_manager.populate_caches()
+ return _inner
diff --git a/test_utils/managers/contest/conftest.py b/test_utils/managers/contest/conftest.py
index 67935e7..b29cf18 100644
--- a/test_utils/managers/contest/conftest.py
+++ b/test_utils/managers/contest/conftest.py
@@ -1,8 +1,14 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
import pytest
from generalresearch.managers.base import Permission
from generalresearch.managers.thl.contest_manager import ContestManager
-from generalresearch.pg_helper import PostgresConfig
+
+if TYPE_CHECKING:
+ from generalresearch.pg_helper import PostgresConfig
@pytest.fixture(scope="session")
@@ -11,8 +17,6 @@ def contest_manager(thl_web_rw: PostgresConfig) -> ContestManager:
assert thl_web_rw.dsn.path
assert "/unittest-" in thl_web_rw.dsn.path
- from generalresearch.managers.thl.contest_manager import ContestManager
-
return ContestManager(
pg_config=thl_web_rw,
permissions=[
diff --git a/test_utils/managers/gr/conftest.py b/test_utils/managers/gr/conftest.py
index 37da164..09e08f5 100644
--- a/test_utils/managers/gr/conftest.py
+++ b/test_utils/managers/gr/conftest.py
@@ -1,64 +1,76 @@
from __future__ import annotations
-from typing import Callable
+import subprocess
+from collections.abc import Callable, Generator
+from random import randint
+from typing import TYPE_CHECKING
import pytest
-import redis.asyncio as redis_async
+import redis
from pydantic import PostgresDsn
-from redis import Redis
-from generalresearch.config import GRLBaseSettings
-from generalresearch.managers.gr.authentication import GRTokenManager, GRUserManager
from generalresearch.managers.gr.business import (
BusinessAddressManager,
BusinessBankAccountManager,
BusinessManager,
)
+from generalresearch.managers.gr.team import MembershipManager
from generalresearch.pg_helper import PostgresConfig
from generalresearch.redis_helper import RedisConfig
+if TYPE_CHECKING:
+ from generalresearch.config import GRLBaseSettings
+ from generalresearch.managers.gr.authentication import GRTokenManager, GRUserManager
+ from generalresearch.managers.gr.team import TeamManager
+
# === Msc ===
-@pytest.fixture(scope="session")
-def gr_redis(settings: GRLBaseSettings) -> Redis:
- assert "unittest" in str(settings.gr_redis) or "127.0.0.1" in str(settings.gr_redis)
- return Redis.from_url(
- url=str(settings.gr_redis),
- decode_responses=True,
- socket_timeout=settings.redis_timeout,
- socket_connect_timeout=settings.redis_timeout,
- )
-@pytest.fixture
-def gr_redis_async(settings: GRLBaseSettings) -> redis_async.Redis:
- assert "unittest" in str(settings.gr_redis) or "127.0.0.1" in str(settings.gr_redis)
+@pytest.fixture(scope="session")
+def gr_redis_config_db() -> str:
+ # need to update 'databases' in /etc/redis/redis.conf
+ # or this won't work and you'll have no indication why ...
+ return str(randint(99, 1_023))
- return redis_async.Redis.from_url(
- str(settings.gr_redis),
- decode_responses=True,
- socket_timeout=0.20,
- socket_connect_timeout=0.20,
+
+@pytest.fixture(scope="session")
+def gr_redis_config(
+ settings: GRLBaseSettings, gr_redis_config_db: str
+) -> Generator[RedisConfig]:
+ assert "unittest" in str(settings.testing_redis) or "127.0.0.1" in str(
+ settings.testing_redis
)
+ uri = f"redis://{settings.testing_redis}/{gr_redis_config_db}"
-@pytest.fixture(scope="session")
-def gr_redis_config(settings: GRLBaseSettings) -> RedisConfig:
- assert "unittest" in str(settings.gr_redis) or "127.0.0.1" in str(settings.gr_redis)
+ res = subprocess.run(
+ ["redis-cli", "-u", uri, "SET", "jenkins_lock", "1", "NX", "EX", "3600"],
+ check=True,
+ text=True,
+ capture_output=True,
+ )
+
+ if res.stdout.strip() != "OK":
+ raise ValueError("Redis already locked... aborting.")
- return RedisConfig(
- dsn=settings.gr_redis,
+ yield RedisConfig(
+ dsn=uri,
decode_responses=True,
socket_timeout=settings.redis_timeout,
socket_connect_timeout=settings.redis_timeout,
)
+ r = redis.from_url(uri)
+ r.flushdb()
+
@pytest.fixture(scope="session")
def gr_db(django_db_factory: Callable[..., PostgresDsn]) -> PostgresConfig:
+ _dsn = django_db_factory("gr.common")
return PostgresConfig(
- dsn=django_db_factory("gr_carer"),
+ dsn=_dsn,
connect_timeout=1,
statement_timeout=5,
)
@@ -80,7 +92,17 @@ def gr_user_manager(
@pytest.fixture(scope="session")
-def gr_team_manager(gr_db: PostgresConfig) -> GRTokenManager:
+def gr_team_manager(gr_db: PostgresConfig, gr_redis_config: RedisConfig) -> TeamManager:
+ assert gr_db.dsn.path
+ assert "/unittest-" in gr_db.dsn.path
+
+ from generalresearch.managers.gr.team import TeamManager
+
+ return TeamManager(pg_config=gr_db, redis_config=gr_redis_config)
+
+
+@pytest.fixture(scope="session")
+def gr_token_manager(gr_db: PostgresConfig) -> GRTokenManager:
assert gr_db.dsn.path
assert "/unittest-" in gr_db.dsn.path
@@ -108,3 +130,10 @@ def gr_business_address_manager(
gr_db: PostgresConfig,
) -> BusinessAddressManager:
return BusinessAddressManager(pg_config=gr_db)
+
+
+@pytest.fixture(scope="session")
+def gr_membership_manager(
+ gr_db: PostgresConfig,
+) -> MembershipManager:
+ return MembershipManager(pg_config=gr_db)
diff --git a/test_utils/managers/ledger/conftest.py b/test_utils/managers/ledger/conftest.py
index ce8348e..c60ee1b 100644
--- a/test_utils/managers/ledger/conftest.py
+++ b/test_utils/managers/ledger/conftest.py
@@ -1,18 +1,24 @@
from __future__ import annotations
+from typing import TYPE_CHECKING
+
import pytest
from generalresearch.managers.base import Permission
from generalresearch.managers.thl.ledger_manager.ledger import (
- LedgerAccountManager,
LedgerManager,
- LedgerTransactionManager,
)
from generalresearch.managers.thl.ledger_manager.thl_ledger import (
ThlLedgerManager,
)
-from generalresearch.pg_helper import PostgresConfig
-from generalresearch.redis_helper import RedisConfig
+
+if TYPE_CHECKING:
+ from generalresearch.managers.thl.ledger_manager.ledger import (
+ LedgerAccountManager,
+ LedgerTransactionManager,
+ )
+ from generalresearch.pg_helper import PostgresConfig
+ from generalresearch.redis_helper import RedisConfig
# --- Ledger ---
diff --git a/test_utils/managers/network/__init__.py b/test_utils/managers/network/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/test_utils/managers/network/__init__.py
+++ /dev/null
diff --git a/test_utils/managers/network/conftest.py b/test_utils/managers/network/conftest.py
deleted file mode 100644
index e69de29..0000000
--- a/test_utils/managers/network/conftest.py
+++ /dev/null
diff --git a/test_utils/managers/thl/conftest.py b/test_utils/managers/thl/conftest.py
index 5b70961..355a39d 100644
--- a/test_utils/managers/thl/conftest.py
+++ b/test_utils/managers/thl/conftest.py
@@ -1,44 +1,108 @@
from __future__ import annotations
-from typing import Callable
+import subprocess
+from collections.abc import Callable, Generator
+from random import randint
+from typing import TYPE_CHECKING
import pytest
+import redis
from pydantic import PostgresDsn
-from generalresearch.config import GRLBaseSettings
from generalresearch.managers.base import Permission
-from generalresearch.managers.thl.buyer import BuyerManager
-from generalresearch.managers.thl.category import CategoryManager
-from generalresearch.managers.thl.payout import (
- BrokerageProductPayoutEventManager,
- BusinessPayoutEventManager,
- PayoutEventManager,
- UserPayoutEventManager,
+from generalresearch.managers.thl.user_manager.mysql_user_manager import (
+ MysqlUserManager,
)
-from generalresearch.managers.thl.product import ProductManager
-from generalresearch.managers.thl.session import SessionManager
-from generalresearch.managers.thl.task_adjustment import (
- TaskAdjustmentManager,
-)
-from generalresearch.managers.thl.user_manager.user_manager import (
- UserManager,
-)
-from generalresearch.managers.thl.user_manager.user_metadata_manager import (
- UserMetadataManager,
-)
-from generalresearch.managers.thl.wall import (
- WallCacheManager,
- WallManager,
+from generalresearch.managers.thl.user_manager.redis_user_manager import (
+ RedisUserManager,
)
from generalresearch.pg_helper import PostgresConfig
from generalresearch.redis_helper import RedisConfig
+if TYPE_CHECKING:
+ from generalresearch.config import GRLBaseSettings
+ from generalresearch.managers.thl.buyer import BuyerManager
+ from generalresearch.managers.thl.category import CategoryManager
+ from generalresearch.managers.thl.ipinfo import (
+ IPGeonameManager,
+ IPInformationManager,
+ )
+ from generalresearch.managers.thl.payout import (
+ BrokerageProductPayoutEventManager,
+ BusinessPayoutEventManager,
+ PayoutEventManager,
+ UserPayoutEventManager,
+ )
+ from generalresearch.managers.thl.product import ProductManager
+ from generalresearch.managers.thl.session import SessionManager
+ from generalresearch.managers.thl.task_adjustment import (
+ TaskAdjustmentManager,
+ )
+ from generalresearch.managers.thl.user_manager.user_manager import (
+ UserManager,
+ )
+ from generalresearch.managers.thl.user_manager.user_metadata_manager import (
+ UserMetadataManager,
+ )
+ from generalresearch.managers.thl.userhealth import (
+ AuditLogManager,
+ IPRecordManager,
+ )
+ from generalresearch.managers.thl.wall import (
+ WallCacheManager,
+ WallManager,
+ )
+
+# === Msc ===
+
+
+@pytest.fixture(scope="session")
+def thl_redis_config_db() -> str:
+ return str(randint(99, 1_023))
+
+
+@pytest.fixture(scope="session")
+def thl_redis_config(
+ settings: GRLBaseSettings, thl_redis_config_db: str
+) -> Generator[RedisConfig]:
+ assert "unittest" in str(settings.testing_redis) or "127.0.0.1" in str(
+ settings.testing_redis
+ )
+
+ uri = f"redis://{settings.testing_redis}/{thl_redis_config_db}"
+
+ res = subprocess.run(
+ ["redis-cli", "-u", uri, "SET", "jenkins_lock", "1", "NX", "EX", "3600"],
+ check=True,
+ text=True,
+ capture_output=True,
+ )
+
+ if res.stdout.strip() != "OK":
+ raise ValueError("Redis already locked... aborting.")
+
+ yield RedisConfig(
+ dsn=uri,
+ decode_responses=True,
+ socket_timeout=settings.redis_timeout,
+ socket_connect_timeout=settings.redis_timeout,
+ )
+
+ r = redis.from_url(uri)
+ r.flushdb()
+
+
+@pytest.fixture(scope="session")
+def thl_redis_client(thl_redis_config):
+ return thl_redis_config.create_redis_client()
+
@pytest.fixture(scope="session")
def thl_web_rr(django_db_factory: Callable[..., PostgresDsn]) -> PostgresConfig:
+ _dsn = django_db_factory("generalresearch.thl_django")
return PostgresConfig(
- dsn=django_db_factory("generalresearch.thl_django"),
+ dsn=_dsn,
connect_timeout=1,
statement_timeout=5,
)
@@ -49,14 +113,7 @@ def thl_web_rw(thl_web_rr: PostgresConfig) -> PostgresConfig:
return thl_web_rr
-@pytest.fixture(scope="session")
-def thl_redis_config(settings: GRLBaseSettings) -> RedisConfig:
- return RedisConfig(
- dsn=settings.thl_redis,
- decode_responses=True,
- socket_timeout=settings.redis_timeout,
- socket_connect_timeout=settings.redis_timeout,
- )
+# === Managers ===
@pytest.fixture(scope="session")
@@ -109,6 +166,13 @@ def brokerage_product_payout_event_manager(
)
+@pytest.fixture()
+def audit_log_manager(thl_web_rw: PostgresConfig) -> AuditLogManager:
+ from generalresearch.managers.thl.userhealth import AuditLogManager
+
+ return AuditLogManager(pg_config=thl_web_rw)
+
+
@pytest.fixture(scope="session")
def business_payout_event_manager(
thl_web_rw: PostgresConfig, thl_redis_config: RedisConfig
@@ -140,7 +204,10 @@ def product_manager(thl_web_rw: PostgresConfig) -> ProductManager:
@pytest.fixture(scope="session")
def user_manager(
- settings: GRLBaseSettings, thl_web_rw: PostgresConfig, thl_web_rr: PostgresConfig
+ settings: GRLBaseSettings,
+ thl_web_rw: PostgresConfig,
+ thl_web_rr: PostgresConfig,
+ thl_redis_config: RedisConfig,
) -> UserManager:
assert thl_web_rw.dsn
assert thl_web_rw.dsn.path
@@ -149,16 +216,32 @@ def user_manager(
assert "/unittest-" in thl_web_rw.dsn.path
assert "/unittest-" in thl_web_rr.dsn.path
+ from generalresearch.managers.thl.user_manager.rate_limit import UserManagerLimiter
from generalresearch.managers.thl.user_manager.user_manager import (
UserManager,
)
- return UserManager(
+ um = UserManager(
pg_config=thl_web_rw,
pg_config_rr=thl_web_rr,
redis=settings.redis,
)
+ # rc = thl_redis_config.create_redis_client()
+ um.user_manager_limiter = UserManagerLimiter(redis=thl_redis_config.dsn)
+
+ return um
+
+
+@pytest.fixture(scope="session")
+def mysql_user_manager(thl_web_rw: PostgresConfig) -> MysqlUserManager:
+ return MysqlUserManager(pg_config=thl_web_rw, is_read_replica=False)
+
+
+@pytest.fixture(scope="session")
+def redis_user_manager(thl_redis_config: RedisConfig) -> RedisUserManager:
+ return RedisUserManager(redis_dsn=thl_redis_config.dsn)
+
@pytest.fixture(scope="session")
def user_metadata_manager(thl_web_rw: PostgresConfig) -> UserMetadataManager:
@@ -256,3 +339,41 @@ def surveypenalty_manager(thl_redis_config: RedisConfig):
from generalresearch.managers.thl.survey_penalty import SurveyPenaltyManager
return SurveyPenaltyManager(redis_config=thl_redis_config)
+
+
+# --- IP Geolocation ---
+
+
+@pytest.fixture
+def ip_geoname_manager(thl_web_rw: PostgresConfig) -> IPGeonameManager:
+ from generalresearch.managers.thl.ipinfo import IPGeonameManager
+
+ return IPGeonameManager(pg_config=thl_web_rw)
+
+
+# --- IP Information ---
+
+
+@pytest.fixture(scope="session")
+def ip_information_manager(thl_web_rw: PostgresConfig) -> IPInformationManager:
+ assert thl_web_rw.dsn.path
+ assert "/unittest-" in thl_web_rw.dsn.path
+
+ from generalresearch.managers.thl.ipinfo import IPInformationManager
+
+ return IPInformationManager(pg_config=thl_web_rw)
+
+
+# --- IP Record ---
+
+
+@pytest.fixture(scope="session")
+def ip_record_manager(
+ thl_web_rw: PostgresConfig, thl_redis_config: RedisConfig
+) -> IPRecordManager:
+ assert thl_web_rw.dsn.path
+ assert "/unittest-" in thl_web_rw.dsn.path
+
+ from generalresearch.managers.thl.userhealth import IPRecordManager
+
+ return IPRecordManager(pg_config=thl_web_rw, redis_config=thl_redis_config)
diff --git a/test_utils/managers/upk/conftest.py b/test_utils/managers/upk/conftest.py
index d8f956c..23af1b3 100644
--- a/test_utils/managers/upk/conftest.py
+++ b/test_utils/managers/upk/conftest.py
@@ -1,4 +1,5 @@
-from typing import Callable, Generator
+from collections.abc import Callable, Generator
+from typing import TYPE_CHECKING
import pytest