diff --git a/.gitignore b/.gitignore index 5dbfe3a1a0edc59e25b82ec47454b370c5e8ed31..6afde985213dd261d8fd1a20004a400ab29610ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ __pycache__/ *.egg-info -.coverage +.coverage* coverage.xml .vscode venv diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0ed900004f54ad77ce3c2cf9a1a327e498f54e83..80eb9a6f4d025d393e67a6ab30ea2c646d1f8a5d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,7 +23,7 @@ run-tox-pipeline: POSTGRES_DB: gso-test-db POSTGRES_USER: nwa POSTGRES_PASSWORD: nwa - DATABASE_URI_TEST: 'postgresql://nwa:nwa@postgres:5432/gso-test-db' + DATABASE_HOST: "postgres" PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" cache: @@ -36,9 +36,9 @@ run-tox-pipeline: - pip install virtualenv - virtualenv venv - . venv/bin/activate + - pip install tox script: - - pip install tox - tox artifacts: diff --git a/requirements.txt b/requirements.txt index 621780cce71a4295884c512ee208c1e5fe9c4323..0ccb4d649c6ee9a30d3a633ab451747097e0d933 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,3 +23,4 @@ sphinx-rtd-theme==2.0.0 urllib3_mock==0.3.3 pytest-asyncio==0.23.6 pre-commit~=3.7.0 +pytest-xdist==3.6.1 diff --git a/test/conftest.py b/test/conftest.py index 2eb7e6a28089c621b620fa56d9a55b293c75b099..ea765207040e59d11a955789deb02b1835247ac1 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -142,8 +142,14 @@ def data_config_filename() -> str: @pytest.fixture(scope="session") def db_uri(): - """Provide the database uri configuration to run the migration on.""" - return os.environ.get("DATABASE_URI_TEST", "postgresql://nwa:nwa@localhost/gso-test-db") + """Provide a unique database URI for each pytest-xdist worker, or a default URI if running without xdist.""" + worker_id = os.getenv("PYTEST_XDIST_WORKER") + database_host = os.getenv("DATABASE_HOST", "localhost") + + if worker_id: + return f"postgresql://nwa:nwa@{database_host}/gso-test-db_{worker_id}" + + return os.environ.get("DATABASE_URI_TEST", f"postgresql://nwa:nwa@{database_host}/gso-test-db") def run_migrations(db_uri: str) -> None: @@ -281,7 +287,7 @@ def partner_factory(): return _create_partner -@pytest.fixture(scope="session") +@pytest.fixture() def geant_partner(partner_factory): return partner_factory(name="GEANT-TEST", email="goat-test@geant.org") diff --git a/tox.ini b/tox.ini index a8eab7b2fc84925ef5a1d2f859e9e5c3bce1eec4..985eddf70e1c5645055d27b04df967f4c91acecb 100644 --- a/tox.ini +++ b/tox.ini @@ -6,25 +6,21 @@ markers = "workflow,noautofixt" filterwarnings = "ignore,default:::gso" [testenv] -passenv = DATABASE_URI_TEST,SKIP_ALL_TESTS,ENVIRONMENT_IGNORE_MUTATION_DISABLED +passenv = DATABASE_URI_TEST,DATABASE_HOST,SKIP_ALL_TESTS,ENVIRONMENT_IGNORE_MUTATION_DISABLED setenv = - OAUTH2_ACTIVE = False - TRANSLATIONS_DIR = ./gso/translations + OAUTH2_ACTIVE=False + TRANSLATIONS_DIR=./gso/translations TESTING=true EXECUTOR=threadpool deps = - coverage + pytest-cov -r requirements.txt commands = ruff check --respect-gitignore --preview . ruff format --respect-gitignore --preview --check . mypy . - coverage erase - coverage run --source gso --omit="gso/migrations/*" -m pytest {posargs} - coverage xml - coverage html - sh -c "if [ $SKIP_ALL_TESTS -eq 1 ]; then echo 'Skipping coverage report'; else coverage report --fail-under 80; fi" + sh -c 'SKIP_ALL_TESTS=${SKIP_ALL_TESTS:-0}; if [ "$SKIP_ALL_TESTS" = "1" ]; then echo "Skipping coverage report"; else pytest --cov=gso --cov-report=xml --cov-report=html --cov-fail-under=85 -n auto; fi' allowlist_externals = sh