U
    L+|jL!  ã                   @   s|   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 G dd„ de	ƒZed	d
id�G dd„ deeƒƒZdS )é    )Úcontextmanager)ÚStaticLiveServerTestCase)Úmodify_settings)ÚSeleniumTestCase)ÚMiddlewareMixin)Úgettextc                   @   s   e Zd ZdZdd„ ZdS )ÚCSPMiddlewarez5The admin's JavaScript should be compatible with CSP.c                 C   s   d|j d< |S )Nzdefault-src 'self'zContent-Security-Policy)Úheaders)ÚselfÚrequestÚresponse© r   úbc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\django/contrib/admin/tests.pyÚprocess_response   s    
zCSPMiddleware.process_responseN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   
   s   r   Úappendz(django.contrib.admin.tests.CSPMiddleware)Z
MIDDLEWAREc                   @   s¼   e Zd ZdddddgZd,dd„Zd-d
d„Zd.dd„Zd/dd„Zd0dd„Zd1dd„Z	d2dd„Z
d3dd„Zed4dd„ƒZd5dd„Zdd„ Zdd „ Zd6d"d#„Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd!S )7ÚAdminSeleniumTestCasezdjango.contrib.adminzdjango.contrib.authzdjango.contrib.contenttypeszdjango.contrib.sessionszdjango.contrib.sitesé
   c                 C   s"   ddl m} || j|ƒ |¡ dS )a%  
        Block the execution of the tests until the specified callback returns a
        value that is not falsy. This method can be called, for example, after
        clicking a link or submitting a form. See the other public methods that
        call this function for more details.
        r   )ÚWebDriverWaitN)Zselenium.webdriver.support.waitr   ÚseleniumZuntil)r
   ÚcallbackÚtimeoutr   r   r   r   Ú
wait_until   s    z AdminSeleniumTestCase.wait_untilé   c                    s6   |   ‡ fdd„|¡ | jj | jjd ¡ |  ¡  dS )zÓ
        Block until `num_windows` are present and are ready (usually 2, but can
        be overridden in the case of pop-ups opening other pop-ups). Switch the
        current window to the new pop-up.
        c                    s   t | jƒˆ kS ©N)ÚlenÚwindow_handles)Úd©Únum_windowsr   r   Ú<lambda>-   ó    zDAdminSeleniumTestCase.wait_for_and_switch_to_popup.<locals>.<lambda>éÿÿÿÿN)r   r   Z	switch_toZwindowr   Úwait_page_ready)r
   r"   r   r   r!   r   Úwait_for_and_switch_to_popup'   s    z2AdminSeleniumTestCase.wait_for_and_switch_to_popupc                 C   s4   ddl m} ddlm} |  | |j|f¡|¡ dS )zB
        Block until a CSS selector is found on the page.
        r   ©ÚBy©Úexpected_conditionsN)Úselenium.webdriver.common.byr)   Úselenium.webdriver.supportr+   r   Zpresence_of_element_locatedÚCSS_SELECTOR©r
   Úcss_selectorr   r)   Úecr   r   r   Úwait_for1   s     ÿzAdminSeleniumTestCase.wait_forc                 C   s6   ddl m} ddlm} |  | |j|f|¡|¡ dS )zD
        Block until the text is found in the CSS selector.
        r   r(   r*   N)r,   r)   r-   r+   r   Ztext_to_be_present_in_elementr.   ©r
   r0   Útextr   r)   r1   r   r   r   Úwait_for_text<   s    þz#AdminSeleniumTestCase.wait_for_textc                 C   s6   ddl m} ddlm} |  | |j|f|¡|¡ dS )zE
        Block until the value is found in the CSS selector.
        r   r(   r*   N)r,   r)   r-   r+   r   Z#text_to_be_present_in_element_valuer.   r3   r   r   r   Úwait_for_valueH   s     ÿüz$AdminSeleniumTestCase.wait_for_valuec                 C   s4   ddl m} ddlm} |  | |j|f¡|¡ dS )zS
        Block until the element described by the CSS selector is visible.
        r   r(   r*   N)r,   r)   r-   r+   r   Zvisibility_of_element_locatedr.   r/   r   r   r   Úwait_until_visibleV   s     ÿz(AdminSeleniumTestCase.wait_until_visiblec                 C   s4   ddl m} ddlm} |  | |j|f¡|¡ dS )zU
        Block until the element described by the CSS selector is invisible.
        r   r(   r*   N)r,   r)   r-   r+   r   Zinvisibility_of_element_locatedr.   r/   r   r   r   Úwait_until_invisiblea   s     ÿz*AdminSeleniumTestCase.wait_until_invisiblec                 C   s   |   dd„ |¡ dS )z1
        Block until the  page is ready.
        c                 S   s   |   d¡dkS )Nzreturn document.readyState;Zcomplete)Zexecute_script©Zdriverr   r   r   r#   q   s   ÿz7AdminSeleniumTestCase.wait_page_ready.<locals>.<lambda>N)r   )r
   r   r   r   r   r&   l   s    ýz%AdminSeleniumTestCase.wait_page_readyc                 c   sR   ddl m} ddlm} | j |jd¡}dV  | j| |¡|d� | j	|d� dS )zA
        Block until a new page has loaded and is ready.
        r   r(   r*   ÚhtmlN)r   )
r,   r)   r-   r+   r   Úfind_elementZTAG_NAMEr   Zstaleness_ofr&   )r
   r   r)   r1   Zold_pager   r   r   Úwait_page_loadedv   s    z&AdminSeleniumTestCase.wait_page_loadedú/admin/c              	   C   sŽ   ddl m} | j d| j|f ¡ | j |jd¡}| |¡ | j |jd¡}| |¡ tdƒ}|  	¡ � | j |j
d| ¡ ¡  W 5 Q R X dS )	z&
        Log in to the admin.
        r   r(   z%s%sÚusernameÚpasswordzLog inz//input[@value="%s"]N)r,   r)   r   ÚgetZlive_server_urlr;   ÚNAMEZ	send_keysÚ_r<   ZXPATHZclick)r
   r>   r?   Z	login_urlr)   Zusername_inputZpassword_inputZ
login_textr   r   r   Úadmin_login„   s    


 ÿz!AdminSeleniumTestCase.admin_loginc                 C   s:   ddl m} ddlm} || j |j|¡ƒ}| |¡ dS )zŠ
        Select the <OPTION> with the value `value` inside the <SELECT> widget
        identified by the CSS selector `selector`.
        r   r(   ©ÚSelectN)r,   r)   Úselenium.webdriver.support.uirE   r   r;   r.   Zselect_by_value©r
   ÚselectorÚvaluer)   rE   Úselectr   r   r   Úselect_option•   s    z#AdminSeleniumTestCase.select_optionc                 C   s:   ddl m} ddlm} || j |j|¡ƒ}| |¡ dS )zŒ
        Deselect the <OPTION> with the value `value` inside the <SELECT> widget
        identified by the CSS selector `selector`.
        r   r(   rD   N)r,   r)   rF   rE   r   r;   r.   Zdeselect_by_valuerG   r   r   r   Údeselect_option    s    z%AdminSeleniumTestCase.deselect_optionNc                 C   s4   ddl m} |p| j}|  t| |j|¡ƒ|¡ dS )z€
        Assert number of matches for a CSS selector.

        `root_element` allow restriction to a pre-selected node.
        r   r(   N)r,   r)   r   ÚassertEqualr   Úfind_elementsr.   )r
   rH   ÚcountZroot_elementr)   r   r   r   ÚassertCountSeleniumElements«   s    
 ÿz1AdminSeleniumTestCase.assertCountSeleniumElementsc              	      sx   ddl m‰  |rL| j ˆ jˆ¡}g }|D ]}| | d¡¡ q(|  ||¡ n(|  ¡ � |  	‡ ‡fdd„¡ W 5 Q R X d S )Nr   r(   rI   c                    s   |   ˆ jˆ¡ S r   )rN   r.   r9   ©r)   Úoptions_selectorr   r   r#   Ç   s    ÿz<AdminSeleniumTestCase._assertOptionsValues.<locals>.<lambda>)
r,   r)   r   rN   r.   r   Úget_attributerM   Zdisable_implicit_waitr   )r
   rR   ÚvaluesÚoptionsZactual_valuesÚoptionr   rQ   r   Ú_assertOptionsValues¸   s    
ÿz*AdminSeleniumTestCase._assertOptionsValuesc                 C   s   |   d| |¡ dS )z{
        Assert that the <SELECT> widget identified by `selector` has the
        options with the given `values`.
        z%s > optionN©rW   ©r
   rH   rT   r   r   r   ÚassertSelectOptionsÌ   s    z)AdminSeleniumTestCase.assertSelectOptionsc                 C   s   |   d| |¡ dS )z„
        Assert that the <SELECT> widget identified by `selector` has the
        selected options with the given `values`.
        z%s > option:checkedNrX   rY   r   r   r   ÚassertSelectedOptionsÓ   s    z+AdminSeleniumTestCase.assertSelectedOptionsc                 C   s,   ddl m} | j |j|¡ d¡ |¡dkS )zh
        Return True if the element identified by `selector` has the CSS class
        `klass`.
        r   r(   Úclassr%   )r,   r)   r   r;   r.   rS   Úfind)r
   rH   Úklassr)   r   r   r   Úhas_css_classÚ   s    þüûúÿz#AdminSeleniumTestCase.has_css_class)r   )r   r   )r   )r   )r   )r   )r   )r   )r   )r=   )N)r   r   r   Zavailable_appsr   r'   r2   r5   r6   r7   r8   r&   r   r<   rC   rK   rL   rP   rW   rZ   r[   r_   r   r   r   r   r      s0   û











r   N)Ú
contextlibr   Z"django.contrib.staticfiles.testingr   Zdjango.testr   Zdjango.test.seleniumr   Zdjango.utils.deprecationr   Zdjango.utils.translationr   rB   r   r   r   r   r   r   Ú<module>   s   