Skip to content

Commit c799a7f

Browse files
committed
Add more elaborate server event testing
1 parent e6e2ca3 commit c799a7f

1 file changed

Lines changed: 48 additions & 5 deletions

File tree

jupyterhub/tests/test_eventlog.py

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
import pytest
1515
from traitlets.config import Config
1616

17+
from .. import orm
1718
from .mocking import MockHub
19+
from .utils import add_user
20+
from .utils import api_request
21+
from jupyterhub.utils import eventlogging_schema_fqn
1822

1923

2024
# To test new schemas, add them to the `valid_events`
@@ -24,7 +28,7 @@
2428
# { ( '<schema id>', <version> ) : { <event_data> } }
2529
valid_events = [
2630
(
27-
'hub.jupyter.org/server-action',
31+
eventlogging_schema_fqn('server-action'),
2832
1,
2933
dict(action='start', username='test-username', servername='test-servername'),
3034
)
@@ -34,7 +38,7 @@
3438
# { ( '<schema id>', <version> ) : { <event_data> } }
3539
invalid_events = [
3640
# Missing required keys
37-
('hub.jupyter.org/server-action', 1, dict(action='start'))
41+
(eventlogging_schema_fqn('server-action'), 1, dict(action='start'))
3842
]
3943

4044

@@ -50,15 +54,17 @@ def eventlog_sink(app):
5054
with mock.patch.object(app.config, 'EventLog', cfg.EventLog):
5155
# recreate the eventlog object with our config
5256
app.init_eventlog()
57+
app.tornado_settings['eventlog'] = app.eventlog
5358
# return the sink from the fixture
54-
yield app.eventlog, sink
59+
yield app, sink
5560
# reset eventlog with original config
5661
app.init_eventlog()
5762

5863

5964
@pytest.mark.parametrize('schema, version, event', valid_events)
6065
def test_valid_events(eventlog_sink, schema, version, event):
61-
eventlog, sink = eventlog_sink
66+
app, sink = eventlog_sink
67+
eventlog = app.eventlog
6268
eventlog.allowed_schemas = [schema]
6369
# Record event
6470
eventlog.record_event(schema, version, event)
@@ -72,9 +78,46 @@ def test_valid_events(eventlog_sink, schema, version, event):
7278

7379
@pytest.mark.parametrize('schema, version, event', invalid_events)
7480
def test_invalid_events(eventlog_sink, schema, version, event):
75-
eventlog, sink = eventlog_sink
81+
app, sink = eventlog_sink
82+
eventlog = app.eventlog
7683
eventlog.allowed_schemas = [schema]
7784

7885
# Make sure an error is thrown when bad events are recorded
7986
with pytest.raises(jsonschema.ValidationError):
8087
recorded_event = eventlog.record_event(schema, version, event)
88+
89+
90+
def remove_event_capsule(data):
91+
return {
92+
k: v for k, v in data.items() if not (k.startswith('__') and k.endswith('__'))
93+
}
94+
95+
96+
async def test_server_event(eventlog_sink):
97+
schema, version = (eventlogging_schema_fqn('server-action'), 1)
98+
99+
app, sink = eventlog_sink
100+
app.eventlog.allowed_schemas = [schema]
101+
102+
db = app.db
103+
name = 'user'
104+
user = add_user(db, app=app, name=name)
105+
106+
# test user server starting event
107+
r = await api_request(app, 'users', name, 'server', method='post')
108+
output = sink.getvalue()
109+
assert output
110+
data = remove_event_capsule(json.loads(output))
111+
jsonschema.validate(data, app.eventlog.schemas[(schema, version)])
112+
expected = {'action': 'start', 'username': name}
113+
assert expected.items() <= data.items()
114+
115+
# test user server stopping event
116+
r = await api_request(app, 'users', name, 'server', method='delete')
117+
offset = len(output)
118+
output = sink.getvalue()[offset:]
119+
assert output
120+
data = remove_event_capsule(json.loads(output))
121+
jsonschema.validate(data, app.eventlog.schemas[(schema, version)])
122+
expected = {'action': 'stop', 'username': name}
123+
assert expected.items() <= data.items()

0 commit comments

Comments
 (0)