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   L/var/www/ecommerce/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;   zEmulation.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 