a
    DgP`                     @   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   )idZ	foobarbazZhello)titlecontent)instance)r	   objectsget	root_pager   
child_pageZ	add_child)cls r   _/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/admin/tests/test_widgets.pysetUpTestData   s    z(TestAdminPageChooserWidget.setUpTestDatac                 C   s   t  }| |j d S )N)r   AdminPageChooserassertFalseZ	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   Z__ID__r   Fzwagtailcore.pagez/admin/choose-page/)canChooseRoot
modelNamesZ	userPermsZ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'   r*   r+   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Zcan_choose_rootr   r$   )r   r   r&   r'   
assertTruer+   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   Zrender_htmlr(   r)   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 )Nr4   r   test-idznew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});r   r   renderr)   r5   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 )NZcopy_to)Z
user_permsr4   r   r8   znew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": false, "userPerms": "copy_to", "modalUrl": "/admin/choose-page/"});r9   r5   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 )Nr4   r   r8   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   r:   r   r(   r   r)   r   r5   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 Nr-   r4   r   r8   new PageChooser("test-id", {"modelNames": ["tests.simplepage"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});Choose a page (Simple page)r   r   r   r:   r)   r   r5   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 r>   rA   r5   r   r   r   0test_render_with_target_model_as_single_instance|   s    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.SimplePager-   r4   r   r8   r?   r@   )r   r   r:   r)   r   r5   r   r   r   .test_render_with_target_model_as_single_string   s    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 )Nr/   r-   r4   r   r8   znew PageChooser("test-id", {"modelNames": ["tests.simplepage", "tests.eventpage"], "canChooseRoot": false, "userPerms": null, "modalUrl": "/admin/choose-page/"});r"   )r   r   r   r:   r)   r   )r   r.   r    r6   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 )NTr1   r4   r   r8   znew PageChooser("test-id", {"modelNames": ["wagtailcore.page"], "canChooseRoot": true, "userPerms": null, "modalUrl": "/admin/choose-page/", "parentId": %d});)r   r   r:   r   r)   r   r   r5   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 )Nr-   d   )	r   r   r   ZassertIsNoneZget_instancer   r   r   r*   r   r   r   r   test_get_instance   s    z,TestAdminPageChooserWidget.test_get_instanceN)__name__
__module____qualname__classmethodr   r!   r,   r0   r3   r7   r;   r<   r=   rB   rC   rD   rE   rF   rH   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   AdminDateInputZAdminDateInputAdapterr'   r*   r+   r   r   r   r,      s    zTestAdminDateInput.test_adaptc                 C   s4   t jdd}t  |}| |d ddd d S )Nz%d.%m.%YrP   r   zd.m.YrN   rQ   r+   r   r   r   test_adapt_with_custom_format   s    z0TestAdminDateInput.test_adapt_with_custom_formatc                 C   sP   t  }|jdd ddid}| d| | d| | d| | d| d S )	Nr4   r   r8   attrsA<input type="text" name="test" autocomplete="off" id="test-id" />z!initDateChooser("test\u002Did", {"dayOfWeekStart": 0z"format": "Y-m-d")r   rR   r:   r(   r)   r5   r   r   r   r;      s    z&TestAdminDateInput.test_render_js_initc                 C   s0   t jdd}|jdd ddid}| d| d S )N	%d.%m.%Y.rS   r4   r   r8   rU   "format": "d.m.Y."r   rR   r:   r)   r5   r   r   r   test_render_js_init_with_format   s    z2TestAdminDateInput.test_render_js_init_with_formatrY   )ZWAGTAIL_DATE_FORMATc                 C   s,   t  }|jdd ddid}| d| d S )Nr4   r   r8   rU   rZ   r[   r5   r   r   r   -test_render_js_init_with_format_from_settings   s    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
   strZmediar)   )r   r    Z
media_htmlr   r   r   test_media_inheritance   s    
z)TestAdminDateInput.test_media_inheritanceN)
rI   rJ   rK   r,   rT   r;   r\   r   r]   r_   r   r   r   r   rM      s   	
	rM   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rP   
formatTimer   AdminTimeInputZAdminTimeInputAdapterr'   r*   r+   r   r   r   r,      s    zTestAdminTimeInput.test_adaptc                 C   s4   t jdd}t  |}| |d ddd d S )N%H:%M:%SrS   r   zH:i:srb   rd   r+   r   r   r   rT      s    z0TestAdminTimeInput.test_adapt_with_custom_formatc                 C   sD   t  }|jdd ddid}| d| | d| | d| d S )Nr4   r   r8   rU   rW   z!initTimeChooser("test\u002Did", {z"format": "H:i")r   re   r:   r(   r)   r5   r   r   r   r;      s    z&TestAdminTimeInput.test_render_js_initc                 C   s0   t jdd}|jdd ddid}| d| d S )Nrf   rS   r4   r   r8   rU   "format": "H:i:s"r   re   r:   r)   r5   r   r   r   r\     s    z2TestAdminTimeInput.test_render_js_init_with_formatrf   )WAGTAIL_TIME_FORMATc                 C   s,   t  }|jdd ddid}| d| d S )Nr4   r   r8   rU   rg   rh   r5   r   r   r   r]     s    z@TestAdminTimeInput.test_render_js_init_with_format_from_settingsN)	rI   rJ   rK   r,   rT   r;   r\   r   r]   r   r   r   r   r`      s   	r`   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:ira   bodyrO   rP   rc   ZparentIDr   AdminDateTimeInputZAdminDateTimeInputAdapterr'   r*   r+   r   r   r   r,   $  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rP   time_formatr   z
d.m.Y. H:izH:i Arl   rm   rn   r+   r   r   r   rT   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)Zjs_overlay_parent_selectorr   rk   ra   rm   rn   r+   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 )Nr4   r   r8   rU   rW   z%initDateTimeChooser("test\u002Did", {rX   z"format": "Y-m-d H:i"z"formatTime": "H:i"z"parentID": "body")r   ro   r:   r(   r)   r5   r   r   r   r;   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 )
Nrp   rq   rr   r4   r   r8   rU   "format": "d.m.Y. H:i""formatTime": "H:i A"r   ro   r:   r)   r5   r   r   r   r\   g  s    z6TestAdminDateTimeInput.test_render_js_init_with_formatrp   rq   )ZWAGTAIL_DATETIME_FORMATri   c                 C   s8   t  }|jdd ddid}| d| | d| d S )Nr4   r   r8   rU   ru   rv   rw   r5   r   r   r   r]   v  s    zDTestAdminDateTimeInput.test_render_js_init_with_format_from_settingsN)
rI   rJ   rK   r,   rT   rt   r;   r\   r   r]   r   r   r   r   rj   #  s   rj   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   r6   Z
element_idZ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   alpharU   /admin/tag-autocomplete/TFZallowSpacesZtagLimitZautocompleteOnlyr   AdminTagWidgetr:   r   r*   r   r    r6   paramsr   r   r   test_render_js_init_basic  s    

z,TestAdminTagWidget.test_render_js_init_basicF)Z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   rU   r   Fr   r   r   r   r   r   %test_render_js_init_no_spaces_allowed  s    

z8TestAdminTagWidget.test_render_js_init_no_spaces_allowed   )Z	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   rU   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   rU   ,/admin/tag-autocomplete/tests/restauranttag/Tr   r   r   r   r:   r   r*   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   rU   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   rU   r   Fr   r   r   r   r   r   "test_render_with_free_tagging_true  s    

z5TestAdminTagWidget.test_render_with_free_tagging_trueTc                 C   sP   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   Zget_contextr:   r*   r)   r   r   r    r   r6   r   r   r   "test_tags_help_text_spaces_allowed  s    
z5TestAdminTagWidget.test_tags_help_text_spaces_allowedc                 C   sP   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 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)rI   rJ   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx     s   


rx   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slugZIndianZ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                   @   s   e Zd ZeedZdS )z=TestTagField.test_tag_whitelisting.<locals>.RestaurantTagFormr   NrI   rJ   rK   r   r   r   r   r   r   r   RestaurantTagForm2  s   r   r   Italian, deliciousr   )r   Formr2   is_validr*   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   Z	delicious)r   r   r2   r   r*   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                   @   s   e Zd ZeedZdS )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   Ztag_name_r   r   r   r   $test_tag_over_one_hundred_charactersB  s    
z1TestTagField.test_tag_over_one_hundred_charactersN)rI   rJ   rK   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choicesZ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   ZFilteredSelectr:   ZassertHTMLEqualr5   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   )ZMOONzThe moonzSmall countriesZAZZ
AzerbaijanZLIZLiechtensteinZSKZ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   r5   r   r   r   test_optgroupsf  s.    





z!TestFilteredSelect.test_optgroupsN)rI   rJ   rK   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   s.   t j }|jdd ddid}| d| d S )Nr4   r   r8   rU   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   	SlugInputr:   r(   r5   r   r   r   test_has_data_attr  s    
z TestSlugInput.test_has_data_attrF)ZWAGTAIL_ALLOW_UNICODE_SLUGSc                 C   s.   t j }|jdd ddid}| d| d S )Nr4   r   r8   rU   zdata-w-slug-allow-unicode-value)r   r   r   r:   ZassertNotInr5   r   r   r   $test_render_data_atrrs_from_settings  s    
z2TestSlugInput.test_render_data_atrrs_from_settingsN)rI   rJ   rK   r   r   r   r   r   r   r   r     s   
r   ) r|   ry   r6   r   Zdjangor   Zdjango.testr   Zdjango.test.utilsr   Zdjango.utils.htmlr   Zwagtail.adminr   Zwagtail.admin.forms.tagsr   Zwagtail.modelsr	   Zwagtail.test.testapp.formsr
   Zwagtail.test.testapp.modelsr   r   r   r   rM   r`   rj   rx   r   r   r   r   r   r   r   <module>   s*    $=2d &!H