codemie-test-harness 0.1.146__py3-none-any.whl → 0.1.148__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.

Files changed (22) hide show
  1. codemie_test_harness/tests/assistant/tools/access_management/__init__.py +0 -0
  2. codemie_test_harness/tests/assistant/tools/access_management/test_keycloak_tool.py +25 -0
  3. codemie_test_harness/tests/conftest.py +18 -7
  4. codemie_test_harness/tests/enums/tools.py +7 -0
  5. codemie_test_harness/tests/integrations/project/test_default_integrations.py +37 -0
  6. codemie_test_harness/tests/integrations/project/test_project_integrations.py +3 -0
  7. codemie_test_harness/tests/integrations/user/test_default_integrations.py +37 -0
  8. codemie_test_harness/tests/integrations/user/test_user_integrations.py +3 -0
  9. codemie_test_harness/tests/test_data/direct_tools/keycloak_tool_test_data.py +120 -0
  10. codemie_test_harness/tests/test_data/integrations_test_data.py +4 -0
  11. codemie_test_harness/tests/test_data/keycloak_tool_test_data.py +35 -0
  12. codemie_test_harness/tests/utils/aws_parameters_store.py +28 -0
  13. codemie_test_harness/tests/utils/env_utils.py +125 -0
  14. codemie_test_harness/tests/workflow/assistant_tools/access_management/__init__.py +0 -0
  15. codemie_test_harness/tests/workflow/assistant_tools/access_management/test_workflow_with_assistant_with_keycloak_tool.py +28 -0
  16. codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_access_management_tool.py +74 -0
  17. codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/__init__.py +0 -0
  18. codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/test_workflow_with_keycloak_tool.py +29 -0
  19. {codemie_test_harness-0.1.146.dist-info → codemie_test_harness-0.1.148.dist-info}/METADATA +2 -2
  20. {codemie_test_harness-0.1.146.dist-info → codemie_test_harness-0.1.148.dist-info}/RECORD +22 -12
  21. {codemie_test_harness-0.1.146.dist-info → codemie_test_harness-0.1.148.dist-info}/WHEEL +0 -0
  22. {codemie_test_harness-0.1.146.dist-info → codemie_test_harness-0.1.148.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,25 @@
1
+ import pytest
2
+
3
+ from codemie_test_harness.tests.enums.tools import Toolkit, AccessManagementTool
4
+ from codemie_test_harness.tests.test_data.keycloak_tool_test_data import (
5
+ KEYCLOAK_TOOL_PROMPT,
6
+ KEYCLOAK_TOOL_RESPONSE,
7
+ )
8
+
9
+
10
+ @pytest.mark.regression
11
+ def test_assistant_with_keycloak_tool(
12
+ assistant_utils,
13
+ assistant,
14
+ keycloak_integration,
15
+ similarity_check,
16
+ ):
17
+ keycloak_assistant = assistant(
18
+ Toolkit.ACCESS_MANAGEMENT,
19
+ AccessManagementTool.KEYCLOAK,
20
+ settings=keycloak_integration,
21
+ )
22
+
23
+ response = assistant_utils.ask_assistant(keycloak_assistant, KEYCLOAK_TOOL_PROMPT)
24
+
25
+ similarity_check.check_similarity(response, KEYCLOAK_TOOL_RESPONSE)
@@ -64,13 +64,15 @@ def pytest_configure(config):
64
64
  """
65
65
  from codemie_test_harness.cli.runner import resolve_tests_path_and_root
66
66
  from codemie_test_harness.tests.utils.aws_parameters_store import AwsParameterStore
67
+ from codemie_test_harness.tests.utils.env_utils import EnvManager
67
68
 
68
69
  # Resolve the root directory and .env file path
69
70
  _, root_dir = resolve_tests_path_and_root()
70
71
  env_file_path = Path(root_dir) / ".env"
71
72
 
72
73
  # Load initial .env file
73
- load_dotenv(env_file_path)
74
+ if env_file_path.exists():
75
+ load_dotenv(env_file_path)
74
76
 
75
77
  # Check if AWS credentials are available for parameter store
76
78
  if os.getenv("AWS_ACCESS_KEY") and os.getenv("AWS_SECRET_KEY"):
@@ -85,12 +87,10 @@ def pytest_configure(config):
85
87
  f"/codemie/autotests/dotenv/{os.getenv('ENV')}"
86
88
  )
87
89
 
88
- # Write the AWS parameters to .env file
89
- with open(env_file_path, "w") as file:
90
- file.write(dotenv)
91
-
92
- # Reload .env file with AWS parameters
93
- load_dotenv(env_file_path)
90
+ # Safely update .env file with new content
91
+ EnvManager.update_env_file_safely(
92
+ env_file_path=env_file_path, new_content=dotenv, clear_old_vars=True
93
+ )
94
94
 
95
95
 
96
96
  def pytest_unconfigure(config):
@@ -379,6 +379,17 @@ def service_now_integration(integration_utils):
379
379
  integration_utils.delete_integration(integration)
380
380
 
381
381
 
382
+ @pytest.fixture(scope="module")
383
+ def keycloak_integration(integration_utils):
384
+ credential_values = CredentialsUtil.keycloak_credentials()
385
+ integration = integration_utils.create_integration(
386
+ CredentialTypes.KEYCLOAK, credential_values
387
+ )
388
+ yield integration
389
+ if integration:
390
+ integration_utils.delete_integration(integration)
391
+
392
+
382
393
  @pytest.fixture(scope="function")
383
394
  def general_integration(integration_utils):
384
395
  created_integration: Optional[Integration] = None
@@ -19,6 +19,7 @@ class Toolkit(str, Enum):
19
19
  OPEN_API = "OpenAPI"
20
20
  DATA_MANAGEMENT = "Data Management"
21
21
  SERVICENOW = "IT Service Management"
22
+ ACCESS_MANAGEMENT = "Access Management"
22
23
 
23
24
 
24
25
  class GitTool(str, Enum):
@@ -178,3 +179,9 @@ class ServiceNowTool(str, Enum):
178
179
  """Enum for ServiceNow tool names."""
179
180
 
180
181
  SERVICE_NOW = "servicenow_table_tool"
182
+
183
+
184
+ class AccessManagementTool(str, Enum):
185
+ """Enum for Access Management tool names."""
186
+
187
+ KEYCLOAK = "keycloak"
@@ -12,6 +12,7 @@ from codemie_test_harness.tests.enums.tools import (
12
12
  ProjectManagementTool,
13
13
  CodeBaseTool,
14
14
  CloudTool,
15
+ AccessManagementTool,
15
16
  )
16
17
  from codemie_test_harness.tests.test_data.ado_test_plan_tools_test_data import (
17
18
  ado_test_plan_get_test_data,
@@ -23,6 +24,10 @@ from codemie_test_harness.tests.test_data.codebase_tools_test_data import (
23
24
  from codemie_test_harness.tests.test_data.git_tools_test_data import (
24
25
  list_branches_set_active_branch_test_data,
25
26
  )
27
+ from codemie_test_harness.tests.test_data.keycloak_tool_test_data import (
28
+ KEYCLOAK_TOOL_PROMPT,
29
+ KEYCLOAK_TOOL_RESPONSE,
30
+ )
26
31
  from codemie_test_harness.tests.test_data.notification_tools_test_data import (
27
32
  EMAIL_TOOL_PROMPT,
28
33
  EMAIL_RESPONSE,
@@ -270,3 +275,35 @@ def test_assistant_with_default_integration_email(
270
275
  response = assistant_utils.ask_assistant(email_assistant, EMAIL_TOOL_PROMPT)
271
276
 
272
277
  similarity_check.check_similarity(response, EMAIL_RESPONSE)
278
+
279
+
280
+ @pytest.mark.regression
281
+ def test_assistant_with_default_integration_keycloak(
282
+ general_integration,
283
+ integration_utils,
284
+ assistant,
285
+ assistant_utils,
286
+ similarity_check,
287
+ ):
288
+ # delete existing integrations of the same type
289
+ for integration_type in IntegrationType:
290
+ integration_utils.delete_integrations_by_type(
291
+ integration_type, CredentialTypes.KEYCLOAK, test_project_name
292
+ )
293
+ # create a new integration
294
+ general_integration(
295
+ integration_type=IntegrationType.PROJECT,
296
+ credential_type=CredentialTypes.KEYCLOAK,
297
+ credential_values=CredentialsUtil.keycloak_credentials(),
298
+ project_name=test_project_name,
299
+ )
300
+ # create an assistant
301
+ keycloak_assistant = assistant(
302
+ Toolkit.ACCESS_MANAGEMENT,
303
+ AccessManagementTool.KEYCLOAK,
304
+ project_name=test_project_name,
305
+ )
306
+
307
+ response = assistant_utils.ask_assistant(keycloak_assistant, KEYCLOAK_TOOL_PROMPT)
308
+
309
+ similarity_check.check_similarity(response, KEYCLOAK_TOOL_RESPONSE)
@@ -46,6 +46,7 @@ from codemie_test_harness.tests.utils.base_utils import (
46
46
  f"Project integration: {CredentialTypes.TELEGRAM}",
47
47
  f"Project integration: {CredentialTypes.SERVICE_NOW}",
48
48
  f"Project integration: {CredentialTypes.KUBERNETES}",
49
+ f"Project integration: {CredentialTypes.KEYCLOAK}",
49
50
  ],
50
51
  )
51
52
  @pytest.mark.regression
@@ -148,6 +149,7 @@ def test_integration_after_creation(
148
149
  f"Project integration: {CredentialTypes.TELEGRAM}",
149
150
  f"Project integration: {CredentialTypes.SERVICE_NOW}",
150
151
  f"Project integration: {CredentialTypes.KUBERNETES}",
152
+ f"Project integration: {CredentialTypes.KEYCLOAK}",
151
153
  ],
152
154
  )
153
155
  @pytest.mark.tescase("EPMCDME-2376")
@@ -333,6 +335,7 @@ def test_integration_during_creation_with_invalid_credentials(
333
335
  f"Project integration: {CredentialTypes.TELEGRAM}",
334
336
  f"Project integration: {CredentialTypes.SERVICE_NOW}",
335
337
  f"Project integration: {CredentialTypes.KUBERNETES}",
338
+ f"Project integration: {CredentialTypes.KEYCLOAK}",
336
339
  ],
337
340
  )
338
341
  @pytest.mark.tescase("EPMCDME-2374")
@@ -12,6 +12,7 @@ from codemie_test_harness.tests.enums.tools import (
12
12
  ProjectManagementTool,
13
13
  CodeBaseTool,
14
14
  CloudTool,
15
+ AccessManagementTool,
15
16
  )
16
17
  from codemie_test_harness.tests.test_data.ado_test_plan_tools_test_data import (
17
18
  ado_test_plan_get_test_data,
@@ -23,6 +24,10 @@ from codemie_test_harness.tests.test_data.codebase_tools_test_data import (
23
24
  from codemie_test_harness.tests.test_data.git_tools_test_data import (
24
25
  list_branches_set_active_branch_test_data,
25
26
  )
27
+ from codemie_test_harness.tests.test_data.keycloak_tool_test_data import (
28
+ KEYCLOAK_TOOL_PROMPT,
29
+ KEYCLOAK_TOOL_RESPONSE,
30
+ )
26
31
  from codemie_test_harness.tests.test_data.notification_tools_test_data import (
27
32
  EMAIL_TOOL_PROMPT,
28
33
  EMAIL_RESPONSE,
@@ -270,3 +275,35 @@ def test_assistant_with_default_integration_email(
270
275
  response = assistant_utils.ask_assistant(email_assistant, EMAIL_TOOL_PROMPT)
271
276
 
272
277
  similarity_check.check_similarity(response, EMAIL_RESPONSE)
278
+
279
+
280
+ @pytest.mark.regression
281
+ def test_assistant_with_default_integration_keycloak(
282
+ general_integration,
283
+ integration_utils,
284
+ assistant,
285
+ assistant_utils,
286
+ similarity_check,
287
+ ):
288
+ # delete existing integrations of the same type
289
+ for integration_type in IntegrationType:
290
+ integration_utils.delete_integrations_by_type(
291
+ integration_type, CredentialTypes.KEYCLOAK, test_project_name
292
+ )
293
+ # create a new integration
294
+ general_integration(
295
+ integration_type=IntegrationType.USER,
296
+ credential_type=CredentialTypes.KEYCLOAK,
297
+ credential_values=CredentialsUtil.keycloak_credentials(),
298
+ project_name=test_project_name,
299
+ )
300
+ # create an assistant
301
+ keycloak_assistant = assistant(
302
+ Toolkit.ACCESS_MANAGEMENT,
303
+ AccessManagementTool.KEYCLOAK,
304
+ project_name=test_project_name,
305
+ )
306
+
307
+ response = assistant_utils.ask_assistant(keycloak_assistant, KEYCLOAK_TOOL_PROMPT)
308
+
309
+ similarity_check.check_similarity(response, KEYCLOAK_TOOL_RESPONSE)
@@ -46,6 +46,7 @@ from codemie_test_harness.tests.utils.base_utils import (
46
46
  f"User integration: {CredentialTypes.TELEGRAM}",
47
47
  f"User integration: {CredentialTypes.SERVICE_NOW}",
48
48
  f"User integration: {CredentialTypes.KUBERNETES}",
49
+ f"User integration: {CredentialTypes.KEYCLOAK}",
49
50
  ],
50
51
  )
51
52
  @pytest.mark.regression
@@ -150,6 +151,7 @@ def test_integration_after_creation(
150
151
  f"User integration: {CredentialTypes.TELEGRAM}",
151
152
  f"User integration: {CredentialTypes.SERVICE_NOW}",
152
153
  f"User integration: {CredentialTypes.KUBERNETES}",
154
+ f"User integration: {CredentialTypes.KEYCLOAK}",
153
155
  ],
154
156
  )
155
157
  @pytest.mark.tescase("EPMCDME-2375")
@@ -336,6 +338,7 @@ def test_integration_during_creation_with_invalid_credentials(
336
338
  f"User integration: {CredentialTypes.TELEGRAM}",
337
339
  f"User integration: {CredentialTypes.SERVICE_NOW}",
338
340
  f"User integration: {CredentialTypes.KUBERNETES}",
341
+ f"User integration: {CredentialTypes.KEYCLOAK}",
339
342
  ],
340
343
  )
341
344
  @pytest.mark.tescase("EPMCDME-2373")
@@ -0,0 +1,120 @@
1
+ KEYCLOAK_DIRECT_TOOL_PROMPT = {
2
+ "method": "GET",
3
+ "relative_url": "/users/profile",
4
+ "params": "",
5
+ }
6
+
7
+ KEYCLOAK_DIRECT_TOOL_RESPONSE = """
8
+ {
9
+ "attributes": [
10
+ {
11
+ "name": "username",
12
+ "displayName": "${username}",
13
+ "validations": {
14
+ "length": {
15
+ "min": 3,
16
+ "max": 255
17
+ },
18
+ "username-prohibited-characters": {},
19
+ "up-username-not-idn-homograph": {}
20
+ },
21
+ "permissions": {
22
+ "view": [
23
+ "admin",
24
+ "user"
25
+ ],
26
+ "edit": [
27
+ "admin",
28
+ "user"
29
+ ]
30
+ },
31
+ "multivalued": false
32
+ },
33
+ {
34
+ "name": "email",
35
+ "displayName": "${email}",
36
+ "validations": {
37
+ "email": {},
38
+ "length": {
39
+ "max": 255
40
+ }
41
+ },
42
+ "required": {
43
+ "roles": [
44
+ "user"
45
+ ]
46
+ },
47
+ "permissions": {
48
+ "view": [
49
+ "admin",
50
+ "user"
51
+ ],
52
+ "edit": [
53
+ "admin",
54
+ "user"
55
+ ]
56
+ },
57
+ "multivalued": false
58
+ },
59
+ {
60
+ "name": "firstName",
61
+ "displayName": "${firstName}",
62
+ "validations": {
63
+ "length": {
64
+ "max": 255
65
+ },
66
+ "person-name-prohibited-characters": {}
67
+ },
68
+ "required": {
69
+ "roles": [
70
+ "user"
71
+ ]
72
+ },
73
+ "permissions": {
74
+ "view": [
75
+ "admin",
76
+ "user"
77
+ ],
78
+ "edit": [
79
+ "admin",
80
+ "user"
81
+ ]
82
+ },
83
+ "multivalued": false
84
+ },
85
+ {
86
+ "name": "lastName",
87
+ "displayName": "${lastName}",
88
+ "validations": {
89
+ "length": {
90
+ "max": 255
91
+ },
92
+ "person-name-prohibited-characters": {}
93
+ },
94
+ "required": {
95
+ "roles": [
96
+ "user"
97
+ ]
98
+ },
99
+ "permissions": {
100
+ "view": [
101
+ "admin",
102
+ "user"
103
+ ],
104
+ "edit": [
105
+ "admin",
106
+ "user"
107
+ ]
108
+ },
109
+ "multivalued": false
110
+ }
111
+ ],
112
+ "groups": [
113
+ {
114
+ "name": "user-metadata",
115
+ "displayHeader": "User metadata",
116
+ "displayDescription": "Attributes, which refer to user metadata"
117
+ }
118
+ ]
119
+ }
120
+ """
@@ -91,6 +91,10 @@ valid_integrations = [
91
91
  CredentialTypes.SERVICE_NOW,
92
92
  CredentialsUtil.servicenow_credentials(),
93
93
  ),
94
+ (
95
+ CredentialTypes.KEYCLOAK,
96
+ CredentialsUtil.keycloak_credentials(),
97
+ ),
94
98
  pytest.param(
95
99
  CredentialTypes.KUBERNETES,
96
100
  CredentialsUtil.kubernetes_credentials(),
@@ -0,0 +1,35 @@
1
+ KEYCLOAK_TOOL_PROMPT = "Get information about all users"
2
+
3
+ KEYCLOAK_TOOL_RESPONSE = """
4
+ 1. **User 1:**
5
+ - **ID:** 8246cdb1-a480-487c-9d6a-6873331dcffe
6
+ - **Username:** codemie-autotests-1@epam.com
7
+ - **First Name:** Codemie
8
+ - **Last Name:** Autotests-1
9
+ - **Email:** codemie-autotests-1@epam.com
10
+ - **Email Verified:** false
11
+ - **Created Timestamp:** 1756980669356
12
+ - **Enabled:** true
13
+ - **Access Permissions:**
14
+ - Manage Group Membership: true
15
+ - View: true
16
+ - Map Roles: true
17
+ - Impersonate: true
18
+ - Manage: true
19
+
20
+ 2. **User 2:**
21
+ - **ID:** e5710bb7-e3a5-4910-bd64-e9dcb75b1bfa
22
+ - **Username:** codemie-autotests-2@epam.com
23
+ - **First Name:** Codemie
24
+ - **Last Name:** Autotests-2
25
+ - **Email:** codemie-autotests-2@epam.com
26
+ - **Email Verified:** false
27
+ - **Created Timestamp:** 1756980685292
28
+ - **Enabled:** true
29
+ - **Access Permissions:**
30
+ - Manage Group Membership: true
31
+ - View: true
32
+ - Map Roles: true
33
+ - Impersonate: true
34
+ - Manage: true
35
+ """
@@ -564,6 +564,34 @@ class CredentialsUtil:
564
564
  cred.value = "wrong_token"
565
565
  return credentials
566
566
 
567
+ @staticmethod
568
+ def keycloak_credentials() -> List[CredentialValues]:
569
+ keycloak_creds = AwsParameterStore.get_cloud_provider_credentials("keycloak")
570
+ return [
571
+ CredentialValues(
572
+ key="url", value=keycloak_creds.get("keycloak_admin", {}).get("url")
573
+ ),
574
+ CredentialValues(
575
+ key="realm", value=keycloak_creds.get("keycloak_admin", {}).get("realm")
576
+ ),
577
+ CredentialValues(
578
+ key="client_id",
579
+ value=keycloak_creds.get("keycloak_admin", {}).get("client_id"),
580
+ ),
581
+ CredentialValues(
582
+ key="client_secret",
583
+ value=keycloak_creds.get("keycloak_admin", {}).get("client_secret"),
584
+ ),
585
+ ]
586
+
587
+ @staticmethod
588
+ def invalid_keycloak_credentials() -> List[CredentialValues]:
589
+ credentials = CredentialsUtil.keycloak_credentials()
590
+ for cred in credentials:
591
+ if cred.key == "client_secret":
592
+ cred.value = "wrong_secret"
593
+ return credentials
594
+
567
595
  @staticmethod
568
596
  def jira_cloud_jql() -> str:
569
597
  jira_creds = AwsParameterStore.get_cloud_provider_credentials("jira")
@@ -0,0 +1,125 @@
1
+ """
2
+ Utility functions for managing environment variables and dotenv files with caching prevention.
3
+ """
4
+
5
+ import os
6
+ import time
7
+ from pathlib import Path
8
+ from dotenv import load_dotenv
9
+
10
+
11
+ class EnvManager:
12
+ """
13
+ Manages environment variables with proper caching prevention.
14
+ """
15
+
16
+ @staticmethod
17
+ def clear_env_vars_from_file(env_file_path: Path) -> None:
18
+ """
19
+ Clear environment variables that exist in the specified .env file from os.environ.
20
+
21
+ Args:
22
+ env_file_path: Path to the .env file
23
+ """
24
+ if not env_file_path.exists():
25
+ return
26
+
27
+ with open(env_file_path, "r") as f:
28
+ content = f.read()
29
+
30
+ for line in content.splitlines():
31
+ line = line.strip()
32
+ if line and "=" in line and not line.startswith("#"):
33
+ key = line.split("=", 1)[0].strip()
34
+ os.environ.pop(key, None)
35
+
36
+ @staticmethod
37
+ def write_env_file_safely(env_file_path: Path, content: str) -> None:
38
+ """
39
+ Write content to .env file with proper flushing and sync.
40
+
41
+ Args:
42
+ env_file_path: Path to the .env file
43
+ content: Content to write
44
+ """
45
+ # Ensure parent directory exists
46
+ env_file_path.parent.mkdir(parents=True, exist_ok=True)
47
+
48
+ # Write with proper flushing
49
+ with open(env_file_path, "w", encoding="utf-8") as file:
50
+ file.write(content)
51
+ file.flush()
52
+ os.fsync(file.fileno())
53
+
54
+ @staticmethod
55
+ def load_env_with_retry(
56
+ env_file_path: Path,
57
+ max_retries: int = 3,
58
+ retry_delay: float = 0.1,
59
+ override: bool = True,
60
+ ) -> bool:
61
+ """
62
+ Load .env file with retry mechanism to handle caching issues.
63
+
64
+ Args:
65
+ env_file_path: Path to the .env file
66
+ max_retries: Maximum number of retry attempts
67
+ retry_delay: Delay between retries in seconds
68
+ override: Whether to override existing environment variables
69
+
70
+ Returns:
71
+ bool: True if successfully loaded, False otherwise
72
+ """
73
+ for attempt in range(max_retries):
74
+ try:
75
+ # Small delay to ensure file system consistency
76
+ if attempt > 0:
77
+ time.sleep(retry_delay)
78
+
79
+ # Verify file exists and is readable
80
+ if not env_file_path.exists():
81
+ raise FileNotFoundError(f".env file not found: {env_file_path}")
82
+
83
+ # Read file content to verify it's accessible
84
+ with open(env_file_path, "r") as f:
85
+ content = f.read()
86
+
87
+ if not content.strip():
88
+ raise ValueError("Empty .env file")
89
+
90
+ # Load environment variables
91
+ success = load_dotenv(env_file_path, override=override)
92
+
93
+ if success:
94
+ return True
95
+
96
+ except Exception as e:
97
+ if attempt == max_retries - 1:
98
+ raise Exception(
99
+ f"Failed to load .env file after {max_retries} attempts: {e}"
100
+ )
101
+ continue
102
+
103
+ return False
104
+
105
+ @staticmethod
106
+ def update_env_file_safely(
107
+ env_file_path: Path, new_content: str, clear_old_vars: bool = True
108
+ ) -> None:
109
+ """
110
+ Safely update .env file with new content, handling caching issues.
111
+
112
+ Args:
113
+ env_file_path: Path to the .env file
114
+ new_content: New content to write
115
+ clear_old_vars: Whether to clear old environment variables
116
+ """
117
+ # Clear old environment variables if requested
118
+ if clear_old_vars:
119
+ EnvManager.clear_env_vars_from_file(env_file_path)
120
+
121
+ # Write new content safely
122
+ EnvManager.write_env_file_safely(env_file_path, new_content)
123
+
124
+ # Load new environment variables with retry
125
+ EnvManager.load_env_with_retry(env_file_path, override=True)
@@ -0,0 +1,28 @@
1
+ import pytest
2
+
3
+ from codemie_test_harness.tests.enums.tools import Toolkit, AccessManagementTool
4
+ from codemie_test_harness.tests.test_data.keycloak_tool_test_data import (
5
+ KEYCLOAK_TOOL_PROMPT,
6
+ KEYCLOAK_TOOL_RESPONSE,
7
+ )
8
+
9
+
10
+ @pytest.mark.regression
11
+ def test_workflow_with_assistant_with_keycloak_tool(
12
+ assistant,
13
+ workflow_with_assistant,
14
+ workflow_utils,
15
+ keycloak_integration,
16
+ similarity_check,
17
+ ):
18
+ assistant = assistant(
19
+ Toolkit.ACCESS_MANAGEMENT,
20
+ AccessManagementTool.KEYCLOAK,
21
+ settings=keycloak_integration,
22
+ )
23
+
24
+ workflow_with_assistant = workflow_with_assistant(assistant, KEYCLOAK_TOOL_PROMPT)
25
+ response = workflow_utils.execute_workflow(
26
+ workflow_with_assistant.id, assistant.name
27
+ )
28
+ similarity_check.check_similarity(response, KEYCLOAK_TOOL_RESPONSE)
@@ -0,0 +1,74 @@
1
+ import copy
2
+ import json
3
+ import random
4
+
5
+ import pytest
6
+
7
+ from codemie_test_harness.tests.enums.tools import AccessManagementTool
8
+ from codemie_test_harness.tests.test_data.direct_tools.keycloak_tool_test_data import (
9
+ KEYCLOAK_DIRECT_TOOL_PROMPT,
10
+ KEYCLOAK_DIRECT_TOOL_RESPONSE,
11
+ )
12
+ from codemie_test_harness.tests.utils.base_utils import get_random_name
13
+
14
+
15
+ @pytest.mark.regression
16
+ @pytest.mark.skip(reason="Need to investigate codemie-tools for fix")
17
+ def test_workflow_with_keycloak_tool_direct(
18
+ keycloak_integration, workflow_utils, workflow_with_tool, similarity_check
19
+ ):
20
+ assistant_and_state_name = get_random_name()
21
+
22
+ test_workflow = workflow_with_tool(
23
+ assistant_and_state_name,
24
+ AccessManagementTool.KEYCLOAK,
25
+ integration=keycloak_integration,
26
+ )
27
+ response = workflow_utils.execute_workflow(
28
+ test_workflow.id,
29
+ assistant_and_state_name,
30
+ user_input=json.dumps(KEYCLOAK_DIRECT_TOOL_PROMPT),
31
+ )
32
+ similarity_check.check_similarity(response, KEYCLOAK_DIRECT_TOOL_RESPONSE)
33
+
34
+
35
+ @pytest.mark.regression
36
+ def test_workflow_with_keycloak_tool_with_hardcoded_args(
37
+ keycloak_integration, workflow_utils, workflow_with_tool, similarity_check
38
+ ):
39
+ assistant_and_state_name = get_random_name()
40
+
41
+ test_workflow = workflow_with_tool(
42
+ assistant_and_state_name,
43
+ AccessManagementTool.KEYCLOAK,
44
+ integration=keycloak_integration,
45
+ tool_args=KEYCLOAK_DIRECT_TOOL_PROMPT,
46
+ )
47
+ response = workflow_utils.execute_workflow(
48
+ test_workflow.id, assistant_and_state_name
49
+ )
50
+ similarity_check.check_similarity(response, KEYCLOAK_DIRECT_TOOL_RESPONSE)
51
+
52
+
53
+ @pytest.mark.regression
54
+ @pytest.mark.skip(reason="Need to investigate codemie-tools for fix")
55
+ def test_workflow_with_keycloak_tool_with_overriding_args(
56
+ keycloak_integration, workflow_utils, workflow_with_tool, similarity_check
57
+ ):
58
+ assistant_and_state_name = get_random_name()
59
+
60
+ args_copy = copy.deepcopy(KEYCLOAK_DIRECT_TOOL_PROMPT)
61
+ args_copy = {key: random.randint(1, 10) for key in args_copy}
62
+
63
+ test_workflow = workflow_with_tool(
64
+ assistant_and_state_name,
65
+ AccessManagementTool.KEYCLOAK,
66
+ integration=keycloak_integration,
67
+ tool_args=args_copy,
68
+ )
69
+ response = workflow_utils.execute_workflow(
70
+ test_workflow.id,
71
+ assistant_and_state_name,
72
+ user_input=json.dumps(KEYCLOAK_DIRECT_TOOL_PROMPT),
73
+ )
74
+ similarity_check.check_similarity(response, KEYCLOAK_DIRECT_TOOL_RESPONSE)
@@ -0,0 +1,29 @@
1
+ import pytest
2
+
3
+ from codemie_test_harness.tests.enums.tools import AccessManagementTool
4
+ from codemie_test_harness.tests.test_data.keycloak_tool_test_data import (
5
+ KEYCLOAK_TOOL_PROMPT,
6
+ KEYCLOAK_TOOL_RESPONSE,
7
+ )
8
+ from codemie_test_harness.tests.utils.base_utils import get_random_name
9
+
10
+
11
+ @pytest.mark.regression
12
+ def test_workflow_with_virtual_assistant_with_keycloak_tool(
13
+ keycloak_integration,
14
+ workflow_with_virtual_assistant,
15
+ workflow_utils,
16
+ similarity_check,
17
+ ):
18
+ assistant_and_state_name = get_random_name()
19
+
20
+ test_workflow = workflow_with_virtual_assistant(
21
+ assistant_and_state_name,
22
+ AccessManagementTool.KEYCLOAK,
23
+ integration=keycloak_integration,
24
+ task=KEYCLOAK_TOOL_PROMPT,
25
+ )
26
+ response = workflow_utils.execute_workflow(
27
+ test_workflow.id, assistant_and_state_name
28
+ )
29
+ similarity_check.check_similarity(response, KEYCLOAK_TOOL_RESPONSE)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: codemie-test-harness
3
- Version: 0.1.146
3
+ Version: 0.1.148
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.146)
16
+ Requires-Dist: codemie-sdk-python (==0.1.148)
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-reportportal (>=5.5.2,<6.0.0)
@@ -23,6 +23,8 @@ codemie_test_harness/tests/assistant/default_integrations/test_default_integrati
23
23
  codemie_test_harness/tests/assistant/default_integrations/test_default_integrations_for_tool_with_datasource.py,sha256=pYbhC7wSt5ekL-OERggxiuaAZYvxAtT2QdKiKfLVzi4,9809
24
24
  codemie_test_harness/tests/assistant/test_assistants.py,sha256=eSLZ6hIaQZcFs32V65_ZZwhsbZztslmoxgV2BzyPy6I,12157
25
25
  codemie_test_harness/tests/assistant/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ codemie_test_harness/tests/assistant/tools/access_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ codemie_test_harness/tests/assistant/tools/access_management/test_keycloak_tool.py,sha256=-SahC4w2EwgTpE4K6h3IIFOMr48ONtp7MyFvw1ZR7v0,695
26
28
  codemie_test_harness/tests/assistant/tools/ado/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
29
  codemie_test_harness/tests/assistant/tools/ado/test_assistant_for_ado_test_plan_tools.py,sha256=jfkd8KoVRhyQ5PnjU5gdtmHp34oaayBFxFE-B329RDc,4925
28
30
  codemie_test_harness/tests/assistant/tools/ado/test_assistant_for_ado_wiki_tools.py,sha256=3WHax84U7DKT0rn377eIV_cmSJcTSJQxecRBaEcUMts,3464
@@ -55,7 +57,7 @@ codemie_test_harness/tests/assistant/tools/servicenow/__init__.py,sha256=47DEQpj
55
57
  codemie_test_harness/tests/assistant/tools/servicenow/test_servicenow_tools.py,sha256=JV_n6COaCsd0_rxQBJvvLZfPdo8BsCbG8Ti-UpzFvfQ,644
56
58
  codemie_test_harness/tests/assistant/tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
59
  codemie_test_harness/tests/assistant/tools/vcs/test_assistant_with_vcs_tools.py,sha256=5-QybLWmYSqHG4Sqr-IN-vNcStV4skSwCJQN44Nfats,922
58
- codemie_test_harness/tests/conftest.py,sha256=pS_7Zh2QLUMgC2wepEFx-ut1-UzOGZy_WIn9rb7z2D4,28557
60
+ codemie_test_harness/tests/conftest.py,sha256=BRq0QKY9OHpqUGe6D-sfckCS8EW6vdHn8iDcb3qYOsk,28994
59
61
  codemie_test_harness/tests/conversations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
62
  codemie_test_harness/tests/conversations/test_conversations_endpoints.py,sha256=SQraRVrjjE4mYTs4EuGzMrO96DuOuKTiYQ4ZRBhHx70,3913
61
63
  codemie_test_harness/tests/e2e/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -63,14 +65,14 @@ codemie_test_harness/tests/e2e/test_e2e.py,sha256=RUvSu_uNInU1OFfkNft3-Cmd0KZV7J
63
65
  codemie_test_harness/tests/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
66
  codemie_test_harness/tests/enums/integrations.py,sha256=hG_cEKN0N5gtGHyrh3wuCpNAWhPyNOJaKsAw16iNshg,164
65
67
  codemie_test_harness/tests/enums/model_types.py,sha256=k07srBYIF9uRwbLWY9pBNYzi0s3Jdt8ajES9p-UmrYo,1185
66
- codemie_test_harness/tests/enums/tools.py,sha256=pGsHRGmPcLUqNtR2bKdRgsxdHw7HylXOWd9CPKPGOb0,5072
68
+ codemie_test_harness/tests/enums/tools.py,sha256=wt8dAKXOA3YOuyzwmTi1oIGVNoGFWfRNllPfenN2nh8,5233
67
69
  codemie_test_harness/tests/integrations/__init__.py,sha256=5vnZbxvYQ1Y91O8DJG3QfBHWcdYsMii59cMBzsvHBCg,237
68
70
  codemie_test_harness/tests/integrations/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
- codemie_test_harness/tests/integrations/project/test_default_integrations.py,sha256=A83Gk6hBl4DTC28UeC9945fwgl3KO2JE80A8Ts2yI4k,8712
70
- codemie_test_harness/tests/integrations/project/test_project_integrations.py,sha256=egg2c4W2JPuEMiFEqtuLcYliUY2CS5Gpd7ly254nhro,13925
71
+ codemie_test_harness/tests/integrations/project/test_default_integrations.py,sha256=PcX06eyD5X1Ph-UxR0HtTz_OCwIizL_XJI-SKEd5uvA,9906
72
+ codemie_test_harness/tests/integrations/project/test_project_integrations.py,sha256=-rL_egAXw7Z0Z3ecnjyPsIGseuJG2unuJa8mroiB_0M,14105
71
73
  codemie_test_harness/tests/integrations/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- codemie_test_harness/tests/integrations/user/test_default_integrations.py,sha256=0sSpbTTz_kxBIMJQl6gt0NMA-M6zuobi9D8YHuM39w0,8694
73
- codemie_test_harness/tests/integrations/user/test_user_integrations.py,sha256=Gz7-lvrbahikAnh5jhZpA1tzrZegkYBRx-R4xjOiU7c,13771
74
+ codemie_test_harness/tests/integrations/user/test_default_integrations.py,sha256=YpkEqJ9DLHMh0pp4xec6RZxa7IoDdU4885hPOPq1cG0,9885
75
+ codemie_test_harness/tests/integrations/user/test_user_integrations.py,sha256=TjtPLOs6OrzyJwZNNJlEtOG-udej1QHyhGQt1VqqeHc,13942
74
76
  codemie_test_harness/tests/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
77
  codemie_test_harness/tests/llm/assistants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
78
  codemie_test_harness/tests/llm/assistants/test_llm.py,sha256=pLF1ETtwQI3y2uz08wfhr3fGIADFAbbGxEwosHhLjzE,3246
@@ -106,6 +108,7 @@ codemie_test_harness/tests/test_data/direct_tools/codebase_tools_test_data.py,sh
106
108
  codemie_test_harness/tests/test_data/direct_tools/data_management_tools_test_data.py,sha256=Eeba0oxKUmBEin2Scbv3VnLOEQRLmK6QR0qk5cRYRNM,1583
107
109
  codemie_test_harness/tests/test_data/direct_tools/direct_tools_test_data.py,sha256=y9awl1IA6EXGXyz05QzcNdt5z7Rk9J5LzIbfi4CFE3s,3233
108
110
  codemie_test_harness/tests/test_data/direct_tools/file_management_tools_test_data.py,sha256=8Y8D_pmHVnzhSnYNeiJng3dQYj5k1GkBZ8-BLHlB5kE,1380
111
+ codemie_test_harness/tests/test_data/direct_tools/keycloak_tool_test_data.py,sha256=6lU1YC6DSV6e_3VNQEVvtA4o3_lSFgOQik4T0u-TF1g,2979
109
112
  codemie_test_harness/tests/test_data/direct_tools/notification_tools_test_data.py,sha256=Blr7qIBEMxAh2_WRvFQr1hYt6wnez03v1b2SpEWha-o,1533
110
113
  codemie_test_harness/tests/test_data/direct_tools/open_api_tools_test_data.py,sha256=UwXVrwD3MnOIS2wwikNDk1EZNYR14p_IjhOOUwjYHOI,497
111
114
  codemie_test_harness/tests/test_data/direct_tools/project_management_tools_test_data.py,sha256=Nugg9rk-qnDFwwY_ISU0mxuz7nTxTHTMcyvp8ZRtjC8,20869
@@ -134,7 +137,8 @@ codemie_test_harness/tests/test_data/files/test.yaml,sha256=3NDQyzwkRM5d6eCYMScN
134
137
  codemie_test_harness/tests/test_data/git_tools_test_data.py,sha256=7U05vLqkh5uJ0l_KJeHis549id1Of99K0jCsWOb0nXM,8485
135
138
  codemie_test_harness/tests/test_data/google_datasource_test_data.py,sha256=fhMJVTU0udINKtBQ750c_c279NzibGiZumnIaCPLtBo,511
136
139
  codemie_test_harness/tests/test_data/index_test_data.py,sha256=jSJ7YSNisFADONRKSwkLUhuOLrSRe_fZisWdjflOjE4,996
137
- codemie_test_harness/tests/test_data/integrations_test_data.py,sha256=dPadoQCurmOtqhq5hcPe1hhuSZ6NYa4IZwdWMiMx2Tw,6599
140
+ codemie_test_harness/tests/test_data/integrations_test_data.py,sha256=Iu48BhQZsRgsBmvNyyDj_vwaUvK1JwEtb5KpgTkhQnc,6694
141
+ codemie_test_harness/tests/test_data/keycloak_tool_test_data.py,sha256=uF8YqHGgLpQVxKdpKXLe-7F-ipEGQiHHh28nZvvVGM8,1244
138
142
  codemie_test_harness/tests/test_data/llm_test_data.py,sha256=SJIBGtC8Ha7T0S7G9598PvHzzQIR6gg4HnNCtgYmLYw,2200
139
143
  codemie_test_harness/tests/test_data/mcp_server_test_data.py,sha256=m6PImS_J2gPNY5ijf9MG_eOX_LxJjTZ23AXQDgaK_Oc,7151
140
144
  codemie_test_harness/tests/test_data/notification_tools_test_data.py,sha256=Rqo-5u7PULDJddidjqcJfnsus6-JbDABk9147JX0pqs,855
@@ -211,12 +215,13 @@ codemie_test_harness/tests/ui/test_workflow_templates.py,sha256=A6eaR-7M5VXoPlUJ
211
215
  codemie_test_harness/tests/ui/test_workflows.py,sha256=_UQT9soqxV68aqFt0V3KJ3iJFA55kzE891EJIER9kk8,3464
212
216
  codemie_test_harness/tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
217
  codemie_test_harness/tests/utils/assistant_utils.py,sha256=jy3dFF4ZiT22Wippl1a5jIEAAyJ71P0ss8AIHPefz6k,6511
214
- codemie_test_harness/tests/utils/aws_parameters_store.py,sha256=uwhvrk4qYYWLILS082SFAqQaGmhrW6aPmmJo-dPTN84,20637
218
+ codemie_test_harness/tests/utils/aws_parameters_store.py,sha256=fiOFvgdhEOdq0zO6xStQUPYrxkhkUCo5SS8ZejVbLBI,21711
215
219
  codemie_test_harness/tests/utils/base_utils.py,sha256=tfishCUxO3iEuasWOifoF9_fXspm4uIHS26Ryqu-NxA,5998
216
220
  codemie_test_harness/tests/utils/client_factory.py,sha256=Yyg2iXe7g7fIfIUbOH8z_8qgVo_lB-nYLOfCV5ONXFw,641
217
221
  codemie_test_harness/tests/utils/constants.py,sha256=lb6mgLjt0GM85Khs18rL1jnE9ILx8L811ykNhpF6IDA,1111
218
222
  codemie_test_harness/tests/utils/conversation_utils.py,sha256=SWj6TBWOQoX5Yh6Wk63yHQFveRXgK1mpLb3PUKAa57A,648
219
223
  codemie_test_harness/tests/utils/datasource_utils.py,sha256=-_HZfW_UufSUVkSUCVq4jMlq9MCcKtMhzD6iBtadzmk,12502
224
+ codemie_test_harness/tests/utils/env_utils.py,sha256=9tyVgxKfYqdtSoo9dRTScOZWjAUm82_65JjaKggcwCg,3999
220
225
  codemie_test_harness/tests/utils/file_utils.py,sha256=hY-kwnyzvtd1BQif8r5NhvRTGfpKLmQKyRsq1Tuflhg,585
221
226
  codemie_test_harness/tests/utils/gitbud_utils.py,sha256=UJ3RbhPSjHQSdos6S6zTR9iZULrBDJXoXq9cbjFH7bo,7829
222
227
  codemie_test_harness/tests/utils/http_utils.py,sha256=wjhttibzzNhleKzWgWC01Q0Y5sV9scu-Ski-qgJPd-Q,4179
@@ -234,6 +239,8 @@ codemie_test_harness/tests/utils/workflow_utils.py,sha256=qKvI2fFiSo_RirFiWLyGRC
234
239
  codemie_test_harness/tests/utils/yaml_utils.py,sha256=y9fUf4u4G4SoCktPOwaC5x71iaDKhktbz_XUfI9kNis,1661
235
240
  codemie_test_harness/tests/workflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
241
  codemie_test_harness/tests/workflow/assistant_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
+ codemie_test_harness/tests/workflow/assistant_tools/access_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
+ codemie_test_harness/tests/workflow/assistant_tools/access_management/test_workflow_with_assistant_with_keycloak_tool.py,sha256=qkW4wUqdWJDIL3zmrvJ1TvY8xgq0hE1EcEBXkyuUVRo,832
237
244
  codemie_test_harness/tests/workflow/assistant_tools/ado/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
245
  codemie_test_harness/tests/workflow/assistant_tools/ado/test_workflow_with_assistant_with_ado_test_plan_tools.py,sha256=3vco4wU0sEj6e9KXnPj812Ltxc44LB_GiRzm4GVxi-8,4893
239
246
  codemie_test_harness/tests/workflow/assistant_tools/ado/test_workflow_with_assistant_with_ado_wiki_tools.py,sha256=Tz5OUah3FaFBliKuBdlS1Wn9nwWDAkGkJRKgFPjJAU0,3454
@@ -275,6 +282,7 @@ codemie_test_harness/tests/workflow/direct_tools_calling/__init__.py,sha256=47DE
275
282
  codemie_test_harness/tests/workflow/direct_tools_calling/default_integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
283
  codemie_test_harness/tests/workflow/direct_tools_calling/default_integrations/test_default_integrations_for_tool.py,sha256=uWhdAnVqk-WrSB9QrHZyJLIQPvLhHayfEL1OZugU00A,8232
277
284
  codemie_test_harness/tests/workflow/direct_tools_calling/default_integrations/test_default_integrations_for_tool_kit.py,sha256=kbCExIw1BBgNjmLNPpwJMncyNvA2Lq3xZQoTVr6K9QI,8437
285
+ codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_access_management_tool.py,sha256=HtAYfbVhIAmVY200avGS4_ziNR0geKAx8U35Vtf9ICE,2507
278
286
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_ado_test_plan_tools.py,sha256=UUSgyhE7GKAkyCQMUm7Y2VkQkiR7-Fr5robBpLvoH-M,2685
279
287
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_ado_wiki_tools.py,sha256=FOQEqm0u4UvRAfjJFo2API-qySGy4sqKD-hwE1Lm6Js,2744
280
288
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_ado_work_item_tools.py,sha256=4h3z3tUTqBLZPjDQCbnW2CkoGX0gEjZlDkYbLHSilZA,2799
@@ -291,6 +299,8 @@ codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_serv
291
299
  codemie_test_harness/tests/workflow/direct_tools_calling/test_workflow_with_vcs_tools.py,sha256=8qKTiFvL0wNBpDv5mUalsYfPVCfq_eoTzQTQdMs5SOY,3005
292
300
  codemie_test_harness/tests/workflow/test_workflows.py,sha256=haGPZqkV0PPBENN_pHc6x6gn84VdjWOrniuadFATKA0,1141
293
301
  codemie_test_harness/tests/workflow/virtual_assistant_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
302
+ codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
303
+ codemie_test_harness/tests/workflow/virtual_assistant_tools/access_management/test_workflow_with_keycloak_tool.py,sha256=aHz3MFmDHU6yNLdSAc9NMEAJsEo3hLMS7SO3YKX0ORc,921
294
304
  codemie_test_harness/tests/workflow/virtual_assistant_tools/ado/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
295
305
  codemie_test_harness/tests/workflow/virtual_assistant_tools/ado/test_workflow_with_ado_test_plan_tools.py,sha256=ge7JJVTWrdoXsGq8nhgbC4fATnq4YP-fVZm2ZSMJ6eo,5785
296
306
  codemie_test_harness/tests/workflow/virtual_assistant_tools/ado/test_workflow_with_ado_wiki_tools.py,sha256=zsGsfdVoNcMLLajy0WQ-I-Y7ZEXbdBq2Y1_wtWuxKeY,4148
@@ -326,7 +336,7 @@ codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/__init__.
326
336
  codemie_test_harness/tests/workflow/virtual_assistant_tools/servicenow/test_workflow_with_servicenow_tools.py,sha256=Cxe5Yuy9JE_IEsnQOThpVIZQqpfLuHfDkF6JwLngDc8,890
327
337
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
328
338
  codemie_test_harness/tests/workflow/virtual_assistant_tools/vcs/test_workflow_with_vcs_tools.py,sha256=tm0NvUf_UtzLPTYJWykYpsNoxoVs-Eh80guDmRwImwg,1106
329
- codemie_test_harness-0.1.146.dist-info/METADATA,sha256=C9bfCCtoQp9HHKSUzlo4GdgfZpMtU1OQPG_yf7GHQxs,8998
330
- codemie_test_harness-0.1.146.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
331
- codemie_test_harness-0.1.146.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
332
- codemie_test_harness-0.1.146.dist-info/RECORD,,
339
+ codemie_test_harness-0.1.148.dist-info/METADATA,sha256=2y0snuPrG9cFdIjTDfnL5Z71Nhaq026a-Kjei0P-36k,8998
340
+ codemie_test_harness-0.1.148.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
341
+ codemie_test_harness-0.1.148.dist-info/entry_points.txt,sha256=n98t-EOM5M1mnMl_j2X4siyeO9zr0WD9a5LF7JyElIM,73
342
+ codemie_test_harness-0.1.148.dist-info/RECORD,,