test_serving_files.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. from pathlib import Path
  3. import httpx
  4. import pytest
  5. from nicegui import app, ui
  6. from .screen import PORT, Screen
  7. from .test_helpers import TEST_DIR
  8. IMAGE_FILE = Path(TEST_DIR).parent / 'examples' / 'slideshow' / 'slides' / 'slide1.jpg'
  9. VIDEO_FILE = Path(TEST_DIR) / 'media' / 'test.mp4'
  10. @pytest.fixture(autouse=True)
  11. def provide_media_files():
  12. if not VIDEO_FILE.exists():
  13. VIDEO_FILE.parent.mkdir(exist_ok=True)
  14. url = 'https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/360/Big_Buck_Bunny_360_10s_1MB.mp4'
  15. with httpx.stream('GET', url) as response:
  16. with open(VIDEO_FILE, 'wb') as file:
  17. for chunk in response.iter_raw():
  18. file.write(chunk)
  19. def assert_video_file_streaming(path: str) -> None:
  20. with httpx.Client() as http_client:
  21. r = http_client.get(
  22. path if 'http' in path else f'http://localhost:{PORT}{path}',
  23. headers={'Range': 'bytes=0-1000'}
  24. )
  25. assert r.status_code == 206
  26. assert r.headers['Accept-Ranges'] == 'bytes'
  27. assert r.headers['Content-Range'].startswith('bytes 0-1000/')
  28. assert r.headers['Content-Length'] == '1001'
  29. assert r.headers['Content-Type'] == 'video/mp4'
  30. def test_media_files_can_be_streamed(screen: Screen):
  31. app.add_media_files('/media', Path(TEST_DIR) / 'media')
  32. screen.open('/')
  33. assert_video_file_streaming('/media/test.mp4')
  34. def test_adding_single_media_file(screen: Screen):
  35. url_path = app.add_media_file(VIDEO_FILE)
  36. screen.open('/')
  37. assert_video_file_streaming(url_path)
  38. def test_adding_single_static_file(screen: Screen):
  39. url_path = app.add_static_file(IMAGE_FILE)
  40. screen.open('/')
  41. with httpx.Client() as http_client:
  42. r = http_client.get(f'http://localhost:{PORT}{url_path}')
  43. assert r.status_code == 200
  44. assert 'max-age=' in r.headers['Cache-Control']
  45. def test_auto_serving_file_from_image_source(screen: Screen):
  46. ui.image(IMAGE_FILE)
  47. screen.open('/')
  48. img = screen.find_by_tag('img')
  49. assert '/_nicegui/auto/static/' in img.get_attribute('src')
  50. assert screen.selenium.execute_script("""
  51. return arguments[0].complete &&
  52. typeof arguments[0].naturalWidth != "undefined" &&
  53. arguments[0].naturalWidth > 0""", img), 'image should load successfully'
  54. def test_auto_serving_file_from_video_source(screen: Screen):
  55. ui.video(VIDEO_FILE)
  56. screen.open('/')
  57. video = screen.find_by_tag('video')
  58. assert '/_nicegui/auto/media/' in video.get_attribute('src')
  59. ic(video.get_attribute('src'))
  60. assert_video_file_streaming(video.get_attribute('src'))