1. from django.contrib.admin.models import CHANGE, LogEntry
    
  2. from django.contrib.admin.tests import AdminSeleniumTestCase
    
  3. from django.contrib.auth.models import User
    
  4. from django.contrib.contenttypes.models import ContentType
    
  5. from django.core.paginator import Paginator
    
  6. from django.test import TestCase, override_settings
    
  7. from django.urls import reverse
    
  8. 
    
  9. from .models import City, State
    
  10. 
    
  11. 
    
  12. @override_settings(ROOT_URLCONF="admin_views.urls")
    
  13. class AdminHistoryViewTests(TestCase):
    
  14.     @classmethod
    
  15.     def setUpTestData(cls):
    
  16.         cls.superuser = User.objects.create_superuser(
    
  17.             username="super",
    
  18.             password="secret",
    
  19.             email="[email protected]",
    
  20.         )
    
  21. 
    
  22.     def setUp(self):
    
  23.         self.client.force_login(self.superuser)
    
  24. 
    
  25.     def test_changed_message_uses_form_labels(self):
    
  26.         """
    
  27.         Admin's model history change messages use form labels instead of
    
  28.         field names.
    
  29.         """
    
  30.         state = State.objects.create(name="My State Name")
    
  31.         city = City.objects.create(name="My City Name", state=state)
    
  32.         change_dict = {
    
  33.             "name": "My State Name 2",
    
  34.             "nolabel_form_field": True,
    
  35.             "city_set-0-name": "My City name 2",
    
  36.             "city_set-0-id": city.pk,
    
  37.             "city_set-TOTAL_FORMS": "3",
    
  38.             "city_set-INITIAL_FORMS": "1",
    
  39.             "city_set-MAX_NUM_FORMS": "0",
    
  40.         }
    
  41.         state_change_url = reverse("admin:admin_views_state_change", args=(state.pk,))
    
  42.         self.client.post(state_change_url, change_dict)
    
  43.         logentry = LogEntry.objects.filter(content_type__model__iexact="state").latest(
    
  44.             "id"
    
  45.         )
    
  46.         self.assertEqual(
    
  47.             logentry.get_change_message(),
    
  48.             "Changed State name (from form’s Meta.labels), "
    
  49.             "nolabel_form_field and not_a_form_field. "
    
  50.             "Changed City verbose_name for city “%s”." % city,
    
  51.         )
    
  52. 
    
  53. 
    
  54. @override_settings(ROOT_URLCONF="admin_views.urls")
    
  55. class SeleniumTests(AdminSeleniumTestCase):
    
  56.     available_apps = ["admin_views"] + AdminSeleniumTestCase.available_apps
    
  57. 
    
  58.     def setUp(self):
    
  59.         self.superuser = User.objects.create_superuser(
    
  60.             username="super",
    
  61.             password="secret",
    
  62.             email="[email protected]",
    
  63.         )
    
  64.         content_type_pk = ContentType.objects.get_for_model(User).pk
    
  65.         for i in range(1, 1101):
    
  66.             LogEntry.objects.log_action(
    
  67.                 self.superuser.pk,
    
  68.                 content_type_pk,
    
  69.                 self.superuser.pk,
    
  70.                 repr(self.superuser),
    
  71.                 CHANGE,
    
  72.                 change_message=f"Changed something {i}",
    
  73.             )
    
  74.         self.admin_login(
    
  75.             username="super",
    
  76.             password="secret",
    
  77.             login_url=reverse("admin:index"),
    
  78.         )
    
  79. 
    
  80.     def test_pagination(self):
    
  81.         from selenium.webdriver.common.by import By
    
  82. 
    
  83.         user_history_url = reverse("admin:auth_user_history", args=(self.superuser.pk,))
    
  84.         self.selenium.get(self.live_server_url + user_history_url)
    
  85. 
    
  86.         paginator = self.selenium.find_element(By.CSS_SELECTOR, ".paginator")
    
  87.         self.assertTrue(paginator.is_displayed())
    
  88.         self.assertIn("%s entries" % LogEntry.objects.count(), paginator.text)
    
  89.         self.assertIn(str(Paginator.ELLIPSIS), paginator.text)
    
  90.         # The current page.
    
  91.         current_page_link = self.selenium.find_element(
    
  92.             By.CSS_SELECTOR, "span.this-page"
    
  93.         )
    
  94.         self.assertEqual(current_page_link.text, "1")
    
  95.         # The last page.
    
  96.         last_page_link = self.selenium.find_element(By.CSS_SELECTOR, ".end")
    
  97.         self.assertTrue(last_page_link.text, "20")
    
  98.         # Select the second page.
    
  99.         pages = paginator.find_elements(By.TAG_NAME, "a")
    
  100.         second_page_link = pages[0]
    
  101.         self.assertEqual(second_page_link.text, "2")
    
  102.         second_page_link.click()
    
  103.         self.assertIn("?p=2", self.selenium.current_url)
    
  104.         rows = self.selenium.find_elements(By.CSS_SELECTOR, "#change-history tbody tr")
    
  105.         self.assertIn("Changed something 101", rows[0].text)
    
  106.         self.assertIn("Changed something 200", rows[-1].text)