|
1 | | -import datetime |
2 | | -import logging |
3 | | -from collections.abc import Generator |
4 | | -from typing import Callable |
5 | | -from unittest.mock import MagicMock, patch |
6 | | -from uuid import uuid4 |
7 | | - |
8 | | -import pytest |
9 | | -from openai.types import CompletionUsage |
10 | | -from openai.types.chat import ChatCompletionMessage |
11 | | -from openai.types.chat.chat_completion import ChatCompletion, Choice |
12 | | - |
13 | | -from galileo.config import GalileoPythonConfig |
14 | | -from galileo.resources.models import DatasetContent, DatasetRow, DatasetRowValuesDict |
15 | | -from galileo_core.constants.request_method import RequestMethod |
16 | | -from galileo_core.constants.routes import Routes as CoreRoutes |
17 | | -from galileo_core.schemas.core.user import User |
18 | | -from galileo_core.schemas.core.user_role import UserRole |
19 | | -from galileo_core.schemas.protect.rule import Rule, RuleOperator |
20 | | -from galileo_core.schemas.protect.ruleset import Ruleset |
21 | | -from tests.testutils.setup import setup_thread_pool_request_capture |
| 1 | +# fmt: off |
| 2 | +# CRITICAL: Set test environment variables BEFORE any other imports. |
| 3 | +# This MUST be at the absolute top of conftest.py before any import statements. |
| 4 | +# Required for pytest-xdist compatibility on Python 3.14+. |
| 5 | +# |
| 6 | +# NOTE: We unconditionally override these vars (not setdefault) to ensure: |
| 7 | +# 1. Tests never accidentally use real credentials from developer's environment |
| 8 | +# 2. Test isolation - all tests see the same predictable values |
| 9 | +# 3. Security - prevents real API keys from leaking into test logs |
| 10 | +import os as _os |
| 11 | + |
| 12 | +_os.environ["GALILEO_CONSOLE_URL"] = "http://localtest:8088" |
| 13 | +_os.environ["GALILEO_API_KEY"] = "api-1234567890" |
| 14 | +_os.environ["GALILEO_PROJECT"] = "test-project" |
| 15 | +_os.environ["GALILEO_LOG_STREAM"] = "test-log-stream" |
| 16 | +_os.environ["OPENAI_API_KEY"] = "sk-test" |
| 17 | +del _os # Clean up temporary import |
| 18 | +# fmt: on |
| 19 | + |
| 20 | +import datetime # noqa: E402 |
| 21 | +import logging # noqa: E402 |
| 22 | +from collections.abc import Generator # noqa: E402 |
| 23 | +from typing import Callable # noqa: E402 |
| 24 | +from unittest.mock import MagicMock, patch # noqa: E402 |
| 25 | +from uuid import uuid4 # noqa: E402 |
| 26 | + |
| 27 | +import pytest # noqa: E402 |
| 28 | +from openai.types import CompletionUsage # noqa: E402 |
| 29 | +from openai.types.chat import ChatCompletionMessage # noqa: E402 |
| 30 | +from openai.types.chat.chat_completion import ChatCompletion, Choice # noqa: E402 |
| 31 | + |
| 32 | +from galileo.config import GalileoPythonConfig # noqa: E402 |
| 33 | +from galileo.resources.models import DatasetContent, DatasetRow, DatasetRowValuesDict # noqa: E402 |
| 34 | +from galileo_core.constants.request_method import RequestMethod # noqa: E402 |
| 35 | +from galileo_core.constants.routes import Routes as CoreRoutes # noqa: E402 |
| 36 | +from galileo_core.schemas.core.user import User # noqa: E402 |
| 37 | +from galileo_core.schemas.core.user_role import UserRole # noqa: E402 |
| 38 | +from galileo_core.schemas.protect.rule import Rule, RuleOperator # noqa: E402 |
| 39 | +from galileo_core.schemas.protect.ruleset import Ruleset # noqa: E402 |
| 40 | +from tests.testutils.setup import setup_thread_pool_request_capture # noqa: E402 |
22 | 41 |
|
23 | 42 | # Note: The mock_request fixture is automatically provided by galileo_core[testing] extras |
24 | 43 |
|
@@ -62,7 +81,13 @@ def set_validated_config( |
62 | 81 | mock_healthcheck: None, mock_login_api_key: None, mock_get_current_user: None, mock_decode_jwt: MagicMock |
63 | 82 | ) -> Generator[None, None, None]: |
64 | 83 | """Automatically set up validated config for tests.""" |
65 | | - config = GalileoPythonConfig.get() |
| 84 | + # Reset any existing config to ensure fresh initialization |
| 85 | + # This is needed for pytest-xdist compatibility on Python 3.14+ |
| 86 | + if GalileoPythonConfig._instance is not None: |
| 87 | + GalileoPythonConfig._instance.reset() |
| 88 | + # Initialize config with EXPLICIT values to avoid env var timing issues with pytest-xdist |
| 89 | + # This ensures correct config even if env vars weren't set before module imports |
| 90 | + config = GalileoPythonConfig.get(console_url="http://localtest:8088", api_key="api-1234567890") |
66 | 91 | yield |
67 | 92 | config.reset() |
68 | 93 |
|
|
0 commit comments