test_project_builds_page.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. import re
  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, Target
  14. class TestProjectBuildsPage(SeleniumTestCase):
  15. """ Test data at /project/X/builds is displayed correctly """
  16. PROJECT_NAME = 'test project'
  17. CLI_BUILDS_PROJECT_NAME = 'command line builds'
  18. def setUp(self):
  19. bbv = BitbakeVersion.objects.create(name='bbv1', giturl='/tmp/',
  20. branch='master', dirpath='')
  21. release = Release.objects.create(name='release1',
  22. bitbake_version=bbv)
  23. self.project1 = Project.objects.create_project(name=self.PROJECT_NAME,
  24. release=release)
  25. self.project1.save()
  26. self.project2 = Project.objects.create_project(name=self.PROJECT_NAME,
  27. release=release)
  28. self.project2.save()
  29. self.default_project = Project.objects.create_project(
  30. name=self.CLI_BUILDS_PROJECT_NAME,
  31. release=release
  32. )
  33. self.default_project.is_default = True
  34. self.default_project.save()
  35. # parameters for builds to associate with the projects
  36. now = timezone.now()
  37. self.project1_build_success = {
  38. 'project': self.project1,
  39. 'started_on': now,
  40. 'completed_on': now,
  41. 'outcome': Build.SUCCEEDED
  42. }
  43. self.project1_build_in_progress = {
  44. 'project': self.project1,
  45. 'started_on': now,
  46. 'completed_on': now,
  47. 'outcome': Build.IN_PROGRESS
  48. }
  49. self.project2_build_success = {
  50. 'project': self.project2,
  51. 'started_on': now,
  52. 'completed_on': now,
  53. 'outcome': Build.SUCCEEDED
  54. }
  55. self.project2_build_in_progress = {
  56. 'project': self.project2,
  57. 'started_on': now,
  58. 'completed_on': now,
  59. 'outcome': Build.IN_PROGRESS
  60. }
  61. def _get_rows_for_project(self, project_id):
  62. """
  63. Helper to retrieve HTML rows for a project's builds,
  64. as shown in the main table of the page
  65. """
  66. url = reverse('projectbuilds', args=(project_id,))
  67. self.get(url)
  68. self.wait_until_present('#projectbuildstable tbody tr')
  69. return self.find_all('#projectbuildstable tbody tr')
  70. def test_show_builds_for_project(self):
  71. """ Builds for a project should be displayed in the main table """
  72. Build.objects.create(**self.project1_build_success)
  73. Build.objects.create(**self.project1_build_success)
  74. build_rows = self._get_rows_for_project(self.project1.id)
  75. self.assertEqual(len(build_rows), 2)
  76. def test_show_builds_project_only(self):
  77. """ Builds for other projects should be excluded """
  78. Build.objects.create(**self.project1_build_success)
  79. Build.objects.create(**self.project1_build_success)
  80. Build.objects.create(**self.project1_build_success)
  81. # shouldn't see these two
  82. Build.objects.create(**self.project2_build_success)
  83. Build.objects.create(**self.project2_build_in_progress)
  84. build_rows = self._get_rows_for_project(self.project1.id)
  85. self.assertEqual(len(build_rows), 3)
  86. def test_builds_exclude_in_progress(self):
  87. """ "in progress" builds should not be shown in main table """
  88. Build.objects.create(**self.project1_build_success)
  89. Build.objects.create(**self.project1_build_success)
  90. # shouldn't see this one
  91. Build.objects.create(**self.project1_build_in_progress)
  92. # shouldn't see these two either, as they belong to a different project
  93. Build.objects.create(**self.project2_build_success)
  94. Build.objects.create(**self.project2_build_in_progress)
  95. build_rows = self._get_rows_for_project(self.project1.id)
  96. self.assertEqual(len(build_rows), 2)
  97. def test_show_tasks_with_suffix(self):
  98. """ Task should be shown as suffixes on build names """
  99. build = Build.objects.create(**self.project1_build_success)
  100. target = 'bash'
  101. task = 'clean'
  102. Target.objects.create(build=build, target=target, task=task)
  103. url = reverse('projectbuilds', args=(self.project1.id,))
  104. self.get(url)
  105. self.wait_until_present('td[class="target"]')
  106. cell = self.find('td[class="target"]')
  107. content = cell.get_attribute('innerHTML')
  108. expected_text = '%s:%s' % (target, task)
  109. self.assertTrue(re.search(expected_text, content),
  110. '"target" cell should contain text %s' % expected_text)
  111. def test_cli_builds_hides_tabs(self):
  112. """
  113. Display for command line builds should hide tabs
  114. """
  115. url = reverse('projectbuilds', args=(self.default_project.id,))
  116. self.get(url)
  117. tabs = self.find_all('#project-topbar')
  118. self.assertEqual(len(tabs), 0,
  119. 'should be no top bar shown for command line builds')
  120. def test_non_cli_builds_has_tabs(self):
  121. """
  122. Non-command-line builds projects should show the tabs
  123. """
  124. url = reverse('projectbuilds', args=(self.project1.id,))
  125. self.get(url)
  126. tabs = self.find_all('#project-topbar')
  127. self.assertEqual(len(tabs), 1,
  128. 'should be a top bar shown for non-command-line builds')