141 lines
4.5 KiB
Python
141 lines
4.5 KiB
Python
import pytest
|
|
from django.http import Http404
|
|
from wagtail.core.models import Page
|
|
|
|
from tests.factories.page import ContentPageFactory
|
|
from tests.factories.segment import SegmentFactory
|
|
from wagtail_personalisation import adapters, wagtail_hooks
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_serve_variant_no_variant(site, rf):
|
|
page = site.root_page
|
|
request = rf.get("/")
|
|
args = tuple()
|
|
kwargs = {}
|
|
|
|
result = wagtail_hooks.serve_variant(page, request, args, kwargs)
|
|
assert result is None
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_variant_accessed_directly_returns_404(segmented_page, rf):
|
|
request = rf.get("/")
|
|
args = tuple()
|
|
kwargs = {}
|
|
with pytest.raises(Http404):
|
|
wagtail_hooks.serve_variant(segmented_page, request, args, kwargs)
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_serve_variant_with_variant_no_segment(site, rf, segmented_page):
|
|
request = rf.get("/")
|
|
args = tuple()
|
|
kwargs = {}
|
|
|
|
page = segmented_page.personalisation_metadata.canonical_page
|
|
result = wagtail_hooks.serve_variant(page, request, args, kwargs)
|
|
assert result is None
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_serve_variant_with_variant_segmented(site, rf, segmented_page):
|
|
request = rf.get("/")
|
|
args = tuple()
|
|
kwargs = {}
|
|
|
|
page = segmented_page.personalisation_metadata.canonical_page
|
|
segment = segmented_page.personalisation_metadata.segment
|
|
|
|
adapter = adapters.get_segment_adapter(request)
|
|
adapter.set_segments([segment])
|
|
|
|
result = wagtail_hooks.serve_variant(page, request, args, kwargs)
|
|
assert result.status_code == 200
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_listing_variant_buttons(site, rf, segmented_page):
|
|
page = segmented_page.personalisation_metadata.canonical_page
|
|
|
|
SegmentFactory(name="something")
|
|
result = wagtail_hooks.page_listing_variant_buttons(page, [])
|
|
items = list(result)
|
|
assert len(items) == 1
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_page_listing_more_buttons(site, rf, segmented_page):
|
|
page = segmented_page.personalisation_metadata.canonical_page
|
|
|
|
SegmentFactory(name="something")
|
|
result = wagtail_hooks.page_listing_more_buttons(page, [])
|
|
items = list(result)
|
|
assert len(items) == 3
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_custom_delete_page_view_does_not_trigger_for_variants(rf, segmented_page):
|
|
assert (wagtail_hooks.delete_related_variants(rf.get("/"), segmented_page)) is None
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_custom_delete_page_view_triggers_for_canonical_pages(rf, segmented_page):
|
|
assert (
|
|
wagtail_hooks.delete_related_variants(
|
|
rf.get("/"), segmented_page.personalisation_metadata.canonical_page
|
|
)
|
|
) is not None
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_custom_delete_page_view_deletes_variants(rf, segmented_page, user):
|
|
post_request = rf.post("/")
|
|
user.is_superuser = True
|
|
rf.user = user
|
|
canonical_page = segmented_page.personalisation_metadata.canonical_page
|
|
canonical_page_variant = canonical_page.personalisation_metadata
|
|
assert canonical_page_variant
|
|
|
|
variants = Page.objects.filter(
|
|
pk__in=(
|
|
canonical_page.personalisation_metadata.variants_metadata.values_list(
|
|
"variant_id", flat=True
|
|
)
|
|
)
|
|
)
|
|
variants_metadata = canonical_page.personalisation_metadata.variants_metadata
|
|
# Make sure there are variants that exist in the database.
|
|
assert len(variants.all())
|
|
assert len(variants_metadata.all())
|
|
wagtail_hooks.delete_related_variants(
|
|
post_request, segmented_page.personalisation_metadata.canonical_page
|
|
)
|
|
with pytest.raises(canonical_page.DoesNotExist):
|
|
canonical_page.refresh_from_db()
|
|
with pytest.raises(canonical_page_variant.DoesNotExist):
|
|
canonical_page_variant.refresh_from_db()
|
|
# Make sure all the variant pages have been deleted.
|
|
assert not len(variants.all())
|
|
assert not len(variants_metadata.all())
|
|
|
|
|
|
@pytest.mark.django_db
|
|
def test_custom_delete_page_view_deletes_variants_of_child_pages(
|
|
rf, segmented_page, user
|
|
):
|
|
"""
|
|
Regression test for deleting pages that have children with variants
|
|
"""
|
|
post_request = rf.post("/")
|
|
user.is_superuser = True
|
|
rf.user = user
|
|
canonical_page = segmented_page.personalisation_metadata.canonical_page
|
|
# Create a child with a variant
|
|
child_page = ContentPageFactory(parent=canonical_page, slug="personalised-child")
|
|
child_page.personalisation_metadata.copy_for_segment(
|
|
segmented_page.personalisation_metadata.segment
|
|
)
|
|
# A ProtectedError would be raised if the bug persists
|
|
wagtail_hooks.delete_related_variants(post_request, canonical_page)
|