
    BhӤ                        d dl Z d dlZ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 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"m#Z#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l0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:  G d de3      Z;d Z< G d de4      Z= G d de3      Z> G d  d!e3      Z?y)"    N)skipIf)settings)get_user_model)Site)cache)ValidationError)models)IntegrityError)HttpResponseHttpResponseNotFound)reverse)now)override)	constants)
add_plugincreate_pagecreate_page_content)get_page_cache)validate_url_uniqueness)PagePageContent)Placeholder)	CMSPlugin)
CMSSitemap)CMSTestCaseTransactionCMSTestCase)get_cms_setting)get_available_slugget_current_siteget_page_from_requestc                       e Zd Zd Zy)PageMigrationTestCasec                     ddl m} | j                  |j                  j	                  dd      j                         d       y)B
        Test correct content type is set for Page object
        r   )ContentTypepagecms)model	app_label   N)"django.contrib.contenttypes.modelsr%   assertEqualobjectsfiltercount)selfr%   s     C/home/dcms/DCMS/lib/python3.12/site-packages/cms/tests/test_page.pytest_content_typez'PageMigrationTestCase.test_content_type$   s8     	C,,33&E3RXXZ\]^    N)__name__
__module____qualname__r2    r3   r1   r"   r"   #   s    _r3   r"   c                  0    t               j                  dk7  S )Nemail)r   USERNAME_FIELDr7   r3   r1   has_no_custom_userr;   -   s    **g55r3   c                   0   e Zd Zd Zd Zd Zd Zd Zd Z e	 e
       d      d        Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/y-).PagesTestCasec                 ,    t        j                          y )N)r   clearr0   s    r1   tearDownzPagesTestCase.tearDown2   s    r3   c                 L   | j                  ddd      }t        dd|       t        ddd|      }t        dd|       | j                  |j	                         d	       | j                  |j	                  d
      d	       | j                  |j	                  d
      d       t        d      5  | j                  |j	                         d       | j                  |j	                  d
      d	       | j                  |j	                  d
      d       ddd       y# 1 sw Y   yxY w)r$   r&   nav_playground.htmlenfrfrench homeinnerparentfrench inner
/en/inner/language/fr/french-inner/Ncreate_homepager   r   r,   get_absolute_urlforce_language)r0   r&   page_2s      r1   test_absolute_urlzPagesTestCase.test_absolute_url5   s    ##F,A4HD-6W&;T$OD.&9002LA00$0?N00$0?ATUD! 	ZV4468KLV44d4C\RV44d4CEXY	Z 	Z 	Z   ,A%DD#c                 L   | j                  ddd      }t        dd|       t        ddd|      }t        dd|      }| j                  |j	                         d	       | j                  |j	                  d
      d       | j                  |j	                  d
      d	       t        d      5  | j                  |j	                         d	       | j                  |j	                  d
      d       | j                  |j	                  d
      d	       d d d        y # 1 sw Y   y xY w)Nr&   rC   rD   rE   rF   rG   rH   rJ   rN   rL   rK   rO   )r0   r&   rS   	content_2s       r1   test_absolute_url_page_contentz,PagesTestCase.test_absolute_url_page_contentG   s   ##F,A4HD-6W&;T$O'nfE	 	3357JK33T3BLQ33T3BDWX D! 	]Y779;NOY777FUY777FH[\	] 	] 	]rU   c                     t        j                  t        dd      } |d      } |d|      } |d|      }||f||f||fg}|D ]%  \  }}| j                  |j	                         |       ' y )NrC   rD   )templaterM   page_a
page_a_a_arH   )	functoolspartialr   r,   get_root)r0   _creater[   page_a_ar\   page_tree_with_rootr&   roots           r1   test_get_root_pagez PagesTestCase.test_get_root_pageZ   s    ##*

 "<7\(;
Vv 
 . 	4JD$T]]_d3	4r3   c                    t        ddd      }t        ddd|      }t        ddd|      }| j                  |j                  d       | j                  |j                  d       | j	                  |j                                | j                  |j                  d       | j                  |j                  d       | j	                  |j                                | j                  |j                  d	       | j                  |j                  d
       | j                  |j                                |j                          |j                          |j                          | j                  |j                  d       | j                  |j                  d
       | j                  |j                                t        ddd|d      }| j                  |j                  d       | j                  |j                  d       | j	                  |j                                | j                  |j                  d	       | j                  |j                  d
       | j                  |j                                | j                  |j                  d       | j                  |j                  d       | j	                  |j                                | j                  |j                  d       | j                  |j                  d       | j	                  |j                                | j                  |j                  d	       | j                  |j                  d
       | j                  |j                                y)z
        This is a test for #4102

        When deleting a page, parent must be updated too, to reflect the new tree status.
        This is handled by MP_NodeQuerySet (which was not used before the fix)

        homerC   rD   page2rH   page3r*         r   )rI   
reverse_idN)	r   r,   depthnumchildassertFalseis_leaf
assertTruedeleterefresh_from_db)r0   page1rg   rh   s       r1   test_treebeard_deletez#PagesTestCase.test_treebeard_deletel   s~    F$94@G%:DOG%:DOa(+)a(+)a(+(a(+(G%:D[bca(+)a(+(a(+)a(+)a(+(r3   c                 f   ddt         j                  d   d   dd} | j                  d
i |}| j                  t        j
                  j                         d       | j                  |j                         | j                  t        |j                         j                  dd            d	g       y )Nrc   r   rC   )titleslugrM   rZ   r*   pathTflat r7   )r   	LANGUAGESrP   r,   r   r-   r/   rp   is_homelistget_urlsvalues_listr0   	page_datar&   s      r1   test_create_page_apiz"PagesTestCase.test_create_page_api   s     **1-a0-	
	 $t##0i0++-q1%dmmo99&t9LMPRtTr3   zNo custom userc           	         ddt         j                  d   d   d| j                  dt        j                  z  dz   dd      d}t        di |}| j                  t        j                  j                         d	       | j                  t        |j                        t        j                         | j                  |j                  d
       | j                  t        |j                        t        j                         | j                  |j                  d
       | j                  t        |j!                         j#                  dd            dg       y )Nrc   r   rC   VzERY-LONG-USERNAMET)is_staffis_superuser)rv   rw   rM   rZ   
created_byr*   zV+\.{3} \(id=\d+\)rx   ry   r7   )r   r|   _create_userr   PAGE_USERNAME_MAX_LENGTHr   r,   r   r-   r/   assertLessEquallenr   assertRegex
changed_byr~   r   r   r   s      r1   'test_create_page_api_with_long_usernamez5PagesTestCase.test_create_page_api_with_long_username   s     **1-a0-++i888;NN! , 

	 'Y'++-q1S193U3UV*?@S193U3UV*?@dmmo99&t9LMPVxXr3   c                     t               }t        dd      D ]  }t        ddd        t        |dd      }| j	                  |d       y)z?Checks cms.utils.page.get_available_slug for infinite recursionr      z	test-pagerC   rD   ztest-page-copy-13N)r   ranger   r   r,   )r0   sitexnew_slugs       r1   !test_get_available_slug_recursionz/PagesTestCase.test_get_available_slug_recursion   sM    !q" 	BA%:DA	B%dK>#67r3   c                     t        ddd      }t        ddd|d       | j                  t              5  t        ddd|d       ddd       y# 1 sw Y   yxY w)zFChecks for slug collisions on sibling pages - uses API to create pagestest page 1rC   rD   test page 1_1foorI   rw   N)r   assertRaisesr
   r0   rs   s     r1   test_path_collisions_api_1z(PagesTestCase.test_path_collisions_api_1   s^    M+@$GO%:DUZ[ ~. 	`)>UY^_	` 	` 	`s   AAc                     | j                  ddd      }t        ddd|d       | j                  t              5  t        dddd       ddd       y# 1 sw Y   yxY w)	zcChecks for slug collisions on root (not home) page and a home page child - uses API to create pagesr   rC   rD   r   r   r   rw   N)rP   r   r   r
   r   s     r1   test_path_collisions_api_2z(PagesTestCase.test_path_collisions_api_2   sa    $$]4I4PO%:DUZ[ ~. 	R)>5Q	R 	R 	Rs   AAc                    t               }t        ddd      }t        ddd|d      }t        ddd|d       t        d	dd|d      }| j                  t        ||j	                  d      d|
             | j                  t        ||j	                  d      d|
             | j                  t              5  t        ddd|d       ddd       y# 1 sw Y   yxY w)zTChecks for slug collisions on children of a non root page - uses API to create pagesr   rC   rD   r   r   r   ztest page 1_1_1barztest page 1_2rx   rM   exclude_pageN)r   r   rp   r   get_pathr   r
   )r0   r   rs   page1_1page1_2s        r1   test_path_collisions_api_3z(PagesTestCase.test_path_collisions_api_3   s    !M+@$Go/DdSX_de%'<d7Y^_o/DdSX_de#%%d+$		
 	#%%d+$		
 ~. 	d)+@$w]bc	d 	d 	ds   7CCc                 b   t        dddd      }t        ddd|d      }| j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d	       | j                  |j                  d      d
       | j                  j                  |j                  d            }| j                  |j                  d       | j                  j                  |j                  d            }| j                  |j                  d       y)z=Test that a parent page and its child can have the same slug.rI   rC   rD   r   r   childr   zfoo/fooz/en/foo/z/en/foo/foo/   N)r   r,   r   rQ   clientgetstatus_code)r0   rI   r   responses       r1   test_parent_child_same_slugz)PagesTestCase.test_parent_child_same_slug   s    X'<dOG%:DV[\ 	.6-y9006
C//5~F ;;??6#:#:4#@A--s3;;??5#9#9$#?@--s3r3   c                    | j                         }| j                  t        j                  j	                         j                         d       | j                  |      5  | j                  ddd      }| j                  j                  | j                               }| j                  |j                  d       t        ddd|      }t        j                  j                         }| j                  |j                  d      d       | j                  |j                         d	       | j                  j                  |j                               }| j                  |j                  d       d
d
d
       y
# 1 sw Y   y
xY w)z'
        Test the details view
        r   r   rC   rD   r   test page 2rH   ztest-page-1z/en/test-page-2/N)get_superuserr,   r   r-   allr/   login_user_contextrP   r   r   get_pages_rootr   r   get_homeget_slugrQ   )r0   	superuserr&   r   rg   homepages         r1   test_details_viewzPagesTestCase.test_details_view  s+    &&(	))+113Q7$$Y/ 
	8''7LdSD{{t':':'<=HX1137/DdSWXE||,,.HX..t4mDU3357IJ{{u'='='?@HX1137
	8 
	8 
	8s   DE33E<c                 (   t        ddd      }t        ddd|      }t        ddd|      }|j                  |d       | j                  |j                  d	       | j                  |j                  d
       | j                  |j                  d       y NHomerC   rD   AlpharH   Betaleftposition00010001000100010002r   	move_pager,   rx   r0   rf   alphabetas       r1   ,test_move_page_regression_left_to_right_5752z:PagesTestCase.test_move_page_regression_left_to_right_5752  s     6#8$?!	
 !	
 	uv. 	F+J/Z0r3   c                 h   t        ddd      }t        ddd|      }t        ddd|      }|j                  |d       |j                          |j                          | j                  |j                  d	       | j                  |j                  d
       | j                  |j                  d       y r   )r   r   rr   r,   rx   r   s       r1   ,test_move_page_regression_right_to_left_5752z:PagesTestCase.test_move_page_regression_right_to_left_57526  s     6#8$?!	
 !	
 	uv. 	F+J/Z0r3   c                     t        ddd      }t        ddd      }|j                  |d       | j                  |j                  d       | j                  |j                  d       y )	Nr   rC   rD   r   rightr   00020003r   )r0   r   r   s      r1   test_move_page_regression_5640z,PagesTestCase.test_move_page_regression_5640Q  sX    G%:DA6#8$?w/F+V,r3   c                    t        ddd      }t        ddd      }t        ddd      }t        ddd      }t        ddd      }|j                  |d	       |j                  |d	       |j                  |d	       |j                  |d	       |d
f|df|df|df|dfg}|D ]!  \  }}| j                  |j                  |       # y )Nr   rC   rD   r   GammaDeltaTheta
last-childr   r   r   000100010001000100010001000100010001000100010001r   )	r0   r   r   gammadeltathetatreer&   rx   s	            r1   %test_move_page_regression_nested_5640z3PagesTestCase.test_move_page_regression_nested_5640Y  s    G%:DA6#8$?G%:DAG%:DAG%:DAu|4|455 FO:N#&'*+
  	.JD$TYY-	.r3   c                    t        ddd      }t        dt        j                  d|      }| j                  |j	                         |j	                                |j                  |d       t        j                  j                  |j                        }| j                  |j	                         |j	                                y )NParentzcol_three.htmlrD   ChildrH   r   pk)
r   r   TEMPLATE_INHERITANCE_MAGICr,   get_templater   r   r-   r   r   )r0   rI   r   s      r1   test_move_page_inheritz$PagesTestCase.test_move_page_inheritq  s    X'7>GY%I%I4X^_++-v/B/B/DE'  EHH -++-v/B/B/DEr3   c                 n   t        ddddd      }|j                  d       |j                         }| j                  j	                  |      }| j                  d	|j                         t        j                  j                  t        j                  d
   d   d
   d      }t        |      5 }|j                         }d d d        	 j                  dd      }t        |d      5 }|j                  |       d d d        | j                  j	                  |      }| j                  d	|j                         t        |d      5 }|j                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   sxY w# 1 sw Y   y xY w# t        |d      5 }|j                         d d d        w # 1 sw Y   w xY wxY w)NzAdd PlaceholderrC   rD   r   T)r   in_navigationzadd_placeholder.html)rZ   r   r   DIRSz<!-- SECOND_PLACEHOLDER -->z${% placeholder second_placeholder %}w)r   update_translationsrQ   r   r   r,   r   osrx   joinr   	TEMPLATESopenreadreplacewrite)r0   r&   urlr   rx   fobjoldnews           r1   test_add_placeholderz"PagesTestCase.test_add_placeholdery  sw   ,.CTT`ptu  *@ A##%;;??3'h223ww||H..q1&9!<>TU$Z 	4))+C		 ++;=cdCdC  D

3 {{s+HS("6"67dC  D

3   	 	   
   dC  D

3     sT   ,EF  $E(6?F  E4E%(E1-F  4E= F4F(	F4(F1-F4c                     t        ddddd       | j                  t        t               j	                               d       y)zi
        Test that CMSSitemap object contains only published,public (login_required=False) pages
        r&   rC   rD   T)login_requiredr   r   N)r   r,   r   r   itemsr@   s    r1   !test_sitemap_login_required_pagesz/PagesTestCase.test_sitemap_login_required_pages  s6     	F14\`aZ\//12A6r3   c                 `   t               t        j                  d      z
  }t        ddd      }||_        |j                          t               }| j                  t        |j                               d       |j                  |j                         d         }| j                  ||kD         y )Nr*   daysr&   rC   rD   r   )tz_nowdatetime	timedeltar   creation_datesaver   r,   r   r   lastmodrp   )r0   one_day_agor&   sitemapactual_last_modification_times        r1   ,test_sitemap_includes_last_modification_datez:PagesTestCase.test_sitemap_includes_last_modification_date  s    h!3!3!;;6#8$?(		,W]]_-q1(/8J(K%5CDr3   c                    t               }|t        j                  |j                        z  }|t        j                  d      z
  }t	        ddd      }|j                  d       ||_        ||_        |j                          t               }|j                  |j                         j                               }| j                  |j                         |j                                y )N)microsecondsr*   r   r&   rC   rD   )r  r  r  microsecondr   get_content_objr  changed_dater  r   r  r   firstr,   date)r0   r   r  r&   r	  r
  s         r1   ?test_sitemap_uses_publication_date_when_later_than_modificationzMPagesTestCase.test_sitemap_uses_publication_date_when_later_than_modification  s    hx!!s??H..A666#8$?T"('		,(/8M8M8O(P%6;;=sxxzJr3   c                    t        ddd      }t        ddd|      }t        ddd|      }t        ddd|      }t        d	dd|      }|j                  d      }|j                  d      }t        j                  |_        |j                  d      }t        j                  |_        |j                          |j                          |j                  d      }	t        j                  |	_        |	j                          | j                  t        |d
             | j                  d      5  | j                  |j                  t        j                         ddd       | j                  d      5  | j                  |j                         |j                                ddd       | j                  d      5  |j                          ddd       | j                  t        |	d
             | j                  d      5  | j                  |j                  d       | j                  |j                         |j                                ddd       | j                  d      5  |j                          ddd       |j                  d      }
t        j                  |
_        |
j                          | j                  |
j                  t        j                         | j                  |j                         t        d      d   d          | j                  |j                         t        d      d   d          y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)z:
        Test the inheritance magic for templates
        rI   rC   rD   r   rH   zgrand childchild2zcol_two.htmlzgrand child2_template_cacher   Nri   r*   r   )r   r  r   r   rZ   r  rn   hasattrassertNumQueriesr,   get_template_namer   r   )r0   rI   r   grand_childr  grand_child2child_contentchild2_contentgrand_child_contentgrand_child2_contentparent_contents              r1   test_templateszPagesTestCase.test_templates  s    X'<dCG%:DP!-1FUZ[X~tFK">3H$W]^--d3//5!*!E!E)99$?'0'K'K$  "+;;DA(1(L(L%!!#!46GHI""1% 	[]33Y5Y5YZ	[""1% 	ZV5579V9V9XY	Z ""1% 	'$$&	' 	!57HIJ""1% 	[^44nEV5579W9W9YZ	[
 ""1% 	(%%'	(  //5"+"F"F00)2V2VW,,.0LQ0OPQ0RS113_[5QRS5TUV5WX/	[ 	[	Z 	Z	' 	'	[ 	[
	( 	(s=   )+L6-/M5M:AMM*6M MMM'*M3c                 N   | j                  d      }t        ddd      }t        ddd      }|j                  d      d   }t        j                  j                  d|dt        j                  d   d         } |d	
      }|j                  |       |j                          | j                  t        j                  j                         d       | j                  |j                  j                         d       | j                  t        j                  j                         dkD         | j                         }|j                  d      j                         }|j                  d      j                         }	t        j                  j                         ||	z   z
  }
| j                  |      5  | j                   j#                  | j%                  t&        d|j(                        ddi       ddd       | j                  |      5  | j                   j#                  | j%                  t&        d|j(                        ddi       ddd       | j                  t        j                  j                         d       | j                  |j                  j                         d       | j                  t        j                  j+                  d      j                         |
       | j                  t&        j                  j                         d       y# 1 sw Y   &xY w# 1 sw Y   xY w)zj
        Check that plugins and placeholders get correctly deleted when we delete
        a page!
        
TextPluginrf   rC   rD   r&   r   r*   )plugin_typeplaceholderr   rM   r{   bodyri   rq   postyesN	clipboard)slot)get_plugin_modelr   get_placeholdersr   r-   creater   r|   set_base_attrr  r,   r/   rp   r   r   r   r   r(  get_admin_urlr   r   exclude)r0   Textrf   r&   r%  plugin_basepluginr   home_pl_countpage_pl_countexpected_pl_counts              r1   test_delete_with_pluginsz&PagesTestCase.test_delete_with_plugins  s   
 $$\26#8$?6#8$?++D1!4''..$+T\TfTfghTijkTl / 
 2!!&)**002A6++-q1++113a78&&(	--d399;--d399;'//557==;XY$$Y/ 	[KKT//hH6SX/Z	[ $$Y/ 	[KKT//hH6SX/Z	[ 	**002A6++-q1,,44+4FLLNPab++-q1	[ 	[	[ 	[s   ,>L>LLL$c                 `    | j                  d      }t        |      }| j                  |d        y )N/)get_requestr    r,   )r0   requestr&   s      r1   !test_get_page_from_request_nopagez/PagesTestCase.test_get_page_from_request_nopage  s,    ""3'$W-t$r3   c                 z    t        ddd       | j                  d      }t        |      }| j                  |d        y )Nr&   rC   rD   z/does-not-exist/)r   r;  r    r,   )r0   r<  
found_pages      r1   (test_get_page_from_request_with_page_404z6PagesTestCase.test_get_page_from_request_with_page_404  s:    F148""#56*73
T*r3   c                     t        dddd      }t        dddd|       | j                  d      }t        |      }| j                  |       y )Nrc   rC   rD   r   r&   rw   rI   z/en/root/page)r   r;  r    assertIsNotNone)r0   rc   r<  r?  s       r1   !test_get_page_without_final_slashz/PagesTestCase.test_get_page_without_final_slash	  sL    6#8$VLF14fTR""?3*73
Z(r3   c                 >   | j                  ddd      }t        ddd|      }t        ddd|      }t        ddd      }t        ddd|      }|j                          |j                          |j                          |j                          |j                          | j                  |j                  |j
                         | j                  |j                  |j
                         | j                  |j                  |j
                         | j                  |j                         | j                         d	z          | j                  |j                         | j                         d
z          | j                  |j                         | j                         dz          | j                  |j                         | j                         dz          | j                  |j                         | j                         dz          | j                  ||      }| j                  |j                         | j                         dz          |j                          |j                          |j                          | j                  ||      }| j                  |j                         | j                         dz          |j                          |j                          | j                  ||      }| j                  |j                         | j                         dz          y )Nr   rC   rD   r   rH   test page 3ztest page 4ztest page 5r{   test-page-2/ztest-page-2/test-page-3/ztest-page-4/ztest-page-4/test-page-5/ztest-page-3/ztest-page-2/test-page-5/ztest-page-4/test-page-3/)	rP   r   rr   r,   	parent_idr   rQ   r   r   )r0   rs   rg   rh   page4page5s         r1   test_page_urlszPagesTestCase.test_page_urls  s   $$]4I4PM+@$uUM+@$uUM+@$GM+@$uU%((3%((3%((3//143F3F3H23MN//143F3F3H>3YZ//143F3F3HKe3ef//143F3F3H>3YZ//143F3F3HKe3efue,//143F3F3H>3YZue,//143F3F3HKe3efue,//143F3F3HKe3efr3   c                 J   t               }| j                  |j                         | j                  dt	        |             t        ddd      }| j                  |j                         | j                  d|j                   t	        |             t               }| j                  |j                         | j                  dt	        |             |j                         }| j                  |j                         | j                  d|j                   t	        |             y )Nzid=Noneztest saved pagerC   rD   zid=)	r   assertIsNoner   assertInreprr   rC  r   r  )r0   non_saved_page
saved_pagenon_saved_titlesaved_contents        r1   test_page_and_title_reprz&PagesTestCase.test_page_and_title_repr1  s    .++,in!56 !24I4P
Z]]+JMM?+T*-=>%-/,,-io!67"224]--.M,,-.]0CDr3   c                 2   | j                  ddd      }t        ddd|      }t        ddd|d      }| j                         }| j                  |j	                         | j                         d	z          | j                  |j	                         | j                         d
z          | j                  d|      }| j                  |      5  dddd}| j                  j                  ||      }| j                  || j                  d             d d d        t        j                  j                  |j                        }t        j                  j                  |j                        }| j                  |j	                         | j                         dz          | j                  |j	                         | j                         d
z          |j!                          | j                  |j	                         | j                         d
z          y # 1 sw Y   xY w)Nr   rC   rD   r   rH   rF  zi-want-another-url)rI   overwrite_urlrG  zi-want-another-url/zpage-test-2rv   rw   rZ   r   zpage-test-2/)rP   r   r   r,   rQ   r   get_page_change_urir   r   r(  assertRedirectsget_pages_admin_list_urir   r-   r   r   r  )r0   rs   rg   rh   r   endpointdatar   s           r1   test_page_overwrite_urlsz&PagesTestCase.test_page_overwrite_urlsB  s   $$]4I4PM+@$uU0$uTh
 &&(	//143F3F3H>3YZ//143F3F3HK`3`a++D%8$$Y/ 	P*MOdeD{{''$7H  4+H+H+NO	P
   EHH -  EHH -//143F3F3H>3YZ//143F3F3HK`3`a 	

//143F3F3HK`3`a	P 	Ps   AHHc           	         t               }| j                  d      5  t        ddd       t        ddd      }t        ddd      }| j                  t	        ||j                  d      d|             | j                  t	        ||j                  d      d|             | j                  t              5  |j                  ddd	       d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   y
xY w)z6Tests if a URL-Override clashes with a normal page urlFCMS_PERMISSIONrf   rC   rD   r   r   r   )managedrx   N)	r   r   r   rp   r   r   r   r
   update_urls)r0   r   r   r   s       r1   test_slug_url_overwrite_clashz+PagesTestCase.test_slug_url_overwrite_clasha  s    !]]%]0 	A 5t<e%:DACe%:DACOO'd+!!$	 OO'd+!!$	 "">2 Ae%@A-	A 	A,A A-	A 	As$   BC&4C	C&C#	C&&C/c                    t         j                  j                         }t         j                  j                  dd      }t	        ddd|      }t	        dddd||      }t	        ddd|      }t	        dddd||      }| j                  t        ||j                  d      d|	             | j                  t        ||j                  d      d|	             y )
Nzsample3.com)domainnamerf   rC   de)r   r   )rw   rI   r   r   )r   r-   get_currentr.  r   rp   r   r   )r0   site1site3rf   r   home_s3bar_s3s          r1   test_valid_url_multisitez&PagesTestCase.test_valid_url_multisite}  s    ((*##=}#M6#8$UK%!65QU\abf&;TNU$94eT[bgh#\\$' 		
 	#__T*#		
r3   c                    | j                  d      5  | j                  ddd      }| j                  |j                  d      d       | j                  j                  d      }| j                  |j                  t        j                         | j                  j                  d      }| j                  |j                  t        j                         d d d        y # 1 sw Y   y xY w)NFr_  r&   rC   rD   /en/z	/en/page/)	r   rP   r,   rQ   r   r   r   r   r   r0   r&   resps      r1   test_home_slug_not_accessiblez+PagesTestCase.test_home_slug_not_accessible  s    ]]%]0 	Q''0EtLDT2248&A;;??6*DT--|/G/GH;;??;/DT--/C/O/OP	Q 	Q 	Qs   B?CC$c                 T   | j                  d      5  t        dddd      }|j                  j                  d      |j                  d<   t        |j                  d            }t        |      D ]=  \  }}t        d      D ]*  }t        |d	dd
||fz         t        |ddd||fz         , ? t        d       | j                  |      }|d   j                  j                          | j                  |d         }| j                  d      5  t        |      D ]a  \  }}|j!                  |j"                  |d      }t        d      D ]0  }| j%                  d
||fz  |       | j%                  d||fz  |       2 c 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N))placeholder_tests/base.htmltpl)CMS_TEMPLATESrf   rt  rD   r   rL      r#  z
text-%d-%dr&  
LinkPluginz
link-%d-%d)rf  z
pages-rootr&   r<     F)inherit)r   r   pagecontent_setr   page_content_cacher~   r-  	enumerater   r   r   get_contextcurrent_pageget_languagesget_content_rendererr  render_page_placeholderr+  rN  )	r0   r&   placeholdersir%  jcontextrenderercontents	            r1   test_plugin_loading_queriesz)PagesTestCase.test_plugin_loading_queries  s   ]]C  
 	F v'DdQWXD,0,@,@,D,Dd,D,SD##D) 5 5d ;<L"+L"9 \;q \A{L$\UVXYTZEZ[{L$\UVXYTZEZ[\\ L!&&D&1GI++99;001CDH&&q) 	F&/&= FNA{&>>#(( % ? G
 #1X FlaV&;WElaV&;WEFF	F'	F 	F&	F 	F'	F 	Fs%   C=FA0FFF	FF'c                     t        ddddt        j                        }| j                  j	                  |j                  d            }| j                  |j	                  d      d       y)zNTest that no X-Frame-Options is set when page's xframe_options is set to allowrf   rC   rD   rv   rZ   rM   rw   xframe_optionsX-Frame-OptionsN)r   r   X_FRAME_OPTIONS_ALLOWr   r   rQ   r,   rp  s      r1   test_xframe_options_allowz'PagesTestCase.test_xframe_options_allow  sZ    *$::
 {{t44T:;"34d;r3   c                     t        ddddt        j                        }| j                  j	                  |j                  d            }| j                  |j	                  d      d       y)zNTest that X-Frame-Options is 'SAMEORIGIN' when xframe_options is set to originrf   rC   rD   r  r  
SAMEORIGINN)r   r   X_FRAME_OPTIONS_SAMEORIGINr   r   rQ   r,   rp  s      r1   test_xframe_options_sameoriginz,PagesTestCase.test_xframe_options_sameorigin  sZ    *$??
 {{t44T:;"34lCr3   c                     t        ddddt        j                        }| j                  j	                  |j                  d            }| j                  |j	                  d      d       y)zFTest that X-Frame-Options is 'DENY' when xframe_options is set to denyrf   rC   rD   r  r  DENYN)r   r   X_FRAME_OPTIONS_DENYr   r   rQ   r,   rp  s      r1   test_xframe_options_denyz&PagesTestCase.test_xframe_options_deny  sZ    *$99
 {{t44T:;"34f=r3   c                 R   t        ddddt        j                        }t        dddd|t        j                        }t        dddd|t        j                        }t        dddd|t        j                        }| j
                  j                  |j                  d            }| j                  |j                  d      d       | j
                  j                  |j                  d            }| j                  |j                  d      d       | j
                  j                  |j                  d            }| j                  |j                  d      d	       | j
                  j                  |j                  d            }| j                  |j                  d      d	       y	)
zMTest that X-Frame-Options is set to parent page's setting when inherit is setrf   rC   rD   r  subpage)rv   rZ   rM   rw   rI   r  r  r  N)	r   r   r  X_FRAME_OPTIONS_INHERITr  r   r   rQ   r,   )r0   rI   child1r  child3rq  s         r1   'test_xframe_options_inherit_with_parentz5PagesTestCase.test_xframe_options_inherit_with_parent  sk   *$99
 *$<<
 *$::
 *$<<
 {{v66t<="34f={{v66t<="34f={{v66t<="34d;{{v66t<="34d;r3   c                 *   t         j                  dgz   }| j                  |      5  t        ddd      }| j                  j	                  |j                  d            }| j                  |j	                  d      d       d d d        y # 1 sw Y   y xY w)N6django.middleware.clickjacking.XFrameOptionsMiddleware)
MIDDLEWAREr   rC   rD   r  r  )r   r  r   r   r   rQ   r,   )r0   r  r&   rq  s       r1   8test_top_level_page_inherited_xframe_options_are_appliedzFPagesTestCase.test_top_level_page_inherited_xframe_options_are_applied  s    ((,d+ee
]]j]1 	H}.CTJD;;??4#8#8#>?DTXX&78,G	H 	H 	Hs   AB		Bc                 >   t        t        dd       rdt        j                  dgz   i}ndt        j                  dgz   i}d|d<    | j                  di |5  t	        dddt
        j                  	      }| j                  j                  |j                  d            }| j                  |j                  d
      d        | j                  j                  |j                  d            }| j                  |j                  d
      d        d d d        y # 1 sw Y   y xY w)Nr  r  MIDDLEWARE_CLASSESTCMS_PAGE_CACHEr   rC   rD   )r  r  r7   )getattrr   r  r  r   r   r  r   r   rQ   r,   )r0   r   r&   rq  s       r1   Ctest_xframe_options_with_cms_page_cache_and_clickjacking_middlewarezQPagesTestCase.test_xframe_options_with_cms_page_cache_and_clickjacking_middleware  s   8\40h11LH %h&A&AL'H &*!"T]]&X& 	@%(>>	D ;;??4#8#8#>?DTXX&78$? ;;??4#8#8#>?DTXX&78$?	@ 	@ 	@s   B4DDc                 V   | j                  ddd      }|j                         }| j                  |      }| j                  j	                  |      }| j                  |j                  d       t        |      }| j                  |       |\  }}}| j                  ||j                         y)zB
        Test that the page cache works in its basic form
        r&   rC   rD   r   N)
rP   rQ   r;  r   r   r,   r   r   rC  r  )	r0   r&   page_urlr<  r   cached_datacached_contentcached_headersexpiress	            r1   test_page_cache_basicz#PagesTestCase.test_page_cache_basic@  s     ##F,A4H((*""8, ;;??8,--s3$W-[) 3>/)9)9:r3   c                 h   | j                  ddd      }t        dd|       |j                  d      }| j                  |      }d|_        | j
                  j                  |      }| j                  |j                  d       |j                  d      }| j                  |      }d|_        | j
                  j                  |      }| j                  |j                  d       t        |      }t        |      }	| j                  |       | j                  |	       | j                  |d   |	d          y	)
zO
        Test that the page cache properly handles different languages
        r&   rC   rD   rE   rF   rL   r   r   N)rP   r   rQ   r;  LANGUAGE_CODEr   r   r,   r   r   rC  assertNotEqual)
r0   r&   en_url
en_requesten_responsefr_url
fr_requestfr_response	en_cached	fr_cacheds
             r1   !test_page_cache_language_handlingz/PagesTestCase.test_page_cache_language_handlingR  s    ##F,A4HD-6 &&&5%%f-
#'
 kkoof-00#6 &&&5%%f-
#'
 kkoof-00#6 #:.	":.	Y'Y'IaL)A,7r3   c                 P   | j                  ddd      }|j                  d      }| j                  |      }d|_        | j                  j                  |      }| j                  |j                  d       | j                  |d   j                  d             t        |      }| j                  |d	       | j                  |d         }d|_        | j                  j                  |d         }| j                  |j                  d
       t        |      }| j                  |d       y)z
        Test that the page cache works correctly with language fallbacks:
        - No cache entry should exist for non-existent language versions
        - The fallback language version should be cached
        r&   rC   rD   rg  rL   i.  Locationro  z0Non-existent German version should not be cachedr   z)Fallback English version should be cachedN)rP   rQ   r;  r  r   r   r,   r   rp   
startswithr   rM  rC  )	r0   r&   de_url
de_requestr   r  r  r  r  s	            r1   !test_page_cache_language_fallbackz/PagesTestCase.test_page_cache_language_fallbacko  s    ##F,A4H &&&5%%f-
#'
 ;;??6*--s3,77?@ %Z0+'YZ %%hz&:;
#'
 kkoohz&:;00#6":.	Y(STr3   N)0r4   r5   r6   rA   rT   rX   rd   rt   r   r   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r8  r=  r@  rD  rK  rT  r]  rc  rm  rr  r  r  r  r  r  r  r  r  r  r  r7   r3   r1   r=   r=   1   s   Z$]&4$4)l
U  "23Y 4Y.8`Rd64"8$1016-.0F (7EK,Y\#2J%
+)gBE"b>A8
4QF><D>.<`H!@F;$8:Ur3   r=   c                       e Zd Zd Zd Zd Zy)PageTreeTestsc                    | j                         }t        dddd       t        dddd      }t        dddd|      }| j                  d|      }| j                  |      5  dd	dd
}| j                  j                  ||      }| j                  || j                  d             d d d        t        j                  j                  |j                        }| j                  |j                  d      d       y # 1 sw Y   VxY w)NgrandparC   rD   rf   r   rI   r   rB  fatherrW  r   rL   z/en/father/child/)r   r   rX  r   r   r(  rY  rZ  r   r-   r   r   r,   rQ   )r0   r   rI   r   r[  r\  r   s          r1   test_rename_nodezPageTreeTests.test_rename_node  s    &&(	I4dHX'<dRG%:DwW]^++D&9$$Y/ 	P%xEZ[D{{''$7H  4+H+H+NO	P
   EHH -///>@ST	P 	Ps   "AC;;Dc                    | j                         }t        dddd       t        dddd      }t        dddd|      }t        d	ddd	|      }|j                          t        d
ddd
|      }|j                          t        dddd|      }| j                  d|      }| j	                  |      5  dddd}| j
                  j                  ||      }	| j                  |	| j                  d             d d d        | j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       y # 1 sw Y   pxY w)Nr  rC   rD   rf   r   rI   r   rB  zgrandchild-1zgrandchild-2zgrandchild-3r  rW  rL   z/en/father/child/grandchild-1/z/en/father/child/grandchild-2/z/en/father/child/grandchild-3/)r   r   rr   rX  r   r   r(  rY  rZ  r,   rQ   )
r0   r   rI   r   grandchild_1grandchild_2grandchild_3r[  r\  r   s
             r1   #test_rename_node_alters_descendantsz1PageTreeTests.test_rename_node_alters_descendants  sq   &&(	I4dHX'<dRG%:DwW]^">3H$Uclqr">3H$Uclqr">3H$Uclqr++D&9$$Y/ 	P%xEZ[D{{''$7H  4+H+H+NO	P
 	666EGgh666EGgh666EGgh	P 	Ps   2AE%%E.c                     t        dddd      }t        dddd      }t        dddd|      }|j                  |       |j                          | j                  |j	                  d	      d
       y )Nr  rC   rD   rf   r   rI   r   rB  rL   z/en/parent/child/)r   r   rr   r,   rQ   )r0   rf   rI   r   s       r1   test_move_nodezPageTreeTests.test_move_node  so    9&;TOX'<dRG%:DwW[\///>@STr3   N)r4   r5   r6   r  r  r  r7   r3   r1   r  r    s    U i*Ur3   r  c                       e Zd Zd Zd Zd Zy)PageContentTestsc                     t        ddd      | _        t        dd| j                        | _        | j                  j	                  d      | _        y )Nzenglish-pagerC   rD   rg  zgerman content)r   r&   r   german_contentr  english_contentr@   s    r1   setUpzPageContentTests.setUp  s@    0EtL	1$8H$))T#yy88>r3   c                     | j                   j                  d= | j                   j                  d      }| j                  |j                  | j
                  j                         y)zS
        Cache partially populated, if no hit it should try to populate it
        rg  N)r&   r}  r  r,   r   r  )r0   r  s     r1   test_get_content_objz%PageContentTests.test_get_content_obj  sL     II((.2248**D,?,?,B,BCr3   c           	      0   ddl m} | j                  t        t        j
                  t        j                               | j                  t        t        j
                  j                         |             | j                  t        j
                  j                  | j                        j                         d       | j                  t        t        t        j
                  j                  | j                        j                                     d       y )Nr   )ContentAdminQuerySetry  ri   )cms.models.managersr  rp   
isinstancer   admin_managerr	   Managernoner,   r.   r&   r/   r   r~   current_content)r0   r  s     r1   test_page_content_managerz*PageContentTests.test_page_content_manager  s    < 	
;#<#<fnnMN
;#<#<#A#A#CEYZ[ 	2299tyy9IOOQSTU 	T+";";"B"B		"B"R"b"b"defhijr3   N)r4   r5   r6   r  r  r  r7   r3   r1   r  r    s    ?
Dkr3   r  )@r  r]   os.pathr   unittestr   django.confr   django.contrib.authr   django.contrib.sites.modelsr   django.core.cacher   django.core.exceptionsr   	django.dbr	   django.db.utilsr
   django.httpr   r   django.urlsr   django.utils.timezoner   r  django.utils.translationr   rR   r'   r   cms.apir   r   r   cms.cache.pager   cms.forms.validatorsr   
cms.modelsr   r   cms.models.placeholdermodelr   cms.models.pluginmodelr   cms.sitemapsr   cms.test_utils.testcasesr   r   cms.utils.confr   cms.utils.pager   r   r    r"   r;   r=   r  r  r7   r3   r1   <module>r     s          . , # 2  * :  / ?  @ @ ) 8 ( 3 , # H * _K _6ZU* ZUz,UK ,U^k{ kr3   