test_toastertable_ui.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #! /usr/bin/env python
  2. #
  3. # BitBake Toaster Implementation
  4. #
  5. # Copyright (C) 2013-2016 Intel Corporation
  6. #
  7. # SPDX-License-Identifier: GPL-2.0-only
  8. #
  9. from datetime import datetime
  10. from django.core.urlresolvers import reverse
  11. from django.utils import timezone
  12. from tests.browser.selenium_helpers import SeleniumTestCase
  13. from orm.models import BitbakeVersion, Release, Project, Build
  14. class TestToasterTableUI(SeleniumTestCase):
  15. """
  16. Tests for the UI elements of ToasterTable (sorting etc.);
  17. note that the tests cover generic functionality of ToasterTable which
  18. manifests as UI elements in the browser, and can only be tested via
  19. Selenium.
  20. """
  21. def setUp(self):
  22. pass
  23. def _get_orderby_heading(self, table):
  24. """
  25. Get the current order by finding the column heading in <table> with
  26. the sorted class on it.
  27. table: WebElement for a ToasterTable
  28. """
  29. selector = 'thead a.sorted'
  30. heading = table.find_element_by_css_selector(selector)
  31. return heading.get_attribute('innerHTML').strip()
  32. def _get_datetime_from_cell(self, row, selector):
  33. """
  34. Return the value in the cell selected by <selector> on <row> as a
  35. datetime.
  36. row: <tr> WebElement for a row in the ToasterTable
  37. selector: CSS selector to use to find the cell containing the date time
  38. string
  39. """
  40. cell = row.find_element_by_css_selector(selector)
  41. cell_text = cell.get_attribute('innerHTML').strip()
  42. return datetime.strptime(cell_text, '%d/%m/%y %H:%M')
  43. def test_revert_orderby(self):
  44. """
  45. Test that sort order for a table reverts to the default sort order
  46. if the current sort column is hidden.
  47. """
  48. now = timezone.now()
  49. later = now + timezone.timedelta(hours=1)
  50. even_later = later + timezone.timedelta(hours=1)
  51. bbv = BitbakeVersion.objects.create(name='test bbv', giturl='/tmp/',
  52. branch='master', dirpath='')
  53. release = Release.objects.create(name='test release',
  54. branch_name='master',
  55. bitbake_version=bbv)
  56. project = Project.objects.create_project('project', release)
  57. # set up two builds which will order differently when sorted by
  58. # started_on or completed_on
  59. # started first, finished last
  60. build1 = Build.objects.create(project=project,
  61. started_on=now,
  62. completed_on=even_later,
  63. outcome=Build.SUCCEEDED)
  64. # started second, finished first
  65. build2 = Build.objects.create(project=project,
  66. started_on=later,
  67. completed_on=later,
  68. outcome=Build.SUCCEEDED)
  69. url = reverse('all-builds')
  70. self.get(url)
  71. table = self.wait_until_visible('#allbuildstable')
  72. # check ordering (default is by -completed_on); so build1 should be
  73. # first as it finished last
  74. active_heading = self._get_orderby_heading(table)
  75. self.assertEqual(active_heading, 'Completed on',
  76. 'table should be sorted by "Completed on" by default')
  77. row_selector = '#allbuildstable tbody tr'
  78. cell_selector = 'td.completed_on'
  79. rows = self.find_all(row_selector)
  80. row1_completed_on = self._get_datetime_from_cell(rows[0], cell_selector)
  81. row2_completed_on = self._get_datetime_from_cell(rows[1], cell_selector)
  82. self.assertTrue(row1_completed_on > row2_completed_on,
  83. 'table should be sorted by -completed_on')
  84. # turn on started_on column
  85. self.click('#edit-columns-button')
  86. self.click('#checkbox-started_on')
  87. # sort by started_on column
  88. links = table.find_elements_by_css_selector('th.started_on a')
  89. for link in links:
  90. if link.get_attribute('innerHTML').strip() == 'Started on':
  91. link.click()
  92. break
  93. # wait for table data to reload in response to new sort
  94. self.wait_until_visible('#allbuildstable')
  95. # check ordering; build1 should be first
  96. active_heading = self._get_orderby_heading(table)
  97. self.assertEqual(active_heading, 'Started on',
  98. 'table should be sorted by "Started on"')
  99. cell_selector = 'td.started_on'
  100. rows = self.find_all(row_selector)
  101. row1_started_on = self._get_datetime_from_cell(rows[0], cell_selector)
  102. row2_started_on = self._get_datetime_from_cell(rows[1], cell_selector)
  103. self.assertTrue(row1_started_on < row2_started_on,
  104. 'table should be sorted by started_on')
  105. # turn off started_on column
  106. self.click('#edit-columns-button')
  107. self.click('#checkbox-started_on')
  108. # wait for table data to reload in response to new sort
  109. self.wait_until_visible('#allbuildstable')
  110. # check ordering (should revert to completed_on); build2 should be first
  111. active_heading = self._get_orderby_heading(table)
  112. self.assertEqual(active_heading, 'Completed on',
  113. 'table should be sorted by "Completed on" after hiding sort column')
  114. cell_selector = 'td.completed_on'
  115. rows = self.find_all(row_selector)
  116. row1_completed_on = self._get_datetime_from_cell(rows[0], cell_selector)
  117. row2_completed_on = self._get_datetime_from_cell(rows[1], cell_selector)
  118. self.assertTrue(row1_completed_on > row2_completed_on,
  119. 'table should be sorted by -completed_on')