o
    þÞhÕ%  ã                   @   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mZmZ d dlmZ d dlmZ d d	lmZ G d
d„ deeƒƒZG dd„ dƒZedƒG dd„ deed�ƒZdd„ ZdS )é    N)Úcontextmanager)Úwraps)ÚPath)Úsettings)ÚLiveServerTestCaseÚoverride_settingsÚtag)Úclassproperty©Úimport_string)Úcapfirstc                       sd   e Zd Zg ZdZdZdZdZ‡ fdd„Ze	dd„ ƒZ
e	dd„ ƒZe	d	d
„ ƒZdd„ Zdd„ Z‡  ZS )ÚSeleniumTestCaseBaseNFc           
         sÒ   t ƒ  | |||¡}|jstdd„ | ¡ D ƒƒs|S |jrb|jd }||_|js*|jnd}||_| j|_t	j
|j }|jdd… D ]}|  | dt|ƒ|f |f||| j|jdœ¡}	t||	j|	ƒ q@|S t d	¡|ƒS )
z¤
        Dynamically create new classes and add them to the test module when
        multiple browsers specs are provided (e.g. --selenium=firefox,chrome).
        c                 s   s&   � | ]\}}|  d ¡ot|ƒV  qdS )ÚtestN)Ú
startswithÚcallable)Ú.0ÚnameÚvalue© r   úT/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/test/selenium.pyÚ	<genexpr>!   s   € 
ÿz/SeleniumTestCaseBase.__new__.<locals>.<genexpr>r   z0.0.0.0é   Nz%s%s)ÚbrowserÚhostÚexternal_hostÚ
__module__zNo browsers specified.)ÚsuperÚ__new__r   ÚanyÚitemsÚbrowsersÚselenium_hubr   r   ÚsysÚmodulesr   r   ÚsetattrÚ__name__ÚunittestÚskip)
Úclsr   ÚbasesÚattrsÚ
test_classÚfirst_browserr   Úmoduler   Úbrowser_test_class©Ú	__class__r   r   r      s4   ÿ
üüzSeleniumTestCaseBase.__new__c                 C   ó   t d| ƒS )Nz)selenium.webdriver.%s.webdriver.WebDriverr
   ©r(   r   r   r   r   Úimport_webdriverD   ó   z%SeleniumTestCaseBase.import_webdriverc                 C   r1   )Nz%selenium.webdriver.%s.options.Optionsr
   r2   r   r   r   Úimport_optionsH   r4   z#SeleniumTestCaseBase.import_optionsc                 C   s   ddl m} t|| ¡ ƒS )Nr   )ÚDesiredCapabilities)Ú.selenium.webdriver.common.desired_capabilitiesr6   ÚgetattrÚupper)r(   r   r6   r   r   r   Úget_capabilityL   s   z#SeleniumTestCaseBase.get_capabilityc                 C   s\   |   | j¡ƒ }| jr,| j  dkrn dkrn n	  | d¡ |S dkr,| d¡ |S |S )NÚchromeÚedgez--headless=newÚfirefoxz	-headless)r5   r   ÚheadlessÚadd_argument)ÚselfÚoptionsr   r   r   Úcreate_optionsR   s   
þ
z#SeleniumTestCaseBase.create_optionsc                 C   sb   |   ¡ }| jr(ddlm} |  | j¡ ¡ D ]
\}}| ||¡ q|j| j|d�S |  	| j¡|d�S )Nr   )Ú	webdriver)Úcommand_executorrA   )rA   )
rB   r!   ÚseleniumrC   r:   r   r   Úset_capabilityÚRemoter3   )r@   rA   rC   Úkeyr   r   r   r   Úcreate_webdriver\   s   z%SeleniumTestCaseBase.create_webdriver)r%   r   Ú__qualname__r    r!   r   r   r>   r   Úclassmethodr3   r5   r:   rB   rI   Ú__classcell__r   r   r/   r   r      s    *



r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚChangeWindowSizec                 C   s   || _ ||f| _d S ©N)rE   Únew_size)r@   ÚwidthÚheightrE   r   r   r   Ú__init__i   s   zChangeWindowSize.__init__c                 C   s   | j  ¡ | _| j j| jŽ  | S rN   )rE   Úget_window_sizeÚold_sizeÚset_window_sizerO   ©r@   r   r   r   Ú	__enter__m   s   zChangeWindowSize.__enter__c                 C   s   | j  | jd | jd ¡ d S )NrP   rQ   )rE   rU   rT   )r@   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__r   s   zChangeWindowSize.__exit__N)r%   r   rJ   rR   rW   r[   r   r   r   r   rM   h   s    rM   rE   c                       sÌ   e Zd ZdZdZdZe‡ fdd„ƒZedd„ ƒZ	edd	„ ƒZ
e‡ fd
d„ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdddœdd„Zedd„ ƒZdd„ Zedd„ ƒZedd „ ƒZ‡  ZS )!ÚSeleniumTestCaseé
   NFc                    s²   t ƒ jdi |¤Ž | jsd S t| j ¡ ƒD ]A\}}t|dƒsqt| |ƒ t|dƒD ],}t	|ƒ||dœdd„ƒ}|› d|› �|_
|j› d|› �|_||_||_t| |j
|ƒ q)qd S )NÚ_screenshot_cases)Ú_funcÚ_casec                _   sF   t | |ƒƒ � || g|¢R i |¤ŽW  d   ƒ S 1 sw   Y  d S rN   )r8   )r@   r_   r`   ÚargsÚkwargsr   r   r   r   Š   s   $ÿz0SeleniumTestCase.__init_subclass__.<locals>.testÚ_r   )r   Ú__init_subclass__ÚscreenshotsÚlistÚ__dict__r   ÚhasattrÚdelattrr8   r   r%   rJ   Ú_screenshot_nameÚ_screenshot_caser$   )r(   rb   r   ÚfuncÚscreenshot_caser   r/   r   r   rd   |   s"   

õúz"SeleniumTestCase.__init_subclass__c                 C   s   d| j p| j| jjf S )Nzhttp://%s:%s)r   r   Úserver_threadÚport©r(   r   r   r   Úlive_server_url•   s   z SeleniumTestCase.live_server_urlc                 C   s   | j p| jS rN   )r   r   rp   r   r   r   Úallowed_host™   r4   zSeleniumTestCase.allowed_hostc                    s2   |   ¡ | _| j | j¡ tƒ  ¡  |  | j¡ d S rN   )rI   rE   Úimplicitly_waitÚimplicit_waitr   Ú
setUpClassÚaddClassCleanupÚ_quit_seleniumrp   r/   r   r   ru   �   s   

zSeleniumTestCase.setUpClassc                 c   ó<   � t dd| jƒ� d V  W d   ƒ d S 1 sw   Y  d S )Ni   iÐ  ©rM   rE   rV   r   r   r   Údesktop_size¤   ó   €"ÿzSeleniumTestCase.desktop_sizec                 c   rx   )Ni   i   ry   rV   r   r   r   Úsmall_screen_size©   r{   z"SeleniumTestCase.small_screen_sizec                 c   rx   )Nih  i   ry   rV   r   r   r   Úmobile_size®   r{   zSeleniumTestCase.mobile_sizec              	   c   sv   � |   ¡ �, ttjd d�� d V  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s4w   Y  d S )Néÿÿÿÿ)ÚLANGUAGE_CODE)rz   r   r   ÚLANGUAGES_BIDIrV   r   r   r   Úrtl³   s   €
ÿÿ"ÿzSeleniumTestCase.rtlc              
   c   sp   � | j  | j¡ | j  d¡ |  ¡ � zd V  W | j  d¡ n| j  d¡ w W d   ƒ d S 1 s1w   Y  d S )Nz&localStorage.setItem('theme', 'dark');z!localStorage.removeItem('theme');)rE   Úgetrq   Úexecute_scriptrz   rV   r   r   r   Údark¹   s   €
"üzSeleniumTestCase.dark)ÚmediaÚfeaturesc                C   sR   | j dvr
|  d¡ i }|d ur||d< |d ur||d< | jjdd|dœd� d S )	N>   r<   r;   zÃEmulation.setEmulatedMedia is only supported on Chromium and Chrome-based browsers. See https://chromedevtools.github.io/devtools-protocol/1-3/Emulation/#method-setEmulatedMedia for more details.r…   r†   ÚexecuteCdpCommandzEmulation.setEmulatedMedia)ÚcmdÚparams)Údriver_commandr‰   )r   ÚskipTestrE   Úexecute)r@   r…   r†   r‰   r   r   r   Úset_emulated_mediaÄ   s   
ÿ
þz#SeleniumTestCase.set_emulated_mediac                 c   sz   � | j dddœgd� |  ¡ �$ zd V  W | j dddœgd� n| j dddœgd� w W d   ƒ d S 1 s6w   Y  d S )Nzforced-colorsÚactive)r   r   )r†   Únone)r�   rz   rV   r   r   r   Úhigh_contrastØ   s   €

ÿ

ÿ"üzSeleniumTestCase.high_contrastc                 C   s`   | j sd S t| | jƒ}|j› d|› d|j› d�}t ¡ d | }|jjddd� | j	 
|¡ d S )Nz--z.pngre   T)Úexist_okÚparents)re   r8   Ú_testMethodNamerj   rk   r   ÚcwdÚparentÚmkdirrE   Úsave_screenshot)r@   r   r   ÚfilenameÚpathr   r   r   Útake_screenshotã   s   z SeleniumTestCase.take_screenshotc                 C   s   t | dƒr| j ¡  d S d S )NrE   )rh   rE   Úquitrp   r   r   r   rw   ì   s   
ÿzSeleniumTestCase._quit_seleniumc              	   c   s:   � | j  d¡ zdV  W | j  | j¡ dS | j  | j¡ w )z"Disable the default implicit wait.r   N)rE   rs   rt   rV   r   r   r   Údisable_implicit_waitô   s
   €"z&SeleniumTestCase.disable_implicit_wait)r%   r   rJ   rt   r   re   rK   rd   r	   rq   rr   ru   r   rz   r|   r}   r�   r„   r�   r�   rš   rw   rœ   rL   r   r   r/   r   r\   v   s<    









	
r\   )Ú	metaclassc                    s$   t ˆ tƒr
ˆ  d¡‰ ‡ fdd„}|S )Nú,c              	      s(   ˆ | _ t| ddh t| dtƒ ƒ¡ƒ | S )NÚtagsÚ
screenshot)r^   r$   Úunionr8   Úset)rl   ©Úmethod_namesr   r   Úwrapper  s   z!screenshot_cases.<locals>.wrapper)Ú
isinstanceÚstrÚsplit)r¤   r¥   r   r£   r   Úscreenshot_casesþ   s   

r©   )r"   r&   Ú
contextlibr   Ú	functoolsr   Úpathlibr   Údjango.confr   Údjango.testr   r   r   Údjango.utils.functionalr	   Údjango.utils.module_loadingr   Údjango.utils.textr   Útyper   rM   r\   r©   r   r   r   r   Ú<module>   s     Z 