a
    Cgˠ                    @   s  d Z ddlZddlZddlmZ ddlmZ ddlmZ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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 ddl Z ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z1 e1  dddiiddidddiidddiiddidddiigddddiigdddd iidd!iddd"iigdgZ2g d#Z3e j4d$e.j5e.j6 d%d&d' Z7e j4d$e.j5e.j6 d%d(d) Z8e j4d$e.j5d%d*d+ Z9e j4d$e.j:d%d,d- Z;e j4d$e.j<d%d.d/ Z=e j4d$e.j>d%d0d1 Z?e j4d$e.j@d%d2d3 ZAe j4d$e.jBd%d4d5 ZCe j4d$e.jDgd%d6d7 ZEe j4d$e.jFgd%d8d9 ZGe j4d$e.jHgd%d:d; ZIe j4d$e.jJgd%d<d= ZKe j4d$e.jLgd%d>d? ZMd@dA ZNG dBdC dCZOe jPjQG dDdE dEeOZRG dFdG dGeOZSe jPjQG dHdI dIeSZTe jPjQG dJdK dKeSZUe jPjQG dLdM dMeSZVe jPjQG dNdO dOeSZWe jPjQG dPdQ dQeOZXe jPjQG dRdS dSeSZYe jPjQG dTdU dUeOZZe jPjQG dVdW dWeSZ[e jPjQG dXdY dYeSZ\e jPjQG dZd[ d[eSZ]e jPjQG d\d] d]eSZ^e jPjQG d^d_ d_eOZ_e jPjQG d`da daeOZ`e jPjQG dbdc dceOZae jPjQG ddde deeOZbe jPjQG dfdg dgeOZce jPjQG dhdi dieOZde jPjQG djdk dkeOZee jPjQG dldm dmeOZfe jPjQG dndo doeOZge jPjQG dpdq dqeOZhe jPjQG drds dseSZie jPjQG dtdu dueSZje jPjQG dvdw dwe_Zke jPjQG dxdy dyeSZle jPjQG dzd{ d{eSZme jPjQG d|d} d}eSZne jPjQG d~d deSZoe jPjQG dd depZqe jPjQG dd deOZrdS )zUnit/Functional tests    N)	AdminSite)
ChangeList)UserAnonymousUser)FallbackStorage)Q)	post_save)receiver)TemplateContext)TestCase)RequestFactory)static)TO_FIELD_VAR)VERSION)numconv)admin_factory)InvalidPositionInvalidMoveToDescendantPathOverflowMissingNodeOrderByNodeAlreadySaved)movenodeform_factory)models)register_alldatadesc12212223231r   children243441
r      r   r   r+      r      r   r    r/   r   r!   r/   r+   r"      r   r%   r/   r   r&   r+   r   r'   r+   r+   r(   r/   r   functionscopeparamsc                 C   s   | j t | j S Nparam	load_bulk	BASE_DATArequest rC   ]/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/treebeard/tests/test_treebeard.pymodelM   s    rE   c                 C   s   | j S r<   r>   rA   rC   rC   rD   model_without_dataS   s    rG   c                 C   s   | j t | j S r<   r=   rA   rC   rC   rD   model_without_proxyX   s    rH   c                 C   s   | j S r<   rF   rA   rC   rC   rD   model_with_unicode^   s    rI   c                 C   s   | j S r<   rF   rA   rC   rC   rD   sorted_modelc   s    rJ   c                 C   s   | j S r<   rF   rA   rC   rC   rD   related_modelh   s    rK   c                 C   s   | j S r<   rF   rA   rC   rC   rD   inherited_modelm   s    rL   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpshort_modelr   s    rM   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpshortnotsorted_modelw   s    rN   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpalphabet_model|   s    rO   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpsortedautonow_model   s    rP   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpsmallstep_model   s    rQ   c                 C   s   | j S r<   rF   rA   rC   rC   rD   mpm2muser_model   s    rR   c                  G   s   t | }tdkr|d |S )N)r-    )listDJANGO_VERSIONappend)argsnew_argsrC   rC   rD   get_changelist_args   s    
rY   c                   @   s   e Zd Zdd ZdddZdS )TestTreeBasec                 C   s   |t jt jfv ri }|jdddD ] \}}}||g ||g q$| D ]B\}}t|t	|ksjJ t
tdt|d }t||ksNJ qNdd | D S )Ntree_idlftrgtr+   c                 S   s    g | ]}|j | | fqS rC   r   	get_depthget_children_count.0orC   rC   rD   
<listcomp>   s   z$TestTreeBase.got.<locals>.<listcomp>)r   ZNS_TestNodeZNS_TestNode_ProxyobjectsZvalues_list
setdefaultextenditemslenmaxrT   rangesortedget_tree)selfrE   dr[   r\   r]   Z	got_edgesZ
good_edgesrC   rC   rD   got   s    zTestTreeBase.gotNc                    sB     |}dd |D }||ks$J t fdd|D s>J d S )Nc                 S   s6   g | ].}|d  j |d d |d d |d d fqS )r   r+   opencloselevelr   rb   objrC   rC   rD   rd      s   z;TestTreeBase._assert_get_annotated_list.<locals>.<listcomp>c                    s   g | ]}t |d   kqS r   typeru   rE   rC   rD   rd          )Zget_annotated_listall)rn   rE   expectedparentresultsrp   rC   rz   rD   _assert_get_annotated_list   s    
z'TestTreeBase._assert_get_annotated_list)N)__name__
__module____qualname__rp   r   rC   rC   rC   rD   rZ      s   rZ   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestEmptyTreec                 C   sZ   | t}dd |jj|dD }dd tD }t|t|ksDJ | |tksVJ d S )Nc                 S   s   g | ]
}|j qS rC   rt   ru   rC   rC   rD   rd      r{   z6TestEmptyTree.test_load_bulk_empty.<locals>.<listcomp>Zpk__inc                 S   s   g | ]}|d  qS rw   rC   )rb   xrC   rC   rD   rd      r{   )r?   r@   re   filter	UNCHANGEDrl   rp   )rn   rG   ids	got_descsexpected_descsrC   rC   rD   test_load_bulk_empty   s
    
z"TestEmptyTree.test_load_bulk_emptyc                 C   s   |  g ksJ d S r<   )	dump_bulk)rn   rG   rC   rC   rD   test_dump_bulk_empty   s    z"TestEmptyTree.test_dump_bulk_emptyc                 C   s(   |j dd dg}| ||ks$J d S )Nr   rt   r*   add_rootrp   rn   rG   r}   rC   rC   rD   test_add_root_empty   s    z!TestEmptyTree.test_add_root_emptyc                 C   s&   |  }g }dd |D |ks"J d S )Nc                 S   s   g | ]
}|j qS rC   rt   rb   noderC   rC   rD   rd      r{   z;TestEmptyTree.test_get_root_nodes_empty.<locals>.<listcomp>get_root_nodes)rn   rG   rp   r}   rC   rC   rD   test_get_root_nodes_empty   s    z'TestEmptyTree.test_get_root_nodes_emptyc                 C   s   |  }|d u sJ d S r<   )get_first_root_nodern   rG   rp   rC   rC   rD   test_get_first_root_node_empty   s    z,TestEmptyTree.test_get_first_root_node_emptyc                 C   s   |  }|d u sJ d S r<   )get_last_root_noder   rC   rC   rD   test_get_last_root_node_empty   s    z+TestEmptyTree.test_get_last_root_node_emptyc                 C   s   t | }|g ksJ d S r<   )rT   rm   r   rC   rC   rD   test_get_tree   s    zTestEmptyTree.test_get_treec                 C   s   g }|  || d S r<   r   r   rC   rC   rD   test_get_annotated_list   s    z%TestEmptyTree.test_get_annotated_listc                 C   sN   |j dd |j dd |j dd |j dd g d}| ||ksJJ d S )Nr   rt   r   r&   r'   )r*   )r   r+   r   r5   )r'   r+   r   r   r   rC   rC   rD   0test_add_multiple_root_nodes_adds_sibling_leaves   s    z>TestEmptyTree.test_add_multiple_root_nodes_adds_sibling_leavesN)r   r   r   r   r   r   r   r   r   r   r   r   rC   rC   rC   rD   r      s   r   c                   @   s   e Zd ZdS )TestNonEmptyTreeN)r   r   r   rC   rC   rC   rD   r      s   r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$TestClassMethodsc                 C   sl   |j jdd}|t|}g d}g d}dd |j j|dD }t|t|ksVJ | ||kshJ d S )Nr"   rt   )r*   r,   r.   r0   r1   r"   r3   r-   r   r-   r   r   r-   r-   r      r   r    r   r   r!   r   r+   r"      r   r%   r   r   r&   r-   r   r'   r-   r+   r(   r   r   r4   r5   r6   r7   )
r   r   r   r    r!   r"   r%   r&   r'   r(   c                 S   s   g | ]
}|j qS rC   rt   ru   rC   rC   rD   rd     r{   z<TestClassMethods.test_load_bulk_existing.<locals>.<listcomp>r   )re   getr?   r@   r   rl   rp   )rn   rE   r   r   r}   r   r   rC   rC   rD   test_load_bulk_existing   s    z(TestClassMethods.test_load_bulk_existingc                    s@      }dd |D }|tks"J t fdd|D s<J d S )Nc                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd   
  r{   z6TestClassMethods.test_get_tree_all.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   ra   rz   rC   rD   rd     r{   )rm   r   r|   )rn   rE   nodesrp   rC   rz   rD   test_get_tree_all  s    z"TestClassMethods.test_get_tree_allc                 C   s   |j ddtksJ d S )NFZkeep_ids)r   r@   rn   rE   rC   rC   rD   test_dump_bulk_all  s    z#TestClassMethods.test_dump_bulk_allc                    st    j jdd} t|  j j|jd} |}dd |D }g d}||ksVJ t fdd|D spJ d S )Nr"   rt   pkc                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd     r{   z7TestClassMethods.test_get_tree_node.<locals>.<listcomp>)r   r   r   r   r   r   r   r   r   r   r   c                    s   g | ]}t | kqS rC   rx   ra   rz   rC   rD   rd   (  r{   )re   r   r?   r@   r   rm   r|   rn   rE   r   r   rp   r}   rC   rz   rD   test_get_tree_node  s    
z#TestClassMethods.test_get_tree_nodec                    sf    j jdd}d| ksJ  |}dd |D }dg}||ksHJ t fdd|D sbJ d S )Nr   rt   r   c                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd   /  r{   z7TestClassMethods.test_get_tree_leaf.<locals>.<listcomp>r*   c                    s   g | ]}t | kqS rC   rx   ra   rz   rC   rD   rd   2  r{   )re   r   r`   rm   r|   r   rC   rz   rD   test_get_tree_leaf*  s    
z#TestClassMethods.test_get_tree_leafc                 C   s   ddg dfddg dfddg dfddg dfd	dg dfd
ddgdfdddgdfddg dfddg dfddddgdfg
}|  || d S )Nr   Tr   r   Fr   r+   r    r!   r"   r/   r%   r&   r'   r(   r   rn   rE   r}   rC   rC   rD   test_get_annotated_list_all4  s    






z,TestClassMethods.test_get_annotated_list_allc              	   C   sf   |j jdd}ddg dfddg dfddg dfd	dg dfd
ddgdfddddgdfg}| ||| d S )Nr   rt   Tr   r   r+   r    Fr!   r"   r/   r%   re   r   r   rn   rE   r   r}   rC   rC   rD   test_get_annotated_list_nodeC  s    



z-TestClassMethods.test_get_annotated_list_nodec                 C   s0   |j jdd}dddgdfg}| ||| d S )Nr   rt   Tr   r   r   rC   rC   rD   test_get_annotated_list_leafO  s    z-TestClassMethods.test_get_annotated_list_leafc                 C   sV   |j jdd}|t| |j j|jd}||d}dditdg}||ksRJ d S )Nr"   rt   r   Fr   r#   )re   r   r?   r@   r   r   )rn   rE   r   rp   r}   rC   rC   rD   test_dump_bulk_nodeT  s    z$TestClassMethods.test_dump_bulk_nodec                 C   sb   |j dd}|j   ||d d |j dd}||ks@J dd | D }|tks^J d S )NTr   c                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd   f  s   zHTestClassMethods.test_load_and_dump_bulk_keeping_ids.<locals>.<listcomp>)r   re   r|   deleter?   rm   r   )rn   rE   exprp   rC   rC   rD   #test_load_and_dump_bulk_keeping_ids_  s    z4TestClassMethods.test_load_and_dump_bulk_keeping_idsc              	   C   s   |j    tjj jd|j d\}}dd|jdid|jddd|jdidd|jdid	|jddd
|jdigddd|jdigddd|jdid|jddd|jdigdg}|| |j	dd}||ksJ d S )NzTest %srt   r   r   )r   relatedr   r   r    r!   r"   r#   r%   r&   r'   r(   Fr   )
re   r|   r   r   ZRelatedModelZget_or_creater   r   r?   r   )rn   rK   r   createdZrelated_datarp   rC   rC   rD   test_load_and_dump_bulk_with_fkk  s0    




z0TestClassMethods.test_load_and_dump_bulk_with_fkc                    sD      }g d}dd |D |ks&J t fdd|D s@J d S )Nr   r   r&   r'   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z8TestClassMethods.test_get_root_nodes.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   r   rz   rC   rD   rd     r{   )r   r|   )rn   rE   rp   r}   rC   rz   rD   test_get_root_nodes  s    z$TestClassMethods.test_get_root_nodesc                 C   s*   |  }|jdksJ t||ks&J d S Nr   )r   r   ry   rn   rE   rp   rC   rC   rD   test_get_first_root_node  s    z)TestClassMethods.test_get_first_root_nodec                 C   s*   |  }|jdksJ t||ks&J d S )Nr'   )r   r   ry   r   rC   rC   rD   test_get_last_root_node  s    z(TestClassMethods.test_get_last_root_nodec                 C   sF   |j dd}| dksJ | }|jdks2J t||ksBJ d S )N5rt   r+   )r   r_   r   r   ry   )rn   rE   rv   rp   rC   rC   rD   test_add_root  s
    zTestClassMethods.test_add_rootc                 C   sL   |dd}|j |d}||ks"J | }|jdks8J t||ksHJ d S )Nr   rt   instance)r   r   r   ry   )rn   rE   rv   resultrp   rC   rC   rD   "test_add_root_with_passed_instance  s    
z3TestClassMethods.test_add_root_with_passed_instancec                 C   sH   |j jdd}tt |j|d W d    n1 s:0    Y  d S )Nr'   rt   r   )re   r   pytestraisesr   r   )rn   rE   rv   rC   rC   rD   )test_add_root_with_already_saved_instance  s    z:TestClassMethods.test_add_root_with_already_saved_instanceN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   rC   rC   rD   r      s"   
#r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(TestSimpleNodeMethodsc                 C   s8   g d}|D ]&\}}|j j|d }||ksJ qd S )N))r   T)r   T)r'   T)r   F)r%   F)r    F)r"   Frt   re   r   is_rootrn   rE   r   r   r}   rp   rC   rC   rD   test_is_root  s    	z"TestSimpleNodeMethods.test_is_rootc                 C   s8   g d}|D ]&\}}|j j|d }||ksJ qd S )N))r   F)r!   F)r"   Trt   re   r   is_leafr   rC   rC   rD   test_is_leaf  s    z"TestSimpleNodeMethods.test_is_leafc                 C   sJ   g d}|D ]8\}}|j j|d }|j|ks4J t||ksJ qd S )N)r   r   r   r   r'   r'   r   r   r%   r   r    r   )r"   r   rt   )re   r   get_rootr   ry   rn   rE   r   r   r}   r   rC   rC   rD   test_get_root  s
    	z#TestSimpleNodeMethods.test_get_rootc                 C   s   g d}t |}i }| D ]\\}}|jj|d}| }|r^|j|ksLJ t||ksjJ n|d u sjJ |||< d|_q| D ]J\}}|| }|d}|r|j|ksJ t||ksJ q|d u sJ qd S )N))r   Nr   Nr'   Nr   r   r   )r"   r!   rt   zCORRUPTED!!!T)dictrh   re   r   
get_parentr   ry   Z_parent_obj)rn   rE   r   objsr   r}   r   r~   rC   rC   rD   test_get_parent  s&    	
z%TestSimpleNodeMethods.test_get_parentc                    sp   dg dfddgfdg fg}|D ]J\}} j j|d }dd |D |ksPJ t fdd|D s J q d S )	Nr   r   r    r!   r%   r!   r"   rt   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z;TestSimpleNodeMethods.test_get_children.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   r   rz   rC   rD   rd     r{   )re   r   get_childrenr|   )rn   rE   r   r   r}   r$   rC   rz   rD   test_get_children  s    
z'TestSimpleNodeMethods.test_get_childrenc                 C   s8   g d}|D ]&\}}|j j|d }||ksJ qd S )N))r   r-   r!   r+   r"   r   rt   re   r   r`   r   rC   rC   rD   test_get_children_count
  s    z-TestSimpleNodeMethods.test_get_children_countc                    st   dg dfdg dfddgfg}|D ]J\}} j j|d }dd |D |ksTJ t fd	d|D s$J q$d S )
Nr   r   r   r   r"   rt   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z;TestSimpleNodeMethods.test_get_siblings.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   r   rz   rC   rD   rd     r{   )re   r   get_siblingsr|   )rn   rE   r   r   r}   ZsiblingsrC   rz   rD   test_get_siblings  s    

z'TestSimpleNodeMethods.test_get_siblingsc                 C   sJ   g d}|D ]8\}}|j j|d }|j|ks4J t||ksJ qd S )N)r   r   r   )r'   r   )r   r   )r%   r   r    r   r"   r"   rt   )re   r   get_first_siblingr   ry   r   rC   rC   rD   test_get_first_sibling  s
    	z,TestSimpleNodeMethods.test_get_first_siblingc                 C   s`   g d}|D ]N\}}|j j|d }|d u r<|d u sZJ q|j|ksJJ t||ksJ qd S )N)r   r   )r'   r&   r   N)r%   r!   r   r"   Nrt   )re   r   get_prev_siblingr   ry   r   rC   rC   rD   test_get_prev_sibling.  s    	z+TestSimpleNodeMethods.test_get_prev_siblingc                 C   s`   g d}|D ]N\}}|j j|d }|d u r<|d u sZJ q|j|ksJJ t||ksJ qd S )N)r   r&   )r   r   r   )r   r    )r%   N)r    r!   r   rt   )re   r   get_next_siblingr   ry   r   rC   rC   rD   test_get_next_sibling@  s    	z+TestSimpleNodeMethods.test_get_next_siblingc                 C   sJ   g d}|D ]8\}}|j j|d }|j|ks4J t||ksJ qd S )N))r   r'   )r   r'   r   )r   r%   )r%   r%   )r    r%   r   rt   )re   r   get_last_siblingr   ry   r   rC   rC   rD   test_get_last_siblingR  s
    	z+TestSimpleNodeMethods.test_get_last_siblingc                 C   s`   g d}|D ]N\}}|j j|d }|d u r<|d u sZJ q|j|ksJJ t||ksJ qd S )N))r   r   r   r!   r"   r   rt   )re   r   get_first_childr   ry   r   rC   rC   rD   test_get_first_childa  s    z*TestSimpleNodeMethods.test_get_first_childc                 C   s`   g d}|D ]N\}}|j j|d }|d u r<|d u sZJ q|j|ksJJ t||ksJ qd S )N))r   r%   r   r  r   rt   )re   r   get_last_childr   ry   r   rC   rC   rD   test_get_last_childp  s    z)TestSimpleNodeMethods.test_get_last_childc                    sp   dg fddgfdddgfg}|D ]J\}} j j|d }dd |D |ksPJ t fdd|D s J q d S )	Nr   r   r"   r!   rt   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z<TestSimpleNodeMethods.test_get_ancestors.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   r   rz   rC   rD   rd     r{   )re   r   get_ancestorsr|   rn   rE   r   r   r}   r   rC   rz   rD   test_get_ancestors  s    
z(TestSimpleNodeMethods.test_get_ancestorsc                    s~   dg dfddgfdg fdg fddgfg}|D ]J\}} j j|d }d	d
 |D |ks^J t fdd
|D s.J q.d S )Nr   )r   r    r!   r"   r%   r!   r"   r   r'   r(   rt   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z>TestSimpleNodeMethods.test_get_descendants.<locals>.<listcomp>c                    s   g | ]}t | kqS rC   rx   r   rz   rC   rD   rd     r{   )re   r   get_descendantsr|   r  rC   rz   rD   test_get_descendants  s    
z*TestSimpleNodeMethods.test_get_descendantsc                 C   s8   g d}|D ]&\}}|j j|d }||ksJ qd S )N))r   r   r   r   r   r   r'   r+   rt   re   r   get_descendant_countr   rC   rC   rD   test_get_descendant_count  s    z/TestSimpleNodeMethods.test_get_descendant_countc                 C   sJ   g d}|D ]8\}}}|j j|d}|j j|d}|||ksJ qd S )N))r   r   T)r   r   T)r   r   Fr"   r   F)r    r!   T)r"   r!   F)r"   r"   Trt   )re   r   Zis_sibling_ofrn   rE   r   Zdesc1Zdesc2r}   node1node2rC   rC   rD   test_is_sibling_of  s
    	z(TestSimpleNodeMethods.test_is_sibling_ofc                 C   sJ   g d}|D ]8\}}}|j j|d}|j j|d}|||ksJ qd S )N)r   r   Fr   r   Fr   r   Tr  r"   r!   Tr"   r"   Frt   )re   r   Zis_child_ofr  rC   rC   rD   test_is_child_of  s
    z&TestSimpleNodeMethods.test_is_child_ofc                 C   sJ   g d}|D ]8\}}}|j j|d}|j j|d}|||ksJ qd S )N)r  r  r  )r"   r   Tr  r  rt   )re   r   Zis_descendant_ofr  rC   rC   rD   test_is_descendant_of  s
    z+TestSimpleNodeMethods.test_is_descendant_ofN)r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r  r   rC   rC   rC   rD   r     s&   
#
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestAddChildc                 C   s4   |j jddjdd g d}| ||ks0J d S )Nr"   rt   2311r*   r,   r.   r0   r1   )r"   r3   r+   )r"  r-   r   r4   r5   r6   r7   re   r   	add_childrp   r   rC   rC   rD   test_add_child_to_leaf  s    z#TestAddChild.test_add_child_to_leafc                 C   s4   |j jddjdd g d}| ||ks0J d S )Nr   rt   25)r*   r   r+   r   r.   r0   r1   r2   r4   )r'  r/   r   r5   r6   r7   r$  r   rC   rC   rD   test_add_child_to_node  s    z#TestAddChild.test_add_child_to_nodec                 C   sJ   |dd}|j jddj|d}||ks,J g d}| ||ksFJ d S )Nr"  rt   r"   r   r#  r$  )rn   rE   childr   r}   rC   rC   rD   #test_add_child_with_passed_instance  s
    
z0TestAddChild.test_add_child_with_passed_instancec                 C   sR   |j jdd}tt& |j jddj|d W d    n1 sD0    Y  d S )Nr   rt   r   r   )re   r   r   r   r   r%  )rn   rE   r*  rC   rC   rD   *test_add_child_with_already_saved_instance  s    z7TestAddChild.test_add_child_with_already_saved_instancec                 C   s2   |ddd}|j jddj|d}||ks.J dS 
        If the model is using a natural primary key then it will be
        already set when the instance is inserted.
        ?B znatural key)r   r   r   rt   r   Nre   r   r%  rn   rE   r*  r   rC   rC   rD   test_add_child_with_pk_set  s    z'TestAddChild.test_add_child_with_pk_setc              	   C   s^   zJt tdddd }|jjdd}| s0J |jdd W tjdd ntjdd 0 d S )Ntest_add_child_post_save)Zdispatch_uidc                 [   s$   |   }|  | dks J d S Nr+   )r   Zrefresh_from_dbr  )r   kwargsr~   rC   rC   rD   on_post_save  s    z;TestAddChild.test_add_child_post_save.<locals>.on_post_saver"   rt   r"  )r	   r   re   r   r   r%  Z
disconnect)rn   rE   r6  r~   rC   rC   rD   r3    s    

z%TestAddChild.test_add_child_post_saveN)	r   r   r   r&  r)  r+  r,  r2  r3  rC   rC   rC   rD   r!    s   	r!  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$TestAddSiblingc                 C   sB   t t$ |jjddd W d    n1 s40    Y  d S Nr"   rt   invalid_pos)r   r   r   re   r   add_siblingr   rC   rC   rD   test_add_sibling_invalid_pos(  s    z+TestAddSibling.test_add_sibling_invalid_posc                 C   sJ   |j jdd}tt |jddd W d    n1 s<0    Y  d S )Nr   rt   sorted-siblingaaa)re   r   r   r   r   r:  )rn   rE   node_wchildrenrC   rC   rD   $test_add_sibling_missing_nodeorderby,  s    z3TestAddSibling.test_add_sibling_missing_nodeorderbyc                 C   sB   |j jdd}|jddd}| dks,J | jdks>J d S )Nr   rt   last-siblingr   r+   re   r   r:  r_   r  r   )rn   rE   r>  rv   rC   rC   rD   test_add_sibling_last_root1  s    z)TestAddSibling.test_add_sibling_last_rootc                 C   sB   |j jdd}|jddd}| dks,J | jdks>J d S )Nr"   rt   r@  Z232r3   rA  )rn   rE   r   rv   rC   rC   rD   test_add_sibling_last7  s    z$TestAddSibling.test_add_sibling_lastc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr   rt   first-siblingnewr+   rE  r+   r   r*   r,   r.   r0   r1   r2   r4   r5   r6   r7   re   r   r:  r_   rp   rn   rE   r>  rv   r}   rC   rC   rD   test_add_sibling_first_root=  s
    z*TestAddSibling.test_add_sibling_first_rootc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr!   rt   rD  rE  r/   )r*   r(  rE  r/   r   r.   r0   r1   r2   r4   r5   r6   r7   rH  rI  rC   rC   rD   test_add_sibling_firstP  s
    z%TestAddSibling.test_add_sibling_firstc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr   rt   leftrE  r+   )r*   rG  r,   r.   r0   r1   r2   r4   r5   r6   r7   rH  rI  rC   rC   rD   test_add_sibling_left_rootc  s
    z)TestAddSibling.test_add_sibling_left_rootc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr!   rt   rM  rE  r/   )r*   r(  r.   r0   rK  r1   r2   r4   r5   r6   r7   rH  rI  rC   rC   rD   test_add_sibling_leftv  s
    z$TestAddSibling.test_add_sibling_leftc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr   rt   rM  rE  r+   rF  rH  rn   rE   r   rv   r}   rC   rC   rD   !test_add_sibling_left_noleft_root  s
    z0TestAddSibling.test_add_sibling_left_noleft_rootc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr"   rt   rM  rE  r3   )r*   r,   r.   r0   r!   r/   r/   rE  r3   r   r2   r4   r5   r6   r7   rH  rP  rC   rC   rD   test_add_sibling_left_noleft  s
    z+TestAddSibling.test_add_sibling_left_noleftc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr   rt   rightrE  r+   )r*   r,   r.   r0   r1   r2   r4   rG  r5   r6   r7   rH  rI  rC   rC   rD   test_add_sibling_right_root  s
    z*TestAddSibling.test_add_sibling_right_rootc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr!   rt   rU  rE  r/   )r*   r(  r.   r0   r1   r2   rK  r4   r5   r6   r7   rH  rI  rC   rC   rD   test_add_sibling_right  s
    z%TestAddSibling.test_add_sibling_rightc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr'   rt   rU  rE  r+   )r*   r,   r.   r0   r1   r2   r4   r5   r6   r7   rG  rH  rP  rC   rC   rD   #test_add_sibling_right_noright_root  s
    z2TestAddSibling.test_add_sibling_right_noright_rootc                 C   sJ   |j jdd}|jddd}| dks,J g d}| ||ksFJ d S )Nr"   rt   rU  rE  r3   )r*   r,   r.   r0   rR  r2   rS  r4   r5   r6   r7   rH  rP  rC   rC   rD   test_add_sibling_right_noright  s
    z-TestAddSibling.test_add_sibling_right_norightc                 C   sX   |j jdd}|dd}|jd|d}||ks2J | dksBJ | jdksTJ d S )Nr   rt   r   r@  r   r+   rA  )rn   rE   r>  rv   r   rC   rC   rD   %test_add_sibling_with_passed_instance  s    
z4TestAddSibling.test_add_sibling_with_passed_instancec                 C   sX   |j jdd}|j jdd}tt |jd|d W d    n1 sJ0    Y  d S )Nr   rt   r'   r@  r   )re   r   r   r   r   r:  )rn   rE   r>  Zexisting_noderC   rC   rD   'test_add_sibling_already_saved_instance  s    z6TestAddSibling.test_add_sibling_already_saved_instancec                 C   s2   |ddd}|j jddj|d}||ks.J dS r-  r0  r1  rC   rC   rD   r2  	  s    z)TestAddSibling.test_add_child_with_pk_setN)r   r   r   r;  r?  rB  rC  rJ  rL  rN  rO  rQ  rT  rV  rW  rX  rY  rZ  r[  r2  rC   rC   rC   rD   r7  &  s"   r7  c                   @   s~   e Zd Zeejdeejej	dd ddd Z
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )
TestDeleter8   c                 C   s   d| d j  d| d j  S )Nbase=r   z dep=r+   r   ZfvrC   rC   rD   <lambda>  r{   zTestDelete.<lambda>r:   r;   r   c                 C   s:   | j \}}|t |j D ]}||d  q||fS )N)r   )r>   r?   r@   re   r|   save)rB   
base_model	dep_modelr   rC   rC   rD   delete_dep_model_pair  s
    

z TestDelete.delete_dep_model_pairc                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )Nr"   rt   )	r*   r,   r.   r0   r!   r/   r   r4   r5   r6   r7   r/   r+   re   r   r   rp   _metalabelrn   re  delete_modelrd  r   r}   rC   rC   rD   test_delete_leaf"  s
    zTestDelete.test_delete_leafc                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )Nr!   rt   )r*   )r   r+   r3   r.   r0   r4   r5   r6   r7   r-   r/   rg  rj  rC   rC   rD   test_delete_node3  s
    
zTestDelete.test_delete_nodec                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )Nr   rt   r*   r5   r6   r7      r   rg  rj  rC   rC   rD   test_delete_rootC  s
    zTestDelete.test_delete_rootc                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )Nr  Zdesc__in)r*   r6   r7         re   r   r   rp   rh  ri  rj  rC   rC   rD   test_delete_filter_root_nodesJ  s
    z(TestDelete.test_delete_filter_root_nodesc                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )N)r   r!   r"   rq  rn  ro  r   rt  rj  rC   rC   rD   test_delete_filter_childrenQ  s
    z&TestDelete.test_delete_filter_childrenc                 C   s@   |\}}|j jdd }| |tks,J |di fks<J d S )N)ZZZZZXXXrq  r   )re   r   r   rp   r   rn   re  rk  rd  r   rC   rC   rD   test_delete_nonexistant_nodesX  s    z(TestDelete.test_delete_nonexistant_nodesc                 C   sX   |\}}|j jdd }g d}| ||ks4J |d|jjd|jjdifksTJ d S )Nr   rq  rn  ro  r   rt  rj  rC   rC   rD   test_delete_same_node_twice^  s
    z&TestDelete.test_delete_same_node_twicec                 C   sJ   |\}}|   }|d|jjd|jjdifks4J |j dksFJ d S N   
   r   )r   r   rh  ri  re   countrw  rC   rC   rD   test_delete_all_root_nodese  s     z%TestDelete.test_delete_all_root_nodesc                 C   sL   |\}}|j   }|d|jjd|jjdifks6J |j  dksHJ d S rz  )re   r|   r   rh  ri  r}  rw  rC   rC   rD   test_delete_all_nodesk  s     z TestDelete.test_delete_all_nodesN)r   r   r   staticmethodr   fixturezipr   BASE_MODELSZ
DEP_MODELSre  rl  rm  rp  ru  rv  rx  ry  r~  r  rC   rC   rC   rD   r\    s    r\  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestMoveErrorsc                 C   sH   |j jdd}tt ||d W d    n1 s:0    Y  d S r8  )re   r   r   r   r   movern   rE   r   rC   rC   rD   test_move_invalid_post  s    z$TestMoveErrors.test_move_invalid_posc                 C   sV   |j jdd}|j jdd}tt ||d W d    n1 sH0    Y  d S )Nr   rt   r"   rD  )re   r   r   r   r   r  )rn   rE   r   targetrC   rC   rD   test_move_to_descendanty  s    z&TestMoveErrors.test_move_to_descendantc                 C   s~   |j jdd}tt ||d W d    n1 s:0    Y  tt ||d W d    n1 sp0    Y  d S )Nr"   rt   sorted-childr<  )re   r   r   r   r   r  r  rC   rC   rD   test_move_missing_nodeorderby  s
    *z,TestMoveErrors.test_move_missing_nodeorderbyN)r   r   r   r  r  r  rC   rC   rC   rD   r  r  s   r  c                   @   s   e Zd Zdd ZdS )TestMoveSortedErrorsc                 C   sJ   |j dddd}tt ||d W d    n1 s<0    Y  d S )Nr3   zxyval1val2r   rM  )r   r   r   r   r  )rn   rJ   r   rC   rC   rD   test_nonsorted_move_in_sorted  s    z2TestMoveSortedErrors.test_nonsorted_move_in_sortedN)r   r   r   r  rC   rC   rC   rD   r    s   r  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestMoveLeafRootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   r@  )
r*   r,   r.   r0   rf  r4   r5   r6   r7   r"   r+   r   re   r   r  rp   rn   rE   r  r}   rC   rC   rD    test_move_leaf_last_sibling_root  s    z1TestMoveLeafRoot.test_move_leaf_last_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   rD  )
r  r*   r,   r.   r0   rf  r4   r5   r6   r7   r  r  rC   rC   rD   !test_move_leaf_first_sibling_root  s    z2TestMoveLeafRoot.test_move_leaf_first_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   rM  
r*   r  r,   r.   r0   rf  r4   r5   r6   r7   r  r  rC   rC   rD    test_move_leaf_left_sibling_root  s    z1TestMoveLeafRoot.test_move_leaf_left_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   rU  )
r*   r,   r.   r0   rf  r4   r  r5   r6   r7   r  r  rC   rC   rD   !test_move_leaf_right_sibling_root  s    z2TestMoveLeafRoot.test_move_leaf_right_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   
last-child
r*   r(  r.   r0   rf  r4   r"   r/   r   r5   r6   r7   r  r  rC   rC   rD   test_move_leaf_last_child_root  s    z/TestMoveLeafRoot.test_move_leaf_last_child_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r"   first-child
r*   r(  r  r.   r0   rf  r4   r5   r6   r7   r  r  rC   rC   rD   test_move_leaf_first_child_root  s    z0TestMoveLeafRoot.test_move_leaf_first_child_rootN)	r   r   r   r  r  r  r  r  r  rC   rC   rC   rD   r    s   r  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestMoveLeafc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   r@  r  r  r  rC   rC   rD   test_move_leaf_last_sibling  s    z(TestMoveLeaf.test_move_leaf_last_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   rD  r  r  r  rC   rC   rD   test_move_leaf_first_sibling  s    z)TestMoveLeaf.test_move_leaf_first_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   rM  )
r*   r(  r.   r  r0   rf  r4   r5   r6   r7   r  r  rC   rC   rD   test_move_leaf_left_sibling  s    z(TestMoveLeaf.test_move_leaf_left_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   rU  )
r*   r(  r.   r0   r  rf  r4   r5   r6   r7   r  r  rC   rC   rD   test_move_leaf_right_sibling-  s    z)TestMoveLeaf.test_move_leaf_right_siblingc                 C   s:   |j jdd}|j jdd|d | |tks6J d S )Nr"   rt   rM  re   r   r  rp   r   rn   rE   r  rC   rC   rD   "test_move_leaf_left_sibling_itself>  s    z/TestMoveLeaf.test_move_leaf_left_sibling_itselfc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   r  
r*   r,   r.   )r    r/   r+   r2   rf  r4   r5   r6   r7   r  r  rC   rC   rD   test_move_leaf_last_childC  s    z&TestMoveLeaf.test_move_leaf_last_childc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr    rt   r"   r  r  r  r  rC   rC   rD   test_move_leaf_first_childT  s    z'TestMoveLeaf.test_move_leaf_first_childN)
r   r   r   r  r  r  r  r  r  r  rC   rC   rC   rD   r    s   r  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestMoveBranchRootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   rD  
r6   r7   r*   r,   r.   r0   r1   r2   r4   r5   r  r  rC   rC   rD   #test_move_branch_first_sibling_rooth  s    z6TestMoveBranchRoot.test_move_branch_first_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   r@  r)   r  r  rC   rC   rD   "test_move_branch_last_sibling_rooty  s    z5TestMoveBranchRoot.test_move_branch_last_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   rM  )
r*   r6   r7   r,   r.   r0   r1   r2   r4   r5   r  r  rC   rC   rD   "test_move_branch_left_sibling_root  s    z5TestMoveBranchRoot.test_move_branch_left_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   rU  )
r*   r,   r.   r0   r1   r2   r4   r6   r7   r5   r  r  rC   rC   rD   #test_move_branch_right_sibling_root  s    z6TestMoveBranchRoot.test_move_branch_right_sibling_rootc                 C   sF   |j jdd }|j jdd|d g d}| ||ksBJ d S )Nr   rt   r'   rM  r  re   r   r   r  rp   r  rC   rC   rD   )test_move_branch_left_noleft_sibling_root  s    z<TestMoveBranchRoot.test_move_branch_left_noleft_sibling_rootc                 C   sF   |j jdd }|j jdd|d g d}| ||ksBJ d S )Nr   rt   r'   rU  r)   re   r   r  r  rp   r  rC   rC   rD   +test_move_branch_right_noright_sibling_root  s    z>TestMoveBranchRoot.test_move_branch_right_noright_sibling_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   r  
r*   r(  r'   r/   r+   r(   r3   r   r.   r0   r1   r2   r4   r5   r  r  rC   rC   rD   !test_move_branch_first_child_root  s    z4TestMoveBranchRoot.test_move_branch_first_child_rootc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr   rt   r'   r  
r*   r(  r.   r0   r1   r2   r4   r  r  r5   r  r  rC   rC   rD    test_move_branch_last_child_root  s    z3TestMoveBranchRoot.test_move_branch_last_child_rootN)r   r   r   r  r  r  r  r  r  r  r  rC   rC   rC   rD   r  f  s   r  c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestMoveBranchc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   rD  r  r  r  rC   rC   rD   test_move_branch_first_sibling  s    z-TestMoveBranch.test_move_branch_first_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   r@  r  r  r  rC   rC   rD   test_move_branch_last_sibling  s    z,TestMoveBranch.test_move_branch_last_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   rM  )
r*   r(  r.   r0   r  r  r1   r2   r4   r5   r  r  rC   rC   rD   test_move_branch_left_sibling  s    z,TestMoveBranch.test_move_branch_left_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   rU  )
r*   r(  r.   r0   r1   r2   r  r  r4   r5   r  r  rC   rC   rD   test_move_branch_right_sibling&  s    z-TestMoveBranch.test_move_branch_right_siblingc                 C   sF   |j jdd }|j jdd|d g d}| ||ksBJ d S )Nr!   rt   r'   rM  r  r  r  rC   rC   rD   $test_move_branch_left_noleft_sibling7  s    z3TestMoveBranch.test_move_branch_left_noleft_siblingc                 C   sF   |j jdd }|j jdd|d g d}| ||ksBJ d S )Nr!   rt   r'   rU  r  r  r  rC   rC   rD   &test_move_branch_right_noright_siblingH  s    z5TestMoveBranch.test_move_branch_right_noright_siblingc                 C   s:   |j jdd}|j jdd|d | |tks6J d S )Nr'   rt   rM  r  r  rC   rC   rD   $test_move_branch_left_itself_siblingY  s    z3TestMoveBranch.test_move_branch_left_itself_siblingc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   r  )
r*   r,   r.   r0   rR  r'   r3   r+   r(   r-   r   r2   r4   r5   r  r  rC   rC   rD   test_move_branch_first_child^  s    z+TestMoveBranch.test_move_branch_first_childc                 C   sB   |j jdd}|j jdd|d g d}| ||ks>J d S )Nr!   rt   r'   r  )
r*   r,   r.   r0   rR  r2   r  r  r4   r5   r  r  rC   rC   rD   test_move_branch_last_childo  s    z*TestMoveBranch.test_move_branch_last_childN)r   r   r   r  r  r  r  r  r  r  r  r  rC   rC   rC   rD   r    s   r  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestTreeSortedc                 C   s   dd |  D S )Nc                 S   s(   g | ] }|j |j|j| | fqS rC   )r  r  r   r_   r`   ra   rC   rC   rD   rd     s   z&TestTreeSorted.got.<locals>.<listcomp>rm   )rn   rJ   rC   rC   rD   rp     s    zTestTreeSorted.gotc                 C   s   |j dddd |j dddd |j dddd |j ddd	d |j ddd
d |j ddd	d |j dddd |j dddd g d}| ||ksJ d S )Nr3   r  r  r+   r-   bcdr/   r   abcfghqwevcx)r+   r-   r  r+   r   )r/   r/   r  r+   r   )r/   r   r  r+   r   )r3   r/   r  r+   r   r3   r3   r  r+   r   r  )r3   r3   r  r+   r   )r-   r+   r  r+   r   r   )rn   rJ   r}   rC   rC   rD   test_add_root_sorted  s    
z#TestTreeSorted.test_add_root_sortedc                 C   s   |j dddd}|jdddd |jdddd |jd	d
dd |jdddd |jdddd |jdddd |jd	d	dd |jdd	dd g d}| ||ksJ d S )Nr   r=  r  r3   r  r+   r-   r  r/   r   r  r  r  r  )	)r   r   r=  r+      )r+   r-   r  r/   r   r/   r/   r  r/   r   r/   r   r  r/   r   r3   r/   r  r/   r   r3   r3   r  r/   r   r  r3   r3   r  r/   r   r-   r+   r  r/   r   )r   r%  rp   )rn   rJ   rootr}   rC   rC   rD   test_add_child_root_sorted  s    z)TestTreeSorted.test_add_child_root_sortedc                    s    fdd} j ddddj}||jddddj}||jdddd ||jdddd ||jddd	d ||jddd
d ||jdddd g d}|  |ksJ d S )Nc                    s    j j| dS )Nr   )re   r   )node_idrJ   rC   rD   r`    r{   z>TestTreeSorted.test_add_child_nonroot_sorted.<locals>.<lambda>r   ar  acaaavacaaccacb))r   r   r  r+   r3   )r   r   r  r/   r   )r   r   r  r/   r3   )r   r   r  r3   r   )r   r   r  r3   r   )r   r   r  r3   r   )r   r   r  r/   r   )r   r   r%  rp   )rn   rJ   get_nodeZroot_idr  r}   rC   r  rD   test_add_child_nonroot_sorted  s    	z,TestTreeSorted.test_add_child_nonroot_sortedc                 C   s   |j dddd |j dddd |j dddd |j ddd	d |j ddd
d |j ddd	d |j dddd |j dddd | }|d }|dd  D ]0}|jj|jd}|jj|jd}||d qg d}| ||ksJ d S )Nr3   r  r  r+   r-   r  r/   r   r  r  r  r  r   r   r  ))r+   r-   r  r+   rs  r  r  r  r  r  r  r  )r   r   re   r   r   r  rp   rn   rJ   Z
root_nodesr  r   r}   rC   rC   rD   test_move_sorted  s     
zTestTreeSorted.test_move_sortedc                 C   s  |j dddd |j dddd |j dddd |j ddd	d |j ddd
d |j ddd	d |j dddd |j dddd | }|d }|dd  D ]F}|jj|jd}|jj|jd}| jd8  _|  ||d qg d}| ||ksJ d S )Nr3   r  r  r+   r-   r  r/   r   r  r  r  r  r   r   r<  ))r   r/   r  r+   r   )r   r   r  r+   r   )r+   r/   r  r+   r   r+   r3   r  r+   r   r  )r+   r3   r  r+   r   r  )r/   r+   r  r+   r   )	r   r   re   r   r   r  rb  r  rp   r  rC   rC   rD   test_move_sortedsibling  s$    
z&TestTreeSorted.test_move_sortedsiblingN)	r   r   r   rp   r  r  r  r  r  rC   rC   rC   rD   r    s   r  c                   @   s   e Zd Zeejdeejej	dd ddd Z
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3S )4TestInheritedModelsr8   c                 C   s   d| d j  d| d j  S )Nr]  r   z inherited=r+   r^  r_  rC   rC   rD   r`    r{   zTestInheritedModels.<lambda>ra  c                 C   s   | j \}}|jdd |jdd |dd}|jjddj|d |jjddjdd |jjddjdd |jjddjdd |d	d}|j|d |S )
Nr   rt   r   r   r   211212r    r&   )r>   r   re   r   r%  )rB   rc  rL   node21node3rC   rC   rD   rL   	  s    


z#TestInheritedModels.inherited_modelc                 C   s*   dd |  D }g d}||ks&J d S )Nc                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd      s   z9TestInheritedModels.test_get_tree_all.<locals>.<listcomp>)r*   )r   r+   r/   r   r/   r/   r  r3   r   r  r3   r   r0   r5   r  rn   rL   rp   r}   rC   rC   rD   r     s
    	z%TestInheritedModels.test_get_tree_allc                 C   s:   |j jdd}dd ||D }g d}||ks6J d S )Nr   rt   c                 S   s    g | ]}|j | | fqS rC   r^   ra   rC   rC   rD   rd   2  s   z:TestInheritedModels.test_get_tree_node.<locals>.<listcomp>)r  r  r  )re   r   rm   )rn   rL   r   rp   r}   rC   rC   rD   r   /  s    z&TestInheritedModels.test_get_tree_nodec                 C   s*   |  }g d}dd |D |ks&J d S )Nr   r   r&   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd   @  r{   z;TestInheritedModels.test_get_root_nodes.<locals>.<listcomp>r   r  rC   rC   rD   r   =  s    z'TestInheritedModels.test_get_root_nodesc                 C   s   |  }|jdksJ d S r   )r   r   rn   rL   rp   rC   rC   rD   r   B  s    z,TestInheritedModels.test_get_first_root_nodec                 C   s   |  }|jdksJ d S )Nr&   )r   r   r  rC   rC   rD   r   F  s    z+TestInheritedModels.test_get_last_root_nodec                 C   s@   |j jdd}|j jdd}| du s,J | du s<J d S Nr   rt   r&   FTr   rn   rL   r  r  rC   rC   rD   r   J  s    z TestInheritedModels.test_is_rootc                 C   s@   |j jdd}|j jdd}| du s,J | du s<J d S r  r   r  rC   rC   rD   r   P  s    z TestInheritedModels.test_is_leafc                 C   sD   |j jdd}|j jdd}| jdks.J | jdks@J d S Nr   rt   r&   r   )re   r   r   r   r  rC   rC   rD   r   V  s    z!TestInheritedModels.test_get_rootc                 C   sB   |j jdd}|j jdd}| jdks.J | d u s>J d S r  )re   r   r   r   r  rC   rC   rD   r   \  s    z#TestInheritedModels.test_get_parentc                 C   sX   |j jdd}|j jdd}dd | D ddgks:J dd | D g ksTJ d S )	Nr   rt   r&   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd   e  r{   z9TestInheritedModels.test_get_children.<locals>.<listcomp>r  r  c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd   f  r{   )re   r   r   r  rC   rC   rD   r   b  s    z%TestInheritedModels.test_get_childrenc                 C   s@   |j jdd}|j jdd}| dks,J | dks<J d S Nr   rt   r&   r/   r   r   r  rC   rC   rD   r   h  s    z+TestInheritedModels.test_get_children_countc                 C   s\   |j jdd}|j jdd}dd | D ddgks:J dd | D g dksXJ d S )	Nr   rt   r&   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd   q  r{   z9TestInheritedModels.test_get_siblings.<locals>.<listcomp>r    c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd   r  r{   r  )re   r   r   r  rC   rC   rD   r   n  s    z%TestInheritedModels.test_get_siblingsc                 C   sD   |j jdd}|j jdd}| jdks.J | jdks@J d S )Nr   rt   r&   r   )re   r   r   r   r  rC   rC   rD   r   t  s    z*TestInheritedModels.test_get_first_siblingc                 C   sB   |j jdd}|j jdd}| d u s,J | jdks>J d S r  )re   r   r   r   r  rC   rC   rD   r   z  s    z)TestInheritedModels.test_get_prev_siblingc                 C   sB   |j jdd}|j jdd}| jdks.J | d u s>J d S Nr   rt   r&   r    )re   r   r  r   r  rC   rC   rD   r    s    z)TestInheritedModels.test_get_next_siblingc                 C   sD   |j jdd}|j jdd}| jdks.J | jdks@J d S r  )re   r   r  r   r  rC   rC   rD   r    s    z)TestInheritedModels.test_get_last_siblingc                 C   sB   |j jdd}|j jdd}| jdks.J | d u s>J d S )Nr   rt   r&   r  )re   r   r  r   r  rC   rC   rD   r    s    z(TestInheritedModels.test_get_first_childc                 C   sB   |j jdd}|j jdd}| jdks.J | d u s>J d S )Nr   rt   r&   r  )re   r   r	  r   r  rC   rC   rD   r
    s    z'TestInheritedModels.test_get_last_childc                 C   sV   |j jdd}|j jdd}dd | D dgks8J dd | D g ksRJ d S )Nr   rt   r&   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z:TestInheritedModels.test_get_ancestors.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   )re   r   r  r  rC   rC   rD   r    s    z&TestInheritedModels.test_get_ancestorsc                 C   sX   |j jdd}|j jdd}dd | D ddgks:J dd | D g ksTJ d S )	Nr   rt   r&   c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z<TestInheritedModels.test_get_descendants.<locals>.<listcomp>r  r  c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   )re   r   r  r  rC   rC   rD   r    s    z(TestInheritedModels.test_get_descendantsc                 C   s@   |j jdd}|j jdd}| dks,J | dks<J d S r  r  r  rC   rC   rD   r    s    z-TestInheritedModels.test_get_descendant_countc                 C   sn   |j d }|jjdd}|  |jjdd}dD ]}|jj|d r2J q2dd | D dgksjJ d S )	Nr   r   rt   r   )r   r  r  c                 S   s   g | ]
}|j qS rC   rt   r   rC   rC   rD   rd     r{   z?TestInheritedModels.test_cascading_deletion.<locals>.<listcomp>r    )	__bases__re   r   r   r   existsr  )rn   rL   rc  r  r  r   rC   rC   rD   test_cascading_deletion  s    
z+TestInheritedModels.test_cascading_deletionN)!r   r   r   r  r   r  r  r   r  INHERITED_MODELSrL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  rC   rC   rC   rD   r    s:   r  c                   @   s.   e Zd Zejjedd dddd ZdS )TestMP_TreeAlphabetZTREEBEARD_TEST_ALPHABETFz-TREEBEARD_TEST_ALPHABET env variable not set.)reasonc           	         s2  t j}d}d}tdt|d D ]}|d|  t dks@J  fdd dd D }| fdd D  | d	  d   |j    |_	d|_
tt d	 D ],}z|j|d
 W q   d}Y  qY q0 q|r qdd |j D }||kr q }q ds.J d|t|dS )z:This isn't actually a test, it's an informational routine.FNr3   r+   r   c                    s   g | ]} d  | qS rw   rC   rb   charalphabetrC   rD   rd     r{   z5TestMP_TreeAlphabet.test_alphabet.<locals>.<listcomp>c                    s   g | ]} d  | qS )r+   rC   r  r  rC   rD   rd     r{   r/   )numvalTc                 S   s   g | ]
}|j qS rC   pathru   rC   rC   rD   rd     r{   z7Best BASE85 based alphabet for your setup: {} (base {}))r   ZBASE85rk   ri   rg   rV   re   r|   r   r  Znumconv_obj_r   format)	rn   rO   Z	basealphaZgot_errZ	last_goodZalphabetlenr}   posrp   rC   r  rD   test_alphabet  s6    
z!TestMP_TreeAlphabet.test_alphabetN)	r   r   r   r   markZskipifosgetenvr
  rC   rC   rC   rD   r    s
   r  c                   @   s>   e Zd Zeejdejej ddd Z	dd Z
dd Zd	S )
TestHelpersr8   r9   c                 C   s:   | j }|t | D ]}|t| q|jdd |S )Nr   rt   )r>   r?   r@   r   r   )rB   rE   r   rC   rC   rD   helpers_model  s    
zTestHelpers.helpers_modelc                 C   s4   dd |  D }dd | D }||ks0J d S )Nc                 S   s   g | ]}|j | fqS rC   r   r  ra   rC   rC   rD   rd     s   zATestHelpers.test_descendants_group_count_root.<locals>.<listcomp>c                 S   s   g | ]}|j |jfqS rC   r   Zdescendants_countra   rC   rC   rD   rd     s   )r   get_descendants_group_count)rn   r  r}   rp   rC   rC   rD   !test_descendants_group_count_root  s    z-TestHelpers.test_descendants_group_count_rootc                 C   sF   |  jdd}dd | D }dd ||D }||ksBJ d S )Nr   rt   c                 S   s   g | ]}|j | fqS rC   r  ra   rC   rC   rD   rd     r{   zATestHelpers.test_descendants_group_count_node.<locals>.<listcomp>c                 S   s   g | ]}|j |jfqS rC   r  ra   rC   rC   rD   rd     s   )r   r   r   r  )rn   r  r~   r}   rp   rC   rC   rD   !test_descendants_group_count_node  s    z-TestHelpers.test_descendants_group_count_nodeN)r   r   r   r  r   r  r   r  PROXY_MODELSr  r  r  rC   rC   rC   rD   r    s
   
r  c                   @   s    e Zd ZdZdd Zdd ZdS )TestMP_TreeSortedAutoNowz~
    The sorting mechanism used by treebeard when adding a node can fail if the
    ordering is using an "auto_now" field
    c                 C   s.   t ddD ]}|jd|f tj d q
d S )Nr+   r   znode%d)r   r   )rk   r   datetimenow)rn   rP   irC   rC   rD   !test_sorted_by_autonow_workaround
  s    z:TestMP_TreeSortedAutoNow.test_sorted_by_autonow_workaroundc                 C   sF   |j dd tt |j dd W d   n1 s80    Y  dS )zU
        This test asserts that we have a problem.
        fix this, somehow
        r  rt   r  N)r   r   r   
ValueError)rn   rP   rC   rC   rD   test_sorted_by_autonow_FAIL  s    z4TestMP_TreeSortedAutoNow.test_sorted_by_autonow_FAILN)r   r   r   __doc__r  r  rC   rC   rC   rD   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestMP_TreeStepOverflowc                 C   sP   |j }tddD ]
}|  qtt |  W d    n1 sB0    Y  d S Nr+   r|  )r   rk   r   r   r   )rn   rQ   methodr  rC   rC   rD   r     s
    z%TestMP_TreeStepOverflow.test_add_rootc                 C   sX   |  }|j}tddD ]
}|  qtt |  W d    n1 sJ0    Y  d S r  )r   r%  rk   r   r   r   )rn   rQ   r  r   r  rC   rC   rD   test_add_child$  s    z&TestMP_TreeStepOverflow.test_add_childc              	   C   sj   |  }tddD ]}|  qd}|D ]<}tt | | W d    q(1 sZ0    Y  q(d S )Nr+   r|  rD  rM  rU  r@  )r   rk   r%  r   r   r   r	  r:  )rn   rQ   r  r  	positionsr	  rC   rC   rD   test_add_sibling,  s    
z(TestMP_TreeStepOverflow.test_add_siblingc           	   
   C   s   |  }tddD ]}|  q|  }|ddgf| g dfg}|D ]H\}}|D ]:}tt ||| W d    qT1 s0    Y  qTqHd S )Nr+   r|  r  r  r"  )r   rk   r%  r  r   r   r   r  )	rn   rQ   r  r  Znewroottargetsr  r#  r	  rC   rC   rD   	test_move5  s    

z!TestMP_TreeStepOverflow.test_moveN)r   r   r   r   r!  r$  r&  rC   rC   rC   rD   r    s   	r  c                   @   s   e Zd ZdZdd ZdS )TestMP_TreeShortPathzSTest a tree with a very small path field (max_length=4) and a
    steplen of 1
    c                 C   sN   |  }|   }tt |  W d    n1 s@0    Y  d S r<   )r   r%  r   r   r   )rn   rN   rv   rC   rC   rD   test_short_pathM  s    z$TestMP_TreeShortPath.test_short_pathN)r   r   r   r  r(  rC   rC   rC   rD   r'  G  s   r'  c                   @   s   e Zd Zdd ZdS )TestMP_TreeFindProblemsc                    s  d _  ddddd   ddddd   ddddd   ddddd   d	dddd   d
dddd   ddddd   ddddd   ddddd   ddddd   ddddd   ddddd   fdd}  \}}}}}dd	g||ks*J ddg||ks@J d
dg||ksVJ g d||kslJ ddg||ksJ d S )NZ01234Z01r+   r   )r  depthnumchildr  r   111Zabcdzqa#$%!Z0201r/   Z020201r3   030301030102r|  Z04Z0401r{  c                    s   dd  j j| dD S )Nc                 S   s   g | ]
}|j qS rC   r  ra   rC   rC   rD   rd   f  r{   zKTestMP_TreeFindProblems.test_find_problems.<locals>.got.<locals>.<listcomp>r   )re   r   )r   rO   rC   rD   rp   e  s    z7TestMP_TreeFindProblems.test_find_problems.<locals>.got)r-  r.  r/  )r  rb  find_problems)rn   rO   rp   Z
evil_charsZbad_steplenZorphansZwrong_depthZwrong_numchildrC   r0  rD   test_find_problemsV  s4    	z*TestMP_TreeFindProblems.test_find_problemsN)r   r   r   r2  rC   rC   rC   rD   r)  T  s   r)  c                   @   sd   e Zd Zejg dejg diZejg dejg diZdd Zdd Z	dd	 Z
d
d Zdd ZdS )TestMP_TreeFix)r   br+   r/   )11ur/   r+   )r,  r  r3   r+   )Z1111er-   r   )12rc   r/   r   r   ro   r+   r   r&   gr+   r   r'   r  r+   r-   r(   r  r/   r   42r  r/   r   43r7  r/   r+   )Z431r  r3   r+   )Z4311r8  r-   r   44rc   r/   r   ))r   r  r+   r-   )r6  r  r/   r   )r9  r  r/   r   )13rc   r/   r   )14r7  r/   r+   )Z141r  r3   r+   )Z1411r8  r-   r   )r   r5  r+   r/   )r   rc   r/   r   )r    r7  r/   r+   )Z221r  r3   r+   )Z2211r8  r-   r   )r&   ro   r+   r   )r'   r<  r+   r   )r4  )rE  r7  r/   r+   )134r  r3   r+   )1343r8  r-   r   )rF  rc   r/   r   r:  r;  r=  r>  r?  rA  )434r  r3   r+   )4343r8  r-   r   rC  c                 C   s   dd |  D S )Nc                 S   s$   g | ]}|j |j| | fqS rC   )r  r   r_   r`   ra   rC   rC   rD   rd     s   z&TestMP_TreeFix.got.<locals>.<listcomp>r  r   rC   rC   rD   rp     s    zTestMP_TreeFix.gotc                 C   s  |ddddd   |ddddd   |d	d
ddd   |ddddd   |ddddd   |ddddd   |ddddd   |dd
ddd   |ddddd   |ddddd   |ddddd   |ddddd   |ddd d!d   |d"dd d#d   d S )$Nr'   r/   r  )r  r*  r+  r   rE  i  r   r7  rF  r-   i  rc   rG  iA  i  r  rH  r8  r@  r+   rB  rD  rI  rJ  r(   r&      iB  r<  r   r|  r3   r5  r   ro   )rb  r   rC   rC   rD   add_broken_test_data  s    z#TestMP_TreeFix.add_broken_test_datac                 C   sB   |  | |jdd | |}| j| }||ks6J |  d S )NFZdestructive)rL  fix_treerp   expected_with_holesr1  rn   rM   rp   r}   rC   rC   rD   test_fix_tree_non_destructive  s    


z,TestMP_TreeFix.test_fix_tree_non_destructivec                 C   sB   |  | |jdd | |}| j| }||ks6J |  d S )NTrM  rL  rN  rp   expected_no_holesr1  rP  rC   rC   rD   test_fix_tree_destructive  s    


z(TestMP_TreeFix.test_fix_tree_destructivec                 C   sB   |  | |jdd | |}| j| }||ks6J |  d S )NT)Z	fix_pathsrR  rP  rC   rC   rD   test_fix_tree_with_fix_paths  s    


z+TestMP_TreeFix.test_fix_tree_with_fix_pathsN)r   r   r   r   MP_TestNodeShortPathZMP_TestSortedNodeShortPathrS  rO  rp   rL  rQ  rT  rU  rC   rC   rC   rD   r3  v  s   

#

#r3  c                   @   s   e Zd Zdd ZdS )
TestIssuesc                    s   d }dd   fdd}t jddd}|  |jdd	}|jd
d	 |jdd	} | d
dg  | td
d	d
g  | t|dg  |d
g|| |d
dg|| t jj	dd}|j
| |d
dg|| |d
g|| d S )Nc                 S   s   dd | D |ksJ d S )Nc                 S   s   g | ]
}|j qS rC   namera   rC   rC   rD   rd   	  r{   zXTestIssues.test_many_to_many_django_user_anonymous.<locals>.qs_check.<locals>.<listcomp>rC   )qsr}   rC   rC   rD   qs_check	  s    zDTestIssues.test_many_to_many_django_user_anonymous.<locals>.qs_checkc                    s(    |  tddt|dB |  d S )NfirstrX  users)r   r   r   )r}   r  userr[  rC   rD   qs_check_first_or_user	  s    zRTestIssues.test_many_to_many_django_user_anonymous.<locals>.qs_check_first_or_userZ	test_userztest@example.comZ
testpasswdzthe root noderX  r\  secondr]  )username)r   re   Zcreate_userrb  r   r%  r   r   r   r   r^  add)rn   rR   Zanonuserobjra  r_  r  rb  rC   r`  rD   'test_many_to_many_django_user_anonymous  s"    z2TestIssues.test_many_to_many_django_user_anonymousN)r   r   r   re  rC   rC   rC   rD   rW    s   rW  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestMoveNodeFormc                 C   s   dd |D S )Nc                 S   s*   g | ]"\}}}|d d|d  |f fqS )z%s%sz&nbsp;&nbsp;&nbsp;&nbsp;r+   rC   )rb   r   strr*  rC   rC   rD   rd   #	  s   z4TestMoveNodeForm._get_nodes_list.<locals>.<listcomp>rC   rn   r   rC   rC   rD   _get_nodes_list"	  s    z TestMoveNodeForm._get_nodes_listc                 C   s<   |j d j}|dd d u s"J |dd |D ks8J d S )N_ref_node_idr   c                 S   s   g | ]}|d  |d fqS )r   r+   rC   rb   choicerC   rC   rD   rd   *	  r{   z=TestMoveNodeForm._assert_nodes_in_choices.<locals>.<listcomp>)fieldschoicespop)rn   formr   rn  rC   rC   rD   _assert_nodes_in_choices'	  s    z)TestMoveNodeForm._assert_nodes_in_choicesc                 C   sp   t t|}||d}g dt|j ks0J dd |jd jD }g d|ksVJ | |}| || d S )Nr   r   	_positionrj  c                 S   s   g | ]}|d  qS rw   rC   rk  rC   rC   rD   rd   0	  r{   z6TestMoveNodeForm._move_node_helper.<locals>.<listcomp>rs  )r  rM  rU  )	r   ry   rT   base_fieldskeysrm  rn  ri  rq  )rn   r   safe_parent_nodes
form_classrp  rp   r   rC   rC   rD   _move_node_helper,	  s    

z"TestMoveNodeForm._move_node_helperc                 C   s   dd |D S )Nc                 S   s    g | ]}|j t|| fqS rC   )r   rg  r_   r   rC   rC   rD   rd   6	  r{   zBTestMoveNodeForm._get_node_ids_strs_and_depths.<locals>.<listcomp>rC   rh  rC   rC   rD   _get_node_ids_strs_and_depths5	  s    z.TestMoveNodeForm._get_node_ids_strs_and_depthsc                 C   s0   t | }|d}| |}| || d S )Nr   )rT   rm   ro  ry  rx  )rn   rE   r   r   rv  rC   rC   rD   test_form_root_node8	  s    

z$TestMoveNodeForm.test_form_root_nodec                 C   s.   t | }| |}| }| || d S r<   )rT   rm   ry  ro  rx  )rn   rE   r   rv  r   rC   rC   rD   test_form_leaf_node>	  s    
z$TestMoveNodeForm.test_form_leaf_nodec                 C   s   d }t | }| |}|j D ]}t }t|}t|}|||}	t |	|j	
 }
g d}||
kspJ |	|}
d d|ifg}|
|ksJ |	||}
|
|ksJ |	| }| |}| || q$d S )Nrr  rm  )rT   rm   ry  re   r|   r   r   r   get_formrt  ru  Zget_fieldsetsri  rq  )rn   rE   rB   r   rv  r   siterw  admin_classmarp   Zdesc_pos_refnodeidr}   rp  rC   rC   rD   test_form_adminD	  s&    



z TestMoveNodeForm.test_form_adminN)
r   r   r   ri  rq  rx  ry  rz  r{  r  rC   rC   rC   rD   rf   	  s   	rf  c                   @   s   e Zd Zdd ZdS )TestModelAdminc                 C   sD   t  }t|}t|}|||}t|d j g dks@J d S )Nrr  )r   r   r   rT   r|  rt  ru  )rn   rE   r}  rw  r~  r  rC   rC   rD   test_default_fields\	  s
    
z"TestModelAdmin.test_default_fieldsN)r   r   r   r  rC   rC   rC   rD   r  Z	  s   r  c                   @   s   e Zd Zdd ZdS )TestSortedFormc                 C   s   |j dddd |j dddd |j dddd |j ddd	d |j ddd
d |j ddd	d |j dddd |j dddd t|}| }t|j g dksJ ||jjddd}t|j g dksJ dt|v sJ dt|v sJ d S )Nr3   r  r  r+   r-   r  r/   r   r  r  r  r  )r  r  r   rs  rj  rt   r   id__positionid__ref_node_id)r   r   rT   rm  ru  re   r   rg  )rn   rJ   rw  rp  rC   rC   rD   test_sorted_formj	  s    zTestSortedForm.test_sorted_formN)r   r   r   r  rC   rC   rC   rD   r  h	  s   r  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestFormc                 C   sz   t |}| }t|j g dks(J ||jjddd}t|j g dksVJ dt|v sfJ dt|v svJ d S )Nrr  r   rt   r   r  r  )r   rT   rm  ru  re   r   rg  )rn   rE   rw  rp  rC   rC   rD   	test_form	  s    zTestForm.test_formc                 C   sX   t |}|jjddjdd}||d}| }d|v s<J d|vsHJ d|v sTJ d S )Nr   rt   z,Benign<script>alert("Compromised");</script>r   ZBenignz<script>z&lt;script&gt;)r   re   r   r%  Zas_p)rn   rE   rw  Zbad_noderp  Zrendered_htmlrC   rC   rD   test_move_node_form	  s    
zTestForm.test_move_node_formc                 C   s   t |}|jjdd}||d}||dddks8J |jjdd}||d}||d|jjddjdkstJ |jjd	d}||d}||d
|jjddjdksJ |jjdd}||d}||d|jjddjdksJ d S )Nr   rt   r   r  rS   )rs  rj  r   r   r    rU  r"   r!   )r   re   r   Z_get_position_ref_noder   )rn   rE   rw  instance_parentrp  Zinstance_childZinstance_grandchildrC   rC   rD   test_get_position_ref_node	  s2    



z#TestForm.test_get_position_ref_nodec                 C   sX   |j jdd}d}d}t|}|||||jdd}| s@J | ||fksTJ d S )Nr   rt   r  rS   rs  rj  r   r   r   )re   r   r   r   is_validZ_clean_cleaned_data)rn   rE   r  rs  rj  rw  rp  rC   rC   rD   test_clean_cleaned_data	  s    z TestForm.test_clean_cleaned_datac                 C   s4  |j jdd}t|j  }t|}||d|j jddj|jdd}| sRJ | }||j  	 kspJ |
 dksJ | dksJ | rJ | sJ t|}||dd	|jdd}| sJ | }||j  	 ksJ |
 dksJ | d
ksJ | s"J | s0J d S )Nr   rt   r  r   r  r  r   r/   rS   r+   )re   r   ri   r|   r   r   r   r  rb  r}  r`   r_   r   r   )rn   rE   r  original_countrw  rp  Zsaved_instanceZrestored_instancerC   rC   rD   test_save_edit	  s@    zTestForm.test_save_editc                 C   sl   |j   }|dksJ d}t|}||ddd}| sBJ | d usRJ ||j   k shJ d S )Nr|  r  New Form Testrs  r   r   )re   r|   r}  r   r  rb  rn   rE   r  rs  rw  rp  rC   rC   rD   test_save_new	  s    zTestForm.test_save_newc                 C   sv   |j   }|dksJ d}t|}||dddd}| sDJ d|j_| dus\J ||j   k srJ dS )r.  r|  r  r/  r  )rs  idr   r  N)re   r|   r}  r   r  r   r  rb  r  rC   rC   rD   test_save_new_with_pk_set
  s    
z"TestForm.test_save_new_with_pk_setc                 C   sF   t |}|dddd}| s$J d|j_| }|jdksBJ d S )Nr  zTest Instancer  r  zModified Instance)r   r  r   r   rb  )rn   rE   rw  rp  r   rC   rC   rD   test_save_instance
  s    zTestForm.test_save_instanceN)r   r   r   r  r  r  r  r  r  r  r  rC   rC   rC   rD   r  	  s   
&
r  c                   @   s,   e Zd ZedZdd Zdd Zdd ZdS )	TestAdminTreezR{% load admin_tree %}{% spaceless %}{% result_tree cl request %}{% endspaceless %}c                 C   s  |}t  d}t |_t }t|}t|}|||}||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d}|||j ksJ |j D ]*}|
|}d|t|f }||v sJ qd|v sJ dS )z
        Verifies that inclusion tag result_list generates a table when with
        default ModelAdmin settings.
        /admin/tree/NclrB   1<td class="drag-handler"><span>&nbsp;</span></td><a href="%s">%s</a>1<input type="hidden" id="has-filters" value="0"/>)r   r   r   r_  r   r   r   get_list_displayget_list_display_linksr   rY   list_filterdate_hierarchysearch_fieldslist_select_relatedlist_per_pagelist_max_show_alllist_editableformsetr   templaterenderr}  re   r|   url_for_resultrg  )rn   rH   rE   rB   r}  rw  r~  mlist_displaylist_display_linksr  contexttable_outputdrag_handlerobjecturlr   rC   rC   rD   test_result_tree&
  sD    


zTestAdminTree.test_result_treec                 C   s  |}|j dd t d}t |_t }t|}t|}G dd d|}|||}||}	|	||	}
t
t|||	|
|j|j|j|j|j|j|j|g  }d|_t||d}| j|}d}|||j ksJ |j D ](}||}d	||jf }||v sJ qd
|v sJ dS )r  u
   áéîøürt   r  c                   @   s   e Zd ZdZdS )zATestAdminTree.test_unicode_result_tree.<locals>.UnicodeModelAdmin)__str__r   N)r   r   r   r  rC   rC   rC   rD   UnicodeModelAdmin_
  s   r  Nr  r  r  r  )r   r   r   r   r_  r   r   r   r  r  r   rY   r  r  r  r  r  r  r  r  r   r  r  r}  re   r|   r  r   )rn   rI   rE   rB   r}  rw  Z
ModelAdminr  r  r  r  r  r  r  r  r  r  r   rC   rC   rD   test_unicode_result_treeQ
  sH    


z&TestAdminTree.test_unicode_result_treec                 C   s  |}t  d}t |_t }t|}t|}|||}||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|v sJ t  d}t |_||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|v s6J t  d}t |_||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|v sJ dS )z1Test template changes with filters or pagination.z/admin/tree/?desc=1Nr  z1<input type="hidden" id="has-filters" value="1"/>z/admin/tree/?p=1r  z/admin/tree/?all=1)r   r   r   r_  r   r   r   r  r  r   rY   r  r  r  r  r  r  r  r  r   r  r  )rn   rH   rE   rB   r}  rw  r~  r  r  r  r  r  r  rC   rC   rD   test_result_filtered
  s    



z"TestAdminTree.test_result_filteredN)r   r   r   r
   r  r  r  r  rC   rC   rC   rD   r  
  s   +1r  c                   @   s4   e Zd ZedZdd Zdd Zdd Zdd	 Zd
S )TestAdminTreeListzW{% load admin_tree_list %}{% spaceless %}{% result_tree cl request %}{% endspaceless %}c                 C   s   |}t  d}t |_t }t|}t|}|||}||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d}|j D ]"}||jt|f }||v sJ qdS )r  r  Nr  z<li><a href="%s/" >%s</a>r   r   r   r_  r   r   r   r  r  r   rY   r  r  r  r  r  r  r  r  r   r  r  re   r|   r   rg  rn   rH   rE   rB   r}  rw  r~  r  r  r  r  r  r  output_templater  expected_outputrC   rC   rD   test_result_tree_list
  s>    

z'TestAdminTreeList.test_result_tree_listc                 C   s   |}t  d}t |_t }t|}t|}|||}||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d |
_t|
|dd}| j|}d}|j D ]&}||j|jt|f }||v sJ qd S )Nr  T)r  rB   Zaction_formzg<input type="checkbox" class="action-select" value="%s" name="_selected_action" /><a href="%s/" >%s</a>r  r  rC   rC   rD   !test_result_tree_list_with_action  s@    

z3TestAdminTreeList.test_result_tree_list_with_actionc                 C   s   |}|j jj}t dt|}t |_t	 }t
| t|}t|}|||}||}	|||	}
tt|||	|
|j|j|j|j|j|j|j|g  }d |_t||d}| j|}d}|j D ]}||j }||v sJ qd S )Nz/admin/tree/?{0}={1}r  z/opener.dismissRelatedLookupPopup(window, '%s');)rh  r   Zattnamer   r   r  r   r   r_  r   admin_register_allr   r   r  r  r   rY   r  r  r  r  r  r  r  r  r   r  r  re   r|   )rn   rH   rE   Zpk_fieldrB   r}  rw  r~  r  r  r  r  r  r  r  r  r  rC   rC   rD   test_result_tree_list_with_get*  sF    




z0TestAdminTreeList.test_result_tree_list_with_getc                 C   s   |j dd}t d}t |_t }t|}t|}|||}||}|	||}	t
t||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|j d}||v sJ dS )r  z<>rt   r  Nr  z<li><a href="z/" >&lt;&gt;</a>)r   r   r   r   r_  r   r   r   r  r  r   rY   r  r  r  r  r  r  r  r  r   r  r  r   )rn   rI   r  rB   r}  rw  r~  r  r  r  r  r  r  r  rC   rC   rD   $test_result_tree_list_escapes_labelsP  s:    

z6TestAdminTreeList.test_result_tree_list_escapes_labelsN)	r   r   r   r
   r  r  r  r  r  rC   rC   rC   rD   r  
  s   %&&r  c                   @   sz   e Zd Ze Zdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )TestTreeAdminc                 C   s   t jj|ddS )NT)rc  Zis_superuser)r   re   create)rn   rc  rC   rC   rD   _create_superuserx  s    zTestTreeAdmin._create_superuserc                 C   s   t  }||}||_|S r<   )r   r   r_  )rn   r  r_  request_factoryrB   rC   rC   rD   _mocked_authenticated_request{  s    
z+TestTreeAdmin._mocked_authenticated_requestc                 C   s8   t  }|jd|d}t|dd t|}t|d| |S )N/r  sessionZ	_messages)r   postsetattrr   )rn   r   r  rB   messagesrC   rC   rD   _mocked_request  s    zTestTreeAdmin._mocked_requestc                 C   s   t |}t|}||| jS r<   )r   r   r}  )rn   Zmodel_classrw  r~  rC   rC   rD   _get_admin_obj  s    zTestTreeAdmin._get_admin_objc                 C   sb   |  d}| d|}| tj}|| |jdks:J | tj}|| |jdks^J d S )NZchangelist_tmpr  zadmin/tree_list.html)r  r  r  r   ZAL_TestNodeZchangelist_viewZchange_list_templateMP_TestNode)rn   Ztmp_userrB   	admin_objrC   rC   rD   test_changelist_view  s    


z"TestTreeAdmin.test_changelist_viewc                 C   s0   |  |}|jjdd}||j|ks,J d S )Nr   rt   )r  re   r   r  r   )rn   rE   r  r  rC   rC   rD   test_get_node  s    
zTestTreeAdmin.test_get_nodec                 C   sZ   |  |}| ji d}||}|jdks.J | jddid}||}|jdksVJ d S )Nr    r  r+   r  r  	move_nodestatus_codern   rE   r  rB   responserC   rC   rD    test_move_node_validate_keyerror  s    


z.TestTreeAdmin.test_move_node_validate_keyerrorc                 C   s:   |  |}| jddddd}||}|jdks6J d S )Nr+   r/   invalidr  Z
sibling_idZas_childr  r  r  r  rC   rC   rD   "test_move_node_validate_valueerror  s    


z0TestTreeAdmin.test_move_node_validate_valueerrorc                 C   sl   |j jdd}| |}| ji d}|jd|d||d}|jdksFJ |jd|d||d}|jdkshJ d S )	Nr"   rt   r  Tr  r  r  r<  re   r   r  r  Ztry_to_move_noder  rn   rE   r   r  rB   r  rC   rC   rD   &test_move_validate_missing_nodeorderby  s    


z4TestTreeAdmin.test_move_validate_missing_nodeorderbyc                 C   sJ   |j jdd}| |}| ji d}|jd|d||d}|jdksFJ d S )Nr"   rt   r  Tr9  r  r  r  r  rC   rC   rD   test_move_validate_invalid_pos  s    

z,TestTreeAdmin.test_move_validate_invalid_posc                 C   sV   |j jdd}|j jdd}| |}| ji d}|d|d||}|jdksRJ d S )Nr   rt   r"   r  TrD  r  r  )rn   rE   r   r  r  rB   r  rC   rC   rD    test_move_validate_to_descendant  s    

z.TestTreeAdmin.test_move_validate_to_descendantc                 C   st   |j jdd}|j jdd}| |}| j|j|jddd}||}|jdksVJ g d}| ||kspJ d S )	Nr"   rt   r   r   r  r     r  re   r   r  r  r   r  r  rp   rn   rE   r   r  r  rB   r  r}   rC   rC   rD   test_move_left  s    

zTestTreeAdmin.test_move_leftc                 C   st   |j jdd}|j jdd}| |}| j|j|jddd}||}|jdksVJ g d}| ||kspJ d S )	Nr"   rt   r   r+   r  r  r  r  r  r  rC   rC   rD   test_move_last_child  s    

z"TestTreeAdmin.test_move_last_childN)r   r   r   r   r}  r  r  r  r  r  r  r  r  r  r  r  r  r  rC   rC   rC   rD   r  t  s   		
r  c                   @   s   e Zd Zdd ZdS )TestMPFormPerformancec                 C   s`   t j}|t t|}| }|t| d  || W d    n1 sR0    Y  d S r4  )r   r  r?   r@   r   ri   r   Zmk_dropdown_tree)rn   django_assert_num_queriesrE   rw  rp  rC   rC   rD   #test_form_add_subtree_no_of_queries  s    
z9TestMPFormPerformance.test_form_add_subtree_no_of_queriesN)r   r   r   r  rC   rC   rC   rD   r    s   r  c                   @   s   e Zd Zdd ZdS )!TestMP_TreeDescendantsPerformancec              	   C   sl   t j}|t g d}|D ]J\}}|jj|d}|| t|  W d    q1 s\0    Y  qd S )N))r   r+   r   r   r  r  rt   )r   r  r?   r@   re   r   rT   r  )rn   r  rE   r   r   r}   r   rC   rC   rD   "test_get_descendants_no_of_queries  s    

zDTestMP_TreeDescendantsPerformance.test_get_descendants_no_of_queriesN)r   r   r   r  rC   rC   rC   rD   r    s   r  )sr  r  r  Zdjango.contrib.admin.sitesr   Zdjango.contrib.admin.views.mainr   Zdjango.contrib.auth.modelsr   r   Z(django.contrib.messages.storage.fallbackr   Zdjango.db.modelsr   Zdjango.db.models.signalsr   Zdjango.dispatchr	   Zdjango.templater
   r   Zdjango.testr   Zdjango.test.clientr   Zdjango.templatetags.staticr   Zdjango.contrib.admin.optionsr   Zdjangor   rU   r   Z	treebeardr   Ztreebeard.adminr   Ztreebeard.exceptionsr   r   r   r   r   Ztreebeard.formsr   Ztreebeard.testsr   Ztreebeard.tests.adminr   r  r@   r   r  r  r  rE   rG   rH   ZUNICODE_MODELSrI   ZSORTED_MODELSrJ   ZRELATED_MODELSrK   r  rL   ZMP_SHORTPATH_MODELSrM   rV  rN   ZMP_TestNodeAlphabetrO   ZMP_TestNodeSortedAutoNowrP   ZMP_TestNodeSmallSteprQ   ZMP_TestManyToManyWithUserrR   rY   rZ   r  Z	django_dbr   r   r   r   r!  r7  r\  r  r  r  r  r  r  r  r  r  r  r  r  r'  r)  r3  rW  rf  r  r  r  r  r  r  r  r  r  rC   rC   rC   rD   <module>   s   



















/ L  V m^hm    1*+!v29!  9  
