
^Q\.                 @   s  y d  d l  m Z Wn d d   Z Yn Xd  d l m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d  d l
 Z
 d  d l m 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 m Z 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" m# Z# m$ Z$ m% Z% e j& e'  Z( d d   Z) Gd d   d e  Z* e*   Gd d   d e   Z+ d S)    )find_executablec             C   s   d  S)N )fr   r   T/var/www/dbchiro/venv/build/django-nested-admin/nested_admin/tests/one_deep/tests.py<lambda>   s    r   )datetimeN)SkipTest)settings)site)override_settings)urlparse
urlunparseParseResult)ActionChains)S3Boto3Storage)BaseNestedAdminTestCaseget_model_nameexpected_failure_if_suit   )PlainStackedRootPlainTabularRootNestedStackedRootNestedTabularRootc             C   s2   t  t |    } d | t j j d  <t |  S)N query)listr   r   _fieldsindexr   )urlpartsr   r   r   strip_query_from_url"   s    r    c               @   s   e  Z d  Z d d   Z d S)'disable_string_if_invalid_for_grappellic             C   sR   i t  j d j   g d 6|  _ d t  j k rN |  j d d d j d  n  d  S)Nr   	TEMPLATESZ	grappelliOPTIONSZstring_if_invalid)r	   r"   copyoptionsZINSTALLED_APPSpop)selfr   r   r   __init__*   s     z0disable_string_if_invalid_for_grappelli.__init__N)__name__
__module____qualname__r(   r   r   r   r   r!   (   s   r!   c                   s9  e  Z d  Z d Z e e e e g Z d Z	 e
   f d d    Z e
   f d d    Z   f d d   Z e d d	    Z e d
 d    Z d d d  Z d d   Z d d   Z d d   Z e d d    Z e d d    Z d d   Z e d d    Z d d   Z e d d    Z e d  d!    Z   S)"VisualComparisonTestCaseNc                s  t  j j d  |  _ |  j s0 t d  |  _ n  |  j sP t  j j |  j  r_ t d   n  t  j j d  |  _ t	 t
 |   j   t j   |  _ t  j j d  r t j d k r t d   n  d	 t  j d |  _ n d
 t j   j d  |  _ t d d   d d g D  rEy t   } | j } Wn YqEX| |  _ n  i  |  _ i  |  _ xl |  j D]a } t j | }   f d d       |  |  j | <}  f d d     |  |  j | <qaWd  S)NZBLINKDIFF_BINz
blink-diffzblink-diff not installedZSCREENSHOT_OUTPUT_DIRZTRAVIS_BUILD_NUMBERr      z$Issue with travis and Django >= 1.11z	travis_%szlocal_%sz%Y%m%dT%H%M%Sc             s   s   |  ] } | t  j k Vq d  S)N)osenviron).0kr   r   r   	<genexpr>J   s    z6VisualComparisonTestCase.setUpClass.<locals>.<genexpr>ZAWS_ACCESS_KEY_IDZAWS_SECRET_ACCESS_KEYc                sM   |  j  g  g } x7 t |  d d   p' g  D] } | d j   |   q( W| S)NZinlinesr   )modelgetattrappend)Zadmindatainline)descend_admin_inlinesr   r   r8   Y   s    zBVisualComparisonTestCase.setUpClass.<locals>.descend_admin_inlinesc                s7   t  |  t  r) d d   t   |   D St |   Sd  S)Nc             S   s   g  |  ] } |  q Sr   r   )r0   mr   r   r   
<listcomp>c   s   	 zZVisualComparisonTestCase.setUpClass.<locals>.recursive_map_model_names.<locals>.<listcomp>)
isinstancer   mapr   )r6   )recursive_map_model_namesr   r   r=   a   s    zFVisualComparisonTestCase.setUpClass.<locals>.recursive_map_model_names)r   r-   )r.   r/   getblinkdiff_binr   pathexistsr   screenshot_output_dirsuperr   
setUpClasstempfilemkdtemproot_temp_dirdjangoVERSIONpath_prefixr   nowstrftimeallr   bucketstorage
all_modelsall_model_namesroot_models
admin_site	_registry)clsrO   rN   
root_modelZ
root_adminmodels)	__class__)r8   r=   r   rD   7   s8    	 			z#VisualComparisonTestCase.setUpClassc                s'   t  t |   j   t j |  j  d  S)N)rC   r,   tearDownClassshutilrmtreerG   )rU   )rX   r   r   rY   i   s    z&VisualComparisonTestCase.tearDownClassc                sd   t  t |   j   t j d |  j  |  _ t j t j	 j
 |  j |  j   |  j j d d  d  S)Ndiri  iX  )rC   r,   setUprE   rF   rG   temp_dirr.   makedirsr@   joinrJ   seleniumset_window_size)r'   )rX   r   r   r]   n   s    "zVisualComparisonTestCase.setUpc             C   s   |  j  |  j S)N)rP   rV   )r'   r   r   r   rW   t   s    zVisualComparisonTestCase.modelsc             C   s   |  j  |  j S)N)rQ   rV   )r'   r   r   r   model_namesx   s    z$VisualComparisonTestCase.model_namesc          
   C   s  | j  d d  } |  j d d d d d d | g } |  j r d	 d
 g } xo | D]d } |  j j |  } | d d i | j d d 6| j d d 6| j d d 6| j d d 6g 7} qO Wn  | r | | 7} n  | | | g 7} t j | d t j	 d t j	 }	 |	 j
   \ }
 } |	 j d k rV|  j rRt j |  t j |  t j |  n  d  St j |
  d } |  j rd |  j t j j |  f } t | d   } |  j j | |  } Wd  QXt |  j j |   } d | | f } n |  j rd | | f } n  t |   d  S)Nz_a.pngz	_diff.pngz	--verbosez--threshold1z--delta0z--outputz
#suit-leftz#headerz--block-outz%(x)s,%(y)s,%(w)s,%(h)sxywidthwheighthstdoutstderrr   zScreenshots do not matchz%s/%srbz%s (See <%s>)z%s (See %s))replacer?   has_suitra   find_element_by_css_selectorlocationsize
subprocessPopenPIPEcommunicate
returncoderB   r.   unlinkloggerinforO   rJ   r@   basenameopensaver    r   AssertionError)r'   ab
extra_argsZdiff_output_pathargsZto_blockselectorelprl   _msgZs3_namer   Zs3_urlr   r   r   assertSameScreenshot|   sD    	!			z-VisualComparisonTestCase.assertSameScreenshotc             C   s  t  j   d d } d |  j f t j d  d  t j d  d  } |  j r\ | d 7} n |  j rr | d 7} n  |  j	 p |  j
 } |  j j j d  r d n d	 } t j j | d
 | | | f  } |  j j d  } t |  j  j | d d  j   t j d  |  j j |  | S)Nr      z%s/py%s%s_dj%s%s   Z_grpZ_suitZPlainr   r   z%s_%s_%s.pngzreturn document.bodyr   g?)inspectstackrJ   sysversion_inforH   rI   has_grappellirp   rB   r^   rV   r)   
startswithr.   r@   r`   ra   Zexecute_scriptr   Zmove_to_element_with_offsetZperformtimesleepZsave_screenshot)r'   nameprefixZ
output_dirsuffixZ
image_pathZbody_elementr   r   r   get_admin_screenshot   s     /		!"z-VisualComparisonTestCase.get_admin_screenshotc             C   sQ   |  j  d d d } | j j j   } |  j d |   } | j   Wd  QXd  S)Nr   r   z*//a[contains(string(.), "Add another %s")])rW   Z_metaverbose_nametitleZclickable_xpathZclick)r'   child_modelr   r   r   r   r   
add_inline   s    z#VisualComparisonTestCase.add_inlinec             C   sT   g  } x: t  t g D], } | |  _ |  j   | j |  j    q W|  j |   d  S)N)r   r   rV   
load_adminr5   r   r   )r'   screenshotsr3   r   r   r   test_stacked_empty   s    	
z+VisualComparisonTestCase.test_stacked_emptyc             C   sT   g  } x: t  t g D], } | |  _ |  j   | j |  j    q W|  j |   d  S)N)r   r   rV   r   r5   r   r   )r'   r   r3   r   r   r   test_tabular_empty   s    	
z+VisualComparisonTestCase.test_tabular_emptyc             C   s   g  } x t  t g D]{ } | |  _ |  j d d d } | j j d d  } | j j d d d | d d  |  j d |  | j |  j    q W|  j	 |   d  S)	Nr   r   slugr   r   rootpositionobj)
r   r   rV   rW   objectscreater   r5   r   r   )r'   r   r3   r   r   r   r   r   test_tabular_one_item   s    	z.VisualComparisonTestCase.test_tabular_one_itemc             C   s   g  } x t  t g D]{ } | |  _ |  j d d d } | j j d d  } | j j d d d | d d  |  j d |  | j |  j    q W|  j	 |   d  S)	Nr   r   r   r   r   r   r   r   )
r   r   rV   rW   r   r   r   r5   r   r   )r'   r   r3   r   r   r   r   r   test_stacked_one_item   s    	z.VisualComparisonTestCase.test_stacked_one_itemc             C   s^   g  } xD t  t g D]6 } | |  _ |  j   |  j   | j |  j    q W|  j |   d  S)N)r   r   rV   r   r   r5   r   r   )r'   r   r3   r   r   r   test_tabular_added_item   s    	

z0VisualComparisonTestCase.test_tabular_added_itemc             C   s^   g  } xD t  t g D]6 } | |  _ |  j   |  j   | j |  j    q W|  j |   d  S)N)r   r   rV   r   r   r5   r   r   )r'   r   r3   r   r   r   test_stacked_added_item   s    	

z0VisualComparisonTestCase.test_stacked_added_itemc             C   sG  g  } x t  t g D] } | |  _ |  j   |  j rK |  j j d d  n  |  j   |  j d   } | j	 d  Wd  QX|  j d   } | j	 d  Wd  QX|  j
   | j |  j    q Wg  } |  j s0|  j j d  } | d d	 i | j d
 d
 6| j d d 6| j d d 6| j d d 6g 7} n  |  j d | |  d  S)Nix  i   z#id_slugr   z#id_children-0-slugr   z#children-0 .deletez--block-outz%(x)s,%(y)s,%(w)s,%(h)srf   rg   rh   ri   rj   rk   r   )r   r   rV   r   rp   ra   rb   r   clickable_selector	send_keys	save_formr5   r   r   rq   rr   rs   r   )r'   r   r3   r   r   
delete_colr   r   r   test_tabular_validation_error   s,    	
	

	z6VisualComparisonTestCase.test_tabular_validation_errorc             C   s(  g  } x t  t g D] } | |  _ |  j   |  j   |  j d   } | j d  Wd  QX|  j d   } | j d  Wd  QX|  j   | j |  j	    q Wg  } |  j
 s|  j j d  } | d d i | j d d 6| j d	 d	 6| j d
 d 6| j d d 6g 7} n  |  j d | |  d  S)Nz#id_slugr   z#id_children-0-slugr   z#children-0 .inline-deletelinkz--block-outz%(x)s,%(y)s,%(w)s,%(h)srf   rg   rh   ri   rj   rk   r   )r   r   rV   r   r   r   r   r   r5   r   r   ra   rq   rr   rs   r   )r'   r   r3   r   r   r   r   r   r   test_stacked_validation_error  s(    	


	z6VisualComparisonTestCase.test_stacked_validation_error)r)   r*   r+   rV   r   r   r   r   rR   rO   classmethodrD   rY   r]   propertyrW   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rX   r   r,   0   s&   2,	
	r,   ),distutils.spawnr   r   r   loggingr.   rZ   rt   r   rE   r   Zunittestr   rH   Zdjango.confr	   Zdjango.contrib.admin.sitesr
   rS   Zdjango.testr   Z#django.utils.six.moves.urllib.parser   r   r   Z'selenium.webdriver.common.action_chainsr   Zstorages.backends.s3boto3r   Znested_admin.tests.baser   r   r   rW   r   r   r   r   	getLoggerr)   rz   r    r!   r,   r   r   r   r   <module>   s6   "