summaryrefslogtreecommitdiff
path: root/tests/admin_views/test_history_view.py
blob: ddfdd56ca669137ce7ac5a2db3fd15ca5f517b1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from django.contrib.admin.models import CHANGE, LogEntry
from django.contrib.admin.tests import AdminSeleniumTestCase
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.core.paginator import Paginator
from django.test import TestCase, override_settings
from django.urls import reverse

from .models import City, State


@override_settings(ROOT_URLCONF="admin_views.urls")
class AdminHistoryViewTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.superuser = User.objects.create_superuser(
            username="super",
            password="secret",
            email="super@example.com",
        )

    def setUp(self):
        self.client.force_login(self.superuser)

    def test_changed_message_uses_form_labels(self):
        """
        Admin's model history change messages use form labels instead of
        field names.
        """
        state = State.objects.create(name="My State Name")
        city = City.objects.create(name="My City Name", state=state)
        change_dict = {
            "name": "My State Name 2",
            "nolabel_form_field": True,
            "city_set-0-name": "My City name 2",
            "city_set-0-id": city.pk,
            "city_set-TOTAL_FORMS": "3",
            "city_set-INITIAL_FORMS": "1",
            "city_set-MAX_NUM_FORMS": "0",
        }
        state_change_url = reverse("admin:admin_views_state_change", args=(state.pk,))
        self.client.post(state_change_url, change_dict)
        logentry = LogEntry.objects.filter(content_type__model__iexact="state").latest(
            "id"
        )
        self.assertEqual(
            logentry.get_change_message(),
            "Changed State name (from form’s Meta.labels), "
            "nolabel_form_field and not_a_form_field. "
            "Changed City verbose_name for city “%s”." % city,
        )


@override_settings(ROOT_URLCONF="admin_views.urls")
class SeleniumTests(AdminSeleniumTestCase):
    available_apps = ["admin_views"] + AdminSeleniumTestCase.available_apps

    def setUp(self):
        self.superuser = User.objects.create_superuser(
            username="super",
            password="secret",
            email="super@example.com",
        )
        content_type_pk = ContentType.objects.get_for_model(User).pk
        for i in range(1, 1101):
            LogEntry.objects.log_action(
                self.superuser.pk,
                content_type_pk,
                self.superuser.pk,
                repr(self.superuser),
                CHANGE,
                change_message=f"Changed something {i}",
            )
        self.admin_login(
            username="super",
            password="secret",
            login_url=reverse("admin:index"),
        )

    def test_pagination(self):
        from selenium.webdriver.common.by import By

        user_history_url = reverse("admin:auth_user_history", args=(self.superuser.pk,))
        self.selenium.get(self.live_server_url + user_history_url)

        paginator = self.selenium.find_element(By.CSS_SELECTOR, ".paginator")
        self.assertTrue(paginator.is_displayed())
        self.assertIn("%s entries" % LogEntry.objects.count(), paginator.text)
        self.assertIn(str(Paginator.ELLIPSIS), paginator.text)
        # The current page.
        current_page_link = self.selenium.find_element(
            By.CSS_SELECTOR, "span.this-page"
        )
        self.assertEqual(current_page_link.text, "1")
        # The last page.
        last_page_link = self.selenium.find_element(By.CSS_SELECTOR, ".end")
        self.assertTrue(last_page_link.text, "20")
        # Select the second page.
        pages = paginator.find_elements(By.TAG_NAME, "a")
        second_page_link = pages[0]
        self.assertEqual(second_page_link.text, "2")
        second_page_link.click()
        self.assertIn("?p=2", self.selenium.current_url)
        rows = self.selenium.find_elements(By.CSS_SELECTOR, "#change-history tbody tr")
        self.assertIn("Changed something 101", rows[0].text)
        self.assertIn("Changed something 200", rows[-1].text)