summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2026-01-09 13:12:29 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2026-05-06 13:01:37 +0200
commit5dd10c0cc50dca728461154494b6faa6eeee0d6c (patch)
tree592ef955385c74847f844bb0768a64baf6e3d9ff
parent3807102f4fe51bb197bdde762151218205438e6c (diff)
Added playwright tests for search bar.
-rw-r--r--djangoproject/tests.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/djangoproject/tests.py b/djangoproject/tests.py
index 2150fdec..e1e25e07 100644
--- a/djangoproject/tests.py
+++ b/djangoproject/tests.py
@@ -1,12 +1,15 @@
+import os
from http import HTTPStatus
from io import StringIO
from django.conf import settings
+from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.core.management import call_command
from django.test import TestCase
from django.urls import NoReverseMatch, get_resolver
from django.utils.translation import activate, gettext as _
from django_hosts.resolvers import reverse
+from playwright.sync_api import expect, sync_playwright
from docs.models import DocumentRelease, Release
@@ -229,3 +232,53 @@ class SiteMapTests(TestCase):
def test_sitemap_renders(self):
response = self.client.get(reverse("sitemap"))
self.assertEqual(response.status_code, 200)
+
+
+class EndToEndTests(ReleaseMixin, StaticLiveServerTestCase):
+ @classmethod
+ def setUpClass(cls):
+ os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
+ super().setUpClass()
+ cls.playwright = sync_playwright().start()
+ cls.browser = cls.playwright.chromium.launch()
+ cls.mac_user_agent = "Mozilla/5.0 (Macintosh) AppleWebKit"
+ cls.windows_user_agent = "Mozilla/5.0 (Windows NT 10.0)"
+ cls.mobile_linux_user_agent = "Mozilla/5.0 (Linux; Android 10; Mobile)"
+
+ @classmethod
+ def tearDownClass(cls):
+ super().tearDownClass()
+ cls.browser.close()
+ cls.playwright.stop()
+
+ def setUp(self):
+ super().setUp()
+ self.setUpTestData()
+
+ def test_search_ctrl_k_hotkey(self):
+ page1 = self.browser.new_page(user_agent=self.windows_user_agent)
+ page2 = self.browser.new_page(
+ user_agent=self.mobile_linux_user_agent,
+ viewport={"width": 375, "height": 812},
+ )
+ for page in [page1, page2]:
+ with self.subTest(page=page):
+ page.goto(self.live_server_url)
+ search_bar = page.locator("#id_q")
+ expect(search_bar).to_have_attribute("placeholder", "Search (Ctrl+K)")
+ is_focused = page.evaluate("document.activeElement.id === 'id_q'")
+ self.assertFalse(is_focused)
+
+ page.keyboard.press("Control+KeyK")
+ is_focused = page.evaluate("document.activeElement.id === 'id_q'")
+ self.assertTrue(is_focused)
+ page.close()
+
+ def test_search_placeholder_mac_mode(self):
+ page = self.browser.new_page(user_agent=self.mac_user_agent)
+ page.goto(self.live_server_url)
+
+ desktop_search_bar = page.locator("#id_q")
+ expect(desktop_search_bar).to_have_attribute("placeholder", "Search (⌘\u200aK)")
+
+ page.close()