From d9d90593de527e7ad3fdacad0da42633a41da173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Thu, 13 Nov 2025 14:13:49 +0000 Subject: [PATCH 1/3] test session name! --- ddtestpy/internal/session_manager.py | 10 ++++++++++ ddtestpy/internal/test_data.py | 1 + 2 files changed, 11 insertions(+) diff --git a/ddtestpy/internal/session_manager.py b/ddtestpy/internal/session_manager.py index 78c614b..b7d1cf3 100644 --- a/ddtestpy/internal/session_manager.py +++ b/ddtestpy/internal/session_manager.py @@ -106,6 +106,7 @@ def __init__(self, session: TestSession) -> None: TestTag.TEST_COMMAND: self.session.test_command, TestTag.TEST_FRAMEWORK: self.session.test_framework, TestTag.TEST_FRAMEWORK_VERSION: self.session.test_framework_version, + TestTag.TEST_SESSION_NAME: self._get_test_session_name(), TestTag.COMPONENT: self.session.test_framework, TestTag.ENV: self.env, }, @@ -227,6 +228,15 @@ def _set_codeowners(self, test: Test) -> None: codeowners = self.codeowners.of(repo_relative_path) test.set_codeowners(codeowners) + def _get_test_session_name(self) -> str: + if session_name := os.environ.get("DD_TEST_SESSION_NAME"): + return session_name + + if job_name := self.env_tags.get(CITag.JOB_NAME): + return f"{job_name}-{self.session.test_command}" + + return self.session.test_command + def upload_git_data(self) -> None: git = Git() latest_commits = git.get_latest_commits() diff --git a/ddtestpy/internal/test_data.py b/ddtestpy/internal/test_data.py index a6fcac3..cbdc010 100644 --- a/ddtestpy/internal/test_data.py +++ b/ddtestpy/internal/test_data.py @@ -307,6 +307,7 @@ class TestTag: TEST_COMMAND = "test.command" TEST_FRAMEWORK = "test.framework" TEST_FRAMEWORK_VERSION = "test.framework_version" + TEST_SESSION_NAME = "test_session.name" ENV = "env" From 6e62d59c60b822bcfa7e723841c6d4e1d3ba9645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Thu, 13 Nov 2025 14:53:44 +0000 Subject: [PATCH 2/3] some tests --- tests/internal/test_session_manager.py | 28 +++++++++++++++++++++++++- tests/mocks.py | 8 +++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/tests/internal/test_session_manager.py b/tests/internal/test_session_manager.py index 5542903..a8e553a 100644 --- a/tests/internal/test_session_manager.py +++ b/tests/internal/test_session_manager.py @@ -1,5 +1,8 @@ -"""Regression tests for SessionManager.is_skippable_test() method changes.""" +import os +import pytest + +from ddtestpy.internal.ci import CITag from ddtestpy.internal.test_data import ModuleRef from ddtestpy.internal.test_data import SuiteRef from ddtestpy.internal.test_data import TestRef @@ -168,3 +171,26 @@ def test_multiple_tests_same_skippable_suite(self) -> None: assert session_manager.is_skippable_test(test_ref1) is True assert session_manager.is_skippable_test(test_ref2) is True assert session_manager.is_skippable_test(test_ref3) is True + + +class TestSessionNameTest: + def test_session_name_explicitly_from_env_var(self, monkeypatch: pytest.MonkeyPatch) -> None: + env = {"DD_TEST_SESSION_NAME": "the_name", "DD_API_KEY": "somekey"} + monkeypatch.setattr(os, "environ", env) + session_manager = session_manager_mock().with_env_tags({CITag.JOB_NAME: "the_job"}).build_real_with_mocks(env) + + assert session_manager._get_test_session_name() == "the_name" + + def test_session_name_from_job_name(self, monkeypatch: pytest.MonkeyPatch) -> None: + env = {"DD_API_KEY": "somekey"} + monkeypatch.setattr(os, "environ", env) + session_manager = session_manager_mock().with_env_tags({CITag.JOB_NAME: "the_job"}).build_real_with_mocks(env) + + assert session_manager._get_test_session_name() == "the_job-pytest" + + def test_session_name_from_test_command(self, monkeypatch: pytest.MonkeyPatch) -> None: + env = {"DD_API_KEY": "somekey"} + monkeypatch.setattr(os, "environ", env) + session_manager = session_manager_mock().with_env_tags({}).build_real_with_mocks(env) + + assert session_manager._get_test_session_name() == "pytest" diff --git a/tests/mocks.py b/tests/mocks.py index 0b76ea0..00edd6b 100644 --- a/tests/mocks.py +++ b/tests/mocks.py @@ -98,6 +98,7 @@ def __init__(self) -> None: self._known_commits: t.List[str] = [] self._workspace_path = "/fake/workspace" self._retry_handlers: t.List[Mock] = [] + self._env_tags: t.Dict[str, str] = {} def with_settings(self, settings: Settings) -> "SessionManagerMockBuilder": """Set custom settings.""" @@ -138,6 +139,11 @@ def with_workspace_path(self, path: str) -> "SessionManagerMockBuilder": self._workspace_path = path return self + def with_env_tags(self, tags: t.Dict[str, str]) -> "SessionManagerMockBuilder": + """Set tags extracted from environment.""" + self._env_tags = tags + return self + def build_mock(self) -> Mock: """Build a Mock SessionManager object.""" mock_manager = Mock(spec=SessionManager) @@ -176,7 +182,7 @@ def build_real_with_mocks(self, test_env: t.Optional[t.Dict[str, str]] = None) - mock_client.get_skippable_tests.return_value = (self._skippable_items, None) mock_api_client.return_value = mock_client - with patch("ddtestpy.internal.session_manager.get_env_tags", return_value={}), patch( + with patch("ddtestpy.internal.session_manager.get_env_tags", return_value=self._env_tags), patch( "ddtestpy.internal.session_manager.get_platform_tags", return_value={} ), patch("ddtestpy.internal.session_manager.Git", return_value=get_mock_git_instance()), patch.dict( os.environ, test_env From c0b419b63e59a34fc14a2e010b7de62c12d89627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Thu, 13 Nov 2025 14:56:30 +0000 Subject: [PATCH 3/3] tests --- tests/internal/test_session_manager.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/internal/test_session_manager.py b/tests/internal/test_session_manager.py index a8e553a..3fa3de2 100644 --- a/tests/internal/test_session_manager.py +++ b/tests/internal/test_session_manager.py @@ -179,18 +179,24 @@ def test_session_name_explicitly_from_env_var(self, monkeypatch: pytest.MonkeyPa monkeypatch.setattr(os, "environ", env) session_manager = session_manager_mock().with_env_tags({CITag.JOB_NAME: "the_job"}).build_real_with_mocks(env) - assert session_manager._get_test_session_name() == "the_name" + expected_name = "the_name" + assert session_manager._get_test_session_name() == expected_name + assert session_manager.writer.metadata["*"]["test_session.name"] == expected_name def test_session_name_from_job_name(self, monkeypatch: pytest.MonkeyPatch) -> None: env = {"DD_API_KEY": "somekey"} monkeypatch.setattr(os, "environ", env) session_manager = session_manager_mock().with_env_tags({CITag.JOB_NAME: "the_job"}).build_real_with_mocks(env) - assert session_manager._get_test_session_name() == "the_job-pytest" + expected_name = "the_job-pytest" + assert session_manager._get_test_session_name() == expected_name + assert session_manager.writer.metadata["*"]["test_session.name"] == expected_name def test_session_name_from_test_command(self, monkeypatch: pytest.MonkeyPatch) -> None: env = {"DD_API_KEY": "somekey"} monkeypatch.setattr(os, "environ", env) session_manager = session_manager_mock().with_env_tags({}).build_real_with_mocks(env) - assert session_manager._get_test_session_name() == "pytest" + expected_name = "pytest" + assert session_manager._get_test_session_name() == expected_name + assert session_manager.writer.metadata["*"]["test_session.name"] == expected_name