1
+ import io
1
2
import json
3
+ import logging
2
4
import pathlib
3
5
4
6
import pytest
7
+ import tornado
8
+ from jupyter_telemetry .eventlog import _skip_message
9
+ from pythonjsonlogger import jsonlogger
10
+
11
+ from tests .utils import expected_http_error
5
12
6
13
7
14
@pytest .fixture
8
- def event_bus (jp_serverapp ):
15
+ def eventbus_sink (jp_serverapp ):
9
16
event_bus = jp_serverapp .event_bus
10
17
# Register the event schema defined in this directory.
11
18
schema_file = pathlib .Path (__file__ ).parent / "mock_event.yaml"
12
19
event_bus .register_schema_file (schema_file )
13
- #
14
20
event_bus .allowed_schemas = ["event.mock.jupyter.org/message" ]
21
+
22
+ sink = io .StringIO ()
23
+ formatter = jsonlogger .JsonFormatter (json_serializer = _skip_message )
24
+ handler = logging .StreamHandler (sink )
25
+ handler .setFormatter (formatter )
26
+ event_bus .handlers = [handler ]
27
+ event_bus .log .addHandler (handler )
28
+
29
+ return event_bus , sink
30
+
31
+
32
+ @pytest .fixture
33
+ def event_bus (eventbus_sink ):
34
+ event_bus , sink = eventbus_sink
15
35
return event_bus
16
36
17
37
18
38
async def test_subscribe_websocket (jp_ws_fetch , event_bus ):
19
- # Open a websocket connection.
20
39
ws = await jp_ws_fetch ("/api/events/subscribe" )
21
40
22
41
event_bus .record_event (
@@ -26,7 +45,119 @@ async def test_subscribe_websocket(jp_ws_fetch, event_bus):
26
45
)
27
46
message = await ws .read_message ()
28
47
event_data = json .loads (message )
29
- # Close websocket
30
48
ws .close ()
31
49
32
50
assert event_data .get ("event_message" ) == "Hello, world!"
51
+
52
+
53
+ payload_1 = """\
54
+ {
55
+ "schema_name": "event.mock.jupyter.org/message",
56
+ "version": 1,
57
+ "event": {
58
+ "event_message": "Hello, world!"
59
+ },
60
+ "timestamp": "2022-05-26T12:50:00+06:00Z"
61
+ }
62
+ """
63
+
64
+ payload_2 = """\
65
+ {
66
+ "schema_name": "event.mock.jupyter.org/message",
67
+ "version": 1,
68
+ "event": {
69
+ "event_message": "Hello, world!"
70
+ }
71
+ }
72
+ """
73
+
74
+
75
+ @pytest .mark .parametrize ("payload" , [payload_1 , payload_2 ])
76
+ async def test_post_event (jp_fetch , eventbus_sink , payload ):
77
+ event_bus , sink = eventbus_sink
78
+
79
+ r = await jp_fetch ("api" , "events" , method = "POST" , body = payload )
80
+ assert r .code == 204
81
+
82
+ output = sink .getvalue ()
83
+ assert output
84
+ input = json .loads (payload )
85
+ data = json .loads (output )
86
+ assert input ["event" ]["event_message" ] == data ["event_message" ]
87
+ assert data ["__timestamp__" ]
88
+ if "timestamp" in input :
89
+ assert input ["timestamp" ] == data ["__timestamp__" ]
90
+
91
+
92
+ payload_3 = """\
93
+ {
94
+ "schema_name": "event.mock.jupyter.org/message",
95
+ "event": {
96
+ "event_message": "Hello, world!"
97
+ }
98
+ }
99
+ """
100
+
101
+ payload_4 = """\
102
+ {
103
+ "version": 1,
104
+ "event": {
105
+ "event_message": "Hello, world!"
106
+ }
107
+ }
108
+ """
109
+
110
+ payload_5 = """\
111
+ {
112
+ "schema_name": "event.mock.jupyter.org/message",
113
+ "version": 1
114
+ }
115
+ """
116
+
117
+ payload_6 = """\
118
+ {
119
+ "schema_name": "event.mock.jupyter.org/message",
120
+ "version": 1,
121
+ "event": {
122
+ "event_message": "Hello, world!"
123
+ },
124
+ "timestamp": "2022-05-26 12:50:00"
125
+ }
126
+ """
127
+
128
+
129
+ @pytest .mark .parametrize ("payload" , [payload_3 , payload_4 , payload_5 , payload_6 ])
130
+ async def test_post_event_400 (jp_fetch , event_bus , payload ):
131
+ with pytest .raises (tornado .httpclient .HTTPClientError ) as e :
132
+ await jp_fetch ("api" , "events" , method = "POST" , body = payload )
133
+
134
+ expected_http_error (e , 400 )
135
+
136
+
137
+ payload_7 = """\
138
+ {
139
+ "schema_name": "event.mock.jupyter.org/message",
140
+ "version": 1,
141
+ "event": {
142
+ "message": "Hello, world!"
143
+ }
144
+ }
145
+ """
146
+
147
+ payload_8 = """\
148
+ {
149
+ "schema_name": "event.mock.jupyter.org/message",
150
+ "version": 2,
151
+ "event": {
152
+ "message": "Hello, world!"
153
+ }
154
+ }
155
+ """
156
+
157
+
158
+ @pytest .mark .parametrize ("payload" , [payload_7 , payload_8 ])
159
+ async def test_post_event_500 (jp_fetch , event_bus , payload ):
160
+ with pytest .raises (tornado .httpclient .HTTPClientError ) as e :
161
+ await jp_fetch ("api" , "events" , method = "POST" , body = payload )
162
+
163
+ expected_http_error (e , 500 )
0 commit comments