Skip to content

Commit 72086c0

Browse files
committed
address review comment
Signed-off-by: Swati Mukund Bagal <sbagal@redhat.com>
1 parent 8f48de7 commit 72086c0

File tree

2 files changed

+92
-51
lines changed

2 files changed

+92
-51
lines changed

tests/model_serving/maas_billing/maas_subscription/conftest.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,3 +556,75 @@ def premium_system_authenticated_access(
556556
if extra_auth_policy.exists:
557557
LOGGER.info(f"Fixture teardown: ensuring AuthPolicy {extra_auth_policy.name} is removed")
558558
extra_auth_policy.clean_up(wait=True)
559+
560+
561+
@pytest.fixture(scope="function")
562+
def two_active_api_key_ids(
563+
request_session_http: requests.Session,
564+
base_url: str,
565+
ocp_token_for_actor: str,
566+
) -> list[str]:
567+
"""
568+
Create two active API keys and return their IDs for list tests.
569+
"""
570+
ids = [
571+
create_api_key(
572+
base_url=base_url,
573+
ocp_user_token=ocp_token_for_actor,
574+
request_session_http=request_session_http,
575+
api_key_name=f"e2e-fixture-list-{i}-{generate_random_name()}",
576+
)[1]["id"]
577+
for i in range(1, 3)
578+
]
579+
LOGGER.info(f"two_active_api_key_ids: created keys {ids}")
580+
return ids
581+
582+
583+
@pytest.fixture(scope="function")
584+
def active_api_key_id(
585+
request_session_http: requests.Session,
586+
base_url: str,
587+
ocp_token_for_actor: str,
588+
) -> str:
589+
"""
590+
Create a single active API key and return its ID for revoke tests.
591+
"""
592+
key_name = f"e2e-fixture-key-{generate_random_name()}"
593+
_, body = create_api_key(
594+
base_url=base_url,
595+
ocp_user_token=ocp_token_for_actor,
596+
request_session_http=request_session_http,
597+
api_key_name=key_name,
598+
)
599+
LOGGER.info(f"active_api_key_id: created key id={body['id']}")
600+
return body["id"]
601+
602+
603+
@pytest.fixture(scope="function")
604+
def revoked_api_key_id(
605+
request_session_http: requests.Session,
606+
base_url: str,
607+
ocp_token_for_actor: str,
608+
active_api_key_id: str,
609+
) -> str:
610+
"""
611+
Revoke the active API key and return its ID.
612+
613+
Asserts the DELETE response confirms status='revoked'.
614+
Used as a precondition fixture for tests that verify revoked state persists.
615+
"""
616+
from tests.model_serving.maas_billing.maas_subscription.utils import revoke_api_key
617+
618+
revoke_resp, revoke_body = revoke_api_key(
619+
request_session_http=request_session_http,
620+
base_url=base_url,
621+
key_id=active_api_key_id,
622+
ocp_user_token=ocp_token_for_actor,
623+
)
624+
assert revoke_resp.status_code == 200, (
625+
f"Expected 200 on DELETE /v1/api-keys/{active_api_key_id}, "
626+
f"got {revoke_resp.status_code}: {revoke_resp.text[:200]}"
627+
)
628+
assert revoke_body.get("status") == "revoked", f"Expected status='revoked' in DELETE response, got: {revoke_body}"
629+
LOGGER.info(f"revoked_api_key_id: revoked key id={active_api_key_id}")
630+
return active_api_key_id

tests/model_serving/maas_billing/maas_subscription/test_api_key_crud.py

Lines changed: 20 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
create_api_key,
99
get_api_key,
1010
list_api_keys,
11-
revoke_api_key,
1211
)
1312
from utilities.general import generate_random_name
1413

@@ -42,9 +41,8 @@ def test_create_api_key(
4241
api_key_name=key_name,
4342
)
4443

45-
assert "id" in body, "Expected 'id' field in create response"
46-
assert "key" in body, "Expected 'key' field in create response"
47-
assert "name" in body, "Expected 'name' field in create response"
44+
for field in ("id", "key", "name"):
45+
assert field in body, f"Expected '{field}' field in create response"
4846

4947
key = body["key"]
5048
assert key.startswith("sk-oai-"), "Expected key to start with 'sk-oai-' prefix"
@@ -70,26 +68,9 @@ def test_list_api_keys(
7068
request_session_http: requests.Session,
7169
base_url: str,
7270
ocp_token_for_actor: str,
71+
two_active_api_key_ids: list[str],
7372
) -> None:
74-
"""Verify active API keys are listed and pagination works."""
75-
76-
key1_name = f"e2e-crud-list-1-{generate_random_name()}"
77-
key2_name = f"e2e-crud-list-2-{generate_random_name()}"
78-
79-
_, key1_body = create_api_key(
80-
base_url=base_url,
81-
ocp_user_token=ocp_token_for_actor,
82-
request_session_http=request_session_http,
83-
api_key_name=key1_name,
84-
)
85-
_, key2_body = create_api_key(
86-
base_url=base_url,
87-
ocp_user_token=ocp_token_for_actor,
88-
request_session_http=request_session_http,
89-
api_key_name=key2_name,
90-
)
91-
key1_id = key1_body["id"]
92-
key2_id = key2_body["id"]
73+
"""Verify active API keys are listed and no plaintext key is exposed."""
9374

9475
list_resp, list_body = list_api_keys(
9576
request_session_http=request_session_http,
@@ -107,14 +88,24 @@ def test_list_api_keys(
10788
assert len(items) >= 2, f"Expected at least 2 active keys, got {len(items)}"
10889

10990
key_ids = [item["id"] for item in items]
110-
assert key1_id in key_ids, f"key1 id={key1_id} not found in listed keys: {key_ids}"
111-
assert key2_id in key_ids, f"key2 id={key2_id} not found in listed keys: {key_ids}"
91+
for created_id in two_active_api_key_ids:
92+
assert created_id in key_ids, f"Created key id={created_id} not found in listed keys"
11293

11394
for item in items:
11495
assert "key" not in item, f"Plaintext key must not appear in any list item: {item}"
11596

11697
LOGGER.info(f"[list] Found {len(items)} active keys")
11798

99+
@pytest.mark.tier1
100+
@pytest.mark.parametrize("ocp_token_for_actor", [{"type": "admin"}], indirect=True)
101+
def test_list_api_keys_pagination(
102+
self,
103+
request_session_http: requests.Session,
104+
base_url: str,
105+
ocp_token_for_actor: str,
106+
) -> None:
107+
"""Verify that the search endpoint respects the pagination limit."""
108+
118109
page_resp, page_body = list_api_keys(
119110
request_session_http=request_session_http,
120111
base_url=base_url,
@@ -137,40 +128,18 @@ def test_revoke_api_key(
137128
request_session_http: requests.Session,
138129
base_url: str,
139130
ocp_token_for_actor: str,
131+
revoked_api_key_id: str,
140132
) -> None:
141-
"""Verify an API key can be revoked and remains revoked on GET."""
142-
143-
key_name = f"e2e-crud-revoke-{generate_random_name()}"
144-
145-
_, body = create_api_key(
146-
base_url=base_url,
147-
ocp_user_token=ocp_token_for_actor,
148-
request_session_http=request_session_http,
149-
api_key_name=key_name,
150-
)
151-
key_id = body["id"]
152-
153-
revoke_resp, revoke_body = revoke_api_key(
154-
request_session_http=request_session_http,
155-
base_url=base_url,
156-
key_id=key_id,
157-
ocp_user_token=ocp_token_for_actor,
158-
)
159-
assert revoke_resp.status_code == 200, (
160-
f"Expected 200 on DELETE /v1/api-keys/{key_id}, got {revoke_resp.status_code}: {revoke_resp.text[:200]}"
161-
)
162-
assert revoke_body.get("status") == "revoked", (
163-
f"Expected status='revoked' in DELETE response, got: {revoke_body}"
164-
)
133+
"""Verify a revoked API key shows status='revoked' on subsequent GET."""
165134

166135
get_resp, get_body = get_api_key(
167136
request_session_http=request_session_http,
168137
base_url=base_url,
169-
key_id=key_id,
138+
key_id=revoked_api_key_id,
170139
ocp_user_token=ocp_token_for_actor,
171140
)
172141
assert get_resp.status_code == 200, (
173142
f"Expected 200 on GET after revoke, got {get_resp.status_code}: {get_resp.text[:200]}"
174143
)
175144
assert get_body.get("status") == "revoked", f"Expected status='revoked' on GET after revoke, got: {get_body}"
176-
LOGGER.info(f"[revoke] Key {key_id} confirmed revoked")
145+
LOGGER.info(f"[revoke] Key {revoked_api_key_id} confirmed revoked")

0 commit comments

Comments
 (0)