@@ -66,15 +66,21 @@ def client(temp_apps_dir):
6666 return TestClient (app )
6767
6868def test_root_index (client ):
69- response = client .get ("/" )
70- assert response .status_code == 200
71- assert "text/html" in response .headers ["content-type" ]
72- assert "Root Index" in response .text
73- # Check that our test files are listed
74- assert "test.txt" in response .text
75- assert "myscript.py" in response .text
76- assert "testapp" in response .text
77- assert "myfolder/" in response .text
69+ import server
70+ original_val = server .AUTO_INDEX
71+ try :
72+ server .AUTO_INDEX = True
73+ response = client .get ("/" )
74+ assert response .status_code == 200
75+ assert "text/html" in response .headers ["content-type" ]
76+ assert "Root Index" in response .text
77+ # Check that our test files are listed
78+ assert "test.txt" in response .text
79+ assert "myscript.py" in response .text
80+ assert "testapp" in response .text
81+ assert "myfolder/" in response .text
82+ finally :
83+ server .AUTO_INDEX = original_val
7884
7985def test_static_file (client , temp_apps_dir ):
8086 response = client .get ("/test.txt" )
@@ -197,18 +203,130 @@ def test_script_timeout(client, temp_apps_dir):
197203 assert "done" in response .text
198204
199205def test_navigation_depth (client , temp_apps_dir ):
200- # Test deeper nesting and "Parent Directory" links
201- sub = temp_apps_dir / "folder" / "sub"
202- sub .mkdir (parents = True )
203- (sub / "file.txt" ).write_text ("deep" )
206+ import server
207+ original_val = server .AUTO_INDEX
208+ try :
209+ server .AUTO_INDEX = True
210+ # Test deeper nesting and "Parent Directory" links
211+ sub = temp_apps_dir / "folder" / "sub"
212+ sub .mkdir (parents = True )
213+ (sub / "file.txt" ).write_text ("deep" )
214+
215+ # Check /folder/ index
216+ resp1 = client .get ("/folder/" )
217+ assert 'href="/folder/sub/"' in resp1 .text
218+ assert 'href="/"' in resp1 .text # Parent from /folder/ is /
219+
220+ # Check /folder/sub/ index
221+ resp2 = client .get ("/folder/sub/" )
222+ assert 'href="/folder/sub/file.txt"' in resp2 .text
223+ assert 'href="/folder/"' in resp2 .text # Parent from /folder/sub/ is /folder/
224+ finally :
225+ server .AUTO_INDEX = original_val
226+
227+ def test_auto_index_disabled (temp_apps_dir ):
228+ import server
229+ # Backup original
230+ original_val = server .AUTO_INDEX
231+ try :
232+ server .AUTO_INDEX = False
233+ router = server .DynamicHtagApps (temp_apps_dir )
234+ from starlette .testclient import TestClient
235+ client = TestClient (router )
236+
237+ response = client .get ("/" )
238+ assert response .status_code == 400
239+ assert response .text == "No default entrypoint"
240+ finally :
241+ server .AUTO_INDEX = original_val
242+
243+ def test_default_index_app (client , temp_apps_dir ):
244+ # Create an index htag app in a folder
245+ idx_dir = temp_apps_dir / "hasindex"
246+ idx_dir .mkdir ()
247+ app_content = """from htag import Tag
248+ class App(Tag.App):
249+ def init(self):
250+ self += Tag.h1("I am the index app")
251+ """
252+ (idx_dir / "index.py" ).write_text (app_content )
204253
205- # Check /folder/ index
206- resp1 = client .get ("/folder/" )
207- assert 'href="/folder/sub/"' in resp1 .text
208- assert 'href="/"' in resp1 .text # Parent from /folder/ is /
254+ import server
255+ original_val = server .AUTO_INDEX
256+ try :
257+ server .AUTO_INDEX = False # Must be False to trigger index check
258+ router = server .DynamicHtagApps (temp_apps_dir )
259+ from starlette .testclient import TestClient
260+ client = TestClient (router )
261+
262+ response = client .get ("/hasindex/" )
263+ assert response .status_code == 200
264+ assert "I am the index app" in response .text
265+ finally :
266+ server .AUTO_INDEX = original_val
267+
268+ def test_default_index_script (client , temp_apps_dir ):
269+ # Create an index script in a folder
270+ idx_dir = temp_apps_dir / "hasidxscript"
271+ idx_dir .mkdir ()
272+ (idx_dir / "index.py" ).write_text ("print('I am the index script')" )
209273
210- # Check /folder/sub/ index
211- resp2 = client .get ("/folder/sub/" )
212- assert 'href="/folder/sub/file.txt"' in resp2 .text
213- assert 'href="/folder/"' in resp2 .text # Parent from /folder/sub/ is /folder/
274+ import server
275+ original_val = server .AUTO_INDEX
276+ try :
277+ server .AUTO_INDEX = False # Must be False to trigger index check
278+ router = server .DynamicHtagApps (temp_apps_dir )
279+ from starlette .testclient import TestClient
280+ client = TestClient (router )
281+
282+ response = client .get ("/hasidxscript/" )
283+ assert response .status_code == 200
284+ assert "I am the index script" in response .text
285+ finally :
286+ server .AUTO_INDEX = original_val
287+
288+ def test_auto_index_enabled_ignores_index_file (client , temp_apps_dir ):
289+ # If AUTO_INDEX is True, it should list the directory even if index.py exists
290+ idx_dir = temp_apps_dir / "index_enabled"
291+ idx_dir .mkdir ()
292+ (idx_dir / "index.py" ).write_text ("print('I should not run')" )
293+ (idx_dir / "other.txt" ).write_text ("other" )
294+
295+ import server
296+ original_val = server .AUTO_INDEX
297+ try :
298+ server .AUTO_INDEX = True
299+ router = server .DynamicHtagApps (temp_apps_dir )
300+ from starlette .testclient import TestClient
301+ client = TestClient (router )
302+
303+ response = client .get ("/index_enabled/" )
304+ assert response .status_code == 200
305+ # Should be a listing
306+ assert "Index of index_enabled/" in response .text
307+ assert "index.py" in response .text
308+ assert "other.txt" in response .text
309+ assert "I should not run" not in response .text
310+ finally :
311+ server .AUTO_INDEX = original_val
312+
313+ def test_auto_index_disabled_in_subfolder (client , temp_apps_dir ):
314+ # Verify 400 even in nested folders if AUTO_INDEX=False and no index
315+ sub = temp_apps_dir / "mysub" / "deep"
316+ sub .mkdir (parents = True )
317+ (sub / "hidden.txt" ).write_text ("secret" )
318+
319+ import server
320+ original_val = server .AUTO_INDEX
321+ try :
322+ server .AUTO_INDEX = False
323+ router = server .DynamicHtagApps (temp_apps_dir )
324+ from starlette .testclient import TestClient
325+ client = TestClient (router )
326+
327+ response = client .get ("/mysub/deep/" )
328+ assert response .status_code == 400
329+ assert response .text == "No default entrypoint"
330+ finally :
331+ server .AUTO_INDEX = original_val
214332
0 commit comments