test_pages.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import asyncio
  2. from tkinter import N
  3. from uuid import uuid4
  4. import justpy.htmlcomponents
  5. import pytest
  6. import starlette
  7. from nicegui import task_logger, ui
  8. from .screen import PORT, Screen
  9. def test_page(screen: Screen):
  10. @ui.page('/')
  11. def page():
  12. ui.label('Hello, world!')
  13. screen.open('/')
  14. screen.should_contain('NiceGUI')
  15. screen.should_contain('Hello, world!')
  16. def test_shared_page(screen: Screen):
  17. @ui.page('/', shared=True)
  18. def page():
  19. ui.label('Hello, world!')
  20. screen.open('/')
  21. screen.should_contain('NiceGUI')
  22. screen.should_contain('Hello, world!')
  23. def test_auto_index_page(screen: Screen):
  24. ui.label('Hello, world!')
  25. screen.open('/')
  26. screen.should_contain('NiceGUI')
  27. screen.should_contain('Hello, world!')
  28. def test_custom_title(screen: Screen):
  29. @ui.page('/', title='My Custom Title')
  30. def page():
  31. ui.label('Hello, world!')
  32. screen.open('/')
  33. screen.should_contain('My Custom Title')
  34. screen.should_contain('Hello, world!')
  35. def test_route_with_custom_path(screen: Screen):
  36. @ui.page('/test_route')
  37. def page():
  38. ui.label('page with custom path')
  39. screen.open('/test_route')
  40. screen.should_contain('page with custom path')
  41. def test_auto_index_page_with_link_to_subpage(screen: Screen):
  42. ui.link('link to subpage', '/subpage')
  43. @ui.page('/subpage')
  44. def page():
  45. ui.label('the subpage')
  46. screen.open('/')
  47. screen.click('link to subpage')
  48. screen.should_contain('the subpage')
  49. def test_link_to_page_by_passing_function(screen: Screen):
  50. @ui.page('/subpage')
  51. def page():
  52. ui.label('the subpage')
  53. ui.link('link to subpage', page)
  54. screen.open('/')
  55. screen.click('link to subpage')
  56. screen.should_contain('the subpage')
  57. def test_creating_new_page_after_startup(screen: Screen):
  58. screen.start_server()
  59. @ui.page('/late_page')
  60. def page():
  61. ui.label('page created after startup')
  62. screen.open('/late_page')
  63. screen.should_contain('page created after startup')
  64. def test_shared_and_individual_pages(screen: Screen):
  65. @ui.page('/individual_page')
  66. def individual_page():
  67. ui.label(f'individual page with uuid {uuid4()}')
  68. @ ui.page('/shared_page', shared=True)
  69. def shared_page():
  70. ui.label(f'shared page with uuid {uuid4()}')
  71. screen.open('/shared_page')
  72. uuid1 = screen.find('shared page').text.split()[-1]
  73. screen.open('/shared_page')
  74. uuid2 = screen.find('shared page').text.split()[-1]
  75. assert uuid1 == uuid2
  76. screen.open('/individual_page')
  77. uuid1 = screen.find('individual page').text.split()[-1]
  78. screen.open('/individual_page')
  79. uuid2 = screen.find('individual page').text.split()[-1]
  80. assert uuid1 != uuid2
  81. def test_on_page_ready_event(screen: Screen):
  82. '''This feature was introduced to fix #50; see https://github.com/zauberzeug/nicegui/issues/50#issuecomment-1210962617.'''
  83. async def load():
  84. label.text = 'loading...'
  85. # NOTE we can not use asyncio.create_task() here because we are on a different thread than the nicegui event loop
  86. task_logger.create_task(takes_a_while())
  87. async def takes_a_while():
  88. await asyncio.sleep(0.1)
  89. label.text = 'delayed data has been loaded'
  90. @ui.page('/', on_page_ready=load)
  91. def page():
  92. global label
  93. label = ui.label()
  94. screen.open('/')
  95. screen.should_contain('delayed data has been loaded')
  96. def test_customised_page(screen: Screen):
  97. trace = []
  98. class custom_page(ui.page):
  99. def __init__(self, route: str, **kwargs):
  100. super().__init__(route, title='My Customized Page', **kwargs)
  101. trace.append('init')
  102. async def connected(self, request):
  103. await super().connected(request)
  104. assert isinstance(request, starlette.requests.Request)
  105. trace.append('connected')
  106. async def header(self) -> None:
  107. assert isinstance(self.page.view, justpy.htmlcomponents.Div), \
  108. 'we should be able to access the underlying justpy view'
  109. await super().header()
  110. trace.append('header')
  111. async def footer(self) -> None:
  112. await super().footer()
  113. trace.append('footer')
  114. @custom_page('/', dark=True)
  115. def mainpage():
  116. trace.append('content')
  117. ui.label('Hello, world!')
  118. screen.open('/')
  119. screen.should_contain('Hello, world!')
  120. screen.should_contain('My Customized Page')
  121. assert 'body--dark' in screen.get_tags('body')[0].get_attribute('class')
  122. assert trace == ['init', 'connected', 'header', 'content', 'footer']
  123. def test_shared_page_with_request_parameter_raises_exception(screen: Screen):
  124. @ui.page('/', shared=True)
  125. def page(request):
  126. ui.label('Hello, world!')
  127. screen.open('/')
  128. screen.should_contain("This page doesn't exist")
  129. def test_adding_elements_in_on_page_ready_event(screen: Screen):
  130. @ui.page('/', on_page_ready=lambda: ui.markdown('Hello, world!'))
  131. def page():
  132. pass
  133. screen.open('/')
  134. screen.should_contain('Hello, world!')