import json from django.contrib.auth.models import AnonymousUser, Permission from django.template import Context, Template from django.test import TestCase from django.urls import reverse from wagtail import hooks from wagtail.admin.userbar import AccessibilityItem from wagtail.coreutils import get_dummy_request from wagtail.models import PAGE_TEMPLATE_VAR, Page, Site from wagtail.test.testapp.models import BusinessChild, BusinessIndex, SimplePage from wagtail.test.utils import WagtailTestUtils class TestUserbarTag(WagtailTestUtils, TestCase): def setUp(self): self.user = self.create_superuser( username="test", email="test@email.com", password="password" ) self.homepage = Page.objects.get(id=2) def dummy_request( self, user=None, *, is_preview=False, in_preview_panel=False, revision_id=None, is_editing=False, ): request = get_dummy_request() request.user = user or AnonymousUser() request.is_preview = is_preview request.is_editing = is_editing request.in_preview_panel = in_preview_panel if revision_id: request.revision_id = revision_id return request def test_userbar_tag(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") context = Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request(self.user), } ) with self.assertNumQueries(5): content = template.render(context) self.assertIn("", content) def test_userbar_does_not_break_without_request(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}boom") content = template.render(Context({})) self.assertEqual("boom", content) def test_userbar_tag_self(self): """ Ensure the userbar renders with `self` instead of `PAGE_TEMPLATE_VAR` """ template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { "self": self.homepage, "request": self.dummy_request(self.user), } ) ) self.assertIn("", content) def test_userbar_tag_anonymous_user(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request(), } ) ) # Make sure nothing was rendered self.assertEqual(content, "") def test_userbar_tag_no_page(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { "request": self.dummy_request(self.user), } ) ) self.assertIn("", content) def test_edit_link(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request(self.user, is_preview=False), } ) ) self.assertIn("", content) self.assertIn("Edit this page", content) def test_userbar_edit_menu_in_previews(self): # The edit link should be visible on draft, revision, and workflow previews. # https://github.com/wagtail/wagtail/issues/10002 template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request(self.user, is_preview=True), } ) ) self.assertIn("", content) self.assertIn("Edit this page", content) self.assertIn( reverse("wagtailadmin_pages:edit", args=(self.homepage.id,)), content ) def test_userbar_edit_menu_not_in_preview(self): # The edit link should not be visible on PreviewOnEdit/Create views. # https://github.com/wagtail/wagtail/issues/8765 template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request( self.user, is_preview=True, is_editing=True ), } ) ) self.assertIn("", content) self.assertNotIn("Edit this page", content) self.assertNotIn( reverse("wagtailadmin_pages:edit", args=(self.homepage.id,)), content ) def test_userbar_hidden_in_preview_panel(self): template = Template("{% load wagtailuserbar %}{% wagtailuserbar %}") content = template.render( Context( { PAGE_TEMPLATE_VAR: self.homepage, "request": self.dummy_request( self.user, is_preview=True, in_preview_panel=True ), } ) ) self.assertIn("