Skip to content

Commit 88dfddf

Browse files
authored
feat: migrate "Regression" user stories from Robot to pytest (#1332)
* feat: migrate "Regression" user stories from Robot to pytest - Add structured error message tests for malformed model data (migrated from Robot) - Test API returns proper error messages for malformed RegisteredModel and ModelVersion requests - for both `code` and `message` - Clean ups/linting Signed-off-by: Matteo Mortari <[email protected]> * add comment to Robot Signed-off-by: Matteo Mortari <[email protected]> * linting Signed-off-by: Matteo Mortari <[email protected]> --------- Signed-off-by: Matteo Mortari <[email protected]>
1 parent 4a33154 commit 88dfddf

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

clients/python/tests/regression_test.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from model_registry import ModelRegistry
55
from model_registry.types.artifacts import ModelArtifact
66

7+
from .conftest import REGISTRY_HOST, REGISTRY_PORT
8+
79

810
@pytest.mark.e2e
911
def test_create_tagged_version(client: ModelRegistry):
@@ -101,6 +103,7 @@ async def test_create_standalone_model_artifact(client: ModelRegistry):
101103
mv_ma = await client._api.upsert_model_version_artifact(new_ma, mv.id)
102104
assert mv_ma.id == new_ma.id
103105

106+
104107
@pytest.mark.e2e
105108
async def test_patch_model_artifacts_artifact_type(client: ModelRegistry):
106109
"""Patching Artifacts makes the model registry server panic.
@@ -125,10 +128,46 @@ async def test_patch_model_artifacts_artifact_type(client: ModelRegistry):
125128
assert ma.id
126129

127130
payload = { "modelFormatName": "foo", "artifactType": "model-artifact" }
128-
from .conftest import REGISTRY_HOST, REGISTRY_PORT
129131
response = requests.patch(url=f"{REGISTRY_HOST}:{REGISTRY_PORT}/api/model_registry/v1alpha3/artifacts/{ma.id}", json=payload, timeout=10, headers={"Content-Type": "application/json"})
130132
assert response.status_code == 200
131133
ma = client.get_model_artifact(name, version)
132134
assert ma
133135
assert ma.id
134136
assert ma.model_format_name == "foo"
137+
138+
139+
@pytest.mark.e2e
140+
async def test_as_mlops_engineer_i_would_like_to_store_a_malformed_registered_model_i_get_a_structured_error_message(client: ModelRegistry):
141+
"""As a MLOps engineer if I try to store a malformed RegisteredModel I get a structured error message
142+
"""
143+
payload = { "name": "test_model", "ext_id": 123 }
144+
response = requests.post(url=f"{REGISTRY_HOST}:{REGISTRY_PORT}/api/model_registry/v1alpha3/registered_models", json=payload, timeout=10, headers={"Content-Type": "application/json"})
145+
assert response.status_code == 400
146+
assert response.json() == {
147+
"code": "Bad Request",
148+
"message": 'json: unknown field "ext_id"',
149+
}
150+
151+
152+
@pytest.mark.e2e
153+
async def test_as_mlops_engineer_i_would_like_to_store_a_malformed_model_version_i_get_a_structured_error_message(client: ModelRegistry):
154+
"""As a MLOps engineer if I try to store a malformed ModelVersion I get a structured error message
155+
"""
156+
name = "test_model"
157+
version = "1.0.0"
158+
rm = client.register_model(
159+
name,
160+
"https://acme.org/something",
161+
model_format_name="test_format",
162+
model_format_version="test_version",
163+
version=version,
164+
)
165+
assert rm.id
166+
167+
payload = { "registeredModelId": rm.id }
168+
response = requests.post(url=f"{REGISTRY_HOST}:{REGISTRY_PORT}/api/model_registry/v1alpha3/model_versions", json=payload, timeout=10, headers={"Content-Type": "application/json"})
169+
assert response.status_code == 422
170+
assert response.json() == {
171+
"code": "Bad Request",
172+
"message": "required field 'name' is zero value.",
173+
}

test/robot/Regression.robot

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ Regression tests for Model Registry
1010

1111
*** Test Cases ***
1212
As a MLOps engineer if I try to store a malformed RegisteredModel I get a structured error message
13+
# MIGRATED to test_as_mlops_engineer_i_would_like_to_store_a_malformed_registered_model_i_get_a_structured_error_message in pytest
1314
${rm} Create Dictionary name="model" ext_id=123
1415
${err} POST url=http://${MR_HOST}:${MR_PORT}/api/model_registry/v1alpha3/registered_models json=&{rm} expected_status=400
1516
${rm_err} Create Dictionary code=Bad Request message=json: unknown field "ext_id"
1617
And Should be equal ${rm_err} ${err.json()}
1718

1819
As a MLOps engineer if I try to store a malformed ModelVersion I get a structured error message
20+
# MIGRATED to test_as_mlops_engineer_i_would_like_to_store_a_malformed_model_version_i_get_a_structured_error_message in pytest
1921
${rId} Given I create a RegisteredModel having name=${name}
2022
${mv} Create Dictionary registeredModelId=${rId}
2123
${err} POST url=http://${MR_HOST}:${MR_PORT}/api/model_registry/v1alpha3/model_versions json=&{mv} expected_status=422

0 commit comments

Comments
 (0)