o
    hq                     @   s\  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZmZ d dlmZmZmZmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z& d dl'm(Z( G dd deZ)G dd deZ*G dd deZ+G dd deZ,G dd deZ-G dd deZ.G dd deZ/dS )     N)template)cache)make_template_fragment_key)HttpRequest)TemplateSyntaxErrorVariableDoesNotExist)TestCase)override_settings)NoReverseMatch)
SafeString)gettext_lazy)get_dummy_request"make_wagtail_template_fragment_keyresolve_model_string)LocalePageSiteSiteRootPath)SITE_ROOT_PATHS_CACHE_KEYSITE_ROOT_PATHS_CACHE_VERSION)WagtailPageCacheNode)richtextslugurl)
SimplePagec                       s   e Zd ZdgZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zeg dddd Zdd Zdd Zeg dddd Zeg dddd  Zd!d" Zeg ddd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Z  ZS )/TestPageUrlTags	test.jsonc                    s   t    t  d S N)supersetUpr   clearself	__class__ S/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/tests/tests.pyr       s   
zTestPageUrlTags.setUpc                 C   *   | j d}| |jd | |d d S )N/events/   z*<a href="/events/christmas/">Christmas</a>clientgetassertEqualstatus_codeassertContainsr!   responser$   r$   r%   test_pageurl_tag&      z TestPageUrlTags.test_pageurl_tagc                 C   X   t d}| d |t dd i}W d    n1 sw   Y  | d| d S )NzX{% load wagtailcore_tags %}<a href="{% pageurl page fallback='fallback' %}">Fallback</a>r   page!<a href="/fallback/">Fallback</a>r   TemplateassertNumQueriesrenderContextassertInr!   tplresultr$   r$   r%   $test_pageurl_with_named_url_fallback+      z4TestPageUrlTags.test_pageurl_with_named_url_fallbackc                 C   s@   G dd d}t d}|t d | d}| d| d S )Nc                   @   s   e Zd Zdd ZdS )z_TestPageUrlTags.test_pageurl_with_get_absolute_url_object_fallback.<locals>.ObjectWithURLMethodc                 S   s   dS )Nz/object-specific-url/r$   r    r$   r$   r%   get_absolute_url5   s   zpTestPageUrlTags.test_pageurl_with_get_absolute_url_object_fallback.<locals>.ObjectWithURLMethod.get_absolute_urlN)__name__
__module____qualname__rA   r$   r$   r$   r%   ObjectWithURLMethod4   s    rE   zd{% load wagtailcore_tags %}<a href="{% pageurl page fallback=object_with_url_method %}">Fallback</a>)r4   object_with_url_methodz,<a href="/object-specific-url/">Fallback</a>r   r7   r9   r:   r;   )r!   rE   r=   r>   r$   r$   r%   2test_pageurl_with_get_absolute_url_object_fallback3   s   
zBTestPageUrlTags.test_pageurl_with_get_absolute_url_object_fallbackc                 C   sF   t d}|t ddi}| d| | d| | d| dS )zc
        `django.shortcuts.resolve_url` accepts strings containing '.' or '/' as they are.
        a  
            {% load wagtailcore_tags %}
            <a href="{% pageurl page fallback='.' %}">Same page fallback</a>
            <a href="{% pageurl page fallback='/' %}">Homepage fallback</a>
            <a href="{% pageurl page fallback='../' %}">Up one step fallback</a>
            r4   Nz"<a href=".">Same page fallback</a>z!<a href="/">Homepage fallback</a>z&<a href="../">Up one step fallback</a>rG   r<   r$   r$   r%   +test_pageurl_with_valid_url_string_fallbackB   s   z;TestPageUrlTags.test_pageurl_with_valid_url_string_fallbackc                 C   sN   t d}| t |t ddi W d   dS 1 s w   Y  dS )z]
        Strings not containing '.' or '/', and not matching a named URL will error.
        ze{% load wagtailcore_tags %}<a href="{% pageurl page fallback='not-existing-endpoint' %}">Fallback</a>r4   N)r   r7   assertRaisesr
   r9   r:   r!   r=   r$   r$   r%   -test_pageurl_with_invalid_url_string_fallbackS   s   "z=TestPageUrlTags.test_pageurl_with_invalid_url_string_fallbackc                 C   r&   )Nz/events/christmas/r(   z+<a href="/events/">Back to events index</a>r)   r/   r$   r$   r%   test_slugurl_tag]   r2   z TestPageUrlTags.test_slugurl_tagc                 C   s   t jjdd}td}| d |td|i}W d    n1 s&w   Y  | d| |t|t	 d}| d| d S )N/home/events/url_pathL{% load wagtailcore_tags %}<a href="{% pageurl page %}">{{ page.title }}</a>   r4   <a href="/events/">Events</a>r4   request)
r   objectsr+   r   r7   r8   r9   r:   r;   r   )r!   r4   r=   r>   r$   r$   r%   'test_pageurl_without_request_in_contextb   s   z7TestPageUrlTags.test_pageurl_without_request_in_contextc                 C   s   t jjdd}td}t }| d |t||d}W d    n1 s*w   Y  | 	d| | d |t||d}W d    n1 sPw   Y  | 	d| d S )NrN   rO   rQ      rT   rS   r   )
r   rV   r+   r   r7   r   r8   r9   r:   r;   r!   r4   r=   rU   r>   r$   r$   r%   test_pageurl_cachess   s   z#TestPageUrlTags.test_pageurl_caches)
testserver	localhostunknown.example.com)ALLOWED_HOSTSc                 C   sx   t jjdd}td}t }d|jd< | d |t	||d}W d    n1 s/w   Y  | 
d| d S )	NrN   rO   rQ   r]   	HTTP_HOSTrX   rT   rS   )r   rV   r+   r   r7   r   METAr8   r9   r:   r;   rY   r$   r$   r%   test_pageurl_with_unknown_site   s   
z.TestPageUrlTags.test_pageurl_with_unknown_sitec                 C   sP   t d}| td |t dd i W d    d S 1 s!w   Y  d S )NrQ   z,pageurl tag expected a Page object, got Noner4   )r   r7   assertRaisesRegex
ValueErrorr9   r:   rK   r$   r$   r%   test_bad_pageurl   s   "z TestPageUrlTags.test_bad_pageurlc                 C   s@   t ti d}| | t tdt idd}| | d S )Nzbad-slug-doesnt-existrU   contextslug)r   r   r:   assertIsNoner   r!   r>   r$   r$   r%   test_bad_slugurl   s   
z TestPageUrlTags.test_bad_slugurl)r[   r\   site2.example.comc                 C   sx   t jjdd}|jdddd}tjjd|d}t d	d
d}|j|d t|d}tt	
d|id
d}| |d d S )N/home/rO   New home pagenew-hometitlerg   update_attrsrk   hostname	root_page	Christmas	christmasinstancesiterU   re   z/christmas/)r   rV   r+   copyr   create	add_childr   r   r   r:   r,   )r!   	home_pagenew_home_pagesecond_sitenew_christmas_pagerU   urlr$   r$   r%   -test_slugurl_tag_returns_url_for_current_site   s   
z=TestPageUrlTags.test_slugurl_tag_returns_url_for_current_sitec                 C   s`   t jjdd}|jdddd}tjjd|d}t|d	}td
t	d|id}| 
|d d S )Nrl   rO   rm   rn   ro   rq   rk   rs   rz   rw   rU   )rg   rf   z"http://localhost/events/christmas/)r   rV   r+   r|   r   r}   r   r   r   r:   r,   )r!   r   r   r   rU   r   r$   r$   r%   +test_slugurl_tag_returns_url_for_other_site   s   
z;TestPageUrlTags.test_slugurl_tag_returns_url_for_other_sitec                 C   sl   t ti d}| |d | d t tdt id}W d    n1 s)w   Y  | |d d S )Neventsr'      rU   )r   r   r:   r,   r8   r   ri   r$   r$   r%   'test_slugurl_without_request_in_context   s   z7TestPageUrlTags.test_slugurl_without_request_in_contextc                 C   s4   t  }d|jd< ttd|id}| |d d S )Nr]   r_   rU   r   r'   )r   r`   r   r   r:   r,   )r!   rU   r>   r$   r$   r%   &test_slugurl_with_null_site_in_request   s   
z6TestPageUrlTags.test_slugurl_with_null_site_in_requestc                 C   sf   t d}tjjdd}| d |t d|i}W d    n1 s&w   Y  | d| d S )NF{% load wagtailcore_tags %}<a href="{% fullpageurl page %}">Events</a>rN   rO   rR   r4   z-<a href="http://localhost/events/">Events</a>)	r   r7   r   rV   r+   r8   r9   r:   r;   )r!   r=   r4   r>   r$   r$   r%   test_fullpageurl   s   z TestPageUrlTags.test_fullpageurlc                 C   r3   )N\{% load wagtailcore_tags %}<a href="{% fullpageurl page fallback='fallback' %}">Fallback</a>r   r4   r5   r6   r<   r$   r$   r%   (test_fullpageurl_with_named_url_fallback   r@   z8TestPageUrlTags.test_fullpageurl_with_named_url_fallbackc                 C   s\   t d}| d |t d t d}W d    n1 s!w   Y  | d| d S )Nr   r   rT   z1<a href="http://localhost/fallback/">Fallback</a>)r   r7   r8   r9   r:   r   r;   r<   r$   r$   r%   'test_fullpageurl_with_absolute_fallback   s   z7TestPageUrlTags.test_fullpageurl_with_absolute_fallbackc                 C   N   t d}| t |t ddi W d    d S 1 s w   Y  d S )Nr   r4   {   r   r7   rJ   rc   r9   r:   rK   r$   r$   r%   "test_fullpageurl_with_invalid_page      "z2TestPageUrlTags.test_fullpageurl_with_invalid_pagec                 C   r   )NzB{% load wagtailcore_tags %}<a href="{% pageurl page %}">Events</a>r4   r   r   rK   r$   r$   r%   test_pageurl_with_invalid_page   r   z.TestPageUrlTags.test_pageurl_with_invalid_page)rB   rC   rD   fixturesr   r1   r?   rH   rI   rL   rM   rW   rZ   r	   ra   rd   rj   r   r   r   r   r   r   r   r   r   __classcell__r$   r$   r"   r%   r      s6    





	
r   c                   @   s"   e Zd ZdgZdd Zdd ZdS )TestWagtailSiteTagr   c                 C   s>   t tj d}td}|td|i}| d| d S )Nrz   X{% load wagtailcore_tags %}{% wagtail_site as current_site %}{{ current_site.hostname }}rU   r\   )	r   r   rV   firstr   r7   r9   r:   r,   )r!   rU   r=   r>   r$   r$   r%   test_wagtail_site_tag  s   z(TestWagtailSiteTag.test_wagtail_site_tagc                 C   s*   t d}|t i }| d| d S )Nr    )r   r7   r9   r:   r,   r<   r$   r$   r%   2test_wagtail_site_tag_with_missing_request_context  s
   zETestWagtailSiteTag.test_wagtail_site_tag_with_missing_request_contextN)rB   rC   rD   r   r   r   r$   r$   r$   r%   r     s    	r   c                   @   s\   e Zd ZdgZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
edddd ZdS )TestSiteRootPathsCacher   c                 C   s   t jttdS )Nversion)r   r+   r   r   r    r$   r$   r%   get_cached_site_root_paths  s   z1TestSiteRootPathsCache.get_cached_site_root_pathsc              	   C   s6   t jjdd}|j}| |  tdddddg dS )zK
        This tests that the cache is populated when building URLs
        rl   rO      http://localhostensite_id	root_pathroot_urllanguage_codeN)r   rV   r+   r   r,   r   r   r!   homepage_r$   r$   r%   
test_cache"  s   z!TestSiteRootPathsCache.test_cachec              	   C   sZ   t  }| |tdddddg tjttt	|t
d t  }| |d t dS )	z
        This tests that, even if the cache backend uses JSON serialization,
        get_site_root_paths() returns a list of SiteRootPath objects.
        r   rl   r   r   r   r   r   N)r   get_site_root_pathsr,   r   r   setr   jsonloadsdumpsr   assertIsInstanceri   r$   r$   r%   *test_cache_backend_uses_json_serialization9  s$   zATestSiteRootPathsCache.test_cache_backend_uses_json_serializationc              	   C   V   t jjdd}|j}| |  tdddddg tjjdd  | 	|   d	S )
zO
        This tests that the cache is cleared whenever a site is saved
        rl   rO   r   r   r   r   Tis_default_siteN)
r   rV   r+   r   r,   r   r   r   saverh   r   r$   r$   r%   !test_cache_clears_when_site_savedW     z8TestSiteRootPathsCache.test_cache_clears_when_site_savedc              	   C   r   )
zQ
        This tests that the cache is cleared whenever a site is deleted
        rl   rO   r   r   r   r   Tr   N)
r   rV   r+   r   r,   r   r   r   deleterh   r   r$   r$   r%   #test_cache_clears_when_site_deletedt  r   z:TestSiteRootPathsCache.test_cache_clears_when_site_deletedc                 C   s   t jjdd}t jjdd}tjjdd}tddd	d
}|j|d ||_|  |j}|j	|dd t jj|j
d}| |jd dS )a  
        This tests for an issue where if a site root page was moved, all
        the page urls in that site would change to None.

        The issue was caused by the 'wagtail_site_root_paths' cache
        variable not being cleared when a site root page was moved. Which
        left all the child pages thinking that they are no longer in the
        site and return None as their url.

        Fix: d6cce69a397d08d5ee81a8cbc1977ab2c9db2682
        Discussion: https://github.com/wagtail/wagtail/issues/7
        r   idrl   rO   Tr   zNew Homepageznew-homepagehello)rp   rg   contentrx   z
last-child)pos/N)r   rV   r+   r   r   r~   ru   r   r   mover   r,   )r!   ru   r   default_sitenew_homepager   r$   r$   r%   &test_cache_clears_when_site_root_moves  s   z=TestSiteRootPathsCache.test_cache_clears_when_site_root_movesc                 C   sJ   t jjdd}|j}d|_d|_|  t jj|jd}| |jd dS )a  
        This tests for an issue where if a site root pages slug was
        changed, all the page urls in that site would change to None.

        The issue was caused by the 'wagtail_site_root_paths' cache
        variable not being cleared when a site root page was changed.
        Which left all the child pages thinking that they are no longer in
        the site and return None as their url.

        Fix: d6cce69a397d08d5ee81a8cbc1977ab2c9db2682
        Discussion: https://github.com/wagtail/wagtail/issues/157
        rl   rO   zNew homern   r   r   N)	r   rV   r+   r   rp   rg   r   r   r,   r   r$   r$   r%   -test_cache_clears_when_site_root_slug_changes  s   zDTestSiteRootPathsCache.test_cache_clears_when_site_root_slug_changesT)WAGTAIL_I18N_ENABLEDc                 C   s>   t jjdd}|j}|jtjjdddd}| |jd d S )Nrl   rO   fr)r   T)aliasr   )r   rV   r+   r   copy_for_translationr   r}   r,   )r!   r   r   translated_homepager$   r$   r%   7test_cache_clears_when_site_root_is_translated_as_alias  s   zNTestSiteRootPathsCache.test_cache_clears_when_site_root_is_translated_as_aliasN)rB   rC   rD   r   r   r   r   r   r   r   r   r	   r   r$   r$   r$   r%   r     s    (r   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestResolveModelStringc                 C   s   t d}| |t d S )Nwagtailcore.Pager   r,   r   r!   modelr$   r$   r%   test_resolve_from_string     z/TestResolveModelString.test_resolve_from_stringc                 C      t ddd}| |t d S )Nr   wagtailcoredefault_appr   r   r$   r$   r%   )test_resolve_from_string_with_default_app     z@TestResolveModelString.test_resolve_from_string_with_default_appc                 C   r   )Nr   wagtailadminr   r   r   r$   r$   r%   3test_resolve_from_string_with_different_default_app  r   zJTestResolveModelString.test_resolve_from_string_with_different_default_appc                 C      t t}| |t d S r   )r   r   r,   r   r$   r$   r%   test_resolve_from_class  r   z.TestResolveModelString.test_resolve_from_classc                 C      |  ttd d S )Nzwagtail.core.PagerJ   rc   r   r    r$   r$   r%    test_resolve_from_string_invalid     z7TestResolveModelString.test_resolve_from_string_invalidc                 C   s   | j ttddd d S )Nr   r   r   rJ   LookupErrorr   r    r$   r$   r%   3test_resolve_from_string_with_incorrect_default_app   s   
zJTestResolveModelString.test_resolve_from_string_with_incorrect_default_appc                 C   r   )Nzwagtailadmin.Pager   r    r$   r$   r%   2test_resolve_from_string_with_unknown_model_string  r   zITestResolveModelString.test_resolve_from_string_with_unknown_model_stringc                 C   r   )Nr   r   r    r$   r$   r%   ,test_resolve_from_string_with_no_default_app  r   zCTestResolveModelString.test_resolve_from_string_with_no_default_appc                 C   r   r   )r   objectr,   r   r$   r$   r%   )test_resolve_from_class_that_isnt_a_model     z@TestResolveModelString.test_resolve_from_class_that_isnt_a_modelc                 C   s   |  ttt d S r   r   r    r$   r$   r%   test_resolve_from_bad_type  r   z1TestResolveModelString.test_resolve_from_bad_typec                 C   s   |  ttd  d S r   r   r    r$   r$   r%   test_resolve_from_none  r   z-TestResolveModelString.test_resolve_from_noneN)rB   rC   rD   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r     s    r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestRichtextTagc                 C   s$   t d}| |d | |t d S )NzHello world!)r   r,   r   r   ri   r$   r$   r%   test_call_with_text  s   z#TestRichtextTag.test_call_with_textc                 C   s   t td}| |d d S )Ntest)r   r   r,   ri   r$   r$   r%   test_call_with_lazy  s   z#TestRichtextTag.test_call_with_lazyc                 C   s   t d }| |d d S )Nr   )r   r,   ri   r$   r$   r%   test_call_with_none   r   z#TestRichtextTag.test_call_with_nonec                 C   :   |  td td W d    d S 1 sw   Y  d S )N4'richtext' template filter received an invalid value*   rb   	TypeErrorr   r    r$   r$   r%   test_call_with_invalid_value$  
   
"z,TestRichtextTag.test_call_with_invalid_valuec                 C   r   )Nr   s   Hello world!r   r    r$   r$   r%   test_call_with_bytes*  r   z$TestRichtextTag.test_call_with_bytesN)rB   rC   rD   r   r   r   r   r   r$   r$   r$   r%   r     s    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestWagtailCacheTagc                 C   s   t   d S r   )r   r   r    r$   r$   r%   r   2  s   zTestWagtailCacheTag.setUpc                 C   sv   t  }td}|t|ddid}| |d |t|ddid}| |d | ttdd d S )NU{% load wagtail_cache %}{% wagtailcache 100 test %}{{ foo.bar }}{% endwagtailcache %}barfoobarrU   foobazr   	r   r   r7   r9   r:   r,   r   r+   r   r!   rU   r=   r>   result2r$   r$   r%   test_caches5  s   zTestWagtailCacheTag.test_cachesc                 C   s   t  }td}|t|ddid}| |d |t|ddid}| |d | ttdddigd | ttdddigd d S )NzY{% load wagtail_cache %}{% wagtailcache 100 test foo %}{{ foo.bar }}{% endwagtailcache %}r   r   r   r   r   r   r  r$   r$   r%   $test_caches_on_additional_parametersG  s$   z8TestWagtailCacheTag.test_caches_on_additional_parametersc                 C   sz   t  }d|_td}|t|ddid}| |d |t|ddid}| |d | t	t
d d S )NTr   r   r   r   r   r   )r   
is_previewr   r7   r9   r:   r,   rh   r   r+   r   r  r$   r$   r%   test_skips_cache_in_preview^  s   z/TestWagtailCacheTag.test_skips_cache_in_previewc                 C   sj   t d}|t dddii}| |d |t dddii}| |d | ttd d S )Nr   r   r   r   r   r   )	r   r7   r9   r:   r,   rh   r   r+   r   r!   r=   r>   r  r$   r$   r%   test_no_requestr  s   z#TestWagtailCacheTag.test_no_requestc                 C   L   |  t}td W d    n1 sw   Y  | |jjd d d S )NzP{% load wagtail_cache %}{% wagtailcache 100 %}{{ foo.bar }}{% endwagtailcache %}r   z1'wagtailcache' tag requires at least 2 arguments.rJ   r   r   r7   r,   	exceptionargsr!   er$   r$   r%   test_invalid_usage     z&TestWagtailCacheTag.test_invalid_usageN)	rB   rC   rD   r   r  r  r  r  r  r$   r$   r$   r%   r   1  s    r   c                   @   s^   e Zd ZdgZedd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )TestWagtailPageCacheTagr   c                 C   s2   t j | _t j d | _tjjddd| _d S )N   r\   P   )rt   port)	r   rV   r   page_1allpage_2r   r+   r{   )clsr$   r$   r%   setUpTestData  s   z%TestWagtailPageCacheTag.setUpTestDatac                 C   s   t | jd}td}|t|ddi| jd}| |d |t|ddi| jd}| |d | t	t
d| j| jd d S )Nrz   ]{% load wagtail_cache %}{% wagtailpagecache 100 test %}{{ foo.bar }}{% endwagtailpagecache %}r   r   rU   r   r4   r   r   r   r{   r   r7   r9   r:   r  r,   r   r+   r   r  r$   r$   r%   r    s,   z#TestWagtailPageCacheTag.test_cachesc              
   C   s   t | jd}td}|t|ddi| jd}| |d |t|ddi| jd}| |d | t	t
d| j| jddigd | t	t
d| j| jddigd d S )Nrz   za{% load wagtail_cache %}{% wagtailpagecache 100 test foo %}{{ foo.bar }}{% endwagtailpagecache %}r   r   r  r   r   r  r  r$   r$   r%   !test_caches_additional_parameters  s@   z9TestWagtailPageCacheTag.test_caches_additional_parametersc                 C   sV   t | jd}td}t|ddi| jd}||}| |d | t	j
| d S )Nrz   r  r   r   r  )r   r{   r   r7   r:   r  r9   r,   assertNotInr   CACHE_SITE_TEMPLATE_VAR)r!   rU   r=   rf   r>   r$   r$   r%   test_doesnt_pollute_cache  s   
z1TestWagtailPageCacheTag.test_doesnt_pollute_cachec                 C   s   t | jd}d|_td}|t|ddi| jd}| |d |t|ddi| jd}| |d | 	t
td| j| j d S )	Nrz   Tr  r   r   r  r   r   )r   r{   r  r   r7   r9   r:   r  r,   rh   r   r+   r   r  r$   r$   r%   r    s,   z3TestWagtailPageCacheTag.test_skips_cache_in_previewc                 C   sz   t d}|t ddi| jd}| |d |t ddi| jd}| |d | tt	d| j| j
 d S )Nr  r   r   )r   r4   r   r   )r   r7   r9   r:   r  r,   rh   r   r+   r   r{   r  r$   r$   r%   r    s    z'TestWagtailPageCacheTag.test_no_requestc                 C   sl   t  }td}| t}|t|ddid W d    n1 s%w   Y  | |jj	d d d S )Nr  r   r   r   r   r4   )
r   r   r7   rJ   r   r9   r:   r,   r  params)r!   rU   r=   r  r$   r$   r%   test_no_page  s   z$TestWagtailPageCacheTag.test_no_pagec                 C   s0   |  td| j| jtd| jj| jjgd d S )Nr   )vary_on)r,   r   r  r{   r   	cache_keyr   r    r$   r$   r%   test_cache_key  s   z&TestWagtailPageCacheTag.test_cache_keyc                 C   r	  )NzX{% load wagtail_cache %}{% wagtailpagecache 100 %}{{ foo.bar }}{% endwagtailpagecache %}r   z5'wagtailpagecache' tag requires at least 2 arguments.r
  r  r$   r$   r%   r  %  r  z*TestWagtailPageCacheTag.test_invalid_usageN)rB   rC   rD   r   classmethodr  r  r  r   r  r  r"  r%  r  r$   r$   r$   r%   r    s    
%r  )0r   djangor   django.core.cacher   django.core.cache.utilsr   django.httpr   django.templater   r   django.testr   django.test.utilsr	   django.urls.exceptionsr
   django.utils.safestringr   django.utils.translationr   wagtail.coreutilsr   r   r   wagtail.modelsr   r   r   r   wagtail.models.sitesr   r   "wagtail.templatetags.wagtail_cacher   %wagtail.templatetags.wagtailcore_tagsr   r   wagtail.test.testapp.modelsr   r   r   r   r   r   r   r  r$   r$   r$   r%   <module>   s4     i O.X