test_pages.py 4.3 KB

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