Skip to content

Commit b702567

Browse files
authored
Merge pull request #422 from aignostics/chore/add-test-environment
chore: add test environment support
2 parents e71465a + 53d278e commit b702567

4 files changed

Lines changed: 133 additions & 64 deletions

File tree

src/aignostics/platform/__init__.py

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,35 +38,43 @@
3838
from ._client import Client
3939
from ._constants import (
4040
API_ROOT_DEV,
41-
API_ROOT_PRODUCTION,
41+
API_ROOT_TEST,
4242
API_ROOT_STAGING,
43+
API_ROOT_PRODUCTION,
4344
AUDIENCE_DEV,
44-
AUDIENCE_PRODUCTION,
45+
AUDIENCE_TEST,
4546
AUDIENCE_STAGING,
47+
AUDIENCE_PRODUCTION,
4648
AUTHORIZATION_BASE_URL_DEV,
47-
AUTHORIZATION_BASE_URL_PRODUCTION,
49+
AUTHORIZATION_BASE_URL_TEST,
4850
AUTHORIZATION_BASE_URL_STAGING,
51+
AUTHORIZATION_BASE_URL_PRODUCTION,
4952
CLIENT_ID_INTERACTIVE_DEV,
50-
CLIENT_ID_INTERACTIVE_PRODUCTION,
53+
CLIENT_ID_INTERACTIVE_TEST,
5154
CLIENT_ID_INTERACTIVE_STAGING,
55+
CLIENT_ID_INTERACTIVE_PRODUCTION,
5256
DEFAULT_CPU_PROVISIONING_MODE,
5357
DEFAULT_FLEX_START_MAX_RUN_DURATION_MINUTES,
5458
DEFAULT_GPU_PROVISIONING_MODE,
5559
DEFAULT_GPU_TYPE,
5660
DEFAULT_MAX_GPUS_PER_SLIDE,
5761
DEFAULT_NODE_ACQUISITION_TIMEOUT_MINUTES,
5862
DEVICE_URL_DEV,
59-
DEVICE_URL_PRODUCTION,
63+
DEVICE_URL_TEST,
6064
DEVICE_URL_STAGING,
65+
DEVICE_URL_PRODUCTION,
6166
JWS_JSON_URL_DEV,
62-
JWS_JSON_URL_PRODUCTION,
67+
JWS_JSON_URL_TEST,
6368
JWS_JSON_URL_STAGING,
69+
JWS_JSON_URL_PRODUCTION,
6470
REDIRECT_URI_DEV,
65-
REDIRECT_URI_PRODUCTION,
71+
REDIRECT_URI_TEST,
6672
REDIRECT_URI_STAGING,
73+
REDIRECT_URI_PRODUCTION,
6774
TOKEN_URL_DEV,
68-
TOKEN_URL_PRODUCTION,
75+
TOKEN_URL_TEST,
6976
TOKEN_URL_STAGING,
77+
TOKEN_URL_PRODUCTION,
7078
)
7179
from ._messages import AUTHENTICATION_FAILED, NOT_YET_IMPLEMENTED, UNKNOWN_ENDPOINT_URL
7280
from ._sdk_metadata import (
@@ -87,18 +95,22 @@
8795

8896
__all__ = [
8997
"API_ROOT_DEV",
90-
"API_ROOT_PRODUCTION",
98+
"API_ROOT_TEST",
9199
"API_ROOT_STAGING",
100+
"API_ROOT_PRODUCTION",
92101
"AUDIENCE_DEV",
93-
"AUDIENCE_PRODUCTION",
102+
"AUDIENCE_TEST",
94103
"AUDIENCE_STAGING",
104+
"AUDIENCE_PRODUCTION",
95105
"AUTHENTICATION_FAILED",
96106
"AUTHORIZATION_BASE_URL_DEV",
97-
"AUTHORIZATION_BASE_URL_PRODUCTION",
107+
"AUTHORIZATION_BASE_URL_TEST",
98108
"AUTHORIZATION_BASE_URL_STAGING",
109+
"AUTHORIZATION_BASE_URL_PRODUCTION",
99110
"CLIENT_ID_INTERACTIVE_DEV",
100-
"CLIENT_ID_INTERACTIVE_PRODUCTION",
111+
"CLIENT_ID_INTERACTIVE_TEST",
101112
"CLIENT_ID_INTERACTIVE_STAGING",
113+
"CLIENT_ID_INTERACTIVE_PRODUCTION",
102114
"DEFAULT_CPU_PROVISIONING_MODE",
103115
"DEFAULT_CPU_PROVISIONING_MODE",
104116
"DEFAULT_FLEX_START_MAX_RUN_DURATION_MINUTES",
@@ -110,21 +122,25 @@
110122
"DEFAULT_MAX_GPUS_PER_SLIDE",
111123
"DEFAULT_NODE_ACQUISITION_TIMEOUT_MINUTES",
112124
"DEVICE_URL_DEV",
113-
"DEVICE_URL_PRODUCTION",
125+
"DEVICE_URL_TEST",
114126
"DEVICE_URL_STAGING",
127+
"DEVICE_URL_PRODUCTION",
115128
"JWS_JSON_URL_DEV",
116-
"JWS_JSON_URL_PRODUCTION",
129+
"JWS_JSON_URL_TEST",
117130
"JWS_JSON_URL_STAGING",
131+
"JWS_JSON_URL_PRODUCTION",
118132
"LIST_APPLICATION_RUNS_MAX_PAGE_SIZE",
119133
"LIST_APPLICATION_RUNS_MIN_PAGE_SIZE",
120134
"NOT_YET_IMPLEMENTED",
121135
"NOT_YET_IMPLEMENTED",
122136
"REDIRECT_URI_DEV",
123-
"REDIRECT_URI_PRODUCTION",
137+
"REDIRECT_URI_TEST",
124138
"REDIRECT_URI_STAGING",
139+
"REDIRECT_URI_PRODUCTION",
125140
"TOKEN_URL_DEV",
126-
"TOKEN_URL_PRODUCTION",
141+
"TOKEN_URL_TEST",
127142
"TOKEN_URL_STAGING",
143+
"TOKEN_URL_PRODUCTION",
128144
"UNKNOWN_ENDPOINT_URL",
129145
"ApiException",
130146
"Application",

src/aignostics/platform/_constants.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
"""Client specific and other constants such as defaults."""
22

3-
API_ROOT_PRODUCTION = "https://platform.aignostics.com"
4-
CLIENT_ID_INTERACTIVE_PRODUCTION = "YtJ7F9lAtxx16SZGQlYPe6wcjlXB78MM" # not a secret, but a public client ID
5-
AUDIENCE_PRODUCTION = "https://aignostics-platform-samia"
6-
AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize"
7-
TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105
8-
REDIRECT_URI_PRODUCTION = "http://localhost:8989/"
9-
DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code"
10-
JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json"
3+
API_ROOT_DEV = "https://platform-dev.aignostics.ai"
4+
CLIENT_ID_INTERACTIVE_DEV = "gqduveFvx7LX90drQPGzr4JGUYdh24gA" # not a secret, but a public client ID
5+
AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia"
6+
AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize"
7+
TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105
8+
REDIRECT_URI_DEV = "http://localhost:8989/"
9+
DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code"
10+
JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json"
11+
12+
API_ROOT_TEST = "https://platform-test.aignostics.ai"
13+
CLIENT_ID_INTERACTIVE_TEST = "gqduveFvx7LX90drQPGzr4JGUYdh24gA" # not a secret, but a public client ID (same as dev)
14+
AUDIENCE_TEST = "https://dev-8ouohmmrbuh2h4vu-samia"
15+
AUTHORIZATION_BASE_URL_TEST = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize"
16+
TOKEN_URL_TEST = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105
17+
REDIRECT_URI_TEST = "http://localhost:8989/"
18+
DEVICE_URL_TEST = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code"
19+
JWS_JSON_URL_TEST = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json"
1120

1221
API_ROOT_STAGING = "https://platform-staging.aignostics.com"
1322
CLIENT_ID_INTERACTIVE_STAGING = "fQkbvYzQPPVwLxc3uque5JsyFW00rJ7b" # not a secret, but a public client ID
@@ -18,14 +27,14 @@
1827
DEVICE_URL_STAGING = "https://aignostics-platform-staging.eu.auth0.com/oauth/device/code"
1928
JWS_JSON_URL_STAGING = "https://aignostics-platform-staging.eu.auth0.com/.well-known/jwks.json"
2029

21-
API_ROOT_DEV = "https://platform-dev.aignostics.ai"
22-
CLIENT_ID_INTERACTIVE_DEV = "gqduveFvx7LX90drQPGzr4JGUYdh24gA" # not a secret, but a public client ID
23-
AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia"
24-
AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize"
25-
TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105
26-
REDIRECT_URI_DEV = "http://localhost:8989/"
27-
DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code"
28-
JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json"
30+
API_ROOT_PRODUCTION = "https://platform.aignostics.com"
31+
CLIENT_ID_INTERACTIVE_PRODUCTION = "YtJ7F9lAtxx16SZGQlYPe6wcjlXB78MM" # not a secret, but a public client ID
32+
AUDIENCE_PRODUCTION = "https://aignostics-platform-samia"
33+
AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize"
34+
TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105
35+
REDIRECT_URI_PRODUCTION = "http://localhost:8989/"
36+
DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code"
37+
JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json"
2938

3039
# Pipeline orchestration defaults
3140
DEFAULT_GPU_TYPE = "L4"

src/aignostics/platform/_settings.py

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,37 @@
2323

2424
from ._constants import (
2525
API_ROOT_DEV,
26-
API_ROOT_PRODUCTION,
26+
API_ROOT_TEST,
2727
API_ROOT_STAGING,
28+
API_ROOT_PRODUCTION,
2829
AUDIENCE_DEV,
29-
AUDIENCE_PRODUCTION,
30+
AUDIENCE_TEST,
3031
AUDIENCE_STAGING,
32+
AUDIENCE_PRODUCTION,
3133
AUTHORIZATION_BASE_URL_DEV,
32-
AUTHORIZATION_BASE_URL_PRODUCTION,
34+
AUTHORIZATION_BASE_URL_TEST,
3335
AUTHORIZATION_BASE_URL_STAGING,
36+
AUTHORIZATION_BASE_URL_PRODUCTION,
3437
CLIENT_ID_INTERACTIVE_DEV,
35-
CLIENT_ID_INTERACTIVE_PRODUCTION,
38+
CLIENT_ID_INTERACTIVE_TEST,
3639
CLIENT_ID_INTERACTIVE_STAGING,
40+
CLIENT_ID_INTERACTIVE_PRODUCTION,
3741
DEVICE_URL_DEV,
38-
DEVICE_URL_PRODUCTION,
42+
DEVICE_URL_TEST,
3943
DEVICE_URL_STAGING,
44+
DEVICE_URL_PRODUCTION,
4045
JWS_JSON_URL_DEV,
41-
JWS_JSON_URL_PRODUCTION,
46+
JWS_JSON_URL_TEST,
4247
JWS_JSON_URL_STAGING,
48+
JWS_JSON_URL_PRODUCTION,
4349
REDIRECT_URI_DEV,
44-
REDIRECT_URI_PRODUCTION,
50+
REDIRECT_URI_TEST,
4551
REDIRECT_URI_STAGING,
52+
REDIRECT_URI_PRODUCTION,
4653
TOKEN_URL_DEV,
47-
TOKEN_URL_PRODUCTION,
54+
TOKEN_URL_TEST,
4855
TOKEN_URL_STAGING,
56+
TOKEN_URL_PRODUCTION,
4957
)
5058
from ._messages import UNKNOWN_ENDPOINT_URL
5159

@@ -519,22 +527,6 @@ def pre_init(cls, values: dict) -> dict: # type: ignore[type-arg] # noqa: N805
519527
return values
520528

521529
match api_root:
522-
case x if x == API_ROOT_PRODUCTION:
523-
values["audience"] = AUDIENCE_PRODUCTION
524-
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_PRODUCTION
525-
values["token_url"] = TOKEN_URL_PRODUCTION
526-
values["redirect_uri"] = REDIRECT_URI_PRODUCTION
527-
values["device_url"] = DEVICE_URL_PRODUCTION
528-
values["jws_json_url"] = JWS_JSON_URL_PRODUCTION
529-
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_PRODUCTION
530-
case x if x == API_ROOT_STAGING:
531-
values["audience"] = AUDIENCE_STAGING
532-
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_STAGING
533-
values["token_url"] = TOKEN_URL_STAGING
534-
values["redirect_uri"] = REDIRECT_URI_STAGING
535-
values["device_url"] = DEVICE_URL_STAGING
536-
values["jws_json_url"] = JWS_JSON_URL_STAGING
537-
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_STAGING
538530
case x if x == API_ROOT_DEV:
539531
values["audience"] = AUDIENCE_DEV
540532
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_DEV
@@ -543,6 +535,30 @@ def pre_init(cls, values: dict) -> dict: # type: ignore[type-arg] # noqa: N805
543535
values["device_url"] = DEVICE_URL_DEV
544536
values["jws_json_url"] = JWS_JSON_URL_DEV
545537
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_DEV
538+
case x if x == API_ROOT_TEST:
539+
values["audience"] = AUDIENCE_TEST
540+
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_TEST
541+
values["token_url"] = TOKEN_URL_TEST
542+
values["redirect_uri"] = REDIRECT_URI_TEST
543+
values["device_url"] = DEVICE_URL_TEST
544+
values["jws_json_url"] = JWS_JSON_URL_TEST
545+
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_TEST
546+
case x if x == API_ROOT_STAGING:
547+
values["audience"] = AUDIENCE_STAGING
548+
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_STAGING
549+
values["token_url"] = TOKEN_URL_STAGING
550+
values["redirect_uri"] = REDIRECT_URI_STAGING
551+
values["device_url"] = DEVICE_URL_STAGING
552+
values["jws_json_url"] = JWS_JSON_URL_STAGING
553+
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_STAGING
554+
case x if x == API_ROOT_PRODUCTION:
555+
values["audience"] = AUDIENCE_PRODUCTION
556+
values["authorization_base_url"] = AUTHORIZATION_BASE_URL_PRODUCTION
557+
values["token_url"] = TOKEN_URL_PRODUCTION
558+
values["redirect_uri"] = REDIRECT_URI_PRODUCTION
559+
values["device_url"] = DEVICE_URL_PRODUCTION
560+
values["jws_json_url"] = JWS_JSON_URL_PRODUCTION
561+
values["client_id_interactive"] = CLIENT_ID_INTERACTIVE_PRODUCTION
546562
case _:
547563
raise ValueError(UNKNOWN_ENDPOINT_URL)
548564

tests/aignostics/platform/settings_test.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,37 @@
1010

1111
from aignostics.platform import (
1212
API_ROOT_DEV,
13-
API_ROOT_PRODUCTION,
13+
API_ROOT_TEST,
1414
API_ROOT_STAGING,
15+
API_ROOT_PRODUCTION,
1516
AUDIENCE_DEV,
16-
AUDIENCE_PRODUCTION,
17+
AUDIENCE_TEST,
1718
AUDIENCE_STAGING,
19+
AUDIENCE_PRODUCTION,
1820
AUTHORIZATION_BASE_URL_DEV,
19-
AUTHORIZATION_BASE_URL_PRODUCTION,
21+
AUTHORIZATION_BASE_URL_TEST,
2022
AUTHORIZATION_BASE_URL_STAGING,
23+
AUTHORIZATION_BASE_URL_PRODUCTION,
2124
CLIENT_ID_INTERACTIVE_DEV,
22-
CLIENT_ID_INTERACTIVE_PRODUCTION,
25+
CLIENT_ID_INTERACTIVE_TEST,
2326
CLIENT_ID_INTERACTIVE_STAGING,
27+
CLIENT_ID_INTERACTIVE_PRODUCTION,
2428
DEVICE_URL_DEV,
25-
DEVICE_URL_PRODUCTION,
29+
DEVICE_URL_TEST,
2630
DEVICE_URL_STAGING,
31+
DEVICE_URL_PRODUCTION,
2732
JWS_JSON_URL_DEV,
28-
JWS_JSON_URL_PRODUCTION,
33+
JWS_JSON_URL_TEST,
2934
JWS_JSON_URL_STAGING,
35+
JWS_JSON_URL_PRODUCTION,
3036
REDIRECT_URI_DEV,
31-
REDIRECT_URI_PRODUCTION,
37+
REDIRECT_URI_TEST,
3238
REDIRECT_URI_STAGING,
39+
REDIRECT_URI_PRODUCTION,
3340
TOKEN_URL_DEV,
34-
TOKEN_URL_PRODUCTION,
41+
TOKEN_URL_TEST,
3542
TOKEN_URL_STAGING,
43+
TOKEN_URL_PRODUCTION,
3644
UNKNOWN_ENDPOINT_URL,
3745
Settings,
3846
settings,
@@ -130,6 +138,26 @@ def test_authentication_settings_dev(record_property, mock_env_vars) -> None:
130138
assert settings.jws_json_url == JWS_JSON_URL_DEV
131139

132140

141+
@pytest.mark.unit
142+
def test_authentication_settings_test(record_property, mock_env_vars) -> None:
143+
"""Test authentication settings with test API root."""
144+
record_property("tested-item-id", "SPEC-PLATFORM-SERVICE")
145+
settings = Settings(
146+
client_id_device=SecretStr("test-client-id-device"),
147+
api_root=API_ROOT_TEST,
148+
)
149+
150+
assert settings.api_root == API_ROOT_TEST
151+
assert settings.client_id_interactive == CLIENT_ID_INTERACTIVE_TEST
152+
assert settings.client_id_device.get_secret_value() == "test-client-id-device"
153+
assert settings.audience == AUDIENCE_TEST
154+
assert settings.authorization_base_url == AUTHORIZATION_BASE_URL_TEST
155+
assert settings.token_url == TOKEN_URL_TEST
156+
assert settings.redirect_uri == REDIRECT_URI_TEST
157+
assert settings.device_url == DEVICE_URL_TEST
158+
assert settings.jws_json_url == JWS_JSON_URL_TEST
159+
160+
133161
@pytest.mark.unit
134162
def test_authentication_settings_unknown_api_root(record_property, mock_env_vars) -> None:
135163
"""Test authentication settings with unknown API root raises ValueError."""

0 commit comments

Comments
 (0)