codemie-test-harness 0.1.211__py3-none-any.whl → 0.1.213__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of codemie-test-harness might be problematic. Click here for more details.

@@ -21,6 +21,8 @@ LANGFUSE_TRACES_ENABLED = (
21
21
  PROJECT = os.getenv("PROJECT_NAME", "codemie")
22
22
  TEST_USER = os.getenv("TEST_USER_FULL_NAME", "Test User")
23
23
  GITHUB_URL = CredentialsManager.get_parameter("GITHUB_URL", "https://github.com")
24
+ VERIFY_SSL = os.getenv("VERIFY_SSL", "True").lower() == "true"
25
+ API_DOMEN = os.getenv("CODEMIE_API_DOMAIN")
24
26
 
25
27
  autotest_entity_prefix = (
26
28
  f"{''.join(random.choice(string.ascii_lowercase) for _ in range(3))}_"
@@ -1,7 +1,7 @@
1
1
  import pytest
2
-
3
2
  from codemie_sdk.models.assistant import ToolConfig
4
3
  from codemie_sdk.models.integration import CredentialTypes
4
+
5
5
  from codemie_test_harness.tests.enums.tools import Toolkit, ProjectManagementTool
6
6
  from codemie_test_harness.tests.test_data.pm_tools_test_data import (
7
7
  CONFLUENCE_TOOL_PROMPT,
@@ -13,7 +13,6 @@ from codemie_test_harness.tests.test_data.pm_tools_test_data import (
13
13
  from codemie_test_harness.tests.test_data.project_management_test_data import (
14
14
  pm_tools_test_data,
15
15
  )
16
- from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
17
16
  from codemie_test_harness.tests.utils.base_utils import (
18
17
  credentials_to_dict,
19
18
  assert_tool_triggered,
@@ -21,6 +20,7 @@ from codemie_test_harness.tests.utils.base_utils import (
21
20
  from codemie_test_harness.tests.utils.constants import (
22
21
  project_management_integrations,
23
22
  )
23
+ from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
24
24
 
25
25
 
26
26
  @pytest.mark.assistant
@@ -41,14 +41,14 @@ def test_assistant_with_project_management_tools(
41
41
  prompt,
42
42
  expected_response,
43
43
  ):
44
- integration = request.getfixturevalue(
44
+ _integration = request.getfixturevalue(
45
45
  project_management_integrations[integration_type]
46
46
  )
47
47
 
48
48
  assistant = assistant(
49
49
  Toolkit.PROJECT_MANAGEMENT,
50
50
  tool_name,
51
- settings=integration,
51
+ settings=_integration,
52
52
  )
53
53
 
54
54
  response, triggered_tools = assistant_utils.ask_assistant(
@@ -28,9 +28,9 @@ def test_create_assistant_with_vcs_tool(
28
28
  prompt,
29
29
  expected_response,
30
30
  ):
31
- integration = request.getfixturevalue(vcs_integrations[tool_name])
31
+ _integration = request.getfixturevalue(vcs_integrations[tool_name])
32
32
 
33
- assistant = assistant(Toolkit.VCS, tool_name, settings=integration)
33
+ assistant = assistant(Toolkit.VCS, tool_name, settings=_integration)
34
34
 
35
35
  response, triggered_tools = assistant_utils.ask_assistant(
36
36
  assistant, prompt, minimal_response=False
@@ -1,14 +1,11 @@
1
1
  import os
2
2
  import subprocess
3
3
  import uuid
4
+ from pathlib import Path
4
5
  from time import sleep
5
6
  from typing import List, Optional
6
- from pathlib import Path
7
7
 
8
8
  import pytest
9
- from requests import HTTPError
10
- from dotenv import load_dotenv
11
-
12
9
  from codemie_sdk.models.assistant import (
13
10
  ToolKitDetails,
14
11
  ToolDetails,
@@ -23,6 +20,8 @@ from codemie_sdk.models.integration import (
23
20
  Integration,
24
21
  )
25
22
  from codemie_sdk.models.workflow import WorkflowCreateRequest, WorkflowMode, Workflow
23
+ from dotenv import load_dotenv
24
+ from requests import HTTPError
26
25
 
27
26
  from codemie_test_harness.tests import PROJECT, autotest_entity_prefix
28
27
  from codemie_test_harness.tests.test_data.file_test_data import file_test_data
@@ -30,14 +29,20 @@ from codemie_test_harness.tests.test_data.google_datasource_test_data import (
30
29
  GOOGLE_DOC_URL,
31
30
  )
32
31
  from codemie_test_harness.tests.utils.assistant_utils import AssistantUtils
33
- from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
34
32
  from codemie_test_harness.tests.utils.base_utils import get_random_name, wait_for_entity
35
33
  from codemie_test_harness.tests.utils.client_factory import get_client
34
+ from codemie_test_harness.tests.utils.confluence_utils import ConfluenceUtils
36
35
  from codemie_test_harness.tests.utils.constants import TESTS_PATH, FILES_PATH
37
36
  from codemie_test_harness.tests.utils.conversation_utils import ConversationUtils
37
+ from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
38
38
  from codemie_test_harness.tests.utils.datasource_utils import DataSourceUtils
39
+ from codemie_test_harness.tests.utils.env_resolver import (
40
+ EnvironmentResolver,
41
+ get_environment,
42
+ )
39
43
  from codemie_test_harness.tests.utils.gitbud_utils import GitBudUtils
40
44
  from codemie_test_harness.tests.utils.integration_utils import IntegrationUtils
45
+ from codemie_test_harness.tests.utils.jira_utils import JiraUtils
41
46
  from codemie_test_harness.tests.utils.llm_utils import LLMUtils
42
47
  from codemie_test_harness.tests.utils.logger_util import setup_logger
43
48
  from codemie_test_harness.tests.utils.notification_utils import GmailUtils
@@ -45,6 +50,7 @@ from codemie_test_harness.tests.utils.provider_utils import ProviderUtils
45
50
  from codemie_test_harness.tests.utils.search_utils import SearchUtils
46
51
  from codemie_test_harness.tests.utils.similarity_check import SimilarityCheck
47
52
  from codemie_test_harness.tests.utils.user_utils import UserUtils
53
+ from codemie_test_harness.tests.utils.webhook_utils import WebhookUtils
48
54
  from codemie_test_harness.tests.utils.workflow_utils import WorkflowUtils
49
55
  from codemie_test_harness.tests.utils.yaml_utils import (
50
56
  WorkflowYamlModel,
@@ -53,11 +59,6 @@ from codemie_test_harness.tests.utils.yaml_utils import (
53
59
  StateModel,
54
60
  prepare_yaml_content,
55
61
  )
56
- from codemie_test_harness.tests.utils.env_resolver import (
57
- EnvironmentResolver,
58
- get_environment,
59
- )
60
- from codemie_test_harness.tests.utils.webhook_utils import WebhookUtils
61
62
 
62
63
  logger = setup_logger(__name__)
63
64
 
@@ -880,13 +881,13 @@ def development_plugin(integration_utils):
880
881
  @pytest.fixture(scope="module")
881
882
  def ado_integration(integration_utils):
882
883
  """Create Azure DevOps integration"""
883
- integration = integration_utils.create_integration(
884
+ _integration = integration_utils.create_integration(
884
885
  CredentialTypes.AZURE_DEVOPS,
885
886
  CredentialsManager.azure_devops_credentials(),
886
887
  )
887
- yield integration
888
- if integration:
889
- integration_utils.delete_integration(integration)
888
+ yield _integration
889
+ if _integration:
890
+ integration_utils.delete_integration(_integration)
890
891
 
891
892
 
892
893
  @pytest.fixture(scope="function")
@@ -968,3 +969,15 @@ def pytest_sessionfinish(session):
968
969
 
969
970
  providers_utils = ProviderUtils(client)
970
971
  providers_utils.cleanup_test_providers()
972
+
973
+ # Clean up Jira test issues
974
+ jira_utils = JiraUtils(is_cloud=False)
975
+ jira_utils.cleanup_jira_project(summary_prefix=prefix)
976
+ jira_utils = JiraUtils(is_cloud=True)
977
+ jira_utils.cleanup_jira_project(summary_prefix=prefix)
978
+
979
+ # Clean up Confluence test pages
980
+ confluence_utils = ConfluenceUtils(is_cloud=False)
981
+ confluence_utils.cleanup_confluence_space(title_prefix=prefix)
982
+ confluence_utils = ConfluenceUtils(is_cloud=True)
983
+ confluence_utils.cleanup_confluence_space(title_prefix=prefix)
@@ -10,15 +10,17 @@ import pytest
10
10
  import requests
11
11
  from hamcrest import assert_that, equal_to, is_in, less_than
12
12
 
13
+ from codemie_test_harness.tests import VERIFY_SSL
14
+
13
15
  # Module-level constants
14
16
  CODEMIE_API_DOMAIN = os.getenv("CODEMIE_API_DOMAIN")
15
17
  SWAGGER_URL = f"{CODEMIE_API_DOMAIN}/docs"
16
18
  OPENAPI_JSON_URL = f"{CODEMIE_API_DOMAIN}/openapi.json"
17
- VERIFY_SSL = os.getenv("VERIFY_SSL", "True").lower() == "true"
18
19
 
19
20
 
20
21
  @pytest.mark.api
21
22
  @pytest.mark.smoke
23
+ @pytest.mark.swagger
22
24
  def test_swagger_endpoint_is_accessible():
23
25
  """
24
26
  Test that the Swagger documentation endpoint is accessible and returns a successful response.
@@ -34,6 +36,7 @@ def test_swagger_endpoint_is_accessible():
34
36
 
35
37
  @pytest.mark.api
36
38
  @pytest.mark.smoke
39
+ @pytest.mark.swagger
37
40
  def test_swagger_endpoint_returns_html():
38
41
  """
39
42
  Test that the Swagger documentation endpoint returns HTML content.
@@ -58,6 +61,7 @@ def test_swagger_endpoint_returns_html():
58
61
 
59
62
  @pytest.mark.api
60
63
  @pytest.mark.smoke
64
+ @pytest.mark.swagger
61
65
  def test_swagger_endpoint_response_time():
62
66
  """
63
67
  Test that the Swagger documentation endpoint responds within acceptable time.
@@ -77,6 +81,7 @@ def test_swagger_endpoint_response_time():
77
81
 
78
82
  @pytest.mark.api
79
83
  @pytest.mark.smoke
84
+ @pytest.mark.swagger
80
85
  def test_openapi_json_endpoint(client):
81
86
  """
82
87
  Test that the OpenAPI JSON endpoint returns valid JSON with expected metadata.
@@ -1,3 +1,7 @@
1
+ from codemie_test_harness.tests.utils.base_utils import get_random_name
2
+ from codemie_test_harness.tests.utils.confluence_utils import CONFLUENCE_SPACE_KEYS
3
+ from codemie_test_harness.tests.utils.jira_utils import JIRA_PROJECT_KEYS
4
+
1
5
  JIRA_TOOL_PROMPT = (
2
6
  "Get a title for ticket EPMCDME-222 ticket."
3
7
  "For generic jira tool use exactly the same parameters:"
@@ -89,3 +93,44 @@ RESPONSE_FOR_CONFLUENCE_CLOUD_TOOL = """
89
93
  Description: This space includes a section for describing the purpose of the space, a search feature, and a filter by label functionality.
90
94
  If you need more detailed information about a specific page, please let me know!
91
95
  """
96
+
97
+
98
+ def get_jira_tool_create_prompt(jira_type: str) -> str:
99
+ return (
100
+ "Create a new issue in Jira with the following details. "
101
+ "For generic jira tool use exactly the same parameters: "
102
+ "relative_url=/rest/api/2/issue "
103
+ "method=POST "
104
+ f"params={{'fields': {{'project': {{'key': '{JIRA_PROJECT_KEYS[jira_type]}'}}, 'summary': '{get_random_name()} Test issue created by automation', "
105
+ "'description': 'This is a test issue created for testing purposes', 'issuetype': {'name': 'Task'}}}}}"
106
+ )
107
+
108
+
109
+ def get_response_for_jira_tool_create(jira_type: str) -> str:
110
+ return f"""
111
+ The issue has been successfully created in Jira. Here are the details:
112
+
113
+ - **ID**: 13411639
114
+ - **Key**: {JIRA_PROJECT_KEYS[jira_type]}-.....
115
+ - **Link**: [{JIRA_PROJECT_KEYS[jira_type]}-.....](https://jira.....)
116
+ """
117
+
118
+
119
+ def get_confluence_tool_create_prompt(confluence_type: str) -> str:
120
+ return f"""
121
+ Create a new page in Confluence with the following details using Generic Confluence Tool with the params:
122
+ relative_url='/rest/api/content'
123
+ method='POST'
124
+ params={{'type': 'page', 'title': '{get_random_name()} Test Page Created by Automation', 'space': {{'key': '{CONFLUENCE_SPACE_KEYS[confluence_type]}'}},
125
+ 'body': {{'storage': {{'value': '<p>This is a test page created for testing purposes.</p>', 'representation': 'storage'}}}}}}
126
+ """
127
+
128
+
129
+ def get_response_for_confluence_tool_create(confluence_type: str) -> str:
130
+ return f"""
131
+ Successfully created a new page in Confluence.
132
+ The page has been created with the following details:
133
+ - Title: Test Page Created by Automation
134
+ - Space: {CONFLUENCE_SPACE_KEYS[confluence_type]}
135
+ - Content: This is a test page created for testing purposes.
136
+ """
@@ -2,14 +2,18 @@ import pytest
2
2
 
3
3
  from codemie_test_harness.tests.enums.tools import ProjectManagementTool
4
4
  from codemie_test_harness.tests.test_data.pm_tools_test_data import (
5
- JIRA_TOOL_PROMPT,
6
- RESPONSE_FOR_JIRA_TOOL,
5
+ get_confluence_tool_create_prompt,
6
+ get_response_for_confluence_tool_create,
7
+ CONFLUENCE_CLOUD_TOOL_PROMPT,
8
+ RESPONSE_FOR_CONFLUENCE_CLOUD_TOOL,
7
9
  CONFLUENCE_TOOL_PROMPT,
8
10
  RESPONSE_FOR_CONFLUENCE_TOOL,
9
- RESPONSE_FOR_JIRA_CLOUD_TOOL,
11
+ get_jira_tool_create_prompt,
12
+ get_response_for_jira_tool_create,
13
+ JIRA_TOOL_PROMPT,
14
+ RESPONSE_FOR_JIRA_TOOL,
10
15
  JIRA_CLOUD_TOOL_PROMPT,
11
- CONFLUENCE_CLOUD_TOOL_PROMPT,
12
- RESPONSE_FOR_CONFLUENCE_CLOUD_TOOL,
16
+ RESPONSE_FOR_JIRA_CLOUD_TOOL,
13
17
  )
14
18
  from codemie_test_harness.tests.utils.constants import ProjectManagementIntegrationType
15
19
 
@@ -46,4 +50,36 @@ pm_tools_test_data = [
46
50
  marks=[pytest.mark.confluence, pytest.mark.confluence_cloud],
47
51
  id=ProjectManagementIntegrationType.CONFLUENCE_CLOUD,
48
52
  ),
53
+ pytest.param(
54
+ ProjectManagementTool.JIRA,
55
+ ProjectManagementIntegrationType.JIRA,
56
+ get_jira_tool_create_prompt("server"),
57
+ get_response_for_jira_tool_create("server"),
58
+ marks=[pytest.mark.jira],
59
+ id=f"{ProjectManagementIntegrationType.JIRA.value} - create",
60
+ ),
61
+ pytest.param(
62
+ ProjectManagementTool.JIRA,
63
+ ProjectManagementIntegrationType.JIRA_CLOUD,
64
+ get_jira_tool_create_prompt("cloud"),
65
+ get_response_for_jira_tool_create("cloud"),
66
+ marks=[pytest.mark.jira, pytest.mark.jira_cloud],
67
+ id=f"{ProjectManagementIntegrationType.JIRA_CLOUD.value} - create",
68
+ ),
69
+ pytest.param(
70
+ ProjectManagementTool.CONFLUENCE,
71
+ ProjectManagementIntegrationType.CONFLUENCE,
72
+ get_confluence_tool_create_prompt("server"),
73
+ get_response_for_confluence_tool_create("server"),
74
+ marks=[pytest.mark.confluence],
75
+ id=f"{ProjectManagementIntegrationType.CONFLUENCE.value} - create",
76
+ ),
77
+ pytest.param(
78
+ ProjectManagementTool.CONFLUENCE,
79
+ ProjectManagementIntegrationType.CONFLUENCE_CLOUD,
80
+ get_confluence_tool_create_prompt("cloud"),
81
+ get_response_for_confluence_tool_create("cloud"),
82
+ marks=[pytest.mark.confluence, pytest.mark.confluence_cloud],
83
+ id=f"{ProjectManagementIntegrationType.CONFLUENCE_CLOUD.value} - create",
84
+ ),
49
85
  ]
@@ -1,6 +1,5 @@
1
1
  import pytest
2
2
 
3
- from codemie_sdk.models.integration import CredentialTypes
4
3
  from codemie_test_harness.tests.enums.tools import VcsTool
5
4
  from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
6
5
 
@@ -40,9 +39,13 @@ GITLAB_TOOL_TASK = (
40
39
  f"Using gitlab tool get info about MR №7014 for repo with id '{GITLAB_PROJECT_ID}'"
41
40
  )
42
41
 
42
+ AZURE_DEVOPS_PROJECT = CredentialsManager.get_parameter("AZURE_DEVOPS_PROJECT_NAME")
43
+
44
+ AZURE_DEVOPS_GIT_TOOL_TASK = f"Using azuredevops tool get info about pull request №1 for project '{AZURE_DEVOPS_PROJECT} and repository '{AZURE_DEVOPS_PROJECT}'"
45
+
43
46
  RESPONSE_FOR_GITLAB = f"""
44
47
  Here is the information about Merge Request (MR) №7014 for the repository with id '{GITLAB_PROJECT_ID}':
45
-
48
+
46
49
  - **Title:** sdk_juhigsaqwkedvdy
47
50
  - **Description:** Merge the changes in branch `sdk_cgkbdhekvjiolpi` to the main branch, including the creation of `SdkYmsodrhepphxpyl.java` with 'Hello World'.
48
51
  - **State:** Closed
@@ -58,23 +61,52 @@ RESPONSE_FOR_GITLAB = f"""
58
61
  - **Author:** [Anton Yeromin](https://gitbud.epam.com/anton_yeromin)
59
62
  - **Labels:** created-by-agent
60
63
  - **Web URL:** [Link to MR](https://gitbud.epam.com/epm-cdme/autotests/codemie-test-project/-/merge_requests/7014)
61
-
64
+
62
65
  This MR does not have any assignees or reviewers and was closed by Anton Yeromin. There are no merge conflicts, and it's the author's first contribution to this project.
63
66
  """
64
67
 
68
+ RESPONSE_FOR_AZURE_DEVOPS_GIT = """
69
+ Here is the information about Pull Request #1 for the repository 'CodemieAnton':
70
+
71
+ - **Title:** Add random value to README
72
+ - **Description:** This PR adds a random value section to the README file. Please update the README manually on the develop branch before merging.
73
+ - **Status:** Active
74
+ - **Created By:** Anton Yeromin
75
+ - **Display Name:** Anton Yeromin
76
+ - **Email:** Anton_Yeromin@epam.com
77
+ - **Profile URL:** [Profile](https://spsprodneu1.vssps.visualstudio.com/Add1f60ac-c7d4-4a5f-b497-bdb733dc5847/_apis/Identities/7bfb0794-d7d6-6d0b-be18-a8c9cbedead2)
78
+ - **Avatar:** ![Avatar](https://dev.azure.com/AntonYeromin/_apis/GraphProfile/MemberAvatars/aad.N2JmYjA3OTQtZDdkNi03ZDBiLWJlMTgtYThjOWNiZWRlYWQy)
79
+ - **Creation Date:** 2025-10-20
80
+ - **Source Branch:** `refs/heads/develop`
81
+ - **Target Branch:** `refs/heads/main`
82
+ - **Merge Status:** Succeeded
83
+ - **Is Draft:** No
84
+ - **Comments:** Added README.md
85
+ - **Pull Request URL:** [Pull Request](https://dev.azure.com/AntonYeromin/9d40cdc1-5404-4d40-8025-e5267d69dc89/_apis/git/repositories/fb1015be-4aed-46f2-a41f-8b121a9568d1/pullRequests/1)
86
+
87
+ If you need more information, let me know!
88
+ """
89
+
65
90
  vcs_tools_test_data = [
66
91
  pytest.param(
67
92
  VcsTool.GITHUB,
68
93
  GITHUB_TOOL_TASK,
69
94
  RESPONSE_FOR_GITHUB,
70
95
  marks=pytest.mark.github,
71
- id=f"{CredentialTypes.GIT}_github",
96
+ id=VcsTool.GITHUB,
72
97
  ),
73
98
  pytest.param(
74
99
  VcsTool.GITLAB,
75
100
  GITLAB_TOOL_TASK,
76
101
  RESPONSE_FOR_GITLAB,
77
102
  marks=pytest.mark.gitlab,
78
- id=f"{CredentialTypes.GIT}_gitlab",
103
+ id=VcsTool.GITLAB,
104
+ ),
105
+ pytest.param(
106
+ VcsTool.AZURE_DEVOPS_GIT,
107
+ AZURE_DEVOPS_GIT_TOOL_TASK,
108
+ RESPONSE_FOR_AZURE_DEVOPS_GIT,
109
+ marks=pytest.mark.azure_devops_git,
110
+ id=VcsTool.AZURE_DEVOPS_GIT,
79
111
  ),
80
112
  ]
@@ -0,0 +1,128 @@
1
+ import logging
2
+
3
+ import requests
4
+
5
+ from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ CONFLUENCE_SPACE_KEYS = {"server": "EPMCDMETST", "cloud": "CODEMIE"}
10
+
11
+
12
+ class ConfluenceUtils:
13
+ """Utility class for interacting with Confluence API."""
14
+
15
+ def __init__(self, is_cloud: bool = False):
16
+ """
17
+ Initialize Confluence utilities with credentials from CredentialsManager.
18
+
19
+ Args:
20
+ is_cloud: Whether to use Confluence Cloud or Confluence Server credentials
21
+ """
22
+ self.is_cloud = is_cloud
23
+
24
+ if is_cloud:
25
+ self.confluence_url = CredentialsManager.get_parameter(
26
+ "CONFLUENCE_CLOUD_URL"
27
+ )
28
+ self.token = CredentialsManager.get_parameter("CONFLUENCE_CLOUD_TOKEN")
29
+ self.email = CredentialsManager.get_parameter("CONFLUENCE_CLOUD_EMAIL")
30
+ self.auth = (self.email, self.token)
31
+ self.headers = {
32
+ "Accept": "application/json",
33
+ "Content-Type": "application/json",
34
+ }
35
+ self.confluence_api = "/wiki/api/v2"
36
+ self.pages_endpoint = "/pages"
37
+ self.space_key = CONFLUENCE_SPACE_KEYS["cloud"]
38
+ else:
39
+ self.confluence_url = CredentialsManager.get_parameter("CONFLUENCE_URL")
40
+ self.token = CredentialsManager.get_parameter("CONFLUENCE_TOKEN")
41
+ self.email = None
42
+ self.auth = None
43
+ self.headers = {
44
+ "Authorization": f"Bearer {self.token}",
45
+ "Accept": "application/json",
46
+ "Content-Type": "application/json",
47
+ }
48
+ self.confluence_api = "/rest/api"
49
+ self.pages_endpoint = "/content"
50
+ self.space_key = CONFLUENCE_SPACE_KEYS["server"]
51
+
52
+ def delete_confluence_page(self, page_id: str):
53
+ """
54
+ Delete a Confluence page via Confluence API.
55
+
56
+ Args:
57
+ page_id: The Confluence page ID
58
+ """
59
+ # Construct API endpoint
60
+ endpoint = (
61
+ f"{self.confluence_url}{self.confluence_api}{self.pages_endpoint}/{page_id}"
62
+ )
63
+
64
+ try:
65
+ logger.info(f"Deleting Confluence page: {page_id}")
66
+ requests.delete(
67
+ url=endpoint,
68
+ headers=self.headers,
69
+ auth=self.auth,
70
+ verify=True,
71
+ )
72
+ except requests.exceptions.RequestException as e:
73
+ logger.error(f"Error deleting Confluence page {page_id}: {str(e)}")
74
+
75
+ def cleanup_confluence_space(self, title_prefix: str, space_key: str = None):
76
+ """
77
+ Clean up Confluence pages in a space with title starting with specified prefix.
78
+
79
+ Args:
80
+ title_prefix: The prefix to filter pages by title (e.g., autotest_entity_prefix)
81
+ space_key: The Confluence space key (e.g., 'TEST')
82
+ """
83
+ space_key = self.space_key if not space_key else space_key
84
+
85
+ try:
86
+ # Search for pages in the space
87
+ search_endpoint = (
88
+ f"{self.confluence_url}{self.confluence_api}{self.pages_endpoint}"
89
+ )
90
+ params = {
91
+ "spaceKey": space_key,
92
+ "type": "page",
93
+ "limit": 100,
94
+ }
95
+
96
+ logger.info(
97
+ f"Searching for Confluence pages in space {space_key} with title starting with '{title_prefix}'"
98
+ )
99
+ response = requests.get(
100
+ url=search_endpoint,
101
+ headers=self.headers,
102
+ auth=self.auth,
103
+ params=params,
104
+ verify=True,
105
+ )
106
+
107
+ if response.status_code == 200:
108
+ all_pages = response.json().get("results", [])
109
+
110
+ # Filter pages by title prefix
111
+ pages_to_delete = [
112
+ page
113
+ for page in all_pages
114
+ if page.get("title", "").startswith(title_prefix)
115
+ ]
116
+
117
+ # Delete each page
118
+ for page in pages_to_delete:
119
+ self.delete_confluence_page(page["id"])
120
+ else:
121
+ logger.error(
122
+ f"Failed to search for pages. Status: {response.status_code}, Response: {response.text}"
123
+ )
124
+
125
+ except requests.exceptions.RequestException as e:
126
+ logger.error(
127
+ f"Error during Confluence cleanup for space {space_key}: {str(e)}"
128
+ )
@@ -22,6 +22,7 @@ WORK_ITEM_ID_PATTERN = r"workItems/(\d+)"
22
22
  vcs_integrations = {
23
23
  VcsTool.GITHUB: "github_integration",
24
24
  VcsTool.GITLAB: "gitlab_integration",
25
+ VcsTool.AZURE_DEVOPS_GIT: "ado_integration",
25
26
  }
26
27
 
27
28
  project_management_integrations = {
@@ -0,0 +1,128 @@
1
+ import logging
2
+
3
+ import requests
4
+
5
+ from codemie_test_harness.tests.utils.credentials_manager import CredentialsManager
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ JIRA_PROJECT_KEYS = {"server": "EPMCDMETST", "cloud": "SCRUM"}
10
+
11
+
12
+ class JiraUtils:
13
+ """Utility class for interacting with Jira API."""
14
+
15
+ def __init__(self, is_cloud: bool = False):
16
+ """
17
+ Initialize Jira utilities with credentials from CredentialsManager.
18
+
19
+ Args:
20
+ is_cloud: Whether to use Jira Cloud or Jira Server credentials
21
+ """
22
+ self.is_cloud = is_cloud
23
+
24
+ if is_cloud:
25
+ self.jira_url = CredentialsManager.get_parameter("JIRA_CLOUD_URL")
26
+ self.token = CredentialsManager.get_parameter("JIRA_CLOUD_TOKEN")
27
+ self.email = CredentialsManager.get_parameter("JIRA_CLOUD_EMAIL")
28
+ self.auth = (self.email, self.token)
29
+ self.headers = {
30
+ "Accept": "application/json",
31
+ "Content-Type": "application/json",
32
+ }
33
+ self.jira_api = "/rest/api/3"
34
+ self.search_endpoint = "/search/jql"
35
+ self.project_key = JIRA_PROJECT_KEYS["cloud"]
36
+ else:
37
+ self.jira_url = CredentialsManager.get_parameter("JIRA_URL")
38
+ self.token = CredentialsManager.get_parameter("JIRA_TOKEN")
39
+ self.email = None
40
+ self.auth = None
41
+ self.headers = {
42
+ "Authorization": f"Bearer {self.token}",
43
+ "Accept": "application/json",
44
+ "Content-Type": "application/json",
45
+ }
46
+ self.jira_api = "/rest/api/2"
47
+ self.search_endpoint = "/search"
48
+ self.project_key = JIRA_PROJECT_KEYS["server"]
49
+
50
+ def delete_jira_item(self, issue_key: str):
51
+ """
52
+ Delete a Jira issue via Jira API.
53
+
54
+ Args:
55
+ issue_key: The Jira issue key (e.g., 'PROJ-123')
56
+ """
57
+ # Construct API endpoint
58
+ endpoint = f"{self.jira_url}{self.jira_api}/issue/{issue_key}"
59
+
60
+ try:
61
+ logger.info(f"Deleting Jira issue: {issue_key}")
62
+ requests.delete(
63
+ url=endpoint,
64
+ headers=self.headers,
65
+ auth=self.auth,
66
+ verify=True,
67
+ )
68
+ except requests.exceptions.RequestException as e:
69
+ logger.error(f"Error deleting Jira issue {issue_key}: {str(e)}")
70
+
71
+ def cleanup_jira_project(self, summary_prefix: str, project_key: str = None):
72
+ """
73
+ Clean up Jira issues in a project with summary starting with specified prefix.
74
+
75
+ Args:
76
+ project_key: The Jira project key (e.g., 'EPMCDMETST')
77
+ summary_prefix: The prefix to filter issues by summary (e.g., autotest_entity_prefix)
78
+ """
79
+ # Construct JQL query to find all issues in the project
80
+ # We'll filter by summary prefix in Python since JQL text search has limitations
81
+ project_key = self.project_key if not project_key else project_key
82
+
83
+ jql = f'project = "{project_key}"'
84
+
85
+ try:
86
+ # Search for issues matching the JQL
87
+ search_endpoint = f"{self.jira_url}{self.jira_api}{self.search_endpoint}"
88
+ params = {
89
+ "jql": jql,
90
+ "maxResults": 100,
91
+ "fields": "key,summary",
92
+ }
93
+
94
+ logger.info(
95
+ f"Searching for Jira issues in project {project_key} with summary starting with '{summary_prefix}'"
96
+ )
97
+ response = requests.get(
98
+ url=search_endpoint,
99
+ headers=self.headers,
100
+ auth=self.auth,
101
+ params=params,
102
+ verify=True,
103
+ )
104
+
105
+ if response.status_code == 200:
106
+ all_issues = response.json().get("issues", [])
107
+
108
+ # Filter issues by summary prefix in Python
109
+ issues_to_delete = [
110
+ issue
111
+ for issue in all_issues
112
+ if issue.get("fields", {})
113
+ .get("summary", "")
114
+ .startswith(summary_prefix)
115
+ ]
116
+
117
+ # Delete each issue
118
+ for issue in issues_to_delete:
119
+ self.delete_jira_item(issue["key"])
120
+ else:
121
+ logger.error(
122
+ f"Failed to search for issues. Status: {response.status_code}, Response: {response.text}"
123
+ )
124
+
125
+ except requests.exceptions.RequestException as e:
126
+ logger.error(
127
+ f"Error during Jira cleanup for project {project_key}: {str(e)}"
128
+ )
@@ -6,7 +6,7 @@ from typing import Optional, Dict, Any
6
6
  import requests
7
7
  from codemie_sdk import CodeMieClient
8
8
 
9
- from codemie_test_harness.tests import autotest_entity_prefix
9
+ from codemie_test_harness.tests import autotest_entity_prefix, VERIFY_SSL, API_DOMEN
10
10
  from codemie_test_harness.tests.utils.base_utils import (
11
11
  BaseUtils,
12
12
  get_random_name,
@@ -21,11 +21,9 @@ providers_endpoint = "/v1/providers"
21
21
  class ProviderUtils(BaseUtils):
22
22
  def __init__(self, client: CodeMieClient):
23
23
  """Initialize the provides service."""
24
- api_domain = os.getenv("CODEMIE_API_DOMAIN")
25
- verify_ssl = os.getenv("VERIFY_SSL", "").lower() == "true"
26
24
 
27
25
  super().__init__(client)
28
- self._api = RequestHandler(api_domain, self.client.token, verify_ssl)
26
+ self._api = RequestHandler(API_DOMEN, self.client.token, VERIFY_SSL)
29
27
 
30
28
  @staticmethod
31
29
  def provider_request_json():
@@ -8,7 +8,7 @@ from codemie_sdk.models.workflow import (
8
8
  WorkflowMode,
9
9
  )
10
10
 
11
- from codemie_test_harness.tests import PROJECT
11
+ from codemie_test_harness.tests import PROJECT, VERIFY_SSL, API_DOMEN
12
12
  from codemie_test_harness.tests.utils.base_utils import (
13
13
  BaseUtils,
14
14
  get_random_name,
@@ -41,10 +41,8 @@ class WorkflowUtils(BaseUtils):
41
41
  Returns:
42
42
  Raw response from '/v1/workflows' endpoint
43
43
  """
44
- api_domain = os.getenv("CODEMIE_API_DOMAIN")
45
- verify_ssl = os.getenv("VERIFY_SSL", "").lower() == "true"
46
44
 
47
- request_handler = RequestHandler(api_domain, self.client.token, verify_ssl)
45
+ request_handler = RequestHandler(API_DOMEN, self.client.token, VERIFY_SSL)
48
46
 
49
47
  return request_handler.post(
50
48
  workflow_endpoint, dict, json_data=request.model_dump()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: codemie-test-harness
3
- Version: 0.1.211
3
+ Version: 0.1.213
4
4
  Summary: Autotest for CodeMie backend and UI
5
5
  Author: Anton Yeromin
6
6
  Author-email: anton_yeromin@epam.com
@@ -13,7 +13,7 @@ Requires-Dist: aws-assume-role-lib (>=2.10.0,<3.0.0)
13
13
  Requires-Dist: boto3 (>=1.39.8,<2.0.0)
14
14
  Requires-Dist: click (>=8.1.7,<9.0.0)
15
15
  Requires-Dist: codemie-plugins (>=0.1.123,<0.2.0)
16
- Requires-Dist: codemie-sdk-python (==0.1.211)
16
+ Requires-Dist: codemie-sdk-python (==0.1.213)
17
17
  Requires-Dist: pytest (>=8.4.1,<9.0.0)
18
18
  Requires-Dist: pytest-playwright (>=0.7.0,<0.8.0)
19
19
  Requires-Dist: pytest-repeat (>=0.9.3,<0.10.0)
@@ -13,7 +13,7 @@ codemie_test_harness/cli/marks_utils.py,sha256=CGAIMWO7EqApYTl3qMxBkREjA3yOQOQGj
13
13
  codemie_test_harness/cli/runner.py,sha256=ZQNKwD98SWcSXOXeVtK39q-cdPWnFLwwUHPDua-4s5w,3954
14
14
  codemie_test_harness/cli/utils.py,sha256=1X7XPcYAgeH1BpwKo4sOk1VpYdxda15usi9U9_dv7BY,1557
15
15
  codemie_test_harness/pytest.ini,sha256=U5XqIpaeJ7OQE7yYBVqoM63bA2F8N1Hr-hIe5lARwz0,262
16
- codemie_test_harness/tests/__init__.py,sha256=CX5mbH_1RzwetK14moYQ0KCoUBPQMGkI14Fg8tAUJ0A,782
16
+ codemie_test_harness/tests/__init__.py,sha256=Uo-PZEmqrJrxy0HzKaVW83Q6BE7btKKUhuXIeO1Fv8E,889
17
17
  codemie_test_harness/tests/assistant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  codemie_test_harness/tests/assistant/datasource/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  codemie_test_harness/tests/assistant/datasource/test_code_datasource.py,sha256=NoEduPw86Y2TocvU-6_hHNDDQZUDWP-aT_6i89rKFEE,3140
@@ -55,7 +55,7 @@ codemie_test_harness/tests/assistant/tools/plugin/test_assistant_with_developmen
55
55
  codemie_test_harness/tests/assistant/tools/plugin/test_assistant_with_plugin_and_mcp_servers.py,sha256=YjKlVactCaPZhRXLu3GQXrPPgVHkUrbTgwhNbz-OP84,2239
56
56
  codemie_test_harness/tests/assistant/tools/plugin/test_single_assistant_dual_time_plugins.py,sha256=6CmNPIaFXpJdvCmV1xu48v8mXWxL0O83ecQYthENvPE,5386
57
57
  codemie_test_harness/tests/assistant/tools/project_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- codemie_test_harness/tests/assistant/tools/project_management/test_assistant_pm_tools.py,sha256=uO51ff-GXbPE_fSvTGOeaMSfEXXDLSmFbCjjwl6KpGU,6022
58
+ codemie_test_harness/tests/assistant/tools/project_management/test_assistant_pm_tools.py,sha256=gmoNr2XEZA2hgKtlnY9ULZnQW_rId9v6O5dvZdKokjk,6024
59
59
  codemie_test_harness/tests/assistant/tools/report_portal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  codemie_test_harness/tests/assistant/tools/report_portal/test_assistant_report_portal_tools.py,sha256=bGv3MS7hV3yX5S3QwaeoWkA273QCOKYAew7M4BhDUso,969
61
61
  codemie_test_harness/tests/assistant/tools/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -63,8 +63,8 @@ codemie_test_harness/tests/assistant/tools/research/test_assistant_research_tool
63
63
  codemie_test_harness/tests/assistant/tools/servicenow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  codemie_test_harness/tests/assistant/tools/servicenow/test_servicenow_tools.py,sha256=aUjfZ4773WoQJjcHx3JqH5e8ckaKB-aIMO-OZWTm0Ek,888
65
65
  codemie_test_harness/tests/assistant/tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
- codemie_test_harness/tests/assistant/tools/vcs/test_assistant_with_vcs_tools.py,sha256=c9cZXxMo0YFVJLWdYt23Awy2PqTnNxp0uLLCgk8k2iQ,1143
67
- codemie_test_harness/tests/conftest.py,sha256=0VlSE9bKnArjEQ0_OEB2NFxDOWsnWHy-MK5ftHuAaSo,31936
66
+ codemie_test_harness/tests/assistant/tools/vcs/test_assistant_with_vcs_tools.py,sha256=qOPr4XOh2rgUV2MXMxkRzRGkAKl9ViwQGCZ-dMEtscU,1145
67
+ codemie_test_harness/tests/conftest.py,sha256=zSOjH7Pak73BtntTPNBdBS488xJag28jNsJRzTOvh5E,32640
68
68
  codemie_test_harness/tests/conversations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  codemie_test_harness/tests/conversations/test_conversations_endpoints.py,sha256=HQ2nu9lXfRNkyJhA0rzar7Rmv6pMe-te0rFYAy-X5UA,4128
70
70
  codemie_test_harness/tests/e2e/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -102,7 +102,7 @@ codemie_test_harness/tests/service/test_user_service.py,sha256=NqSsxOLTGg7p7juHL
102
102
  codemie_test_harness/tests/service/test_workflow_execution_service.py,sha256=pHV7WXvQKzpw0wMn6aHVZ01g7yZupmU5NXLVE9rIKjo,5419
103
103
  codemie_test_harness/tests/service/test_workflow_service.py,sha256=QyxtorhaCI1oE2D1OLx7X7jAlBv0kwwFpQztvV1nUus,8152
104
104
  codemie_test_harness/tests/swagger/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- codemie_test_harness/tests/swagger/test_swagger_endpoint.py,sha256=rMfZD1HfCkZqxXKzeIH8MTAIMp8qkhAb2-UHrrt_Gn4,3244
105
+ codemie_test_harness/tests/swagger/test_swagger_endpoint.py,sha256=Vk9d6-Vj5NBrUjEwKJfs50k6OwQg7La74z_uFyJG29g,3316
106
106
  codemie_test_harness/tests/test_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  codemie_test_harness/tests/test_data/ado_test_plan_tools_test_data.py,sha256=Al5u4HNfrcoj-b072uEGsqUqjKqwXLGJXKQ0QeJT3PI,5778
108
108
  codemie_test_harness/tests/test_data/ado_wiki_tools_test_data.py,sha256=xvgEja5vE0l41sP4fE0stdFLQ0M201FWynOCEcRYufE,3188
@@ -161,12 +161,12 @@ codemie_test_harness/tests/test_data/open_api_tools_test_data.py,sha256=mvf0legy
161
161
  codemie_test_harness/tests/test_data/openapi.json,sha256=X4uqtfjpTUuMifefQRf8mHI1k8pspp8-L0rpJlhLOI4,10459
162
162
  codemie_test_harness/tests/test_data/output_schema_test_data.py,sha256=4l7AvXbMl9hIvoFxu1LPPSGz9hb5Uz2_is4zTm77ARY,261
163
163
  codemie_test_harness/tests/test_data/plugin_tools_test_data.py,sha256=bVamztyQ4bAVo1CRSrtu6f5H-gkjhAN2nq5Jbc0erqM,4168
164
- codemie_test_harness/tests/test_data/pm_tools_test_data.py,sha256=ctPwLSJYy7xPg4B-uwAAhRwIogdxTgBn-PPY2rN0llc,3248
165
- codemie_test_harness/tests/test_data/project_management_test_data.py,sha256=oBOh18LbXKntdsifoktc-d-3M7Kyl8j0q7qumdHuTYU,1692
164
+ codemie_test_harness/tests/test_data/pm_tools_test_data.py,sha256=SnXG0knX7uMb-jMvbmE1OObzYQZQSCDQtD0tL2XTvIo,5256
165
+ codemie_test_harness/tests/test_data/project_management_test_data.py,sha256=2RWzrJmdlrOuJQKcmlWOfYz2daw_Oc2RkDU5XyM-w6U,3242
166
166
  codemie_test_harness/tests/test_data/report_portal_tools_test_data.py,sha256=YZdmfEwrwOdCduNxs768LOB8OHfL8sfNI-R2k-koKTk,14555
167
167
  codemie_test_harness/tests/test_data/research_tools_test_data.py,sha256=zwpzm-VSnrLZEfG97AE9Ms7z7j3xmqxiNd1EmZyWCSk,9102
168
168
  codemie_test_harness/tests/test_data/servicenow_tools_test_data.py,sha256=PKw9zEYSNcQM1KApCSjsBiA_3Py0bNQI7clqw8cmT-s,1983
169
- codemie_test_harness/tests/test_data/vcs_tools_test_data.py,sha256=pnnMjmlCEECSqznA4-6G5_spJ9v7-n-jpLCDTfLq8Zk,2850
169
+ codemie_test_harness/tests/test_data/vcs_tools_test_data.py,sha256=ZJdday96uOKOy_kPRBPp0w9JZbf0il7Y_hPfwRmUkuM,4518
170
170
  codemie_test_harness/tests/test_data/workflow/invalid_config/invalid_assistant_id.yaml,sha256=_cioQNq3icemob9u0i-hXkTy2nflzyP0Ce8FWiPG14M,265
171
171
  codemie_test_harness/tests/test_data/workflow/invalid_config/invalid_assistant_in_state.yaml,sha256=t_W95zD5bfdGf3F6p64-2qBHz7SkL_7mFT675uieWZg,209
172
172
  codemie_test_harness/tests/test_data/workflow/invalid_config/invalid_data_source.yaml,sha256=Vwx3HyrQkL8sWNtfwL6d0qiJhru6X3ojKBASAzJeY9w,252
@@ -271,7 +271,8 @@ codemie_test_harness/tests/utils/assistant_utils.py,sha256=2s1MikCfIcM3Ulkcuwaed
271
271
  codemie_test_harness/tests/utils/aws_parameters_store.py,sha256=YAVpvwElkKZJZvzSVxtOue1Gjs-kvSBS2y5QvIlz484,3267
272
272
  codemie_test_harness/tests/utils/base_utils.py,sha256=SJV-m8KuC6MAU4W5a1sWLz6Nw-1-buc0f-W1hbA1OIY,8270
273
273
  codemie_test_harness/tests/utils/client_factory.py,sha256=xGta0ZaVYzWfwJ4cu3f89KkGc_R5Bq-9lqnhr57x_2w,972
274
- codemie_test_harness/tests/utils/constants.py,sha256=ZNyM5wERHFN-c8TCvBcxCdFf0As9TOpr22YvLCMHArE,1116
274
+ codemie_test_harness/tests/utils/confluence_utils.py,sha256=auhip1ntqSDsHWAoWCxQxfuNv05BinS6TWXyg_F2dfc,4544
275
+ codemie_test_harness/tests/utils/constants.py,sha256=aGs0gdHB38Ozd-UyCKNpWRoQXMy3D0bjmfxiPcdZdqY,1165
275
276
  codemie_test_harness/tests/utils/conversation_utils.py,sha256=SWj6TBWOQoX5Yh6Wk63yHQFveRXgK1mpLb3PUKAa57A,648
276
277
  codemie_test_harness/tests/utils/credentials_manager.py,sha256=xF7fjQbT4b1rPrOOQfo3ie5c06FLjUzppvTaJDVOg2s,55252
277
278
  codemie_test_harness/tests/utils/datasource_utils.py,sha256=7I37BBD-ySvH9u-y9wjposohqXZG8ksx2CGvbsHK3WY,12707
@@ -281,17 +282,18 @@ codemie_test_harness/tests/utils/file_utils.py,sha256=hY-kwnyzvtd1BQif8r5NhvRTGf
281
282
  codemie_test_harness/tests/utils/gitbud_utils.py,sha256=-2nHX79FHLwoLN9crbTO4Q9scLXNmNgkw8N1_JUTqys,7972
282
283
  codemie_test_harness/tests/utils/http_utils.py,sha256=wjhttibzzNhleKzWgWC01Q0Y5sV9scu-Ski-qgJPd-Q,4179
283
284
  codemie_test_harness/tests/utils/integration_utils.py,sha256=FN9OORtIahATyjzfvwVmJ96mX0BTjk_xDPTQYBLS_8E,4417
285
+ codemie_test_harness/tests/utils/jira_utils.py,sha256=-n8Kqi7HZstRgrP4KClbijGbHpGMqgvoaYcN1CnHx8c,4635
284
286
  codemie_test_harness/tests/utils/json_utils.py,sha256=PWO4Ixxgta_zkdq-8umcP9qwDSi9JFxMuaT2NW3v1eI,226
285
287
  codemie_test_harness/tests/utils/llm_utils.py,sha256=JPAlMYh-wQH4any5HWdpQOejCbhjqJCsztRU_fUq-SU,257
286
288
  codemie_test_harness/tests/utils/logger_util.py,sha256=6Kca4pLxyTYnUgm2i3j19DdZSH6XUSGXPjHtExx33QU,828
287
289
  codemie_test_harness/tests/utils/notification_utils.py,sha256=WyrO8Udp4O8-C4eI6wRd5Pph9C8VmCXw9_R4rbMslxo,3434
288
- codemie_test_harness/tests/utils/provider_utils.py,sha256=hBgJubdBlqFFMzn-Xlorm3UvjzQ92ELyTN5tLyaSFk0,5213
290
+ codemie_test_harness/tests/utils/provider_utils.py,sha256=NSI5vG1IPpzsytuwQAGbx9Fe0xN6OYQ9Gp9mvjO0H2g,5115
289
291
  codemie_test_harness/tests/utils/pytest_utils.py,sha256=k-mEjX2qpnh37sqKpJqYhZT6BV9974y_KaAhv8Xj9GI,284
290
292
  codemie_test_harness/tests/utils/search_utils.py,sha256=SrXiB2d9wiI5ka9bgg0CD73GOX_1mqi2Hz5FBm5DsEU,1435
291
293
  codemie_test_harness/tests/utils/similarity_check.py,sha256=1U66NGh6esISKABodtVobE2WnuFt0f6vcK3qUri6ZqU,1485
292
294
  codemie_test_harness/tests/utils/user_utils.py,sha256=zJNrmL3Fb7iGuaVRobUMwJ2Og6NqEPcM_9lw60m18T8,242
293
295
  codemie_test_harness/tests/utils/webhook_utils.py,sha256=YjyLwAqQjR12vYFOUmYhJCJIyZvKm4SvU-1oIjIYNqg,340
294
- codemie_test_harness/tests/utils/workflow_utils.py,sha256=Kz4F4Xzdx42PNmye--ENpjSakdB1Y-QL_nwSfKhMAXE,9359
296
+ codemie_test_harness/tests/utils/workflow_utils.py,sha256=d0dT5ciaLCDrRPZ-uwgGvWBhOdDExebH_h_Q3oJ4KOY,9261
295
297
  codemie_test_harness/tests/utils/yaml_utils.py,sha256=y9fUf4u4G4SoCktPOwaC5x71iaDKhktbz_XUfI9kNis,1661
296
298
  codemie_test_harness/tests/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
297
299
  codemie_test_harness/tests/webhook/test_webhook_service.py,sha256=POmxQG0tpcNW9-yKQ62CcnQpUEFYlTOs0_4H9MijIHY,8127
@@ -400,7 +402,7 @@ codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/__init__.
400
402
  codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/test_workflow_with_servicenow_tools.py,sha256=D835gaRbCnB4va5mi9TdA_u9StSpGXQ_fgzwW0S2pwo,1173
401
403
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
402
404
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/test_workflow_with_vcs_tools.py,sha256=Se9imIiBYuJU78m1pLu0g4ZmHygKZjr6JjIWkGXTy1Q,1364
403
- codemie_test_harness-0.1.211.dist-info/METADATA,sha256=HAFx4njhGCCXfknG4cRAoLXYDUzcdyWB2r8kfpA2hdQ,27184
404
- codemie_test_harness-0.1.211.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
405
- codemie_test_harness-0.1.211.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
406
- codemie_test_harness-0.1.211.dist-info/RECORD,,
405
+ codemie_test_harness-0.1.213.dist-info/METADATA,sha256=yFQaB6HKgMkLqmiIDGbo0-wu4bwEWhyGznZEIxz7FiI,27184
406
+ codemie_test_harness-0.1.213.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
407
+ codemie_test_harness-0.1.213.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
408
+ codemie_test_harness-0.1.213.dist-info/RECORD,,