sefrone-api-e2e 1.2.5__tar.gz → 1.2.7__tar.gz
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.
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/PKG-INFO +1 -1
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/1_normal_auth_flow.yaml +0 -34
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/4_workspace_endpoints.yaml +3 -1
- sefrone_api_e2e-1.2.7/sefrone_api_e2e/e2e/Scenarios/Auth/8_temporary_passwords_flow.yaml +219 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/runner_rest_api.py +56 -26
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/PKG-INFO +1 -1
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/SOURCES.txt +2 -1
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/setup.py +1 -1
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/README.md +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/__init__.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/api_e2e_manager.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/0_check_features.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/2_account_endpoints.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/3_admin_account_endpoints.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/5_apikey_endpoints.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/6_project_endpoints.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e/Scenarios/Auth/7_email_2fa_flow.yaml +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/e2e_scenarios_manager.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/env_patch.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/json_mock_server.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/runner_assets.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/runner_email_mock.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/runner_satim_mock.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/runner_webhook_mock.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e/step_runner.py +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/dependency_links.txt +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/requires.txt +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/top_level.txt +0 -0
- {sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/setup.cfg +0 -0
|
@@ -221,40 +221,6 @@ steps:
|
|
|
221
221
|
- "{{body.response.linkedWorkspaces.count()}} == 1"
|
|
222
222
|
- "{{body.response.linkedWorkspaces[0].workspaceName}} == '$var(DEFAULT_WORKSPACE_NAME)'"
|
|
223
223
|
|
|
224
|
-
- name: "Register standard account"
|
|
225
|
-
skip_if:
|
|
226
|
-
- "PseudoRegister not in {$stored.0_check_features.enabled_features}"
|
|
227
|
-
method: "POST"
|
|
228
|
-
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)"
|
|
229
|
-
send_as: "json"
|
|
230
|
-
body:
|
|
231
|
-
username: "e2e_new_user_{$stored.seed_id}"
|
|
232
|
-
password: "e2e_test_password"
|
|
233
|
-
expect:
|
|
234
|
-
status: 200
|
|
235
|
-
body:
|
|
236
|
-
errorCode: number
|
|
237
|
-
errorCodeStr: string
|
|
238
|
-
message: string
|
|
239
|
-
response:
|
|
240
|
-
accountId: string
|
|
241
|
-
projectId: string
|
|
242
|
-
project: string
|
|
243
|
-
accountType: string
|
|
244
|
-
credentialType: string
|
|
245
|
-
isActive: boolean
|
|
246
|
-
username: string
|
|
247
|
-
linkedWorkspaces: []
|
|
248
|
-
save:
|
|
249
|
-
registered_account_id: "{{body.response.accountId}}"
|
|
250
|
-
registered_username: "{{body.response.username}}"
|
|
251
|
-
assertions:
|
|
252
|
-
- "{{body.response.accountType}} == 'standard'"
|
|
253
|
-
- "{{body.response.credentialType}} == 'standard'"
|
|
254
|
-
- "{{body.response.isActive}} == True"
|
|
255
|
-
- "{{body.response.linkedWorkspaces.count()}} == 0"
|
|
256
|
-
- "{{body.response.username}} include 'e2e_new_user_'"
|
|
257
|
-
|
|
258
224
|
- name: "Login with wrong password"
|
|
259
225
|
method: "POST"
|
|
260
226
|
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
@@ -179,7 +179,9 @@ steps:
|
|
|
179
179
|
|
|
180
180
|
- name: "Register standard test account"
|
|
181
181
|
method: "POST"
|
|
182
|
-
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)"
|
|
182
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/create"
|
|
183
|
+
request_headers:
|
|
184
|
+
- x-api-token: "{$stored.admin_token}"
|
|
183
185
|
send_as: "json"
|
|
184
186
|
body:
|
|
185
187
|
username: "e2e_ws_std_{$stored.seed_account_id}"
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
name: "Temporary Passwords Flow"
|
|
2
|
+
base_url: "http://localhost:$var(API_PUBLIC_PORT)"
|
|
3
|
+
|
|
4
|
+
# This scenario requires the TemporaryCredentials feature to be registered.
|
|
5
|
+
skip_if:
|
|
6
|
+
- "TemporaryCredentials not in {$stored.0_check_features.enabled_features}"
|
|
7
|
+
|
|
8
|
+
steps:
|
|
9
|
+
- name: "Login root admin"
|
|
10
|
+
retry:
|
|
11
|
+
attempts: 10
|
|
12
|
+
delay_seconds: 5
|
|
13
|
+
method: "POST"
|
|
14
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
15
|
+
send_as: "json"
|
|
16
|
+
body:
|
|
17
|
+
device: "e2e_test_device"
|
|
18
|
+
pseudo: "$var(DEFAULT_USERNAME)"
|
|
19
|
+
password: "$var(DEFAULT_PASSWORD)"
|
|
20
|
+
expect:
|
|
21
|
+
status: 200
|
|
22
|
+
body:
|
|
23
|
+
response:
|
|
24
|
+
token: string
|
|
25
|
+
save:
|
|
26
|
+
root_admin_token: "{{body.response.token}}"
|
|
27
|
+
|
|
28
|
+
- name: "Generate unique test suffix"
|
|
29
|
+
randomize:
|
|
30
|
+
seed_id: 8
|
|
31
|
+
|
|
32
|
+
- name: "Create temporary credential"
|
|
33
|
+
method: "POST"
|
|
34
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/create"
|
|
35
|
+
request_headers:
|
|
36
|
+
- x-api-token: "{$stored.root_admin_token}"
|
|
37
|
+
send_as: "json"
|
|
38
|
+
body:
|
|
39
|
+
password: "e2e_temp_pwd_{$stored.seed_id}"
|
|
40
|
+
label: "e2e temp credential {$stored.seed_id}"
|
|
41
|
+
expiresAt: "$date(+1,end)"
|
|
42
|
+
expect:
|
|
43
|
+
status: 200
|
|
44
|
+
body:
|
|
45
|
+
errorCode: number
|
|
46
|
+
errorCodeStr: string
|
|
47
|
+
message: string
|
|
48
|
+
response:
|
|
49
|
+
id: string
|
|
50
|
+
label: string
|
|
51
|
+
expiresAt: datetime
|
|
52
|
+
createdAt: datetime
|
|
53
|
+
save:
|
|
54
|
+
temp_credential_id: "{{body.response.id}}"
|
|
55
|
+
assertions:
|
|
56
|
+
- "{{body.response.label}} == 'e2e temp credential {$stored.seed_id}'"
|
|
57
|
+
|
|
58
|
+
- name: "List temporary credentials shows the created one"
|
|
59
|
+
method: "GET"
|
|
60
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/list"
|
|
61
|
+
request_headers:
|
|
62
|
+
- x-api-token: "{$stored.root_admin_token}"
|
|
63
|
+
expect:
|
|
64
|
+
status: 200
|
|
65
|
+
body:
|
|
66
|
+
errorCode: number
|
|
67
|
+
errorCodeStr: string
|
|
68
|
+
message: string
|
|
69
|
+
response:
|
|
70
|
+
- id: string
|
|
71
|
+
label: string
|
|
72
|
+
expiresAt: datetime
|
|
73
|
+
createdAt: datetime
|
|
74
|
+
assertions:
|
|
75
|
+
- "{{body.response.count()}} == 1"
|
|
76
|
+
- "{{body.response[0].id}} == '{$stored.temp_credential_id}'"
|
|
77
|
+
|
|
78
|
+
- name: "Login with original password still works"
|
|
79
|
+
method: "POST"
|
|
80
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
81
|
+
send_as: "json"
|
|
82
|
+
body:
|
|
83
|
+
device: "e2e_test_device"
|
|
84
|
+
pseudo: "$var(DEFAULT_USERNAME)"
|
|
85
|
+
password: "$var(DEFAULT_PASSWORD)"
|
|
86
|
+
expect:
|
|
87
|
+
status: 200
|
|
88
|
+
body:
|
|
89
|
+
response:
|
|
90
|
+
token: string
|
|
91
|
+
|
|
92
|
+
- name: "Login with the temporary password succeeds"
|
|
93
|
+
method: "POST"
|
|
94
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
95
|
+
send_as: "json"
|
|
96
|
+
body:
|
|
97
|
+
device: "e2e_test_device"
|
|
98
|
+
pseudo: "$var(DEFAULT_USERNAME)"
|
|
99
|
+
password: "e2e_temp_pwd_{$stored.seed_id}"
|
|
100
|
+
expect:
|
|
101
|
+
status: 200
|
|
102
|
+
body:
|
|
103
|
+
errorCode: number
|
|
104
|
+
errorCodeStr: string
|
|
105
|
+
message: string
|
|
106
|
+
response:
|
|
107
|
+
token: string
|
|
108
|
+
save:
|
|
109
|
+
temp_login_token: "{{body.response.token}}"
|
|
110
|
+
assertions:
|
|
111
|
+
- "{{body.errorCode}} == 0"
|
|
112
|
+
|
|
113
|
+
- name: "Temporary password token is valid - get account info"
|
|
114
|
+
method: "GET"
|
|
115
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/info/{$stored.temp_login_token}"
|
|
116
|
+
expect:
|
|
117
|
+
status: 200
|
|
118
|
+
body:
|
|
119
|
+
response:
|
|
120
|
+
accountId: string
|
|
121
|
+
username: string
|
|
122
|
+
assertions:
|
|
123
|
+
- "{{body.response.username}} == '$var(DEFAULT_USERNAME)'"
|
|
124
|
+
|
|
125
|
+
- name: "Revoke temporary credential"
|
|
126
|
+
method: "POST"
|
|
127
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/{$stored.temp_credential_id}/revoke"
|
|
128
|
+
request_headers:
|
|
129
|
+
- x-api-token: "{$stored.temp_login_token}"
|
|
130
|
+
expect:
|
|
131
|
+
status: 200
|
|
132
|
+
body:
|
|
133
|
+
errorCode: number
|
|
134
|
+
errorCodeStr: string
|
|
135
|
+
message: string
|
|
136
|
+
|
|
137
|
+
- name: "List temporary credentials is empty after revoke"
|
|
138
|
+
method: "GET"
|
|
139
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/list"
|
|
140
|
+
request_headers:
|
|
141
|
+
- x-api-token: "{$stored.temp_login_token}"
|
|
142
|
+
expect:
|
|
143
|
+
status: 200
|
|
144
|
+
body:
|
|
145
|
+
response: []
|
|
146
|
+
assertions:
|
|
147
|
+
- "{{body.response.count()}} == 0"
|
|
148
|
+
|
|
149
|
+
- name: "Login with revoked temporary password fails"
|
|
150
|
+
method: "POST"
|
|
151
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
152
|
+
send_as: "json"
|
|
153
|
+
body:
|
|
154
|
+
device: "e2e_test_device"
|
|
155
|
+
pseudo: "$var(DEFAULT_USERNAME)"
|
|
156
|
+
password: "e2e_temp_pwd_{$stored.seed_id}"
|
|
157
|
+
expect:
|
|
158
|
+
status: 401
|
|
159
|
+
body:
|
|
160
|
+
errorCode: number
|
|
161
|
+
errorCodeStr: string
|
|
162
|
+
message: string
|
|
163
|
+
|
|
164
|
+
- name: "Revoking an already-revoked temporary credential returns not found"
|
|
165
|
+
method: "POST"
|
|
166
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/{$stored.temp_credential_id}/revoke"
|
|
167
|
+
request_headers:
|
|
168
|
+
- x-api-token: "{$stored.temp_login_token}"
|
|
169
|
+
expect:
|
|
170
|
+
status: 404
|
|
171
|
+
body:
|
|
172
|
+
errorCode: number
|
|
173
|
+
errorCodeStr: string
|
|
174
|
+
message: string
|
|
175
|
+
|
|
176
|
+
- name: "Create an already expired temporary credential"
|
|
177
|
+
method: "POST"
|
|
178
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/create"
|
|
179
|
+
request_headers:
|
|
180
|
+
- x-api-token: "{$stored.temp_login_token}"
|
|
181
|
+
send_as: "json"
|
|
182
|
+
body:
|
|
183
|
+
password: "e2e_expired_pwd_{$stored.seed_id}"
|
|
184
|
+
label: "e2e expired credential {$stored.seed_id}"
|
|
185
|
+
expiresAt: "$date(-1)"
|
|
186
|
+
expect:
|
|
187
|
+
status: 200
|
|
188
|
+
body:
|
|
189
|
+
response:
|
|
190
|
+
id: string
|
|
191
|
+
save:
|
|
192
|
+
expired_credential_id: "{{body.response.id}}"
|
|
193
|
+
|
|
194
|
+
- name: "Login with an expired temporary password fails"
|
|
195
|
+
method: "POST"
|
|
196
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/login"
|
|
197
|
+
send_as: "json"
|
|
198
|
+
body:
|
|
199
|
+
device: "e2e_test_device"
|
|
200
|
+
pseudo: "$var(DEFAULT_USERNAME)"
|
|
201
|
+
password: "e2e_expired_pwd_{$stored.seed_id}"
|
|
202
|
+
expect:
|
|
203
|
+
status: 401
|
|
204
|
+
body:
|
|
205
|
+
errorCode: number
|
|
206
|
+
errorCodeStr: string
|
|
207
|
+
message: string
|
|
208
|
+
|
|
209
|
+
- name: "Cleanup: revoke expired temporary credential"
|
|
210
|
+
method: "POST"
|
|
211
|
+
endpoint: "/api/v1/apiAuth/account/$var(AUTH_PROJECT_NAME)/temp-credentials/{$stored.expired_credential_id}/revoke"
|
|
212
|
+
request_headers:
|
|
213
|
+
- x-api-token: "{$stored.temp_login_token}"
|
|
214
|
+
expect:
|
|
215
|
+
status: 200
|
|
216
|
+
body:
|
|
217
|
+
errorCode: number
|
|
218
|
+
errorCodeStr: string
|
|
219
|
+
message: string
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import hashlib
|
|
2
2
|
import os
|
|
3
3
|
import random
|
|
4
|
+
import re
|
|
4
5
|
import secrets
|
|
5
6
|
import time
|
|
6
7
|
from typing import Any
|
|
@@ -256,13 +257,18 @@ class RestApiRunner(StepRunner):
|
|
|
256
257
|
)
|
|
257
258
|
|
|
258
259
|
# --- JSON parsing ---
|
|
260
|
+
# Best-effort: a non-JSON/empty body (e.g. a redirect response) is only fatal if
|
|
261
|
+
# the step actually needs the parsed body (`expect.body`). Steps that only need
|
|
262
|
+
# `{{headers.*}}` (assertions/save) must still work when the body isn't JSON.
|
|
259
263
|
needs_json = "body" in expect or "assertions" in step or "save" in step
|
|
260
264
|
resp_json = None
|
|
261
265
|
if needs_json:
|
|
262
266
|
try:
|
|
263
267
|
resp_json = resp.json()
|
|
264
268
|
except Exception:
|
|
265
|
-
|
|
269
|
+
if "body" in expect:
|
|
270
|
+
raise AssertionError(f"Response is not valid JSON: {resp.text}")
|
|
271
|
+
resp_json = None
|
|
266
272
|
|
|
267
273
|
# --- Content-Type assertion ---
|
|
268
274
|
expected_content_type = expect.get("content_type")
|
|
@@ -295,32 +301,56 @@ class RestApiRunner(StepRunner):
|
|
|
295
301
|
if "save_file_sha256" in step:
|
|
296
302
|
ctx.store_value(step["save_file_sha256"], hashlib.sha256(resp.content).hexdigest())
|
|
297
303
|
|
|
304
|
+
# `{{headers.*}}` is always available (even on non-JSON/redirect responses);
|
|
305
|
+
# `{{body.*}}` is only available when the response was valid JSON.
|
|
306
|
+
template_context: dict[str, Any] = {"headers": dict(resp.headers)}
|
|
298
307
|
if resp_json is not None:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
308
|
+
template_context["body"] = resp_json
|
|
309
|
+
|
|
310
|
+
if "body" in expect:
|
|
311
|
+
if ctx.is_verbose:
|
|
312
|
+
print(f"Response body: {resp_json}")
|
|
313
|
+
ctx.validate_structure(resp_json, expect["body"])
|
|
314
|
+
|
|
315
|
+
if "assertions" in step:
|
|
316
|
+
for expr in step["assertions"]:
|
|
317
|
+
try:
|
|
318
|
+
expr = ctx.substitute_stored(expr)
|
|
319
|
+
rendered = ctx.render_template(expr, template_context, add_quotes=True)
|
|
320
|
+
ctx.try_eval(rendered, expr)
|
|
321
|
+
except Exception as e:
|
|
322
|
+
raise AssertionError(
|
|
323
|
+
f"Assertion failed for expression\n -->'{expr}'\n -->{e}\n -->{resp.text}"
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
if "save" in step:
|
|
327
|
+
for key, path_expr in step["save"].items():
|
|
328
|
+
try:
|
|
329
|
+
if isinstance(path_expr, dict) and "from" in path_expr and "regex" in path_expr:
|
|
330
|
+
# Regex extraction mode — same shape as check_email's save:
|
|
331
|
+
# save:
|
|
332
|
+
# auth_code:
|
|
333
|
+
# from: "{{headers.Location}}"
|
|
334
|
+
# regex: "code=([^&]+)"
|
|
335
|
+
source_tmpl = ctx.substitute_stored(str(path_expr["from"]))
|
|
336
|
+
source = ctx.render_template(source_tmpl, template_context)
|
|
337
|
+
m = re.search(path_expr["regex"], source)
|
|
338
|
+
if m is None:
|
|
339
|
+
raise AssertionError(
|
|
340
|
+
f"Regex {path_expr['regex']!r} did not match. Source: {source!r}"
|
|
341
|
+
)
|
|
342
|
+
value = m.group(1) if m.lastindex else m.group(0)
|
|
343
|
+
ctx.store_value(key, value)
|
|
344
|
+
else:
|
|
345
|
+
# Plain template mode
|
|
346
|
+
rendered_path = ctx.substitute_stored(str(path_expr))
|
|
347
|
+
rendered = ctx.render_template(rendered_path, template_context)
|
|
320
348
|
ctx.store_value(key, rendered)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
349
|
+
except AssertionError:
|
|
350
|
+
raise
|
|
351
|
+
except Exception as e:
|
|
352
|
+
raise AssertionError(
|
|
353
|
+
f"Failed to render save path\n -->'{path_expr}'\n -->{e}\n -->{resp.text}"
|
|
354
|
+
)
|
|
325
355
|
|
|
326
356
|
return StepResult.passed()
|
|
@@ -23,4 +23,5 @@ sefrone_api_e2e/e2e/Scenarios/Auth/3_admin_account_endpoints.yaml
|
|
|
23
23
|
sefrone_api_e2e/e2e/Scenarios/Auth/4_workspace_endpoints.yaml
|
|
24
24
|
sefrone_api_e2e/e2e/Scenarios/Auth/5_apikey_endpoints.yaml
|
|
25
25
|
sefrone_api_e2e/e2e/Scenarios/Auth/6_project_endpoints.yaml
|
|
26
|
-
sefrone_api_e2e/e2e/Scenarios/Auth/7_email_2fa_flow.yaml
|
|
26
|
+
sefrone_api_e2e/e2e/Scenarios/Auth/7_email_2fa_flow.yaml
|
|
27
|
+
sefrone_api_e2e/e2e/Scenarios/Auth/8_temporary_passwords_flow.yaml
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name="sefrone_api_e2e",
|
|
8
|
-
version="1.2.
|
|
8
|
+
version="1.2.7",
|
|
9
9
|
author="Sefrone",
|
|
10
10
|
author_email="contact@sefrone.com",
|
|
11
11
|
description="A Python package to provide e2e testing helpers for sefrone API projects",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sefrone_api_e2e-1.2.5 → sefrone_api_e2e-1.2.7}/sefrone_api_e2e.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|