From 89e88d7695044785470824dee839fd3cd6bd5ddf Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Sun, 30 Aug 2026 22:14:44 -0700 Subject: imports work, gr base_init works. jenkins test1 --- Jenkinsfile | 189 ++---------------------------------------------------------- 1 file changed, 5 insertions(+), 184 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index e829ba9..d3bc039 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,45 +12,22 @@ pipeline { environment { VENV = "${env.WORKSPACE}/generalresearch-venv" - SPECTRUM_CARER_VENV = "${env.WORKSPACE}/thl-spectrum-carer-venv" - GRLIQ_CARER_VENV = "${env.WORKSPACE}/grliq-carer-venv" - GR_CARER_VENV = "${env.WORKSPACE}/gr-carer-venv" - - INCITE_MOUNT_DIR = '/mnt/thl-incite' - TMP_DIR = "${env.WORKSPACE}/tmp" } stages { stage('python versions') { + matrix { axes { axis { name 'PYTHON_VERSION' - values 'python3.14' 'python3.13', 'python3.12', 'python3.11', 'python3.10' + values 'python3.14' 'python3.13', 'python3.12', 'python3.11' } } stages { - stage('Setup DB') { - script { - env.REDIS_DB = new Random().nextInt(1024).toString() - env.REDIS = "${env.REDIS}:6379/${env.REDIS_DB}" - env.THL_REDIS = "${env.THL_REDIS}:6379/${env.REDIS_DB}" - echo "Using THL Redis: ${env.REDIS}" - if (sh(script: "redis-cli -u ${env.REDIS} SET jenkins_lock 1 NX EX 3600", returnStdout: true).trim() != 'OK') - error('Redis already locked... aborting.') - } - script { - env.GR_REDIS_DB = new Random().nextInt(1024).toString() - env.GR_REDIS = "redis://${env.REDIS}:6379/${env.GR_REDIS_DB}" - echo "Using GR Redis: ${env.GR_REDIS}" - if (sh(script: "redis-cli -u ${env.GR_REDIS} SET jenkins_lock 1 NX EX 3600", returnStdout: true).trim() != 'OK') - error('Redis already locked... aborting.') - } - } - } - stage('Setup Git') { + stage('Setup') { steps { cleanWs() @@ -67,188 +44,32 @@ pipeline { url: 'ssh://code.g-r-l.com:6611/generalresearch'] ], ) - } - - dir("thl-spectrum:$PYTHON_VERSION/") { - checkout scmGit( - branches: [[name: env.BRANCH_NAME]], - extensions: [ cloneOption(shallow: true) ], - userRemoteConfigs: [ - [credentialsId: 'abdeb570-b708-44f3-b857-8a6b06ed9822', - url: 'ssh://code.g-r-l.com:6611/thl-marketplaces/thl-spectrum'] - ], - ) - } - dir("grliq:$PYTHON_VERSION/") { - checkout scmGit( - branches: [[name: env.BRANCH_NAME]], - extensions: [ cloneOption(shallow: true) ], - userRemoteConfigs: [ - [credentialsId: 'abdeb570-b708-44f3-b857-8a6b06ed9822', - url: 'ssh://code.g-r-l.com:6611/grl-iq'] - ], - ) - } - - dir("gr:$PYTHON_VERSION/") { - checkout scmGit( - branches: [[name: env.BRANCH_NAME]], - extensions: [ cloneOption(shallow: true) ], - userRemoteConfigs: [ - [credentialsId: 'abdeb570-b708-44f3-b857-8a6b06ed9822', - url: 'ssh://code.g-r-l.com:6611/general-research/gr-carer'] - ], - ) - } - } - } - - stage('Env & Migration') { - steps { - dir("generalresearch:$PYTHON_VERSION/") { sh "/usr/local/bin/$PYTHON_VERSION -m venv $VENV-$PYTHON_VERSION" sh "$VENV-$PYTHON_VERSION/bin/pip install -U setuptools wheel pip" sh "$VENV-$PYTHON_VERSION/bin/pip install -r requirements.txt" sh "$VENV-$PYTHON_VERSION/bin/pip install '.[django]'" - sh """ - export DB_NAME=${DB_NAME} - export DB_USER=${env.DB_USER} - export DB_PASSWORD=${env.DB_PASSWORD} - export DB_HOST=${env.DB_POSTGRESQL_HOST} - $VENV-$PYTHON_VERSION/bin/$PYTHON_VERSION -m generalresearch.thl_django.app.manage migrate - """ - } - - dir("thl-spectrum:$PYTHON_VERSION/") { - dir('carer') { - sh "/usr/local/bin/$PYTHON_VERSION -m venv $SPECTRUM_CARER_VENV-$PYTHON_VERSION" - sh "$SPECTRUM_CARER_VENV-$PYTHON_VERSION/bin/pip install -U setuptools wheel pip" - sh "$SPECTRUM_CARER_VENV-$PYTHON_VERSION/bin/pip install -r requirements.txt" - - sh """ - export DB_NAME=${SPECTRUM_DB_NAME} - $SPECTRUM_CARER_VENV-$PYTHON_VERSION/bin/$PYTHON_VERSION manage.py migrate --settings=carer.settings.unittest - """ - } - } - - dir("grliq:$PYTHON_VERSION/") { - dir('carer') { - sh "/usr/local/bin/$PYTHON_VERSION -m venv $GRLIQ_CARER_VENV-$PYTHON_VERSION" - sh "$GRLIQ_CARER_VENV-$PYTHON_VERSION/bin/pip install -U setuptools wheel pip" - sh "$GRLIQ_CARER_VENV-$PYTHON_VERSION/bin/pip install -r requirements.txt" - - sh """ - export DB_NAME=${GRLIQ_DB_NAME} - $GRLIQ_CARER_VENV-$PYTHON_VERSION/bin/$PYTHON_VERSION manage.py migrate --settings=carer.settings.unittest - """ - } - } - - dir("gr:$PYTHON_VERSION/") { - sh "/usr/local/bin/$PYTHON_VERSION -m venv $GR_CARER_VENV-$PYTHON_VERSION" - sh "$GR_CARER_VENV-$PYTHON_VERSION/bin/pip install -U setuptools wheel pip" - sh "$GR_CARER_VENV-$PYTHON_VERSION/bin/pip install -r requirements.txt" - - sh """ - export DB_NAME=${GR_DB_NAME} - $GR_CARER_VENV-$PYTHON_VERSION/bin/$PYTHON_VERSION manage.py migrate --settings=gr.settings.unittest - """ } } } stage('base') { - when { - expression { return true } - } - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/sql_helper.py" - } - } - } - - stage('models') { - when { - expression { return true } - } steps { dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/models" + sh "$VENV-$PYTHON_VERSION/bin/pytest tests/models/gr/test_base.py -vs" } } } - stage('managers') { - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/managers" - } - } - } - - stage('wall_status_codes') { - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/wall_status_codes" - } - } - } - - stage('wxet') { - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/wxet" - } - } - } - - stage('grliq') { - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/grliq" - } - } - } - - stage('incite') { - steps { - dir("generalresearch:$PYTHON_VERSION") { - sh "$VENV-$PYTHON_VERSION/bin/pytest -v tests/incite" - } - } - } } } } } + post { always { echo 'One way or another, I have finished' deleteDir() /* clean up our workspace */ - sh """ - mariadb -h ${env.DB_MARIA_HOST} -u ${env.DB_USER} -p${env.DB_PASSWORD} --ssl=0 -e 'DROP DATABASE `${env.SPECTRUM_DB_NAME}`;' - """ - sh """ - PGPASSWORD=${env.DB_PASSWORD} psql -h ${env.DB_POSTGRESQL_HOST} -U ${env.DB_USER} -d postgres < dict[str, Any]: - d = self.model_dump(mode="json", *args, **kwargs) + def model_dump_mysql(self) -> dict[str, Any]: + d = self.model_dump(mode="json") if "created" in d: d["created"] = self.created.replace(tzinfo=None) return d diff --git a/generalresearch/models/thl/product.py b/generalresearch/models/thl/product.py index 65ed177..83955a6 100644 --- a/generalresearch/models/thl/product.py +++ b/generalresearch/models/thl/product.py @@ -1396,8 +1396,9 @@ class Product(BaseModel, validate_assignment=True): # --- ORM --- - def model_dump_mysql(self, *args, **kwargs) -> dict[str, Any]: - d = self.model_dump(mode="json", *args, **kwargs) + def model_dump_mysql(self) -> dict[str, Any]: + d = self.model_dump(mode="json") + assert self.created if "created" in d: d["created"] = self.created.replace(tzinfo=None) diff --git a/generalresearch/models/thl/session.py b/generalresearch/models/thl/session.py index 5653526..31dc668 100644 --- a/generalresearch/models/thl/session.py +++ b/generalresearch/models/thl/session.py @@ -445,9 +445,9 @@ class Wall(WallBase): d = self.model_dump(mode="json", exclude={"elapsed"}) return json.dumps(d) - def model_dump_mysql(self, *args, **kwargs) -> dict[str, Any]: + def model_dump_mysql(self) -> dict[str, Any]: # Generate a dictionary representation of the model, with special handling for datetimes - d = self.model_dump(mode="json", exclude={"elapsed"}, *args, **kwargs) + d = self.model_dump(mode="json", exclude={"elapsed"}) d["started"] = self.started.replace(tzinfo=None) if self.finished: d["finished"] = self.finished.replace(tzinfo=None) @@ -816,14 +816,12 @@ class Session(BaseModel): self.model_config["validate_assignment"] = True self.__class__.model_validate(self) - def model_dump_mysql( - self, *args, **kwargs - ) -> dict[str, str | int | datetime | float | None]: + def model_dump_mysql(self) -> dict[str, str | int | datetime | float | None]: # Generate a dictionary representation of the model, with special # handling for datetimes, and nested models such as User & Bucket - d = self.model_dump(mode="json", *args, **kwargs) + d = self.model_dump(mode="json") d["started"] = self.started.replace(tzinfo=None) if self.finished: diff --git a/generalresearch/models/thl/wallet/payout.py b/generalresearch/models/thl/wallet/payout.py index 42530b3..d43807d 100644 --- a/generalresearch/models/thl/wallet/payout.py +++ b/generalresearch/models/thl/wallet/payout.py @@ -129,13 +129,16 @@ class PayoutEvent(BaseModel, validate_assignment=True): else: raise ValueError("this shouldn't happen") - def model_dump_mysql(self, *args, **kwargs) -> dict[str, Any]: - d = self.model_dump(mode="json", *args, **kwargs) + def model_dump_mysql(self) -> dict[str, Any]: + d = self.model_dump(mode="json") + if "created" in d: d["created"] = self.created.replace(tzinfo=None) if d.get("request_data") is not None: d["request_data"] = json.dumps(self.request_data) if d.get("order_data") is not None: + assert self.order_data + if isinstance(self.order_data, dict): d["order_data"] = json.dumps(self.order_data) else: diff --git a/test_utils/conftest.py b/test_utils/conftest.py index 757f141..af78738 100644 --- a/test_utils/conftest.py +++ b/test_utils/conftest.py @@ -233,7 +233,6 @@ def django_db_factory( _ran = {} import django - from django.apps import apps from django.conf import settings as django_settings from django.core.management import call_command -- cgit v1.2.3 From 32dc99ab32994928fc4ed2bb7d397cefb205124e Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Sun, 30 Aug 2026 22:54:50 -0700 Subject: p6 --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 0d920f1..deb4cea 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -35,7 +35,7 @@ pipeline { axes { axis { name 'PYTHON_VERSION' - values 'python3.14', 'python3.13', 'python3.12', + values 'python3.14', 'python3.13', 'python3.12' } } -- cgit v1.2.3 From 8761c07e2f27373739cf966ab08e7ea3b55de06e Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Sun, 30 Aug 2026 23:38:33 -0700 Subject: jenkins p7 --- Jenkinsfile | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index deb4cea..942519e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,6 +47,11 @@ pipeline { deleteDir() unstash 'source' + withCredentials([file( + credentialsId: '971e1f48-09ce-4446-9155-a52c1adb6249', + variable: 'ENV_TEST_FILE')]) { + sh 'cp $ENV_TEST_FILE .env.test' + } sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -r requirements.txt" -- cgit v1.2.3 From 0f3c5b3939bdfc21ac1e60938261a85bf4b4e6b9 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 08:20:25 -0700 Subject: jenkins p9 (don't clear, inspect env) --- Jenkinsfile | 7 ------- 1 file changed, 7 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 942519e..6bcc1f3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -72,11 +72,4 @@ pipeline { } } } - - post { - always { - echo 'One way or another, I have finished' - deleteDir() - } - } } \ No newline at end of file -- cgit v1.2.3 From 10de61a8d3e2fcc687616ab8cc794bafe442cdf5 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 08:39:29 -0700 Subject: jenkins p10 --- Jenkinsfile | 1 + test_utils/conftest.py | 2 ++ 2 files changed, 3 insertions(+) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 6bcc1f3..79d1f2c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,6 +52,7 @@ pipeline { variable: 'ENV_TEST_FILE')]) { sh 'cp $ENV_TEST_FILE .env.test' } + sh "chmod 600 .env.test" sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -r requirements.txt" diff --git a/test_utils/conftest.py b/test_utils/conftest.py index fcff1b0..256166d 100644 --- a/test_utils/conftest.py +++ b/test_utils/conftest.py @@ -172,6 +172,7 @@ def git_key_path( # We are using the tmp_path_factory because unlike the tmp_path (which # is function scoped), this is session scoped. + print("GIT CREDS", settings.git_creds) assert settings.git_creds, "Must define key to download alternative models" fn = tmp_path_factory.mktemp("keys") / "git_creds" fn.write_text(settings.git_creds, encoding="utf-8") @@ -208,6 +209,7 @@ def gr_repo( "-o StrictHostKeyChecking=no " ) env = {"GIT_SSH_COMMAND": ssh_cmd} + print("SSH ENV", env) if repo_path.exists(): subprocess.run(["git", "-C", str(repo_path), "pull"], check=True, env=env) -- cgit v1.2.3 From 92d82a6e381541bc6cee34ffb89d213f0c5cde39 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 08:44:24 -0700 Subject: jenkins p11 --- Jenkinsfile | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 79d1f2c..793b810 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -73,4 +73,11 @@ pipeline { } } } + + post { + always { + echo 'One way or another, I have finished' + deleteDir() + } + } } \ No newline at end of file -- cgit v1.2.3 From 2b938618f6668fb388813715954d6bd43e11ae0f Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 08:58:05 -0700 Subject: jenkins p12 --- Jenkinsfile | 1 - test_utils/conftest.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 793b810..942519e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,7 +52,6 @@ pipeline { variable: 'ENV_TEST_FILE')]) { sh 'cp $ENV_TEST_FILE .env.test' } - sh "chmod 600 .env.test" sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -r requirements.txt" diff --git a/test_utils/conftest.py b/test_utils/conftest.py index 256166d..0946209 100644 --- a/test_utils/conftest.py +++ b/test_utils/conftest.py @@ -204,11 +204,11 @@ def gr_repo( _ran[repo_url] = True ssh_cmd = ( - f"ssh -i {git_key_path} " + f'ssh -i "{git_key_path}" ' "-o IdentitiesOnly=yes " "-o StrictHostKeyChecking=no " ) - env = {"GIT_SSH_COMMAND": ssh_cmd} + env = {**os.environ, "GIT_SSH_COMMAND": ssh_cmd} print("SSH ENV", env) if repo_path.exists(): -- cgit v1.2.3 From 21dbab3e3ea2960add65fee2461fcf34e02996cf Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 12:38:57 -0700 Subject: jenkins to only use toml --- Jenkinsfile | 3 +- requirements.txt | 112 ------------------------------------------- test_utils/conftest.py | 4 -- tests/models/gr/test_base.py | 1 - 4 files changed, 1 insertion(+), 119 deletions(-) delete mode 100644 requirements.txt (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 942519e..c44e57b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -40,7 +40,6 @@ pipeline { } stages { - stage('Setup') { steps { dir("generalresearch-${PYTHON_VERSION}") { @@ -54,7 +53,7 @@ pipeline { } sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" - sh "${VENV}-${PYTHON_VERSION}/bin/pip install -r requirements.txt" + sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.'" sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.[django]'" } } diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 6c04995..0000000 --- a/requirements.txt +++ /dev/null @@ -1,112 +0,0 @@ -aiohappyeyeballs==2.6.1 -aiohttp==3.12.15 -aiosignal==1.4.0 -annotated-types==0.7.0 -anyio==4.10.0 -attrs==25.3.0 -boto3==1.40.19 -botocore==1.40.19 -CacheControl==0.14.3 -cachetools==6.1.0 -certifi==2025.8.3 -cffi==1.17.1 -charset-normalizer==3.4.3 -click==8.2.2 -cloudpickle==3.1.1 -coverage==7.10.5 -cryptography==45.0.6 -dask==2025.7.0 -decorator==5.2.1 -Deprecated==1.2.18 -distributed==2025.7.0 -dnspython==2.7.0 -Django>=5.2 -ecdsa==0.19.1 -email-validator==2.3.0 -Faker==37.6.0 -filelock==3.25.1 -frozenlist==1.7.0 -fsspec==2025.7.0 -geoip2==4.7.0 -idna==3.10 -importlib_metadata==8.7.0 -iniconfig==2.1.0 -Jinja2==3.1.6 -jmespath==1.0.1 -jsonpickle==5.0.0rc1 -limits==5.5.0 -locket==1.0.0 -MarkupSafe==3.0.2 -maxminddb==2.8.2 -more-itertools==10.7.0 -msgpack==1.1.1 -multidict==6.6.4 -mypy_extensions==1.1.0 -numpy==2.3.2 -opentelemetry-api==1.36.0 -opentelemetry-sdk==1.36.0 -opentelemetry-semantic-conventions==0.57b0 -outcome==1.3.0.post0 -packaging==25.0 -pandas==2.3.2 -pandera==0.26.1 -partd==1.4.2 -phonenumbers==9.0.12 -pluggy==1.6.0 -propcache==0.3.2 -protobuf==6.32.0 -psutil==7.0.0 -psycopg==3.2.9 -psycopg-binary==3.2.9 -pyarrow==21.0.0 -pyasn1==0.6.1 -pycountry==24.6.1 -pycparser==2.22 -pydantic==2.11.7 -pydantic-extra-types==2.10.5 -pydantic-settings==2.10.1 -pydantic_core==2.33.2 -Pygments==2.19.2 -pylibmc==1.6.3 -pymemcache==4.0.0 -PyMySQL==1.1.1 -pytest==8.4.1 -pytest-anyio==0.0.0 -pytest-cov==6.2.1 -python-dateutil==2.9.0.post0 -python-dotenv==1.1.1 -python-jose==3.5.0 -pytz==2025.2 -PyYAML==6.0.2 -redis==6.4.0 -requests==2.32.5 -requests-file==3.0.1 -rsa==4.9.1 -s3transfer==0.13.1 -scipy==1.16.1 -sentry-sdk==3.0.0a5 -setuptools==80.9.0 -six==1.17.0 -slackclient==2.9.4 -sniffio==1.3.1 -sortedcontainers==2.4.0 -tblib==3.1.0 -tldextract==5.3.1 -toolz==1.0.0 -tornado==6.5.2 -trio==0.30.0 -typeguard==4.4.4 -typing-inspect==0.9.0 -typing-inspection==0.4.1 -typing_extensions==4.15.0 -tzdata==2025.2 -ua-parse==1.0.1 -ua-parser==1.0.1 -ua-parser-builtins==0.19.0.dev79 -urllib3==2.5.0 -user-agents==2.2.0 -wheel==0.46.1 -wrapt==1.17.3 -yarl==1.20.1 -zict==3.0.0 -zipp==3.23.0 diff --git a/test_utils/conftest.py b/test_utils/conftest.py index 9b631ff..041caf2 100644 --- a/test_utils/conftest.py +++ b/test_utils/conftest.py @@ -172,7 +172,6 @@ def git_key_path( # We are using the tmp_path_factory because unlike the tmp_path (which # is function scoped), this is session scoped. - print("GIT CREDS", settings.git_creds) assert settings.git_creds, "Must define key to download alternative models" fn = tmp_path_factory.mktemp("keys") / "git_creds" key_content = settings.git_creds.replace("\\n", "\n") @@ -210,7 +209,6 @@ def gr_repo( "-o StrictHostKeyChecking=no " ) env = {**os.environ, "GIT_SSH_COMMAND": ssh_cmd} - print("SSH ENV", env) if repo_path.exists(): subprocess.run(["git", "-C", str(repo_path), "pull"], check=True, env=env) @@ -256,8 +254,6 @@ def django_db_factory( # 1. Bootstrapping Django settings if not django_settings.configured: - print(postgres_instance_dict) - django_settings.configure( DATABASES={ "default": { diff --git a/tests/models/gr/test_base.py b/tests/models/gr/test_base.py index a066fa1..f019fc0 100644 --- a/tests/models/gr/test_base.py +++ b/tests/models/gr/test_base.py @@ -44,6 +44,5 @@ class TestGRPostgresDjangoCreation: FROM information_schema.tables WHERE table_schema = 'public'; """) - print(res) assert len(res) == 1 assert res[0]["count"] == 10 -- cgit v1.2.3 From df4445609608833f0c67d0633439ea2220966638 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 12:45:23 -0700 Subject: adding dask pattern --- Jenkinsfile | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index c44e57b..60838ca 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -54,7 +54,7 @@ pipeline { sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.'" - sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.[django]'" + sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.[django,dask]'" } } } diff --git a/pyproject.toml b/pyproject.toml index 71ba993..5037085 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dependencies = [ ] [project.optional-dependencies] django = ["Django>=5.2", "psycopg>=3.1"] - +dask = ["dask>=2026.7.1", "distributed>=2026.7.1"] [tool.setuptools.packages.find] where = ["."] -- cgit v1.2.3 From 340f0b93a0ad79124635015d1b2270884521bdc3 Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Mon, 31 Aug 2026 12:53:21 -0700 Subject: rename matrix so the UI shows the actual values --- Jenkinsfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index 60838ca..de909b2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -30,11 +30,11 @@ pipeline { } } - stage('python versions') { + stage('Python Versions') { matrix { axes { axis { - name 'PYTHON_VERSION' + name 'VER' values 'python3.14', 'python3.13', 'python3.12' } } @@ -42,7 +42,7 @@ pipeline { stages { stage('Setup') { steps { - dir("generalresearch-${PYTHON_VERSION}") { + dir("generalresearch-${VER}") { deleteDir() unstash 'source' @@ -51,18 +51,18 @@ pipeline { variable: 'ENV_TEST_FILE')]) { sh 'cp $ENV_TEST_FILE .env.test' } - sh "/usr/local/bin/${PYTHON_VERSION} -m venv ${VENV}-${PYTHON_VERSION}" - sh "${VENV}-${PYTHON_VERSION}/bin/pip install -U setuptools wheel pip" - sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.'" - sh "${VENV}-${PYTHON_VERSION}/bin/pip install '.[django,dask]'" + sh "/usr/local/bin/${VER} -m venv ${VENV}-${VER}" + sh "${VENV}-${VER}/bin/pip install -U setuptools wheel pip" + sh "${VENV}-${VER}/bin/pip install '.'" + sh "${VENV}-${VER}/bin/pip install '.[django,dask]'" } } } stage('base') { steps { - dir("generalresearch-${PYTHON_VERSION}") { - sh "${VENV}-${PYTHON_VERSION}/bin/pytest tests/models/gr/test_base.py -vs" + dir("generalresearch-${VER}") { + sh "${VENV}-${VER}/bin/pytest tests/models/gr/test_base.py -vs" } } } -- cgit v1.2.3 From ad620d7586640534a092672b8f3cddf6eff5604b Mon Sep 17 00:00:00 2001 From: Max Nanis Date: Wed, 2 Sep 2026 17:40:18 -0700 Subject: gr mangers all green ✅ --- Jenkinsfile | 16 +++++ generalresearch/managers/gr/team.py | 7 +- generalresearch/models/thl/product.py | 4 +- generalresearch/thl_django/app/test_settings.py | 2 +- test_utils/managers/gr/conftest.py | 22 +++++- test_utils/models/conftest.py | 31 +-------- test_utils/models/gr/conftest.py | 10 +-- test_utils/models/thl/conftest.py | 61 +++++++++++------ tests/managers/gr/test_authentication.py | 32 +++++---- tests/managers/gr/test_business.py | 22 ++++-- tests/managers/gr/test_team.py | 91 +++++++++++++++---------- 11 files changed, 180 insertions(+), 118 deletions(-) (limited to 'Jenkinsfile') diff --git a/Jenkinsfile b/Jenkinsfile index de909b2..a646d22 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -60,6 +60,14 @@ pipeline { } stage('base') { + steps { + dir("generalresearch-${VER}") { + sh "${VENV}-${VER}/bin/pytest tests/test_postgres.py -vs" + } + } + } + + stage('models') { steps { dir("generalresearch-${VER}") { sh "${VENV}-${VER}/bin/pytest tests/models/gr/test_base.py -vs" @@ -67,6 +75,14 @@ pipeline { } } + stage('managers') { + steps { + dir("generalresearch-${VER}") { + sh "${VENV}-${VER}/bin/pytest tests/managers/gr/ -vs" + } + } + } + } } } diff --git a/generalresearch/managers/gr/team.py b/generalresearch/managers/gr/team.py index e551f85..41af709 100644 --- a/generalresearch/managers/gr/team.py +++ b/generalresearch/managers/gr/team.py @@ -11,6 +11,7 @@ from generalresearch.managers.base import ( PostgresManager, PostgresManagerWithRedis, ) +from generalresearch.managers.gr.authentication import GRUserManager from generalresearch.models.custom_types import UUIDStr from generalresearch.models.gr.team import ( Membership, @@ -187,10 +188,12 @@ class TeamManager(PostgresManagerWithRedis): return team - def add_user(self, team: Team, gr_user: GRUser) -> Membership: + def add_user( + self, team: Team, gr_user: GRUser, gr_user_manager: GRUserManager + ) -> Membership: """Create a Membership between a GRUser and a Team""" - team.prefetch_gr_users(pg_config=self.pg_config, redis_config=self.redis_config) + team.prefetch_gr_users(gr_user_manager=gr_user_manager) assert gr_user not in team.gr_users, ( "Can't create multiple Memberships for " "the same User to the same Team" diff --git a/generalresearch/models/thl/product.py b/generalresearch/models/thl/product.py index 346a98b..3677ff2 100644 --- a/generalresearch/models/thl/product.py +++ b/generalresearch/models/thl/product.py @@ -1396,8 +1396,8 @@ class Product(BaseModel, validate_assignment=True): # --- ORM --- - def model_dump_mysql(self) -> dict[str, Any]: - d = self.model_dump(mode="json") + def model_dump_mysql(self, *args, **kwargs) -> dict[str, Any]: + d = self.model_dump(mode="json", *args, **kwargs) assert self.created if "created" in d: diff --git a/generalresearch/thl_django/app/test_settings.py b/generalresearch/thl_django/app/test_settings.py index 2738aed..276b94a 100644 --- a/generalresearch/thl_django/app/test_settings.py +++ b/generalresearch/thl_django/app/test_settings.py @@ -1,7 +1,7 @@ DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", - "NAME": 'unittest-2026-09-02-77ae16', + "NAME": 'unittest-2026-09-03-ab1271', "USER": 'jenkins', "PASSWORD": '123456789', "HOST": 'unittest-postgresql.fmt2.grl.internal', diff --git a/test_utils/managers/gr/conftest.py b/test_utils/managers/gr/conftest.py index b5db2a5..cc1053c 100644 --- a/test_utils/managers/gr/conftest.py +++ b/test_utils/managers/gr/conftest.py @@ -7,7 +7,6 @@ from typing import TYPE_CHECKING import pytest import redis -import redis.asyncio as redis_async from pydantic import PostgresDsn from generalresearch.managers.gr.business import ( @@ -15,12 +14,14 @@ from generalresearch.managers.gr.business import ( 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 === @@ -89,7 +90,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 @@ -117,3 +128,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/models/conftest.py b/test_utils/models/conftest.py index ed4da08..d71593f 100644 --- a/test_utils/models/conftest.py +++ b/test_utils/models/conftest.py @@ -286,36 +286,7 @@ def session( return session -@pytest.fixture -def product(request: Request, product_manager: ProductManager) -> Product: - - team = getattr(request, "team", None) - business = getattr(request, "business", None) - - return product_manager.create_dummy( - team_id=team.uuid if team else None, - business_id=business.uuid if business else None, - ) - - -@pytest.fixture -def product_factory(product_manager: ProductManager) -> Callable[..., Product]: - - def _inner( - team: Team | None = None, - business: Business | None = None, - commission_pct: Decimal = Decimal("0.05"), - ) -> Product: - return product_manager.create_dummy( - team_id=team.uuid if team else None, - business_id=business.uuid if business else None, - commission_pct=commission_pct, - ) - - return _inner - - -@pytest.fixture +@pytest.fixture() def payout_config(request: Request) -> PayoutConfig: from generalresearch.models.thl.product import ( PayoutConfig, diff --git a/test_utils/models/gr/conftest.py b/test_utils/models/gr/conftest.py index a5abf74..3dd73a1 100644 --- a/test_utils/models/gr/conftest.py +++ b/test_utils/models/gr/conftest.py @@ -207,8 +207,10 @@ def gr_team_factory( **kwargs, ) -> Team: + name = name or f"" + if save: - return gr_team_manager.create(uuid=uuid, name=name, **kwargs) + return gr_team_manager.create(name=name, uuid=uuid, **kwargs) else: raise ValueError("BusinessBankAccount Business not supported yet") @@ -325,12 +327,12 @@ def gr_user_token_header(gr_user_token: GRToken) -> dict[str, str]: @pytest.fixture() def gr_membership_factory( - gr_team: Team, - gr_user: GRUser, gr_membership_manager: MembershipManager, ) -> Callable[..., Membership]: - def _inner(save: bool = True, **kwargs) -> Membership: + def _inner( + gr_team: Team, gr_user: GRUser, save: bool = True, **kwargs + ) -> Membership: if save: return gr_membership_manager.create(team=gr_team, gr_user=gr_user, **kwargs) else: diff --git a/test_utils/models/thl/conftest.py b/test_utils/models/thl/conftest.py index 3545509..badd87c 100644 --- a/test_utils/models/thl/conftest.py +++ b/test_utils/models/thl/conftest.py @@ -39,6 +39,7 @@ if TYPE_CHECKING: from generalresearch.managers.thl.userhealth import AuditLogManager, IPRecordManager from generalresearch.managers.thl.wall import WallManager from generalresearch.models.definitions import DeviceType + from generalresearch.models.gr.team import Team from generalresearch.models.legacy.bucket import Bucket from generalresearch.models.thl.ipinfo import IPGeoname, IPInformation from generalresearch.models.thl.payout import UserPayoutEvent @@ -144,12 +145,18 @@ def wall_factory( return _inner -@pytest.fixture +# --- Product --- + + +@pytest.fixture() def product_factory(product_manager: ProductManager) -> Callable[..., Product]: def _inner( + save: bool = True, + team: Team | None = None, + # business: Business | None = None, + # commission_pct: Decimal = Decimal("0.05"), product_id: UUIDStr | None = None, - team_id: UUIDStr | None = None, business_id: UUIDStr | None = None, name: str | None = None, redirect_url: str | None = None, @@ -165,30 +172,46 @@ def product_factory(product_manager: ProductManager) -> Callable[..., Product]: ) -> Product: """To be used in tests, where we don't care about certain fields""" product_id = product_id if product_id else uuid4().hex - team_id = team_id if team_id else uuid4().hex + team_id = team.uuid if team else uuid4().hex name = name if name else f"name-{product_id[:12]}" redirect_url = redirect_url if redirect_url else "https://www.example.com/" - return product_manager.create( - product_id=product_id, - team_id=team_id, - business_id=business_id, - name=name, - redirect_url=redirect_url, - harmonizer_domain=harmonizer_domain, - commission_pct=commission_pct, - sources_config=sources_config, - payout_config=payout_config, - session_config=session_config, - profiling_config=profiling_config, - user_wallet_config=user_wallet_config, - user_create_config=user_create_config, - user_health_config=user_health_config, - ) + if save: + return product_manager.create( + product_id=product_id, + team_id=team_id, + business_id=business_id, + name=name, + redirect_url=redirect_url, + harmonizer_domain=harmonizer_domain, + commission_pct=commission_pct, + sources_config=sources_config, + payout_config=payout_config, + session_config=session_config, + profiling_config=profiling_config, + user_wallet_config=user_wallet_config, + user_create_config=user_create_config, + user_health_config=user_health_config, + ) + else: + raise ValueError("Unsaved Product not yet supported") return _inner +@pytest.fixture() +def product(product_factory: Callable[..., Product]) -> Product: + return product_factory(save=True) + + +@pytest.fixture() +def unsaved_product(product_factory: Callable[..., Product]) -> Product: + return product_factory(save=False) + + +# --- Session --- + + @pytest.fixture def session_factory(session_manager: SessionManager): diff --git a/tests/managers/gr/test_authentication.py b/tests/managers/gr/test_authentication.py index 0bcabc5..1310c79 100644 --- a/tests/managers/gr/test_authentication.py +++ b/tests/managers/gr/test_authentication.py @@ -84,29 +84,32 @@ class TestGRUserManager: class TestGRTokenManager: - def test_create(self, gr_user: GRUser, gr_team_manager: TeamManager): - assert gr_team_manager.create(user_id=gr_user.id) is None + def test_create(self, gr_user: GRUser, gr_token_manager: GRTokenManager): + assert gr_token_manager.create(user_id=gr_user.id) is None - token = gr_team_manager.get_by_user_id(user_id=gr_user.id) + token = gr_token_manager.get_by_user_id(user_id=gr_user.id) + assert isinstance(token, GRToken) assert gr_user.id == token.user_id - def test_get_by_user_id(self, gr_user: GRUser, gr_team_manager: TeamManager): - assert gr_team_manager.create(user_id=gr_user.id) is None + def test_get_by_user_id(self, gr_user: GRUser, gr_token_manager: GRTokenManager): + assert gr_token_manager.create(user_id=gr_user.id) is None - token = gr_team_manager.get_by_user_id(user_id=gr_user.id) + token = gr_token_manager.get_by_user_id(user_id=gr_user.id) + assert isinstance(token, GRToken) assert gr_user.id == token.user_id def test_prefetch_user( self, gr_user: GRUser, - gr_team_manager: TeamManager, + gr_token_manager: GRTokenManager, gr_db: PostgresConfig, gr_redis_config: RedisConfig, ): - gr_team_manager.create(user_id=gr_user.id) + gr_token_manager.create(user_id=gr_user.id) - token: GRToken = gr_team_manager.get_by_user_id(user_id=gr_user.id) + token: GRToken | None = gr_token_manager.get_by_user_id(user_id=gr_user.id) + assert isinstance(token, GRToken) assert token.user is None token.prefetch_user(pg_config=gr_db, redis_config=gr_redis_config) @@ -115,17 +118,18 @@ class TestGRTokenManager: def test_get_by_key( self, gr_user: GRUser, - gr_team_manager: TeamManager, + gr_token_manager: GRTokenManager, ): - gr_team_manager.create(user_id=gr_user.id) - token = gr_team_manager.get_by_user_id(user_id=gr_user.id) + gr_token_manager.create(user_id=gr_user.id) + token = gr_token_manager.get_by_user_id(user_id=gr_user.id) + assert isinstance(token, GRToken) - instance = gr_team_manager.get_by_key(api_key=token.key) + instance = gr_token_manager.get_by_key(api_key=token.key) assert token.created == instance.created # Search for non-existent key with pytest.raises(expected_exception=Exception) as cm: - gr_team_manager.get_by_key(api_key=uuid4().hex) + gr_token_manager.get_by_key(api_key=uuid4().hex) assert "No GRUser with token of " in str(cm.value) @pytest.mark.skip(reason="no idea how to actually test this...") diff --git a/tests/managers/gr/test_business.py b/tests/managers/gr/test_business.py index 3513af5..0d5b0d5 100644 --- a/tests/managers/gr/test_business.py +++ b/tests/managers/gr/test_business.py @@ -1,3 +1,4 @@ +from collections.abc import Callable from typing import TYPE_CHECKING from uuid import uuid4 @@ -9,6 +10,7 @@ from generalresearch.models.gr.business import ( BusinessBankAccount, ) from generalresearch.models.gr.definitions import TransferMethod +from generalresearch.models.gr.team import Team if TYPE_CHECKING: from generalresearch.managers.gr.business import ( @@ -68,9 +70,9 @@ class TestBusinessAddressManager: class TestBusinessManager: - def test_create(self, business_manager: BusinessManager): + def test_create(self, gr_business_factory: Callable[..., Business]): - instance = business_manager.create_dummy() + instance = gr_business_factory() assert isinstance(instance, Business) assert isinstance(instance.id, int) @@ -88,11 +90,15 @@ class TestBusinessManager: assert isinstance(res, Business) assert res.id == instance.id - def test_get_all(self, business_manager: BusinessManager): + def test_get_all( + self, + business_manager: BusinessManager, + gr_business_factory: Callable[..., Business], + ): res1 = business_manager.get_all() assert isinstance(res1, list) - business_manager.create_dummy() + gr_business_factory() res2 = business_manager.get_all() assert len(res1) == len(res2) - 1 @@ -106,17 +112,19 @@ class TestBusinessManager: gr_user: GRUser, team_manager: TeamManager, membership_manager: MembershipManager, + gr_business_factory: Callable[..., Business], + gr_team_factory: Callable[..., Team], ): res = business_manager.get_by_user_id(user_id=gr_user.id) assert len(res) == 0 # Create a business: Business, but don't add it to anything - b1 = business_manager.create_dummy() + b1 = gr_business_factory() res = business_manager.get_by_user_id(user_id=gr_user.id) assert len(res) == 0 # Create a Team, but don't create any Memberships - t1 = team_manager.create_dummy() + t1 = gr_team_factory() res = business_manager.get_by_user_id(user_id=gr_user.id) assert len(res) == 0 @@ -133,7 +141,7 @@ class TestBusinessManager: assert len(res) == 1 # Add another Business to the Team! - b2 = business_manager.create_dummy() + b2 = gr_business_factory() team_manager.add_business(team=t1, business=b2) res = business_manager.get_by_user_id(user_id=gr_user.id) assert len(res) == 2 diff --git a/tests/managers/gr/test_team.py b/tests/managers/gr/test_team.py index 17e0470..751e33c 100644 --- a/tests/managers/gr/test_team.py +++ b/tests/managers/gr/test_team.py @@ -4,6 +4,7 @@ from collections.abc import Callable from typing import TYPE_CHECKING from uuid import uuid4 +from generalresearch.models.gr.authentication import GRUser from generalresearch.models.gr.team import Membership, Team if TYPE_CHECKING: @@ -23,94 +24,110 @@ class TestMembershipManager: class TestTeamManager: - def test_init(self, team_manager: TeamManager, gr_db: PostgresConfig): - assert team_manager.pg_config == gr_db + def test_init(self, gr_team_manager: TeamManager, gr_db: PostgresConfig): + assert gr_team_manager.pg_config == gr_db - def test_get_or_create(self, team_manager: TeamManager): + def test_get_or_create(self, gr_team_manager: TeamManager): from generalresearch.models.gr.team import Team new_uuid = uuid4().hex - team: Team = team_manager.get_or_create(uuid=new_uuid) + team: Team = gr_team_manager.get_or_create(uuid=new_uuid) assert isinstance(team, Team) assert isinstance(team.id, int) assert team.uuid == new_uuid assert team.name == "< Unknown >" - def test_get_all(self, team_manager: TeamManager): - res1 = team_manager.get_all() + def test_get_all( + self, gr_team_factory: Callable[..., Team], gr_team_manager: TeamManager + ): + res1 = gr_team_manager.get_all() assert isinstance(res1, list) - team_manager.create_dummy() - res2 = team_manager.get_all() + gr_team_factory() + res2 = gr_team_manager.get_all() assert len(res1) == len(res2) - 1 - def test_create(self, team_manager: TeamManager): + def test_create( + self, gr_team_factory: Callable[..., Team], gr_team_manager: TeamManager + ): - team: Team = team_manager.create_dummy() + team: Team = gr_team_factory() assert isinstance(team, Team) assert isinstance(team.id, int) def test_add_user( self, - team: Team, - team_manager: TeamManager, - gr_um: GRUserManager, - gr_db: PostgresConfig, - gr_redis_config: RedisConfig, + gr_team: Team, + gr_team_manager: TeamManager, + gr_user_manager: GRUserManager, + gr_user_factory: Callable[..., GRUser], ): - user: GRUser = gr_um.create_dummy() + user: GRUser = gr_user_factory() - instance = team_manager.add_user(team=team, gr_user=user) + instance = gr_team_manager.add_user( + gr_user_manager=gr_user_manager, team=gr_team, gr_user=user + ) assert isinstance(instance, Membership) # assert team.gr_users is None - team.prefetch_gr_users(pg_config=gr_db, redis_config=gr_redis_config) - assert isinstance(team.gr_users, list) - assert len(team.gr_users) - assert team.gr_users == [user] + gr_team.prefetch_gr_users(gr_user_manager=gr_user_manager) + assert isinstance(gr_team.gr_users, list) + assert len(gr_team.gr_users) + assert gr_team.gr_users == [user] - def test_get_by_uuid(self, team_manager: TeamManager): + def test_get_by_uuid( + self, gr_team_factory: Callable[..., Team], gr_team_manager: TeamManager + ): - team: Team = team_manager.create_dummy() + team: Team = gr_team_factory() - instance = team_manager.get_by_uuid(team_uuid=team.uuid) + instance = gr_team_manager.get_by_uuid(team_uuid=team.uuid) + assert isinstance(instance, Team) assert team.id == instance.id - def test_get_by_id(self, team_manager: TeamManager): + def test_get_by_id( + self, gr_team_factory: Callable[..., Team], gr_team_manager: TeamManager + ): - team: Team = team_manager.create_dummy() + team: Team = gr_team_factory() - instance = team_manager.get_by_id(team_id=team.id) + instance = gr_team_manager.get_by_id(team_id=team.id) + assert isinstance(instance, Team) assert team.uuid == instance.uuid def test_get_by_user( - self, team: Team, team_manager: TeamManager, gr_um: GRUserManager + self, + gr_team: Team, + gr_user_factory: Callable[..., GRUser], + gr_team_manager: TeamManager, + gr_user_manager: GRUserManager, ): + user: GRUser = gr_user_factory() + gr_team_manager.add_user( + gr_user_manager=gr_user_manager, team=gr_team, gr_user=user + ) - user: GRUser = gr_um.create_dummy() - team_manager.add_user(team=team, gr_user=user) - - res = team_manager.get_by_user(gr_user=user) + res = gr_team_manager.get_by_user(gr_user=user) assert isinstance(res, list) assert len(res) == 1 instance = res[0] assert isinstance(instance, Team) - assert instance.uuid == team.uuid + assert instance.uuid == gr_team.uuid def test_get_by_user_duplicates( self, gr_user: GRUser, product_factory: Callable[..., Product], - membership_factory: Callable[..., Membership], - team: Team, + gr_membership_factory: Callable[..., Membership], + gr_team: Team, gr_redis_config: RedisConfig, gr_db: PostgresConfig, ): - product_factory(team=team) - membership_factory(team=team, gr_user=gr_user) + product_factory(team=gr_team) + gr_membership_factory(gr_team=gr_team, gr_user=gr_user) gr_user.prefetch_teams( pg_config=gr_db, -- cgit v1.2.3