Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions ddtestpy/internal/session_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
Expand Down Expand Up @@ -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()
Expand Down
1 change: 1 addition & 0 deletions ddtestpy/internal/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
34 changes: 33 additions & 1 deletion tests/internal/test_session_manager.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -168,3 +171,32 @@ 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)

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)

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)

expected_name = "pytest"
assert session_manager._get_test_session_name() == expected_name
assert session_manager.writer.metadata["*"]["test_session.name"] == expected_name
8 changes: 7 additions & 1 deletion tests/mocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down