Initial commit

This commit is contained in:
2024-08-27 20:33:44 +02:00
commit 1f1832267d
14794 changed files with 1599592 additions and 0 deletions

View File

@@ -0,0 +1,290 @@
from unittest import TestCase
from django.test import TestCase as DjangoTestCase
from django.urls import reverse
from wagtail.admin.search import SearchArea
from wagtail.admin.ui.sidebar import (
ActionMenuItem,
LinkMenuItem,
MainMenuModule,
PageExplorerMenuItem,
SearchModule,
SubMenuItem,
)
from wagtail.telepath import JSContext
from wagtail.test.utils import WagtailTestUtils
from wagtail.utils.deprecation import RemovedInWagtail70Warning
class TestAdaptLinkMenuItem(TestCase):
def test_adapt(self):
packed = JSContext().pack(LinkMenuItem("link", "Link", "/link/"))
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"classname": "",
"icon_name": "",
"label": "Link",
"name": "link",
"url": "/link/",
"attrs": {},
}
],
},
)
def test_adapt_with_optional_parameters(self):
packed = JSContext().pack(
LinkMenuItem(
"link",
"Link",
"/link/",
icon_name="link-icon",
classname="some classes",
attrs={"data-is-custom": "true"},
)
)
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"classname": "some classes",
"icon_name": "link-icon",
"label": "Link",
"name": "link",
"url": "/link/",
"attrs": {"data-is-custom": "true"},
}
],
},
)
def test_adapt_with_deprecated_classnames(self):
with self.assertWarnsRegex(
RemovedInWagtail70Warning,
"The `classnames` kwarg for sidebar LinkMenuItem is deprecated - use `classname` instead.",
):
packed = JSContext().pack(
LinkMenuItem("link", "Link", "/link/", classnames="legacy-classes")
)
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"classname": "legacy-classes", # mapped to new name but raises warning
"icon_name": "",
"label": "Link",
"name": "link",
"url": "/link/",
"attrs": {},
}
],
},
)
class TestAdaptSubMenuItem(TestCase):
def test_adapt(self):
packed = JSContext().pack(
SubMenuItem(
"sub-menu",
"Sub menu",
[
LinkMenuItem("link", "Link", "/link/", icon_name="link-icon"),
],
footer_text="Footer text",
)
)
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.SubMenuItem",
"_args": [
{
"name": "sub-menu",
"label": "Sub menu",
"icon_name": "",
"classname": "",
"footer_text": "Footer text",
"attrs": {},
},
[
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"name": "link",
"label": "Link",
"icon_name": "link-icon",
"classname": "",
"url": "/link/",
"attrs": {},
}
],
}
],
],
},
)
def test_adapt_without_footer_text(self):
packed = JSContext().pack(
SubMenuItem(
"sub-menu",
"Sub menu",
[
LinkMenuItem("link", "Link", "/link/", icon_name="link-icon"),
],
)
)
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.SubMenuItem",
"_args": [
{
"name": "sub-menu",
"label": "Sub menu",
"icon_name": "",
"classname": "",
"footer_text": "",
"attrs": {},
},
[
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"name": "link",
"label": "Link",
"icon_name": "link-icon",
"classname": "",
"url": "/link/",
"attrs": {},
}
],
}
],
],
},
)
class TestAdaptPageExplorerMenuItem(TestCase):
def test_adapt(self):
packed = JSContext().pack(PageExplorerMenuItem("pages", "Pages", "/pages/", 1))
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.PageExplorerMenuItem",
"_args": [
{
"attrs": {},
"classname": "",
"icon_name": "",
"label": "Pages",
"name": "pages",
"url": "/pages/",
},
1,
],
},
)
class TestAdaptSearchModule(TestCase):
def test_adapt(self):
packed = JSContext().pack(SearchModule(SearchArea("Search", "/search/")))
self.assertEqual(
packed, {"_type": "wagtail.sidebar.SearchModule", "_args": ["/search/"]}
)
class TestAdaptMainMenuModule(WagtailTestUtils, DjangoTestCase):
def test_adapt(self):
main_menu = [
LinkMenuItem("pages", "Pages", "/pages/"),
]
account_menu = [
LinkMenuItem(
"account", "Account", reverse("wagtailadmin_account"), icon_name="user"
),
ActionMenuItem(
"logout", "Logout", reverse("wagtailadmin_logout"), icon_name="logout"
),
]
user = self.create_user(username="admin")
packed = JSContext().pack(MainMenuModule(main_menu, account_menu, user))
self.assertEqual(
packed,
{
"_type": "wagtail.sidebar.MainMenuModule",
"_args": [
[
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"name": "pages",
"label": "Pages",
"icon_name": "",
"classname": "",
"url": "/pages/",
"attrs": {},
}
],
}
],
[
{
"_type": "wagtail.sidebar.LinkMenuItem",
"_args": [
{
"name": "account",
"label": "Account",
"icon_name": "user",
"classname": "",
"url": reverse("wagtailadmin_account"),
"attrs": {},
}
],
},
{
"_type": "wagtail.sidebar.ActionMenuItem",
"_args": [
{
"name": "logout",
"label": "Logout",
"icon_name": "logout",
"classname": "",
"action": reverse("wagtailadmin_logout"),
"method": "POST",
"attrs": {},
}
],
},
],
{
"name": user.first_name or user.get_username(),
"avatarUrl": "//www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=100&d=mm",
},
],
},
)

View File

@@ -0,0 +1,371 @@
from django.template import Context, Template
from django.test import RequestFactory, TestCase
from django.utils.html import format_html
from wagtail.admin.ui.tables import (
BaseColumn,
Column,
RelatedObjectsColumn,
Table,
TitleColumn,
)
from wagtail.models import Page, Site
class TestTable(TestCase):
fixtures = ["test.json"]
def setUp(self):
self.rf = RequestFactory()
def render_component(self, obj):
request = self.rf.get("/")
template = Template("{% load wagtailadmin_tags %}{% component obj %}")
return template.render(Context({"request": request, "obj": obj}))
def test_table_render(self):
data = [
{"first_name": "Paul", "last_name": "Simon"},
{"first_name": "Art", "last_name": "Garfunkel"},
]
table = Table(
[
Column("first_name"),
Column("last_name"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<thead>
<tr><th>First name</th><th>Last name</th></tr>
</thead>
<tbody>
<tr><td>Paul</td><td>Simon</td></tr>
<tr><td>Art</td><td>Garfunkel</td></tr>
</tbody>
</table>
""",
)
def test_table_render_with_caption(self):
data = [
{"first_name": "Paul", "last_name": "Simon"},
{"first_name": "Art", "last_name": "Garfunkel"},
]
caption = "Test table"
table = Table(
columns=[
Column("first_name"),
Column("last_name"),
],
data=data,
caption=caption,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<caption class="w-sr-only">Test table</caption>
<thead>
<tr><th>First name</th><th>Last name</th></tr>
</thead>
<tbody>
<tr><td>Paul</td><td>Simon</td></tr>
<tr><td>Art</td><td>Garfunkel</td></tr>
</tbody>
</table>
""",
)
def test_table_render_with_width(self):
data = [
{"first_name": "Paul", "last_name": "Simon"},
{"first_name": "Art", "last_name": "Garfunkel"},
]
table = Table(
[
Column("first_name"),
Column("last_name", width="75%"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<col />
<col width="75%" />
<thead>
<tr><th>First name</th><th>Last name</th></tr>
</thead>
<tbody>
<tr><td>Paul</td><td>Simon</td></tr>
<tr><td>Art</td><td>Garfunkel</td></tr>
</tbody>
</table>
""",
)
def test_title_column(self):
root_page = Page.objects.filter(depth=2).first()
blog = Site.objects.create(
hostname="blog.example.com", site_name="My blog", root_page=root_page
)
gallery = Site.objects.create(
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
)
data = [blog, gallery]
table = Table(
[
TitleColumn(
"hostname",
url_name="wagtailsites:edit",
link_classname="choose-site",
link_attrs={"data-chooser": "yes"},
),
Column("site_name", label="Site name"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<thead>
<tr><th>Hostname</th><th>Site name</th></tr>
</thead>
<tbody>
<tr>
<td class="title">
<div class="title-wrapper">
<a href="/admin/sites/edit/%d/" class="choose-site" data-chooser="yes">blog.example.com</a>
</div>
</td>
<td>My blog</td>
</tr>
<tr>
<td class="title">
<div class="title-wrapper">
<a href="/admin/sites/edit/%d/" class="choose-site" data-chooser="yes">gallery.example.com</a>
</div>
</td>
<td>My gallery</td>
</tr>
</tbody>
</table>
"""
% (blog.pk, gallery.pk),
)
def test_column_media(self):
class FancyColumn(Column):
class Media:
js = ["js/gradient-fill.js"]
data = [
{"first_name": "Paul", "last_name": "Simon"},
{"first_name": "Art", "last_name": "Garfunkel"},
]
table = Table(
[
FancyColumn("first_name"),
Column("last_name"),
],
data,
)
self.assertIn('src="/static/js/gradient-fill.js"', str(table.media["js"]))
def test_row_classname(self):
class SiteTable(Table):
def get_row_classname(self, instance):
return "default-site" if instance.is_default_site else ""
root_page = Page.objects.filter(depth=2).first()
blog = Site.objects.create(
hostname="blog.example.com",
site_name="My blog",
root_page=root_page,
is_default_site=True,
)
gallery = Site.objects.create(
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
)
data = [blog, gallery]
table = SiteTable(
[
Column("hostname"),
Column("site_name", label="Site name"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<thead>
<tr><th>Hostname</th><th>Site name</th></tr>
</thead>
<tbody>
<tr class="default-site">
<td>blog.example.com</td>
<td>My blog</td>
</tr>
<tr>
<td>gallery.example.com</td>
<td>My gallery</td>
</tr>
</tbody>
</table>
""",
)
def test_row_attrs(self):
class SiteTable(Table):
def get_row_attrs(self, instance):
attrs = super().get_row_attrs(instance)
attrs["data-id"] = instance.pk
return attrs
root_page = Page.objects.filter(depth=2).first()
blog = Site.objects.create(
hostname="blog.example.com",
site_name="My blog",
root_page=root_page,
is_default_site=True,
)
gallery = Site.objects.create(
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
)
data = [blog, gallery]
table = SiteTable(
[
Column("hostname"),
Column("site_name", label="Site name"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
f"""
<table class="listing">
<thead>
<tr><th>Hostname</th><th>Site name</th></tr>
</thead>
<tbody>
<tr data-id="{blog.pk}">
<td>blog.example.com</td>
<td>My blog</td>
</tr>
<tr data-id="{gallery.pk}">
<td>gallery.example.com</td>
<td>My gallery</td>
</tr>
</tbody>
</table>
""",
)
def test_table_and_row_in_context(self):
data = [
{"first_name": "Paul", "last_name": "Simon"},
{"first_name": "Art", "last_name": "Garfunkel"},
]
class CounterColumn(BaseColumn):
def render_cell_html(self, instance, parent_context):
context = self.get_cell_context_data(instance, parent_context)
return format_html(
"<td>{} of {}</td>",
context["row"].index + 1,
context["table"].row_count,
)
table = Table(
[
CounterColumn("index"),
Column("first_name"),
Column("last_name"),
],
data,
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<thead>
<tr><th>Index</th><th>First name</th><th>Last name</th></tr>
</thead>
<tbody>
<tr><td>1 of 2</td><td>Paul</td><td>Simon</td></tr>
<tr><td>2 of 2</td><td>Art</td><td>Garfunkel</td></tr>
</tbody>
</table>
""",
)
class TestRelatedObjectsColumn(TestCase):
def setUp(self):
self.rf = RequestFactory()
def render_component(self, obj):
request = self.rf.get("/")
template = Template("{% load wagtailadmin_tags %}{% component obj %}")
return template.render(Context({"request": request, "obj": obj}))
def test_table_render(self):
table = Table(
[
Column("title"),
RelatedObjectsColumn("sites_rooted_here"),
],
Page.objects.all(),
)
html = self.render_component(table)
self.assertHTMLEqual(
html,
"""
<table class="listing">
<thead>
<tr><th>Title</th><th>Sites rooted here</th></tr>
</thead>
<tbody>
<tr>
<td>Root</td>
<td></td>
</tr>
<tr>
<td>Welcome to your new Wagtail site!</td>
<td><ul><li>localhost [default]</li></ul></td>
</tr>
</tbody>
</table>
""",
)