o
    hP`                     @   s  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 d dlmZmZ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G dd deZdS )    N)unescape)forms)TestCase)override_settings)escape)widgets)TagField)Page)AdminStarDateInput)	EventPageRestaurantTag
SimplePagec                   @   s   e Zd 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d Zdd Zdd Zdd Zdd Zdd ZdS ) TestAdminPageChooserWidgetc                 C   s2   t jjdd| _tddd| _| jj| jd d S )N   )id	foobarbazhello)titlecontent)instance)r	   objectsget	root_pager   
child_page	add_child)cls r   `/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/tests/test_widgets.pysetUpTestData   s   z(TestAdminPageChooserWidget.setUpTestDatac                 C   s   t  }| |j d S )N)r   AdminPageChooserassertFalse	is_hiddenselfwidgetr   r   r   test_not_hidden   s   z*TestAdminPageChooserWidget.test_not_hiddenc                 C   sf   t  }t  |}| d|d  | d|d  | |d d | |d ddgd d	d
 d S )Nz3<input id="__ID__" name="__NAME__" type="hidden" />r   Choose a page   __ID__r   Fzwagtailcore.pagez/admin/choose-page/)canChooseRoot
modelNames	userPermsmodalUrl)r   r   PageChooserAdapterjs_argsassertInHTMLassertInassertEqualr#   r$   r.   r   r   r   
test_adapt!   s   z%TestAdminPageChooserWidget.test_adaptc                 C   s:   t jttgd}t  |}| |d d ddg d S )Ntarget_modelsr   r*   ztests.simplepagetests.eventpage)r   r   r   r   r-   r.   r1   r2   r   r   r   test_adapt_with_target_model4   s
   z7TestAdminPageChooserWidget.test_adapt_with_target_modelc                 C   s0   t jdd}t  |}| |d d  d S )NTcan_choose_rootr   r)   )r   r   r-   r.   
assertTruer2   r   r   r   test_adapt_with_can_choose_root<   s   z:TestAdminPageChooserWidget.test_adapt_with_can_choose_rootc                 C   s2   t  }|dd i }| d| | d| d S )Ntestz#<input name="test" type="hidden" />r&   )r   r   render_htmlr/   r0   r#   r$   htmlr   r   r   test_render_htmlB   s   z+TestAdminPageChooserWidget.test_render_htmlc                 C   s*   t  }|dd ddi}| d| d S )Nr<   r   test-idznew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});r   r   renderr0   r>   r   r   r   test_render_js_initL   s   z.TestAdminPageChooserWidget.test_render_js_initc                 C   s.   t jdd}|dd ddi}| d| d S )Ncopy_to)
user_permsr<   r   rA   znew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": false, "userPerms": "copy_to", "modalUrl": "/admin/choose-page/"});rB   r>   r   r   r   "test_render_js_init_with_user_permU   s   z=TestAdminPageChooserWidget.test_render_js_init_with_user_permc                 C   sT   t  }|d| jddi}| d| jj | | d| | d| jj | d S )Nr<   r   rA   z;<input id="test-id" name="test" type="hidden" value="%d" />zfoobarbaz (simple page)znew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/", "parentId": %d});)r   r   rC   r   r/   r   r0   r   r>   r   r   r   test_render_with_value^   s   z1TestAdminPageChooserWidget.test_render_with_valuec                 C   sP   t jtgd}|dd ddi}| d| |d| jddi}| d| d S Nr4   r<   r   rA   new PageChooser("test-id", {"modelNames": ["tests.simplepage"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});Choose a page (Simple page)r   r   r   rC   r0   r   r>   r   r   r   test_render_with_target_modelp   s   z8TestAdminPageChooserWidget.test_render_with_target_modelc                 C   sN   t jtd}|dd ddi}| d| |d| jddi}| d| d S rI   rL   r>   r   r   r   0test_render_with_target_model_as_single_instance|      zKTestAdminPageChooserWidget.test_render_with_target_model_as_single_instancec                 C   sN   t jdd}|dd ddi}| d| |d| jddi}| d| d S )Nztests.SimplePager4   r<   r   rA   rJ   rK   )r   r   rC   r0   r   r>   r   r   r   .test_render_with_target_model_as_single_string   rO   zITestAdminPageChooserWidget.test_render_with_target_model_as_single_stringc                 C   sV   t dg}tj|d}|dd ddi}| d| |d| jddi}| d| d S )Nr6   r4   r<   r   rA   znew PageChooser("test-id", {"modelNames": ["tests.simplepage", "tests.eventpage"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});r&   )r   r   r   rC   r0   r   )r#   r5   r$   r?   r   r   r   'test_render_with_multiple_target_models   s   zBTestAdminPageChooserWidget.test_render_with_multiple_target_modelsc                 C   s8   t jdd}|d| jddi}| d| jj | d S )NTr8   r<   r   rA   znew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": true, "userPerms": null, "modalUrl": "/admin/choose-page/", "parentId": %d});)r   r   rC   r   r0   r   r   r>   r   r   r   (test_render_js_init_with_can_choose_root   s   zCTestAdminPageChooserWidget.test_render_js_init_with_can_choose_rootc                 C   s|   t jtgd}| |d  | || jj | || jjd  | || j| j | || jj| j d S )Nr4   d   )	r   r   r   assertIsNoneget_instancer   r   r   r1   r"   r   r   r   test_get_instance   s   z,TestAdminPageChooserWidget.test_get_instanceN)__name__
__module____qualname__classmethodr   r%   r3   r7   r;   r@   rD   rG   rH   rM   rN   rP   rQ   rR   rV   r   r   r   r   r      s"    


		
r   c                   @   sF   e Zd Zdd Zdd Zdd Zdd Zed	d
dd Zdd Z	dS )TestAdminDateInputc                 C   s0   t  }t  |}| |d ddd d S )Nr   zY-m-ddayOfWeekStartformatr   AdminDateInputAdminDateInputAdapterr.   r1   r2   r   r   r   r3         zTestAdminDateInput.test_adaptc                 C   s4   t jdd}t  |}| |d ddd d S )Nz%d.%m.%Yr^   r   zd.m.Yr\   r_   r2   r   r   r   test_adapt_with_custom_format      z0TestAdminDateInput.test_adapt_with_custom_formatc                 C   sP   t  }|jdd ddid}| d| | d| | d| | d| d S )	Nr<   r   rA   attrsA<input type="text" name="test" autocomplete="off" id="test-id" />z!initDateChooser("test\u002Did", {"dayOfWeekStart": 0z"format": "Y-m-d")r   r`   rC   r/   r0   r>   r   r   r   rD      s   z&TestAdminDateInput.test_render_js_initc                 C   0   t jdd}|jdd ddid}| d| d S )N	%d.%m.%Y.rc   r<   r   rA   rf   "format": "d.m.Y."r   r`   rC   r0   r>   r   r   r   test_render_js_init_with_format      z2TestAdminDateInput.test_render_js_init_with_formatrk   )WAGTAIL_DATE_FORMATc                 C   ,   t  }|jdd ddid}| d| d S )Nr<   r   rA   rf   rl   rm   r>   r   r   r   -test_render_js_init_with_format_from_settings      z@TestAdminDateInput.test_render_js_init_with_format_from_settingsc                 C   s,   t  }t|j}| d| | d| dS )z
        Widgets inheriting from AdminDateInput should have their media definitions merged
        with AdminDateInput's
        z$wagtailadmin/js/date-time-chooser.jszvendor/star_date.jsN)r
   strmediar0   )r#   r$   
media_htmlr   r   r   test_media_inheritance   s   
z)TestAdminDateInput.test_media_inheritanceN)
rW   rX   rY   r3   rd   rD   rn   r   rr   rw   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ed	d
dd ZdS )TestAdminTimeInputc                 C   s0   t  }t  |}| |d ddd d S )Nr   H:ir^   
formatTimer   AdminTimeInputAdminTimeInputAdapterr.   r1   r2   r   r   r   r3      rb   zTestAdminTimeInput.test_adaptc                 C   s4   t jdd}t  |}| |d ddd d S )N%H:%M:%Src   r   zH:i:srz   r|   r2   r   r   r   rd      re   z0TestAdminTimeInput.test_adapt_with_custom_formatc                 C   sD   t  }|jdd ddid}| d| | d| | d| d S )Nr<   r   rA   rf   rh   z!initTimeChooser("test\u002Did", {z"format": "H:i")r   r}   rC   r/   r0   r>   r   r   r   rD      s   z&TestAdminTimeInput.test_render_js_initc                 C   rj   )Nr   rc   r<   r   rA   rf   "format": "H:i:s"r   r}   rC   r0   r>   r   r   r   rn     ro   z2TestAdminTimeInput.test_render_js_init_with_formatr   )WAGTAIL_TIME_FORMATc                 C   rq   )Nr<   r   rA   rf   r   r   r>   r   r   r   rr     rs   z@TestAdminTimeInput.test_render_js_init_with_format_from_settingsN)	rW   rX   rY   r3   rd   rD   rn   r   rr   r   r   r   r   rx      s    	rx   c                   @   sH   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zeddddd Z	dS )TestAdminDateTimeInputc                 C   s4   t  }t  |}| |d ddddd d S )Nr   	Y-m-d H:iry   bodyr]   r^   r{   parentIDr   AdminDateTimeInputAdminDateTimeInputAdapterr.   r1   r2   r   r   r   r3   $  s   z!TestAdminDateTimeInput.test_adaptc                 C   s:   t jddd}t  |}| |d ddddd d S )	N%d.%m.%Y. %H:%M%H:%M %pr^   time_formatr   z
d.m.Y. H:izH:i Ar   r   r   r2   r   r   r   rd   3  s   z4TestAdminDateTimeInput.test_adapt_with_custom_formatc                 C   s8   t jdd}t  |}| |d ddddd d S )Nz#test-parent-id)js_overlay_parent_selectorr   r   ry   r   r   r2   r   r   r   &test_adapt_with_custom_parent_selectorD  s   z=TestAdminDateTimeInput.test_adapt_with_custom_parent_selectorc                 C   sh   t  }|jdd ddid}| d| | d| | d| | d| | d	| | d
| d S )Nr<   r   rA   rf   rh   z%initDateTimeChooser("test\u002Did", {ri   z"format": "Y-m-d H:i"z"formatTime": "H:i"z"parentID": "body")r   r   rC   r/   r0   r>   r   r   r   rD   U  s   z*TestAdminDateTimeInput.test_render_js_initc                 C   s>   t jddd}|jdd ddid}| d| | d	| d S )
Nr   r   r   r<   r   rA   rf   "format": "d.m.Y. H:i""formatTime": "H:i A"r   r   rC   r0   r>   r   r   r   rn   g  s   z6TestAdminDateTimeInput.test_render_js_init_with_formatr   r   )WAGTAIL_DATETIME_FORMATr   c                 C   s8   t  }|jdd ddid}| d| | d| d S )Nr<   r   rA   rf   r   r   r   r>   r   r   r   rr   v  s   zDTestAdminDateTimeInput.test_render_js_init_with_format_from_settingsN)
rW   rX   rY   r3   rd   r   rD   rn   r   rr   r   r   r   r   r   #  s    r   c                   @   s|   e Zd Zdd Zdd Zedddd Zed	d
dd Zdd Zdd Z	dd Z
edddd Zedddd ZdS )TestAdminTagWidgetc                 C   sJ   t d|d}t d|d}t d|d}||tt|gS )a  
        Returns a list of the key parts of data needed for the w-tag controlled element
        An id for the element with the 'w-tag' controller, the autocomplete url & tag options

        example element <input data-controller="w-tag" id="test_id" data-w-tag-url-value="/admin/tag-autocomplete/" data-w-tag-options-value="{...encoded json opts}" />
        example result - ["test_id", "/admin/tag-autocomplete/", {'allowSpaces': True}]
        z5data-controller=\"w-tag\" id=\"((?:\\.|[^"\\])*)\"\s+r'   z)data-w-tag-url-value=\"((?:\\.|[^"\\])*)"z-data-w-tag-options-value=\"((?:\\.|[^"\\])*)")researchgroupjsonloadsr   )r#   r?   
element_idautocomplete_urloptionsr   r   r   get_js_init_params  s&   	z%TestAdminTagWidget.get_js_init_paramsc              	   C   sD   t  }|jddddid}| |}| |dddddd	g dS )
zTChecks that the 'w-tag' controller attributes are correctly added to the tag widgetstagsNr   alpharf   /admin/tag-autocomplete/TFallowSpacestagLimitautocompleteOnlyr   AdminTagWidgetrC   r   r1   r#   r$   r?   paramsr   r   r   test_render_js_init_basic  s   

z,TestAdminTagWidget.test_render_js_init_basicF)TAG_SPACES_ALLOWEDc              	   C   sD   t  }|jddddid}| |}| |ddddddg dS )	z}Checks that the 'w-tag' controller attributes are correctly added to the tag widgets based  on TAG_SPACES_ALLOWED in settingsr   Nr   r   rf   r   Fr   r   r   r   r   r   %test_render_js_init_no_spaces_allowed  s   

z8TestAdminTagWidget.test_render_js_init_no_spaces_allowed   )	TAG_LIMITc              	   C   sD   t  }|jddddid}| |}| |ddddd	d
g dS )zChecks that the 'w-tag' controller attributes are correctly added to the tag widget using options based on TAG_LIMIT in settingsr   Nr   r   rf   r   Tr   Fr   r   r   r   r   r   "test_render_js_init_with_tag_limit  s   

z5TestAdminTagWidget.test_render_js_init_with_tag_limitc              	   C   sH   t jtd}|jddddid}| |}| |dddddd	g dS )
z
        Checks that the 'w-tag' controller attributes are correctly added to the tag widget using
        the correct autocomplete URL for the custom model,
        and sets autocompleteOnly according to that model's free_tagging attribute
        	tag_modelr   Nr   r   rf   ,/admin/tag-autocomplete/tests/restauranttag/Tr   r   r   r   rC   r   r1   r   r   r   r   "test_render_js_init_with_tag_model  s   

z5TestAdminTagWidget.test_render_js_init_with_tag_modelc              	   C   sH   t jdd}|jddddid}| |}| |ddd	dd	d
g dS )z=Checks that free_tagging=False is passed to the inline scriptF)free_taggingr   Nr   r   rf   r   Tr   r   r   r   r   r   #test_render_with_free_tagging_false  s   

z6TestAdminTagWidget.test_render_with_free_tagging_falsec              	   C   sJ   t jtdd}|jddddid}| |}| |ddddd	d
g dS )zZfree_tagging=True on the widget can also override the tag model setting free_tagging=FalseTr   r   r   Nr   r   rf   r   Fr   r   r   r   r   r   "test_render_with_free_tagging_true  s   

z5TestAdminTagWidget.test_render_with_free_tagging_trueTc                 C   P   t  }|ddi d d }|ddi }| |d | dt| | dS )z^Checks that the tags help text html element content is correct when TAG_SPACES_ALLOWED is TrueNr$   	help_textr   zPMulti-word tags with spaces will automatically be enclosed in double quotes (").<p class="help">%s</p>r   r   get_contextrC   r1   r0   r   r#   r$   r   r?   r   r   r   "test_tags_help_text_spaces_allowed  s   
z5TestAdminTagWidget.test_tags_help_text_spaces_allowedc                 C   r   )z_Checks that the tags help text html element content is correct when TAG_SPACES_ALLOWED is FalseNr$   r   r   z:Tags can only consist of a single word, no spaces allowed.r   r   r   r   r   r   %test_tags_help_text_no_spaces_allowed  s   
z8TestAdminTagWidget.test_tags_help_text_no_spaces_allowedN)rW   rX   rY   r   r   r   r   r   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	S )
TestTagFieldc                 C   s$   t jjddd t jjddd d S )NItalianitalian)nameslugIndianindian)r   r   create)r#   r   r   r   setUp-  s   zTestTagField.setUpc                 C   sD   G dd dt j}|ddi}| |  | |jd dg d S )Nc                   @      e Zd ZeedZdS )z=TestTagField.test_tag_whitelisting.<locals>.RestaurantTagFormr   NrW   rX   rY   r   r   r   r   r   r   r   RestaurantTagForm2  s    r   r   Italian, deliciousr   )r   Formr:   is_validr1   cleaned_datar#   r   formr   r   r   test_tag_whitelisting1  s   z"TestTagField.test_tag_whitelistingc                 C   sJ   G dd dt j}|ddi}| |  | t|jd ddh d S )Nc                   @   s   e Zd ZeeddZdS )zBTestTagField.test_override_free_tagging.<locals>.RestaurantTagFormTr   Nr   r   r   r   r   r   ;  s    r   r   r   r   	delicious)r   r   r:   r   r1   setr   r   r   r   r   test_override_free_tagging:  s   z'TestTagField.test_override_free_taggingc                 C   sJ   G dd dt j}d}tdD ]}|d7 }q|d|i}| |  d S )Nc                   @   r   )zLTestTagField.test_tag_over_one_hundred_characters.<locals>.RestaurantTagFormr   Nr   r   r   r   r   r   C  s    r    e   ar   )r   r   ranger    r   )r#   r   tag_name_r   r   r   r   $test_tag_over_one_hundred_charactersB  s   
z1TestTagField.test_tag_over_one_hundred_charactersN)rW   rX   rY   r   r   r   r   r   r   r   r   r   ,  s
    	r   c                   @   s   e Zd Zdd Zdd ZdS )TestFilteredSelectc                 C   sL   t jddddgfdddgfdd	ddgfgd
d}|dd}| |d d S )NNz----FRFranceEUJPJapanASRURussiaid_continentchoicesfilter_fieldcountrya  
            <select name="country" data-widget="filtered-select" data-filter-field="id_continent">
                <option value="">----</option>
                <option value="FR" data-filter-value="EU">France</option>
                <option value="JP" selected data-filter-value="AS">Japan</option>
                <option value="RU" data-filter-value="AS,EU">Russia</option>
            </select>
        r   FilteredSelectrC   assertHTMLEqualr>   r   r   r   test_renderN  s   


zTestFilteredSelect.test_renderc              	   C   sx   t jdddddgfdddgfd	d
ddgfdgfddddgfdddgfgfdddgfgdd}|dd}| |d d S )Nr   zBig countriesr   r   r   r   r   r   r   r   )MOONzThe moonzSmall countriesAZ
AzerbaijanLILiechtensteinSKSlovakiar   r   r   ap  
            <select name="country" data-widget="filtered-select" data-filter-field="id_continent">
                <option value="">----</option>
                <optgroup label="Big countries">
                    <option value="FR" data-filter-value="EU">France</option>
                    <option value="JP" selected data-filter-value="AS">Japan</option>
                    <option value="RU" data-filter-value="AS,EU">Russia</option>
                    <option value="MOON">The moon</option>
                </optgroup>
                <optgroup label="Small countries">
                    <option value="AZ" data-filter-value="AS">Azerbaijan</option>
                    <option value="LI" data-filter-value="EU">Liechtenstein</option>
                </optgroup>
                <option value="SK" data-filter-value="EU">Slovakia</option>
            </select>
        r   r>   r   r   r   test_optgroupsf  s.   





z!TestFilteredSelect.test_optgroupsN)rW   rX   rY   r   r   r   r   r   r   r   M  s    r   c                   @   s&   e Zd Zdd Zedddd ZdS )TestSlugInputc                 C   .   t j }|jdd ddid}| d| d S )Nr<   r   rA   rf   z<input type="text" name="test" data-controller="w-slug" data-action="blur-&gt;w-slug#slugify w-sync:check-&gt;w-slug#compare w-sync:apply-&gt;w-slug#urlify:prevent" data-w-slug-allow-unicode-value data-w-slug-compare-as-param="urlify" id="test-id">)r   r   	SlugInputrC   r/   r>   r   r   r   test_has_data_attr  s   
z TestSlugInput.test_has_data_attrF)WAGTAIL_ALLOW_UNICODE_SLUGSc                 C   r   )Nr<   r   rA   rf   zdata-w-slug-allow-unicode-value)r   r   r   rC   assertNotInr>   r   r   r   $test_render_data_atrrs_from_settings  s   
z2TestSlugInput.test_render_data_atrrs_from_settingsN)rW   rX   rY   r   r   r   r   r   r   r   r     s    
r   ) r   r   r?   r   djangor   django.testr   django.test.utilsr   django.utils.htmlr   wagtail.adminr   wagtail.admin.forms.tagsr   wagtail.modelsr	   wagtail.test.testapp.formsr
   wagtail.test.testapp.modelsr   r   r   r   r[   rx   r   r   r   r   r   r   r   r   r   <module>   s,     $=2d &!H