test_userbar.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. from django.contrib.auth.models import AnonymousUser
  2. from django.template import Context, Template
  3. from django.test import TestCase
  4. from django.test.client import RequestFactory
  5. from django.urls import reverse
  6. from wagtail.models import PAGE_TEMPLATE_VAR, Page
  7. from wagtail.test.testapp.models import BusinessChild, BusinessIndex
  8. from wagtail.test.utils import WagtailTestUtils
  9. class TestUserbarTag(TestCase, WagtailTestUtils):
  10. def setUp(self):
  11. self.user = self.create_superuser(
  12. username="test", email="test@email.com", password="password"
  13. )
  14. self.homepage = Page.objects.get(id=2)
  15. def dummy_request(
  16. self, user=None, *, is_preview=False, in_preview_panel=False, revision_id=None
  17. ):
  18. request = RequestFactory().get("/")
  19. request.user = user or AnonymousUser()
  20. request.is_preview = is_preview
  21. request.in_preview_panel = in_preview_panel
  22. if revision_id:
  23. request.revision_id = revision_id
  24. return request
  25. def test_userbar_tag(self):
  26. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  27. context = Context(
  28. {
  29. PAGE_TEMPLATE_VAR: self.homepage,
  30. "request": self.dummy_request(self.user),
  31. }
  32. )
  33. with self.assertNumQueries(5):
  34. content = template.render(context)
  35. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  36. def test_userbar_tag_revision(self):
  37. self.homepage.save_revision(user=self.user, submitted_for_moderation=True)
  38. revision = self.homepage.get_latest_revision()
  39. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  40. context = Context(
  41. {
  42. PAGE_TEMPLATE_VAR: self.homepage,
  43. "request": self.dummy_request(self.user, revision_id=revision.id),
  44. }
  45. )
  46. with self.assertNumQueries(7):
  47. content = template.render(context)
  48. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  49. self.assertIn("Approve", content)
  50. def test_userbar_does_not_break_without_request(self):
  51. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}boom")
  52. content = template.render(Context({}))
  53. self.assertEqual("boom", content)
  54. def test_userbar_tag_self(self):
  55. """
  56. Ensure the userbar renders with `self` instead of `PAGE_TEMPLATE_VAR`
  57. """
  58. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  59. content = template.render(
  60. Context(
  61. {
  62. "self": self.homepage,
  63. "request": self.dummy_request(self.user),
  64. }
  65. )
  66. )
  67. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  68. def test_userbar_tag_anonymous_user(self):
  69. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  70. content = template.render(
  71. Context(
  72. {
  73. PAGE_TEMPLATE_VAR: self.homepage,
  74. "request": self.dummy_request(),
  75. }
  76. )
  77. )
  78. # Make sure nothing was rendered
  79. self.assertEqual(content, "")
  80. def test_userbar_tag_no_page(self):
  81. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  82. content = template.render(
  83. Context(
  84. {
  85. "request": self.dummy_request(self.user),
  86. }
  87. )
  88. )
  89. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  90. def test_edit_link(self):
  91. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  92. content = template.render(
  93. Context(
  94. {
  95. PAGE_TEMPLATE_VAR: self.homepage,
  96. "request": self.dummy_request(self.user, is_preview=False),
  97. }
  98. )
  99. )
  100. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  101. self.assertIn("Edit this page", content)
  102. def test_userbar_edit_menu_not_in_preview(self):
  103. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  104. content = template.render(
  105. Context(
  106. {
  107. PAGE_TEMPLATE_VAR: self.homepage,
  108. "request": self.dummy_request(self.user, is_preview=True),
  109. }
  110. )
  111. )
  112. self.assertIn("<!-- Wagtail user bar embed code -->", content)
  113. self.assertNotIn("Edit this page", content)
  114. def test_userbar_not_in_preview_panel(self):
  115. template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}")
  116. content = template.render(
  117. Context(
  118. {
  119. PAGE_TEMPLATE_VAR: self.homepage,
  120. "request": self.dummy_request(
  121. self.user, is_preview=True, in_preview_panel=True
  122. ),
  123. }
  124. )
  125. )
  126. # Make sure nothing was rendered
  127. self.assertEqual(content, "")
  128. class TestUserbarFrontend(TestCase, WagtailTestUtils):
  129. def setUp(self):
  130. self.login()
  131. self.homepage = Page.objects.get(id=2)
  132. def test_userbar_frontend(self):
  133. response = self.client.get(
  134. reverse("wagtailadmin_userbar_frontend", args=(self.homepage.id,))
  135. )
  136. self.assertEqual(response.status_code, 200)
  137. self.assertTemplateUsed(response, "wagtailadmin/userbar/base.html")
  138. def test_userbar_frontend_anonymous_user_cannot_see(self):
  139. # Logout
  140. self.client.logout()
  141. response = self.client.get(
  142. reverse("wagtailadmin_userbar_frontend", args=(self.homepage.id,))
  143. )
  144. # Check that the user received a forbidden message
  145. self.assertEqual(response.status_code, 403)
  146. class TestUserbarAddLink(TestCase, WagtailTestUtils):
  147. fixtures = ["test.json"]
  148. def setUp(self):
  149. self.login()
  150. self.homepage = Page.objects.get(url_path="/home/")
  151. self.event_index = Page.objects.get(url_path="/home/events/")
  152. self.business_index = BusinessIndex(title="Business", live=True)
  153. self.homepage.add_child(instance=self.business_index)
  154. self.business_child = BusinessChild(title="Business Child", live=True)
  155. self.business_index.add_child(instance=self.business_child)
  156. def test_page_allowing_subpages(self):
  157. response = self.client.get(
  158. reverse("wagtailadmin_userbar_frontend", args=(self.event_index.id,))
  159. )
  160. # page allows subpages, so the 'add page' button should show
  161. expected_url = reverse(
  162. "wagtailadmin_pages:add_subpage", args=(self.event_index.id,)
  163. )
  164. needle = f"""
  165. <a href="{expected_url}" target="_parent" role="menuitem">
  166. <svg class="icon icon-plus w-action-icon" aria-hidden="true">
  167. <use href="#icon-plus"></use>
  168. </svg>
  169. Add a child page
  170. </a>
  171. """
  172. self.assertTagInHTML(needle, str(response.content))
  173. def test_page_disallowing_subpages(self):
  174. response = self.client.get(
  175. reverse("wagtailadmin_userbar_frontend", args=(self.business_child.id,))
  176. )
  177. # page disallows subpages, so the 'add page' button shouldn't show
  178. expected_url = reverse(
  179. "wagtailadmin_pages:add_subpage", args=(self.business_index.id,)
  180. )
  181. expected_link = (
  182. '<a href="%s" target="_parent">Add a child page</a>' % expected_url
  183. )
  184. self.assertNotContains(response, expected_link)
  185. class TestUserbarModeration(TestCase, WagtailTestUtils):
  186. def setUp(self):
  187. self.login()
  188. self.homepage = Page.objects.get(id=2)
  189. self.homepage.save_revision(submitted_for_moderation=True)
  190. self.revision = self.homepage.get_latest_revision()
  191. def test_userbar_moderation(self):
  192. response = self.client.get(
  193. reverse("wagtailadmin_userbar_moderation", args=(self.revision.id,))
  194. )
  195. self.assertEqual(response.status_code, 200)
  196. self.assertTemplateUsed(response, "wagtailadmin/userbar/base.html")
  197. expected_approve_html = """
  198. <form action="/admin/pages/moderation/{}/approve/" target="_parent" method="post">
  199. <input type="hidden" name="csrfmiddlewaretoken">
  200. <div class="w-action">
  201. <input type="submit" value="Approve" class="button" />
  202. </div>
  203. </form>
  204. """.format(
  205. self.revision.id
  206. )
  207. self.assertTagInHTML(expected_approve_html, str(response.content))
  208. expected_reject_html = """
  209. <form action="/admin/pages/moderation/{}/reject/" target="_parent" method="post">
  210. <input type="hidden" name="csrfmiddlewaretoken">
  211. <div class="w-action">
  212. <input type="submit" value="Reject" class="button" />
  213. </div>
  214. </form>
  215. """.format(
  216. self.revision.id
  217. )
  218. self.assertTagInHTML(expected_reject_html, str(response.content))
  219. def test_userbar_moderation_anonymous_user_cannot_see(self):
  220. # Logout
  221. self.client.logout()
  222. response = self.client.get(
  223. reverse("wagtailadmin_userbar_moderation", args=(self.revision.id,))
  224. )
  225. # Check that the user received a forbidden message
  226. self.assertEqual(response.status_code, 403)