-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathtest_config_env_vars.py
More file actions
228 lines (182 loc) · 7.89 KB
/
Copy pathtest_config_env_vars.py
File metadata and controls
228 lines (182 loc) · 7.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
from pathlib import Path
import pytest
from uipath.platform.common._config import UiPathConfig
from uipath.platform.constants import (
ENTRY_POINTS_FILE,
ENV_BASE_URL,
ENV_FOLDER_KEY,
ENV_FOLDER_PATH,
ENV_JOB_KEY,
ENV_ORGANIZATION_ID,
ENV_PROCESS_KEY,
ENV_PROJECT_KEY,
ENV_TENANT_ID,
ENV_TENANT_NAME,
ENV_TRACING_ENABLED,
ENV_UIPATH_AGENT_ID,
ENV_UIPATH_CLOUD_USER_ID,
ENV_UIPATH_CONFIG_PATH,
ENV_UIPATH_PROCESS_UUID,
ENV_UIPATH_PROCESS_VERSION,
ENV_UIPATH_PROJECT_FILES_SOURCE,
ENV_UIPATH_PROJECT_ID,
ENV_UIPATH_TRACE_ID,
EVALS_FOLDER,
LEGACY_EVAL_FOLDER,
STUDIO_METADATA_FILE,
UIPATH_BINDINGS_FILE,
UIPATH_CONFIG_FILE,
UIPROJ_FILE,
)
# Every env var read by ConfigurationManager properties. Cleared before each
# test so "returns None when unset" assertions don't pick up the real
# environment.
_ENV_VARS = (
ENV_UIPATH_PROJECT_ID,
ENV_UIPATH_AGENT_ID,
ENV_UIPATH_CLOUD_USER_ID,
ENV_UIPATH_PROJECT_FILES_SOURCE,
ENV_PROJECT_KEY,
ENV_TENANT_NAME,
ENV_TENANT_ID,
ENV_ORGANIZATION_ID,
ENV_BASE_URL,
ENV_FOLDER_KEY,
ENV_FOLDER_PATH,
ENV_PROCESS_KEY,
ENV_UIPATH_PROCESS_UUID,
ENV_UIPATH_TRACE_ID,
ENV_UIPATH_PROCESS_VERSION,
ENV_JOB_KEY,
ENV_UIPATH_CONFIG_PATH,
ENV_TRACING_ENABLED,
)
@pytest.fixture(autouse=True)
def _clear_env(monkeypatch):
for var in _ENV_VARS:
monkeypatch.delenv(var, raising=False)
class TestProjectId:
def test_reads_env_var(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_PROJECT_ID, "file-source-id")
assert UiPathConfig.project_id == "file-source-id"
def test_returns_none_when_unset(self):
assert UiPathConfig.project_id is None
class TestAgentId:
def test_returns_explicit_agent_id_when_set(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_PROJECT_ID, "debug-project-guid")
monkeypatch.setenv(ENV_UIPATH_AGENT_ID, "real-agent-id")
assert UiPathConfig.agent_id == "real-agent-id"
def test_falls_back_to_project_id_when_agent_id_unset(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_PROJECT_ID, "cloud-project-id")
assert UiPathConfig.agent_id == "cloud-project-id"
def test_returns_none_when_neither_set(self):
assert UiPathConfig.agent_id is None
class TestCloudUserId:
def test_returns_value_when_set(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_CLOUD_USER_ID, "user-guid")
assert UiPathConfig.cloud_user_id == "user-guid"
def test_returns_none_when_unset(self):
assert UiPathConfig.cloud_user_id is None
class TestProjectFilesSource:
def test_returns_value_when_set(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_PROJECT_FILES_SOURCE, "Local")
assert UiPathConfig.project_files_source == "Local"
def test_returns_none_when_unset(self):
assert UiPathConfig.project_files_source is None
@pytest.mark.parametrize(
("prop", "env_var", "value"),
[
("project_key", ENV_PROJECT_KEY, "proj-key"),
("tenant_name", ENV_TENANT_NAME, "my-tenant"),
("tenant_id", ENV_TENANT_ID, "tenant-guid"),
("organization_id", ENV_ORGANIZATION_ID, "org-guid"),
("base_url", ENV_BASE_URL, "https://cloud.uipath.com/org/tenant"),
("folder_key", ENV_FOLDER_KEY, "folder-guid"),
("folder_path", ENV_FOLDER_PATH, "Shared/My Folder"),
("process_key", ENV_PROCESS_KEY, "process-key"),
("process_uuid", ENV_UIPATH_PROCESS_UUID, "process-uuid"),
("trace_id", ENV_UIPATH_TRACE_ID, "trace-id"),
("process_version", ENV_UIPATH_PROCESS_VERSION, "1.2.3"),
("job_key", ENV_JOB_KEY, "job-guid"),
],
)
class TestOptionalEnvVarProperties:
def test_returns_value_when_set(self, monkeypatch, prop, env_var, value):
monkeypatch.setenv(env_var, value)
assert getattr(UiPathConfig, prop) == value
def test_returns_none_when_unset(self, monkeypatch, prop, env_var, value):
assert getattr(UiPathConfig, prop) is None
class TestFileNameProperties:
def test_config_file_name(self):
assert UiPathConfig.config_file_name == UIPATH_CONFIG_FILE
def test_bindings_file_path(self):
assert UiPathConfig.bindings_file_path == Path(UIPATH_BINDINGS_FILE)
def test_entry_points_file_path(self):
assert UiPathConfig.entry_points_file_path == Path(ENTRY_POINTS_FILE)
def test_uiproj_file_path(self):
assert UiPathConfig.uiproj_file_path == Path(UIPROJ_FILE)
def test_studio_metadata_file_path(self):
assert UiPathConfig.studio_metadata_file_path == Path(
".uipath", STUDIO_METADATA_FILE
)
def test_config_file_path_defaults_to_config_file(self):
assert UiPathConfig.config_file_path == Path(UIPATH_CONFIG_FILE)
def test_config_file_path_honors_override(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_CONFIG_PATH, "custom/config.json")
assert UiPathConfig.config_file_path == Path("custom/config.json")
class TestIsStudioProject:
def test_true_when_project_id_set(self, monkeypatch):
monkeypatch.setenv(ENV_UIPATH_PROJECT_ID, "some-id")
assert UiPathConfig.is_studio_project is True
def test_false_when_project_id_unset(self):
assert UiPathConfig.is_studio_project is False
class TestIsTracingEnabled:
def test_defaults_to_true_when_unset(self):
assert UiPathConfig.is_tracing_enabled is True
@pytest.mark.parametrize("value", ["false", "False", "FALSE"])
def test_false_when_disabled(self, monkeypatch, value):
monkeypatch.setenv(ENV_TRACING_ENABLED, value)
assert UiPathConfig.is_tracing_enabled is False
def test_true_when_explicitly_enabled(self, monkeypatch):
monkeypatch.setenv(ENV_TRACING_ENABLED, "true")
assert UiPathConfig.is_tracing_enabled is True
class TestEvalFolderDetection:
def test_has_legacy_eval_folder(self, monkeypatch, tmp_path):
monkeypatch.chdir(tmp_path)
assert UiPathConfig.has_legacy_eval_folder is False
(tmp_path / LEGACY_EVAL_FOLDER).mkdir()
assert UiPathConfig.has_legacy_eval_folder is True
def test_has_eval_folder(self, monkeypatch, tmp_path):
monkeypatch.chdir(tmp_path)
assert UiPathConfig.has_eval_folder is False
(tmp_path / EVALS_FOLDER).mkdir()
assert UiPathConfig.has_eval_folder is True
class TestIsRootedToDebugJob:
@pytest.fixture(autouse=True)
def _reset_singleton(self):
# is_rooted_to_debug_job mutates the process-wide singleton; reset around
# each test so nothing leaks between tests.
UiPathConfig.reset()
yield
UiPathConfig.reset()
def test_defaults_to_false_when_unset(self):
assert UiPathConfig.is_rooted_to_debug_job is False
def test_reads_is_debug_internal_argument(self):
UiPathConfig.__dict__["_internal_arguments"] = {"isDebug": True}
assert UiPathConfig.is_rooted_to_debug_job is True
def test_setter_override_wins_and_is_true(self):
UiPathConfig.is_rooted_to_debug_job = True
assert UiPathConfig.is_rooted_to_debug_job is True
def test_setter_override_beats_internal_argument(self):
# Even when the internal argument says True, an explicit False override wins.
UiPathConfig.__dict__["_internal_arguments"] = {"isDebug": True}
UiPathConfig.is_rooted_to_debug_job = False
assert UiPathConfig.is_rooted_to_debug_job is False
def test_reset_clears_override(self):
UiPathConfig.__dict__["_internal_arguments"] = {"isDebug": True}
UiPathConfig.is_rooted_to_debug_job = False
assert UiPathConfig.is_rooted_to_debug_job is False
UiPathConfig.reset()
# Override cleared, so it falls back to the internal argument again — but
# reset() also drops the cached internal arguments, so it re-reads (None).
assert UiPathConfig.is_rooted_to_debug_job is False