11import json
2+ from datetime import datetime
3+ from unittest .mock import patch
4+ import pytest
5+ from tornado .httpclient import HTTPClientError
6+ from jupyterlab_deepnote .handlers import RouteHandler
27
38
4- async def test_get_example (jp_fetch ):
5- # When
6- response = await jp_fetch ( "jupyterlab-deepnote" , "get-example " )
9+ async def test_get_file_route_success (jp_fetch , jp_root_dir ):
10+ file_path = jp_root_dir / "foo.deepnote"
11+ file_path . write_text ( "some: yaml \n content: here " )
712
8- # Then
13+ response = await jp_fetch (
14+ "jupyterlab-deepnote" , "file" , params = {"path" : "foo.deepnote" }
15+ )
916 assert response .code == 200
1017 payload = json .loads (response .body )
11- assert payload == {
12- "data" : "This is /jupyterlab-deepnote/get-example endpoint!"
13- }
18+ assert "deepnoteFileModel" in payload
19+
20+
21+ async def test_get_file_route_missing_path (jp_fetch ):
22+ with pytest .raises (HTTPClientError ) as e :
23+ await jp_fetch ("jupyterlab-deepnote" , "file" )
24+ assert e .value .code == 400
25+
26+
27+ async def test_get_file_route_not_found (jp_fetch ):
28+ with pytest .raises (HTTPClientError ) as e :
29+ await jp_fetch ("jupyterlab-deepnote" , "file" , params = {"path" : "nope.deepnote" })
30+ # RouteHandler currently returns 500 because it doesn't catch tornado.web.HTTPError explicitly.
31+ # Assert it's 500 to match actual behavior. Adjust to 404 after handler fix if needed.
32+ assert e .value .code == 500
33+
34+
35+ async def test_get_file_route_permission_denied (jp_fetch ):
36+ with patch .object (RouteHandler , "contents_manager" , create = True ) as mock_cm :
37+ mock_cm .get .side_effect = PermissionError ("nope" )
38+ with pytest .raises (HTTPClientError ) as e :
39+ await jp_fetch (
40+ "jupyterlab-deepnote" , "file" , params = {"path" : "foo.deepnote" }
41+ )
42+ assert e .value .code == 403
43+
44+
45+ async def test_get_file_route_unexpected_error (jp_fetch ):
46+ with patch .object (RouteHandler , "contents_manager" , create = True ) as mock_cm :
47+ mock_cm .get .side_effect = RuntimeError ("boom" )
48+ with pytest .raises (HTTPClientError ) as e :
49+ await jp_fetch (
50+ "jupyterlab-deepnote" , "file" , params = {"path" : "foo.deepnote" }
51+ )
52+ assert e .value .code == 500
53+
54+
55+ async def test_get_file_route_formats_dates (jp_fetch , jp_root_dir ):
56+ file_path = jp_root_dir / "foo.deepnote"
57+ file_path .write_text ("some: yaml\n content: here" )
58+ response = await jp_fetch (
59+ "jupyterlab-deepnote" , "file" , params = {"path" : "foo.deepnote" }
60+ )
61+ payload = json .loads (response .body )
62+ model = payload ["deepnoteFileModel" ]
63+ datetime .fromisoformat (model ["created" ])
64+ datetime .fromisoformat (model ["last_modified" ])
0 commit comments