tests_panels.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2013 The Distro Tracker Developers
  3. # See the COPYRIGHT file at the top-level directory of this distribution and
  4. # at http://deb.li/DTAuthors
  5. #
  6. # This file is part of Distro Tracker. It is subject to the license terms
  7. # in the LICENSE file found in the top-level directory of this
  8. # distribution and at http://deb.li/DTLicense. No part of Distro Tracker,
  9. # including this file, may be copied, modified, propagated, or distributed
  10. # except according to the terms contained in the LICENSE file.
  11. """
  12. Tests for the Distro Tracker core panels.
  13. """
  14. from __future__ import unicode_literals
  15. from django.core.urlresolvers import reverse
  16. from django.conf import settings
  17. from bs4 import BeautifulSoup as soup
  18. from distro_tracker.test import TestCase, TemplateTestsMixin
  19. from distro_tracker.core.models import SourcePackageName
  20. from distro_tracker.core.models import PseudoPackageName
  21. from distro_tracker.core.models import PackageName
  22. from distro_tracker.core.models import SourcePackage
  23. from distro_tracker.core.models import Repository, SourcePackageRepositoryEntry
  24. from distro_tracker.core.panels import VersionedLinks, DeadPackageWarningPanel
  25. class VersionedLinksPanelTests(TestCase):
  26. def setUp(self):
  27. self.package_name = SourcePackageName.objects.create(
  28. name='dummy-package')
  29. self.package = SourcePackage.objects.create(
  30. source_package_name=self.package_name,
  31. version='1.0.0')
  32. self.repo1 = Repository.objects.create(name='repo1', shorthand='repo1')
  33. self.repo1.source_entries.create(source_package=self.package)
  34. self.panel = VersionedLinks(self.package_name, None)
  35. # Clear any registered link providers to let the test control which
  36. # ones exist.
  37. VersionedLinks.LinkProvider.plugins = []
  38. def add_link_provider(self, icons):
  39. type(str('TestProvider'),
  40. (VersionedLinks.LinkProvider,),
  41. {'icons': icons})
  42. def get_package_page_response(self):
  43. url = reverse('dtracker-package-page', kwargs={
  44. 'package_name': self.package.name,
  45. })
  46. return self.client.get(url)
  47. def panel_is_in_response(self, response):
  48. """
  49. Checks whether the versioned links panel is found in the rendered HTML
  50. response.
  51. """
  52. html = soup(response.content, 'html.parser')
  53. panels = html.findAll("div", {'class': 'panel-heading'})
  54. for panel in panels:
  55. if 'versioned links' in str(panel):
  56. return True
  57. return False
  58. def test_panel_not_displayed(self):
  59. """
  60. Tests that the panel is not displayed in the package page when there
  61. are no items to be displayed.
  62. """
  63. response = self.get_package_page_response()
  64. self.assertFalse(self.panel_is_in_response(response))
  65. def test_panel_displayed(self):
  66. """
  67. Tests that the panel is displayed when there is at least one icon
  68. provider.
  69. """
  70. self.add_link_provider(['icon1'])
  71. response = self.get_package_page_response()
  72. self.assertTrue(self.panel_is_in_response(response))
  73. def test_context_returns_something(self):
  74. """Tests that the context returns data for the source package
  75. version we have."""
  76. self.add_link_provider(['icon1'])
  77. context = self.panel.context
  78. self.assertEqual(len(context), 1)
  79. def test_context_does_not_contain_hidden_versions(self):
  80. """Tests that the context doesn't return data for source
  81. package versions that are only in hidden repositories."""
  82. self.repo1.flags.create(name='hidden', value=True)
  83. self.add_link_provider(['icon1'])
  84. context = self.panel.context
  85. self.assertEqual(len(context), 0)
  86. def test_context_returns_version_in_hidden_and_non_hidden_repo(self):
  87. """Tests that the context doesn't return data for source
  88. package versions that are only in hidden repositories."""
  89. self.repo1.flags.create(name='hidden', value=True)
  90. self.repo2 = Repository.objects.create(name='repo2', shorthand='repo2')
  91. self.repo2.source_entries.create(source_package=self.package)
  92. self.repo2.flags.create(name='hidden', value=False)
  93. self.add_link_provider(['icon1'])
  94. context = self.panel.context
  95. self.assertEqual(len(context), 1)
  96. class GeneralInfoLinkPanelItemsTests(TestCase, TemplateTestsMixin):
  97. def setUp(self):
  98. self.package_name = SourcePackageName.objects.create(
  99. name='dummy-package')
  100. self.homepage = 'http://www.dummyhomepage.net'
  101. self.package = SourcePackage.objects.create(
  102. source_package_name=self.package_name,
  103. version='1.0.0',
  104. homepage=self.homepage)
  105. def get_package_page_response(self):
  106. url = reverse('dtracker-package-page', kwargs={
  107. 'package_name': self.package.name,
  108. })
  109. return self.client.get(url)
  110. def get_general_info_link_panel(self, response):
  111. """
  112. Checks whether the links panel is found in the rendered HTML
  113. response.
  114. """
  115. html = soup(response.content, 'html.parser')
  116. panels = html.findAll("div", {'class': 'panel-heading'})
  117. for panel in panels:
  118. if 'links' in str(panel) and 'versioned links' not in str(panel):
  119. return panel
  120. return False
  121. def assert_homepage_is_in_linkspanel(self, response):
  122. """
  123. Checks whether the homepage link is displayed
  124. """
  125. self.assertLinkIsInResponse(response, self.homepage)
  126. def test_panel_displayed(self):
  127. """
  128. Tests that the panel is displayed when package has a homepage
  129. and that the homepage is displayed in that panel
  130. """
  131. response = self.get_package_page_response()
  132. self.assertTrue(self.get_general_info_link_panel(response))
  133. self.assert_homepage_is_in_linkspanel(response)
  134. class DeadPackageWarningPanelTests(TestCase):
  135. def setUp(self):
  136. self.pkgname = SourcePackageName.objects.create(name='dummy-package')
  137. self.srcpkg = SourcePackage.objects.create(
  138. source_package_name=self.pkgname, version='1.0.0')
  139. self.default_repo = \
  140. Repository.objects.create(name='default', shorthand='default',
  141. default=True)
  142. self.repo1 = Repository.objects.create(name='repo1', shorthand='repo1')
  143. self.panel = DeadPackageWarningPanel(self.pkgname, None)
  144. def test_has_content_pkg_in_no_repository(self):
  145. """The package is not in any repository. We should display the
  146. warning."""
  147. self.assertTrue(self.panel.has_content)
  148. def test_has_content_pkg_not_in_devel_repos(self):
  149. """The package is not in a development repository. We should display
  150. the warning."""
  151. SourcePackageRepositoryEntry.objects.create(
  152. source_package=self.srcpkg, repository=self.repo1)
  153. self.assertTrue(self.panel.has_content)
  154. def test_has_content_pkg_in_devel_repos(self):
  155. """The package is in at least one of the development repositories.
  156. We should not display the warning."""
  157. SourcePackageRepositoryEntry.objects.create(
  158. source_package=self.srcpkg, repository=self.default_repo)
  159. self.assertFalse(self.panel.has_content)
  160. def test_has_content_for_pseudo_package(self):
  161. """A pseudo-package is never obsolete. No warning displayed."""
  162. pkgname = PseudoPackageName.objects.create(name='pseudo')
  163. panel = DeadPackageWarningPanel(pkgname, None)
  164. self.assertFalse(panel.has_content)
  165. def test_has_content_for_old_packages(self):
  166. """Old package only exists as PackageName. We should display the
  167. warning in this case."""
  168. pkgname = PackageName.objects.create(name='oldpkg')
  169. panel = DeadPackageWarningPanel(pkgname, None)
  170. self.assertTrue(panel.has_content)
  171. def test_context_pkg_disappeared_completely(self):
  172. """The package is not in any repository. The context exports this."""
  173. self.assertTrue(self.panel.context['disappeared'])
  174. def test_context_pkg_disappeared_from_devel_repository(self):
  175. """The package is in a few repositories. The context exports this."""
  176. SourcePackageRepositoryEntry.objects.create(
  177. source_package=self.srcpkg, repository=self.repo1)
  178. self.assertFalse(self.panel.context['disappeared'])
  179. class NewsPanelTests(TestCase, TemplateTestsMixin):
  180. NEWS_LIMIT = settings.DISTRO_TRACKER_NEWS_PANEL_LIMIT
  181. def setUp(self):
  182. self.package = SourcePackageName.objects.create(name='dummy-package')
  183. self.src_pkg = SourcePackage.objects.create(
  184. source_package_name=self.package, version='1.0.0')
  185. self.src_pkg.save()
  186. self.news_link = reverse('dtracker-package-news',
  187. kwargs={'package_name': self.package.name})
  188. # add some news
  189. for i in range(self.NEWS_LIMIT - 1):
  190. self.package.news_set.create(title="News {}".format(i),
  191. created_by="Author {}".format(i))
  192. def get_package_page_response(self):
  193. url = reverse('dtracker-package-page', kwargs={
  194. 'package_name': self.package.name,
  195. })
  196. return self.client.get(url)
  197. def test_panel_links_to_news_page(self):
  198. response = self.get_package_page_response()
  199. self.assertLinkIsInResponse(response, self.news_link)
  200. def test_panel_has_no_paginated_news_link_when_not_necessary(self):
  201. response = self.get_package_page_response()
  202. self.assertLinkIsNotInResponse(response, self.news_link + "?page=2")
  203. def test_panel_has_paginated_news_link_when_useful(self):
  204. self.package.news_set.create(
  205. title="News {}".format(self.NEWS_LIMIT),
  206. created_by="Author {}".format(self.NEWS_LIMIT))
  207. response = self.get_package_page_response()
  208. self.assertLinkIsInResponse(response, self.news_link + "?page=2")