B
    Z†`3  ã            	   @   s  d dl Zd dlm  mZ d dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ e ejjd¡Ze ejjd¡Ze ejd¡Ze d¡Ze d¡Ze d	¡Ze ejd
¡Ze ¡ dd„ ƒZej j
dd„ ƒZ!ej j
dd„ ƒZ"e #ed¡Z$ej  %dddddddg¡ej j
dd„ ƒƒZ&e #ed¡Z'ej  %ddddd d!g¡ej j
d"d#„ ƒƒZ(e #ed$¡Z)ej  %d%d&d'd(g¡ej j
d)d*„ ƒƒZ*e #ed+¡Z+ej j
d,d-„ ƒZ,ej j
d.d/„ ƒZ-e #ed0¡Z.ej  %d1d2d3d4g¡ej j
d5d6„ ƒƒZ/e #ed7¡Z0ej  %d8d9d:d;g¡ej j
d<d=„ ƒƒZ1e #ed>¡Z2ej j
d?d@„ ƒZ3e #edA¡Z4ej j
dBdC„ ƒZ5e #edD¡Z6ej  %dEdFdGg¡ej j
dHdI„ ƒƒZ7e #edJ¡Z8ej j
dKdL„ ƒZ9e #edM¡Z:ej j
dNdO„ ƒZ;e #edP¡Z<ej  %dQdRdSg¡ej j
dTdU„ ƒƒZ=e #edV¡Z>ej j
dWdX„ ƒZ?e #edY¡Z@ej j
dZd[„ ƒZAej jBd\d]„ ƒZCdS )^é    N)Úmock)ÚtestingÚTemplateZtext_error_templateÚTemporaryDirectoryÚset_extraction_pathÚresource_filenameÚcleanup_resourcesÚscandirc              C   s   dd„ } | S )Nc               S   s   t jtjdS )N)Zautospec)r   Z	MagicMockÚpathlibÚPath© r   r   úN/home/kop/projects/devel/pgwui/pgwui_develop/PGWUI_Develop/tests/test_pgwui.pyÚrun2   s    zMockPath.<locals>.runr   )r   r   r   r   ÚMockPath0   s    r   c       	      C   s  |ƒ }d|j _t |¡ |  ¡ \}}d}||k}|s”t d|fd||f¡dt ¡ ks^t 	|¡rht 
|¡ndt 
|¡dœ }dd|i }tt |¡ƒ‚d	 }}d}||k}|st d|fd||f¡d
t ¡ ksØt 	|¡rât 
|¡nd
t 
|¡dœ }dd|i }tt |¡ƒ‚d	 }}d	S )z4When the target does not exist, nothing happens
    FÚ )ú==)z%(py0)s == %(py3)sÚout)Úpy0Úpy3zassert %(py5)sÚpy5NÚerr)ÚexistsÚreturn_valueÚpgwuiÚvalidate_targetÚ
readouterrÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)	Úcapsysr   Úentryr   r   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6r   r   r   Útest_validate_target_not_exists;   s$    
   F      F   r*   c          	   C   sÖ  |ƒ }d|j _t t¡}t |¡ W dQ R X |j}|j}d}||k}|sºt	 
d|fd||f¡dt ¡ kstt	 |¡r~t	 |¡ndt	 |¡t	 |¡t	 |¡dœ }dd	|i }	tt	 |	¡ƒ‚d } } }}|  ¡ \}
}d
}|
|k}|sLt	 
d|fd|
|f¡dt ¡ kst	 |
¡r t	 |
¡ndt	 |¡dœ }dd|i }tt	 |¡ƒ‚d }}d
}||k}|sÊt	 
d|fd||f¡dt ¡ ks”t	 |¡ržt	 |¡ndt	 |¡dœ }dd|i }tt	 |¡ƒ‚d }}dS )z_When the target exists, SystemExit is raised with a
    value of 1, text is sent to stdout
    TNé   )r   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)sÚexecinfo)r   Úpy2Úpy4Úpy7zassert %(py9)sÚpy9r   )z%(py0)s == %(py3)sr   )r   r   zassert %(py5)sr   )ú!=)z%(py0)s != %(py3)sr   )r   r   ÚpytestÚraisesÚ
SystemExitr   r   ÚvalueÚcoder   r   r   r   r    r!   r"   r#   r   )r$   r   r%   r,   r'   Ú@py_assert3Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10r   r   r&   r(   r)   r   r   r   Útest_validate_target_existsI   s8         V      J      J   r<   r   )ÚnameÚexpected)Úanythingr?   )Úanytemplater@   )ÚtemplaterA   )Ú	templatesrB   )ZanyTEMPLATEZanySUB)ZanyTEMPLATEanyZ	anySUBanyc             C   sž   t  ddi| ¡}||k}|s–t d|fd||f¡dt ¡ ksFt |¡rPt |¡nddt ¡ ksht |¡rrt |¡nddœ }dd	|i }tt 	|¡ƒ‚d
}d
S )z$The expected result is returned
    Ú
short_nameZSUB)r   )z%(py0)s == %(py2)sÚresultr>   )r   r-   zassert %(py4)sr.   N)
r   Útransform_namer   r   r   r   r    r!   r"   r#   )r=   r>   rD   r'   Ú@py_format3Ú@py_format5r   r   r   Útest_transform_namea   s      `   rH   rE   )Úsuffixr>   )r   F)z.ishF)z.fooF)z.makT)z.makishTc             C   s¤   | ƒ }||_ t |¡}||k}|sœt d|fd||f¡dt ¡ ksLt |¡rVt |¡nddt ¡ ksnt |¡rxt |¡nddœ }dd|i }t	t 
|¡ƒ‚d}dS )	z$The expected result is returned
    )r   )z%(py0)s == %(py2)srD   r>   )r   r-   zassert %(py4)sr.   N)rI   r   Ú
renderabler   r   r   r   r    r!   r"   r#   )r   rI   r>   r%   rD   r'   rF   rG   r   r   r   Útest_renderablex   s    
  `   rK   rJ   )rI   Úrenderable_resultÚstemr=   Úexpected_name)r   TrM   r=   rM   )z.ishFrM   r=   rM   )r   FrM   r=   r=   c             C   s°   | ƒ }||_ ||_||_||_t d|¡ |jd d }	|	|k}
|
s¤t d|
fd|	|f¡t 	|	¡dt
 ¡ ksvt |¡r€t 	|¡nddœ }dd	|i }tt |¡ƒ‚d }	}
dS )
z4The expected name is passed to transform_name()
    Nr   r+   )r   )z%(py1)s == %(py3)srN   )Zpy1r   zassert %(py5)sr   )rI   r=   rM   r   r   Útransform_file_nameÚ	call_argsr   r   r!   r   r   r    r"   r#   )r   Úmock_renderableÚmock_transform_namerI   rL   rM   r=   rN   r%   Z@py_assert0r&   r(   r)   r   r   r   Útest_transform_file_name‘   s       F   rS   rO   c             C   s¢  |ƒ }d|j _||_t  i dd¡}d}||k}|s’t d|fd||f¡dt ¡ ks\t |¡rft |¡ndt |¡dœ }dd|i }t	t 
|¡ƒ‚d }}|  ¡ \}	}
d	}|	|k}|st d|fd|	|f¡d
t ¡ ksât |	¡rìt |	¡nd
t |¡dœ }dd|i }t	t 
|¡ƒ‚d }}d	}|
|k}|s–t d|fd|
|f¡dt ¡ ks`t |
¡rjt |
¡ndt |¡dœ }dd|i }t	t 
|¡ƒ‚d }}dS )zfWhen the template is successfully rendered, the result is returned,
    nothing is sent to stderr
    r>   N)r   )z%(py0)s == %(py3)srD   )r   r   zassert %(py5)sr   r   r   r   )Úrenderr   r   r   r   r   r   r    r!   r"   r#   r   )r$   ÚMockTemplateÚmock_text_error_templateZmock_templaterD   r&   r'   r(   r)   r   r   r   r   r   Útest_render_success®   s4       F      F      J   rW   c          	   C   sÒ  t |_t t¡°}t i dd¡ |j}|j}d}||k}|s¬t	 
d|fd||f¡dt ¡ ksft	 |¡rpt	 |¡ndt	 |¡t	 |¡t	 |¡dœ }dd|i }	tt	 |	¡ƒ‚d } } }}W dQ R X |  ¡ \}
}d	}|
|k}|sHt	 
d|fd
|
|f¡dt ¡ kst	 |
¡rt	 |
¡ndt	 |¡dœ }dd|i }tt	 |¡ƒ‚d }}d	}||k}|sÆt	 
d|fd||f¡dt ¡ kst	 |¡ršt	 |¡ndt	 |¡dœ }dd|i }tt	 |¡ƒ‚d }}dS )z‹When the template does not render, the the error template render is
    sent to stderr, and sys exit raised with the right return code
    Nr+   )r   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)sr,   )r   r-   r.   r/   zassert %(py9)sr0   r   )z%(py0)s == %(py3)sr   )r   r   zassert %(py5)sr   )r1   )z%(py0)s != %(py3)sr   )Ú	ExceptionZside_effectr2   r3   r4   r   rT   r5   r6   r   r   r   r   r    r!   r"   r#   r   )r$   rU   rV   r,   r'   r7   r8   r9   r:   r;   r   r   r&   r(   r)   r   r   r   Útest_render_fail¿   s6         V      J      J   rY   rT   )Úinputr>   )z% ${foo}
barz% ${foo}
bar)z %% ${foo} %%
 bar %% 
z%${foo} %%
 bar%
)z$ {foo}
 $ {bar}
${baz}
z${foo}
 ${bar}
${baz}
c             C   s˜   t  | ¡}||k}|st d|fd||f¡dt ¡ ks@t |¡rJt |¡nddt ¡ ksbt |¡rlt |¡nddœ }dd|i }tt 	|¡ƒ‚d}dS )	z!Produces the expected result
    )r   )z%(py0)s == %(py2)srD   r>   )r   r-   zassert %(py4)sr.   N)
r   Úmake_renderabler   r   r   r   r    r!   r"   r#   )rZ   r>   rD   r'   rF   rG   r   r   r   Útest_make_renderable×   s    	
  `   r\   r[   )ÚcontentrI   rJ   Úrender_resultÚmake_renderable_resultr>   )r]   r   FNNr]   )Nr   TÚrendered_contentNr`   )Nz.makishTNÚrenderable_contentra   c
             C   sÀ   | ƒ }
||
_ ||
j_||_||_||_t d|
¡}||	k}|s¸t d|fd||	f¡dt ¡ ksht 	|¡rrt 
|¡nddt ¡ ksŠt 	|	¡r”t 
|	¡nddœ }dd|i }tt |¡ƒ‚d}dS )	z+The right suffix makes the right calls
    N)r   )z%(py0)s == %(py2)srD   r>   )r   r-   zassert %(py4)sr.   )rI   Ú	read_textr   r   Úproduce_contentr   r   r   r   r    r!   r"   r#   )r   rQ   Úmock_renderÚmock_make_renderabler]   rI   rJ   r^   r_   r>   r%   rD   r'   rF   rG   r   r   r   Útest_produce_contentë   s      `   rf   rc   c             C   sP  d}d}||_ ||_ t | dd¡ tj}| | }||ƒ}|j}|ƒ }	|	|k}
|
s4t d|
fd|	|f¡dt 	¡ ks|t 
t¡r†t t¡ndt |¡dt 	¡ ks¦t 
| ¡r°t | ¡nddt 	¡ ksÈt 
|¡rÒt |¡ndt |¡t |¡t |	¡dt 	¡ kst 
|¡rt |¡ndd	œ }d
d|i }tt |¡ƒ‚d } } } } }	}
dS )z>The expected file content is written to the expected file
    Ú	test_namezsome content
N)r   )z%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.Path
}((%(py3)s / %(py4)s))
}.read_text
}()
} == %(py13)sr
   Útmp_pathÚtest_content)r   r-   r   r.   r/   r0   Úpy11Zpy13zassert %(py15)sZpy15)r   r   Údeliver_filer
   r   rb   r   r   r   r   r    r!   r"   r#   )rh   Úmock_transform_file_nameÚmock_produce_contentrg   ri   r'   r9   r8   Ú@py_assert8Ú@py_assert10Z@py_assert12Z@py_format14Z@py_format16r   r   r   Útest_deliver_file  s            È   rp   rk   c          
   C   s”  d}dddg}|ƒ }||_ ||_|tjƒ}||j_t | i |¡ |j}	d}
|	|
k}|s¾t d|fd|	|
f¡dt	 
¡ ks€t |¡rŠt |¡ndt |	¡t |
¡d	œ }d
d|i }tt |¡ƒ‚d }	 }}
|j}	t|ƒ}|	|k}|sžt d|fd|	|f¡dt	 
¡ kst |¡rt |¡ndt |	¡dt	 
¡ ksBt t¡rLt t¡nddt	 
¡ ksht |¡rrt |¡ndt |¡dœ }dd|i }tt |¡ƒ‚d }	 }}tj}	| | }|	|ƒ}|j}|ƒ }|s|ddt	 
¡ ksît t¡røt t¡ndt |	¡dt	 
¡ kst | ¡r&t | ¡nddt	 
¡ ksBt |¡rLt |¡ndt |¡t |¡t |¡dœ }tt |¡ƒ‚d }	 } } }}dS )zzMakes the entry directory, calls deliver_entry() for every entry
    returned by os.scandir(), calls transform_name()
    rg   ÚaÚbÚcr+   )r   )z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)srR   )r   r-   r   zassert %(py7)sr/   N)zP%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py7)s
{%(py7)s = %(py4)s(%(py5)s)
}Úmock_deliver_entryÚlenÚtest_entries)r   r-   r.   r   r/   zassert %(py9)sr0   z‡assert %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.Path
}((%(py3)s / %(py4)s))
}.exists
}()
}r
   rh   )r   r-   r   r.   r/   r0   rj   )r=   r   r   ÚosÚ	__enter__Údeliver_dirÚ
call_countr   r   r   r   r    r!   r"   r#   ru   r
   r   r   )rh   r   rR   Úmock_scandirrt   rg   rv   Z
mock_entryÚmocked_scandirr'   Ú@py_assert4r7   r)   r:   r8   r;   r9   rn   ro   Z@py_format12r   r   r   Útest_deliver_dir"  sB    

    N       ž         œ  r~   ry   )Úis_dirÚdd_callsÚdf_calls)Tr+   r   )Fr   r+   c             C   sn  |r
| }n| d }|  ¡  t dd|¡ |j}||k}|s¼t d|fd||f¡dt ¡ ksdt |¡rnt 	|¡ndt 	|¡dt ¡ ksŽt |¡r˜t 	|¡nddœ }	dd	|	i }
t
t |
¡ƒ‚d }}|j}||k}|sbt d|fd||f¡d
t ¡ kst |¡rt 	|¡nd
t 	|¡dt ¡ ks4t |¡r>t 	|¡nddœ }	dd	|	i }
t
t |
¡ƒ‚d }}dS )zCalls the right functions
    Z	test_fileN)r   )z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py4)sÚmock_deliver_dirr€   )r   r-   r.   zassert %(py6)sZpy6Úmock_deliver_filer   )Útouchr   Údeliver_entryrz   r   r   r   r   r    r!   r"   r#   )rh   r‚   rƒ   r   r€   r   Z
test_entryr'   r7   rG   Z@py_format7r   r   r   Útest_deliver_entryA  s&    
   h      p   r†   r…   c             C   s°  dddg}| ƒ }|t jƒ}||j_t  |i d¡ |j}|j}d}||k}	|	s¼t d|	fd||f¡dt	 
¡ ksvt |¡r€t |¡ndt |¡t |¡t |¡d	œ }
d
d|
i }tt |¡ƒ‚d } } }	}|j}t|ƒ}||k}|s t d|fd||f¡dt	 
¡ kst |¡r t |¡ndt |¡dt	 
¡ ksDt t¡rNt t¡nddt	 
¡ ksjt |¡rtt |¡ndt |¡dœ }
d
d|
i }tt |¡ƒ‚d } }}dS )zaMakes the target directory, calls deliver_entry for every entry
    returned by os.scandir()
    rq   rr   rs   Nr+   )r   )zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.mkdir
}.call_count
} == %(py7)sÚ	mock_path)r   r-   r.   r/   zassert %(py9)sr0   )zP%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py7)s
{%(py7)s = %(py4)s(%(py5)s)
}rt   ru   rv   )r   r-   r.   r   r/   )r   rw   rx   r   Útraverse_templatesÚmkdirrz   r   r   r   r   r    r!   r"   r#   ru   )r   r{   rt   rv   r‡   r|   r'   r7   r8   r9   r:   r;   r   r   r   Útest_traverse_templates]  s,    

     V       ž   rŠ   rˆ   c       
      C   sÌ  |t jƒ}|t jƒ}|t jƒ}t  dd¡ | j}|svddt ¡ ksLt | ¡rVt | ¡ndt |¡dœ }	t	t 
|	¡ƒ‚d}|j}|sÆddt ¡ ksœt |¡r¦t |¡ndt |¡dœ }	t	t 
|	¡ƒ‚d}|j}|sddt ¡ ksît |¡røt |¡ndt |¡dœ }	t	t 
|	¡ƒ‚d}|j}|snddt ¡ ksDt |¡rNt |¡ndt |¡dœ }	t	t 
|	¡ƒ‚d}|j}|sÄddt ¡ ksšt |¡r¤t |¡ndt |¡dœ }	t	t 
|	¡ƒ‚d}dS )	zAll the mocks are called
    Nz.assert %(py2)s
{%(py2)s = %(py0)s.call_count
}ÚMockTemporaryDirectory)r   r-   Úmocked_set_extraction_pathÚmocked_resource_filenameÚmock_traverse_templatesÚmocked_cleanup_resources)r   Úpkg_resourcesÚdeliver_targetrz   r   r   r   r    r!   r"   r#   )
r‹   Úmock_set_extraction_pathÚmock_resource_filenamerŽ   Úmock_cleanup_resourcesrŒ   r   r   r'   rF   r   r   r   Útest_deliver_targett  s:    


  4    4    4    8    8  r•   r‘   )Úpathr>   )z	/anythingz	/anything)NÚ.c             C   s˜   t  | ¡}||k}|st d|fd||f¡dt ¡ ks@t |¡rJt |¡nddt ¡ ksbt |¡rlt |¡nddœ }dd|i }tt 	|¡ƒ‚d}dS )	z%The expected values are returned
    )r   )z%(py0)s == %(py2)srD   r>   )r   r-   zassert %(py4)sr.   N)
r   Úpath_or_defaultr   r   r   r   r    r!   r"   r#   )r–   r>   rD   r'   rF   rG   r   r   r   Útest_path_or_defaultŽ  s    
  `   r™   r˜   c       
      C   sˆ  d| _ tj ¡ }| ¡ , | tjdddddddd	d
dddg¡}W dQ R X | j}d}||k}|sÈt 	d|fd||f¡dt
 ¡ ksŠt | ¡r”t | ¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d } }}|j}d}||k}|sXt 	d|fd||f¡dt
 ¡ kst |¡r$t |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d } }}|j}d}||k}|sèt 	d|fd||f¡dt
 ¡ ksªt |¡r´t |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d } }}|j}d}||k}|sxt 	d|fd||f¡dt
 ¡ ks:t |¡rDt |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d } }}dS )z9Takes the right arguments, calls the right functions
    r—   Úcookiecutterz--componentÚ	componentz--short-namerC   z	--summaryÚsummaryz--author-nameÚauthor_namez--author-emailÚauthor_emailNr+   )r   )z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sÚmock_path_or_default)r   r-   r   zassert %(py7)sr/   Úmock_validate_targetÚmock_deliver_targetr   )z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)srD   )r   Úclickr   Ú	CliRunnerÚisolated_filesystemÚinvoker   rz   r   r   r   r   r    r!   r"   r#   Ú	exit_code)
rŸ   r    r¡   ÚrunnerrD   r'   r}   r7   r)   r:   r   r   r   Útest_cookiecutter¡  sV    

    N       R       R       R   r¨   rš   c          	   C   sH  t j ¡ }| ¡  | tjg ¡}W dQ R X |j}d}||k}|sªt d|fd||f¡dt	 
¡ kslt |¡rvt |¡ndt |¡t |¡dœ }dd|i }tt |¡ƒ‚d } }}| j}d}||k}|s8t d|fd	||f¡d
t	 
¡ ksút | ¡rt | ¡nd
t |¡t |¡dœ }dd|i }tt |¡ƒ‚d } }}dS )zFThe cookiecutter is not called when not given on the command line
    Nr   )r   )z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)srD   )r   r-   r   zassert %(py7)sr/   )z2%(py2)s
{%(py2)s = %(py0)s.call_count
} == %(py5)sÚmock_cookiecutter)r¢   r   r£   r¤   r¥   r   r¦   r   r   r   r   r    r!   r"   r#   rz   )r©   r§   rD   r'   r}   r7   r)   r:   r   r   r   Ú
test_pgwuiÀ  s&    

    N       P   rª   c       
      C   sÒ   t j ¡ }| ¡ , | tjddddddddd	d
ddg¡}W dQ R X |j}d}||k}|sÂt d|fd||f¡dt	 
¡ ks„t |¡rŽt |¡ndt |¡t |¡dœ }dd|i }	tt |	¡ƒ‚d } }}dS )z/Execute the code, except that which writes
    rš   z--componentr›   z--short-namerC   z	--summaryrœ   z--author-namer   z--author-emailrž   r—   Nr   )r   )z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)srD   )r   r-   r   zassert %(py7)sr/   )r¢   r   r£   r¤   r¥   r   r¦   r   r   r   r   r    r!   r"   r#   )
rh   rƒ   r‚   r§   rD   r'   r}   r7   r)   r:   r   r   r   Útest_cookiecutter_integrationÎ  s$    

    N   r«   )DÚbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r2   Zclick.testingr¢   r
   Úunittestr   Úpgwui_developr   Zpgwui_develop.pgwuir   Zmake_magicmock_fixtureZmakorA   rU   Ú
exceptionsrV   Útempfiler‹   Zinstance_method_mock_fixturer’   r“   r”   rw   r{   Úfixturer   Úmarkr*   r<   Zmake_mock_fixturer    ÚparametrizerH   rR   rK   rQ   rS   rl   rW   rY   rd   r\   re   rf   rm   rp   rƒ   r~   r‚   r†   rt   rŠ   rŽ   r•   r¡   r™   rŸ   r¨   r©   rª   Zintegrationtestr«   r   r   r   r   Ú<module>   sÔ     

			