Skip to content

Commit 21da85d

Browse files
committed
Update exception strategy and tests
1 parent f5bb5a8 commit 21da85d

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

jupyter_server/services/events/handlers.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from typing import TYPE_CHECKING, Any, Dict, Optional, cast
1111

1212
from jupyter_core.utils import ensure_async
13-
from jupyter_events.logger import SchemaNotRegistered
1413
from tornado import web, websocket
1514

1615
from jupyter_server.auth.decorator import authorized, ws_authenticated
@@ -72,12 +71,19 @@ def on_close(self):
7271
self.event_logger.remove_listener(listener=self.event_listener)
7372

7473

75-
def validate_model(data: dict[str, Any]) -> None:
76-
"""Validates for required fields in the JSON request body"""
74+
def validate_model(data: dict[str, Any], schema: jupyter_events.schema.EventSchema) -> None:
75+
"""Validates for required fields in the JSON request body and verifies that
76+
a registered schema/version exists"""
7777
required_keys = {"schema_id", "version", "data"}
7878
for key in required_keys:
7979
if key not in data:
80-
raise web.HTTPError(400, f"Missing `{key}` in the JSON request body.")
80+
raise Exception(f"Missing `{key}` in the JSON request body.")
81+
schema_id = cast(str, data.get("schema_id"))
82+
version = cast(int, data.get("version"))
83+
if schema is None:
84+
raise Exception(f"Unregistered schema: `{schema_id}`")
85+
if schema.version != version:
86+
raise Exception(f"Unregistered version: `{version}` for `{schema_id}`")
8187

8288

8389
def get_timestamp(data: dict[str, Any]) -> Optional[datetime]:
@@ -112,21 +118,19 @@ async def post(self):
112118
raise web.HTTPError(400, "No JSON data provided")
113119

114120
try:
115-
validate_model(payload)
121+
schema = self.event_logger.schemas.get(cast(str, payload.get("schema_id")))
122+
validate_model(payload, schema)
116123
self.event_logger.emit(
117-
schema_id=cast(str, payload.get("schema_id")),
124+
schema_id=schema.id,
118125
data=cast("Dict[str, Any]", payload.get("data")),
119126
timestamp_override=get_timestamp(payload),
120127
)
121128
self.set_status(204)
122129
self.finish()
123-
except web.HTTPError:
124-
raise
125-
except SchemaNotRegistered as e:
126-
message = f"Unregistered event schema: ${str(e)}"
127-
raise web.HTTPError(400, message) from e
128130
except Exception as e:
129-
raise web.HTTPError(500, str(e)) from e
131+
# All known exceptions are raised by bad requests, e.g., bad
132+
# version, unregistered schema, invalid emission data payload, etc.
133+
raise web.HTTPError(400, str(e)) from e
130134

131135

132136
default_handlers = [

tests/services/events/test_api.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,6 @@ async def test_post_event(jp_fetch, event_logger_sink, payload):
127127
}
128128
"""
129129

130-
131-
@pytest.mark.parametrize("payload", [payload_3, payload_4, payload_5, payload_6, payload_7])
132-
async def test_post_event_400(jp_fetch, event_logger, payload):
133-
with pytest.raises(tornado.httpclient.HTTPClientError) as e:
134-
await jp_fetch("api", "events", method="POST", body=payload)
135-
136-
assert expected_http_error(e, 400)
137-
138-
139130
payload_8 = """\
140131
{
141132
"schema_id": "http://event.mock.jupyter.org/message",
@@ -151,15 +142,17 @@ async def test_post_event_400(jp_fetch, event_logger, payload):
151142
"schema_id": "http://event.mock.jupyter.org/message",
152143
"version": 2,
153144
"data": {
154-
"message": "Hello, world!"
145+
"event_message": "Hello, world!"
155146
}
156147
}
157148
"""
158149

159150

160-
@pytest.mark.parametrize("payload", [payload_8, payload_9])
161-
async def test_post_event_500(jp_fetch, event_logger, payload):
151+
@pytest.mark.parametrize(
152+
"payload",
153+
[payload_3, payload_4, payload_5, payload_6, payload_7, payload_8, payload_9],
154+
)
155+
async def test_post_event_400(jp_fetch, event_logger, payload):
162156
with pytest.raises(tornado.httpclient.HTTPClientError) as e:
163157
await jp_fetch("api", "events", method="POST", body=payload)
164-
165-
assert expected_http_error(e, 500)
158+
assert expected_http_error(e, 400)

0 commit comments

Comments
 (0)