1from django.contrib.auth.models import Group, Permission
2from django.test import TestCase
3from django.urls import reverse
4
5from wagtail.core.models import GroupPagePermission, Page
6from wagtail.tests.testapp.models import SimplePage
7from wagtail.tests.utils import WagtailTestUtils
8
9
10class TestModerationList(TestCase, WagtailTestUtils):
11    """Test moderation list rendered by `wagtailadmin_home` view"""
12
13    def setUp(self):
14        # Create a submitter
15        submitter = self.create_user(
16            username='submitter',
17            email='submitter@email.com',
18            password='password',
19        )
20
21        # Find root page
22        self.root_page = Page.objects.get(id=2)
23
24        # Create a page
25        self.page = SimplePage(
26            title='Wagtail, the powerful CMS for modern websites',
27            slug='wagtail',
28            content='Fast, elegant, open source',
29        )
30
31        self.root_page.add_child(instance=self.page)
32
33        # Submit it for moderation
34        self.page.save_revision(user=submitter, submitted_for_moderation=True)
35
36        # Create a revision
37        self.revision = self.page.get_latest_revision()
38
39        self.edit_page_url = reverse('wagtailadmin_pages:edit', args=(self.revision.page.id, ))
40        self.preview_page_url = reverse('wagtailadmin_pages:preview_for_moderation', args=(self.revision.id, ))
41
42    def login_as_moderator_without_edit(self):
43        # Create moderators group without edit permissions
44        moderators_group = Group.objects.create(name='Moderators without edit')
45
46        admin_permission = Permission.objects.get(
47            content_type__app_label='wagtailadmin',
48            codename='access_admin'
49        )
50
51        moderators_group.permissions.add(admin_permission)
52
53        # Create group permissions
54        GroupPagePermission.objects.create(
55            group=moderators_group,
56            page=self.root_page,
57            permission_type='publish',
58        )
59
60        # Create a moderator without edit permissions
61        moderator = self.create_user(
62            username='moderator',
63            email='moderator@email.com',
64            password='password'
65        )
66
67        moderator.groups.add(moderators_group)
68
69        self.login(moderator)
70
71    def get(self):
72        return self.client.get(reverse('wagtailadmin_home'))
73
74    def test_edit_page(self):
75        # Login as moderator
76        self.login()
77
78        response = self.get()
79
80        self.assertEqual(response.status_code, 200)
81        self.assertTemplateUsed(response, 'wagtailadmin/home.html')
82
83        # Check response
84        self.assertContains(response, self.edit_page_url, count=2)
85
86    def test_preview_for_moderation(self):
87        # Login as moderator without edit permissions
88        self.login_as_moderator_without_edit()
89
90        response = self.get()
91
92        self.assertEqual(response.status_code, 200)
93        self.assertTemplateUsed(response, 'wagtailadmin/home.html')
94
95        # Check response
96        self.assertContains(response, self.preview_page_url, count=2)
97        self.assertNotContains(response, self.edit_page_url)
98