U
    zhˠ                 
   @   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Z2d#d$d%d&d'd(d)d*d+d,g
Z3e j4d-e.j5e.j6 d.d/d0 Z7e j4d-e.j5e.j6 d.d1d2 Z8e j4d-e.j5d.d3d4 Z9e j4d-e.j:d.d5d6 Z;e j4d-e.j<d.d7d8 Z=e j4d-e.j>d.d9d: Z?e j4d-e.j@d.d;d< ZAe j4d-e.jBd.d=d> ZCe j4d-e.jDgd.d?d@ ZEe j4d-e.jFgd.dAdB ZGe j4d-e.jHgd.dCdD ZIe j4d-e.jJgd.dEdF ZKe j4d-e.jLgd.dGdH ZMdIdJ ZNG dKdL dLZOe jPjQG dMdN dNeOZRG dOdP dPeOZSe jPjQG dQdR dReSZTe jPjQG dSdT dTeSZUe jPjQG dUdV dVeSZVe jPjQG dWdX dXeSZWe jPjQG dYdZ dZeOZXe jPjQG d[d\ d\eSZYe jPjQG d]d^ d^eOZZe jPjQG d_d` d`eSZ[e jPjQG dadb dbeSZ\e jPjQG dcdd ddeSZ]e jPjQG dedf dfeSZ^e jPjQG dgdh dheOZ_e jPjQG didj djeOZ`e jPjQG dkdl dleOZae jPjQG dmdn dneOZbe jPjQG dodp dpeOZce jPjQG dqdr dreOZde jPjQG dsdt dteOZee jPjQG dudv dveOZfe jPjQG dwdx dxeOZge jPjQG dydz dzeOZhe jPjQG d{d| d|eSZie jPjQG d}d~ d~eSZje jPjQG dd de_Zke jPjQG dd deSZle jPjQG dd deSZme jPjQG dd deSZne jPjQG dd deS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 rB   f/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/treebeard/tests/test_treebeard.pymodelM   s    rD   c                 C   s   | j S r;   r=   r@   rB   rB   rC   model_without_dataS   s    rF   c                 C   s   | j t | j S r;   r<   r@   rB   rB   rC   model_without_proxyX   s    rG   c                 C   s   | j S r;   rE   r@   rB   rB   rC   model_with_unicode^   s    rH   c                 C   s   | j S r;   rE   r@   rB   rB   rC   sorted_modelc   s    rI   c                 C   s   | j S r;   rE   r@   rB   rB   rC   related_modelh   s    rJ   c                 C   s   | j S r;   rE   r@   rB   rB   rC   inherited_modelm   s    rK   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpshort_modelr   s    rL   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpshortnotsorted_modelw   s    rM   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpalphabet_model|   s    rN   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpsortedautonow_model   s    rO   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpsmallstep_model   s    rP   c                 C   s   | j S r;   rE   r@   rB   rB   rC   mpm2muser_model   s    rQ   c                  G   s   t | }tdkr|d |S )N)r,    )listDJANGO_VERSIONappend)argsnew_argsrB   rB   rC   get_changelist_args   s    
rX   c                   @   s   e Zd Zdd ZdddZdS )TestTreeBasec                 C   s   |t jt jfkri }|jdddD ] \}}}||g ||g q$| D ]B\}}t|t	|ksjt
ttdt|d }t||ksNt
qNdd | D S )Ntree_idlftrgtr*   c                 S   s    g | ]}|j | | fqS rB   r   	get_depthget_children_count.0orB   rB   rC   
<listcomp>   s    z$TestTreeBase.got.<locals>.<listcomp>)r   ZNS_TestNodeZNS_TestNode_ProxyobjectsZvalues_list
setdefaultextenditemslenmaxAssertionErrorrS   rangesortedget_tree)selfrD   drZ   r[   r\   Z	got_edgesZ
good_edgesrB   rB   rC   got   s    zTestTreeBase.gotNc                    sB     |}dd |D }||ks$tt fdd|D s>td S )Nc                 S   s6   g | ].}|d  j |d d |d d |d d fqS )r   r*   opencloselevelr   ra   objrB   rB   rC   rc      s   z;TestTreeBase._assert_get_annotated_list.<locals>.<listcomp>c                    s   g | ]}t |d   kqS r   typeru   rD   rB   rC   rc      s     )Zget_annotated_listrj   all)rn   rD   expectedparentresultsrp   rB   rz   rC   _assert_get_annotated_list   s    
z'TestTreeBase._assert_get_annotated_list)N)__name__
__module____qualname__rp   r   rB   rB   rB   rC   rY      s   rY   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sDt| |tksVtd S )Nc                 S   s   g | ]
}|j qS rB   rt   ru   rB   rB   rC   rc      s     z6TestEmptyTree.test_load_bulk_empty.<locals>.<listcomp>Zpk__inc                 S   s   g | ]}|d  qS rw   rB   )ra   xrB   rB   rC   rc      s     )r>   r?   rd   filter	UNCHANGEDrl   rj   rp   )rn   rF   ids	got_descsexpected_descsrB   rB   rC   test_load_bulk_empty   s
    
z"TestEmptyTree.test_load_bulk_emptyc                 C   s   |  g kstd S r;   )	dump_bulkrj   )rn   rF   rB   rB   rC   test_dump_bulk_empty   s    z"TestEmptyTree.test_dump_bulk_emptyc                 C   s(   |j dd dg}| ||ks$td S )Nr   rt   r)   add_rootrp   rj   rn   rF   r|   rB   rB   rC   test_add_root_empty   s    z!TestEmptyTree.test_add_root_emptyc                 C   s&   |  }g }dd |D |ks"td S )Nc                 S   s   g | ]
}|j qS rB   rt   ra   noderB   rB   rC   rc      s     z;TestEmptyTree.test_get_root_nodes_empty.<locals>.<listcomp>get_root_nodesrj   )rn   rF   rp   r|   rB   rB   rC   test_get_root_nodes_empty   s    z'TestEmptyTree.test_get_root_nodes_emptyc                 C   s   |  }|d kstd S r;   )get_first_root_noderj   rn   rF   rp   rB   rB   rC   test_get_first_root_node_empty   s    z,TestEmptyTree.test_get_first_root_node_emptyc                 C   s   |  }|d kstd S r;   )get_last_root_noderj   r   rB   rB   rC   test_get_last_root_node_empty   s    z+TestEmptyTree.test_get_last_root_node_emptyc                 C   s   t | }|g kstd S r;   )rS   rm   rj   r   rB   rB   rC   test_get_tree   s    zTestEmptyTree.test_get_treec                 C   s   g }|  || d S r;   r   r   rB   rB   rC   test_get_annotated_list   s    z%TestEmptyTree.test_get_annotated_listc                 C   sR   |j dd |j dd |j dd |j dd dddd	g}| ||ksNtd S )
Nr   rt   r   r&   r'   r)   )r   r*   r   r4   )r'   r*   r   r   r   rB   rB   rC   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   rB   rB   rB   rC   r      s   r   c                   @   s   e Zd ZdS )TestNonEmptyTreeN)r   r   r   rB   rB   rB   rC   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   s   |j jdd}|t|}ddddddd	d
ddddddddddddg}ddddddddddg
}d d! |j j|d"D }t|t|kst| ||kstd S )#Nr"   rt   r)   r+   r-   r/   r0   r"   r2   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   r4   r5   r6   r   r   r   r    r!   r%   r&   r'   r(   c                 S   s   g | ]
}|j qS rB   rt   ru   rB   rB   rC   rc     s     z<TestClassMethods.test_load_bulk_existing.<locals>.<listcomp>r   )rd   getr>   r?   r   rl   rj   rp   )rn   rD   r   r   r|   r   r   rB   rB   rC   test_load_bulk_existing   s6    z(TestClassMethods.test_load_bulk_existingc                    s@      }dd |D }|tks"tt fdd|D s<td S )Nc                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc   
  s     z6TestClassMethods.test_get_tree_all.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r`   rz   rB   rC   rc     s     )rm   r   rj   r{   )rn   rD   nodesrp   rB   rz   rC   test_get_tree_all  s    z"TestClassMethods.test_get_tree_allc                 C   s   |j ddtkstd S )NFZkeep_ids)r   r?   rj   rn   rD   rB   rB   rC   test_dump_bulk_all  s    z#TestClassMethods.test_dump_bulk_allc                    s    j jdd} t|  j j|jd} |}dd |D }dddd	d
ddddddg}||kshtt fdd|D std S )Nr"   rt   pkc                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc     s     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 rB   rx   r`   rz   rB   rC   rc   (  s     )rd   r   r>   r?   r   rm   rj   r{   rn   rD   r   r   rp   r|   rB   rz   rC   test_get_tree_node  s&    
z#TestClassMethods.test_get_tree_nodec                    sf    j jdd}d| kst |}dd |D }dg}||ksHtt fdd|D sbtd S )Nr   rt   r   c                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc   /  s     z7TestClassMethods.test_get_tree_leaf.<locals>.<listcomp>r)   c                    s   g | ]}t | kqS rB   rx   r`   rz   rB   rC   rc   2  s     )rd   r   r_   rj   rm   r{   r   rB   rz   rC   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   rD   r|   rB   rB   rC   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%   rd   r   r   rn   rD   r   r|   rB   rB   rC   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   rB   rB   rC   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sRtd S )Nr"   rt   r   Fr   r#   )rd   r   r>   r?   r   r   rj   )rn   rD   r   rp   r|   rB   rB   rC   test_dump_bulk_nodeT  s    z$TestClassMethods.test_dump_bulk_nodec                 C   sb   |j dd}|j   ||d d |j dd}||ks@tdd | D }|tks^td S )NTr   c                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc   f  s    zHTestClassMethods.test_load_and_dump_bulk_keeping_ids.<locals>.<listcomp>)r   rd   r{   deleter>   rj   rm   r   )rn   rD   exprp   rB   rB   rC   #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st
d S )NzTest %srt   r   r   )r   relatedr   r   r    r!   r"   r#   r%   r&   r'   r(   Fr   )rd   r{   r   r   ZRelatedModelZget_or_creater   r   r>   r   rj   )rn   rJ   r   createdZrelated_datarp   rB   rB   rC   test_load_and_dump_bulk_with_fkk  s0    




z0TestClassMethods.test_load_and_dump_bulk_with_fkc                    sH      }ddddg}dd |D |ks*tt fdd|D sDtd S )Nr   r   r&   r'   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z8TestClassMethods.test_get_root_nodes.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r   rz   rB   rC   rc     s     )r   rj   r{   )rn   rD   rp   r|   rB   rz   rC   test_get_root_nodes  s    z$TestClassMethods.test_get_root_nodesc                 C   s*   |  }|jdkstt||ks&td S Nr   )r   r   rj   ry   rn   rD   rp   rB   rB   rC   test_get_first_root_node  s    z)TestClassMethods.test_get_first_root_nodec                 C   s*   |  }|jdkstt||ks&td S )Nr'   )r   r   rj   ry   r   rB   rB   rC   test_get_last_root_node  s    z(TestClassMethods.test_get_last_root_nodec                 C   sF   |j dd}| dkst| }|jdks2tt||ksBtd S )N5rt   r*   )r   r^   rj   r   r   ry   )rn   rD   rv   rp   rB   rB   rC   test_add_root  s
    zTestClassMethods.test_add_rootc                 C   sL   |dd}|j |d}||ks"t| }|jdks8tt||ksHtd S )Nr   rt   instance)r   rj   r   r   ry   )rn   rD   rv   resultrp   rB   rB   rC   "test_add_root_with_passed_instance  s    
z3TestClassMethods.test_add_root_with_passed_instancec              	   C   s4   |j jdd}tt |j|d W 5 Q R X d S )Nr'   rt   r   )rd   r   pytestraisesr   r   )rn   rD   rv   rB   rB   rC   )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   rB   rB   rB   rC   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   sB   dddddddg}|D ]&\}}|j j|d }||kstqd S )	N)r   T)r   T)r'   T)r   F)r%   F)r    F)r"   Frt   rd   r   is_rootrj   rn   rD   r   r   r|   rp   rB   rB   rC   test_is_root  s    	z"TestSimpleNodeMethods.test_is_rootc                 C   s:   dddg}|D ]&\}}|j j|d }||kstqd S )N)r   F)r!   F)r"   Trt   rd   r   is_leafrj   r   rB   rB   rC   test_is_leaf  s    z"TestSimpleNodeMethods.test_is_leafc                 C   sT   dddddddg}|D ]8\}}|j j|d }|j|ks>tt||kstqd S )	Nr   r   r   r   r'   r'   r   r   r%   r   r    r   )r"   r   rt   )rd   r   get_rootr   rj   ry   rn   rD   r   r   r|   r   rB   rB   rC   test_get_root  s    	z#TestSimpleNodeMethods.test_get_rootc                 C   s   dddddddg}t |}i }| D ]\\}}|jj|d}| }|rh|j|ksVtt||ksttn|d kstt|||< d	|_q&| D ]J\}}|| }|d
}|r|j|kstt||kstq|d kstqd S )N)r   Nr   Nr'   Nr   r   r   )r"   r!   rt   zCORRUPTED!!!T)	dictrg   rd   r   
get_parentr   rj   ry   Z_parent_obj)rn   rD   r   Zobjsr   r|   r   r}   rB   rB   rC   test_get_parent  s4    	
z%TestSimpleNodeMethods.test_get_parentc                    st   dddddgfddgfdg fg}|D ]J\}} j j|d }dd	 |D |ksTtt fd
d	|D s$tq$d S )Nr   r   r    r!   r%   r"   rt   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z;TestSimpleNodeMethods.test_get_children.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r   rz   rB   rC   rc     s     )rd   r   get_childrenrj   r{   )rn   rD   r   r   r|   r$   rB   rz   rC   test_get_children  s    z'TestSimpleNodeMethods.test_get_childrenc                 C   s:   dddg}|D ]&\}}|j j|d }||kstqd S )N)r   r,   r!   r*   r"   r   rt   rd   r   r_   rj   r   rB   rB   rC   test_get_children_count
  s    z-TestSimpleNodeMethods.test_get_children_countc                    s|   dddddgfdddddgfd	d	gfg}|D ]J\}} j j|d
 }dd |D |ks\tt fdd|D s,tq,d S )Nr   r   r&   r'   r   r    r!   r%   r"   rt   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z;TestSimpleNodeMethods.test_get_siblings.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r   rz   rB   rC   rc     s     )rd   r   get_siblingsrj   r{   )rn   rD   r   r   r|   ZsiblingsrB   rz   rC   test_get_siblings  s    z'TestSimpleNodeMethods.test_get_siblingsc                 C   sT   dddddddg}|D ]8\}}|j j|d }|j|ks>tt||kstqd S )	Nr   r   r   )r'   r   )r   r   )r%   r   r    r   r"   r"   rt   )rd   r   get_first_siblingr   rj   ry   r   rB   rB   rC   test_get_first_sibling  s    	z,TestSimpleNodeMethods.test_get_first_siblingc                 C   sj   dddddddg}|D ]N\}}|j j|d }|d krF|d ksdtq|j|ksTtt||kstqd S )	Nr   r   )r'   r&   r   N)r%   r!   r   r"   Nrt   )rd   r   get_prev_siblingrj   r   ry   r   rB   rB   rC   test_get_prev_sibling.  s    	z+TestSimpleNodeMethods.test_get_prev_siblingc                 C   sj   dddddddg}|D ]N\}}|j j|d }|d krF|d ksdtq|j|ksTtt||kstqd S )	Nr   r&   )r   r   r   )r   r    )r%   N)r    r!   r   rt   )rd   r   get_next_siblingrj   r   ry   r   rB   rB   rC   test_get_next_sibling@  s    	z+TestSimpleNodeMethods.test_get_next_siblingc                 C   sT   dddddddg}|D ]8\}}|j j|d }|j|ks>tt||kstqd S )	N)r   r'   )r   r'   r   )r   r%   )r%   r%   )r    r%   r   rt   )rd   r   get_last_siblingr   rj   ry   r   rB   rB   rC   test_get_last_siblingR  s    	z+TestSimpleNodeMethods.test_get_last_siblingc                 C   sd   ddddg}|D ]N\}}|j j|d }|d kr@|d ks^tq|j|ksNtt||kstqd S )N)r   r   r   r!   r"   r   rt   )rd   r   get_first_childrj   r   ry   r   rB   rB   rC   test_get_first_childa  s    z*TestSimpleNodeMethods.test_get_first_childc                 C   sd   ddddg}|D ]N\}}|j j|d }|d kr@|d ks^tq|j|ksNtt||kstqd S )N)r   r%   r   r  r   rt   )rd   r   get_last_childrj   r   ry   r   rB   rB   rC   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sPtt fdd|D s tq d S )	Nr   r   r"   r!   rt   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z<TestSimpleNodeMethods.test_get_ancestors.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r   rz   rB   rC   rc     s     )rd   r   get_ancestorsrj   r{   rn   rD   r   r   r|   r   rB   rz   rC   test_get_ancestors  s    
z(TestSimpleNodeMethods.test_get_ancestorsc                    s   ddddddg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sdtt fdd|D s4tq4d S )Nr   r   r    r!   r"   r%   r   r'   r(   rt   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z>TestSimpleNodeMethods.test_get_descendants.<locals>.<listcomp>c                    s   g | ]}t | kqS rB   rx   r   rz   rB   rC   rc     s     )rd   r   get_descendantsrj   r{   r  rB   rz   rC   test_get_descendants  s    z*TestSimpleNodeMethods.test_get_descendantsc                 C   s>   dddddg}|D ]&\}}|j j|d }||kstqd S )N)r   r   r   r   r   r   r'   r*   rt   rd   r   get_descendant_countrj   r   rB   rB   rC   test_get_descendant_count  s    z/TestSimpleNodeMethods.test_get_descendant_countc                 C   sT   dddddddg}|D ]8\}}}|j j|d}|j j|d}|||kst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   )rd   r   Zis_sibling_ofrj   rn   rD   r   Zdesc1Zdesc2r|   node1node2rB   rB   rC   test_is_sibling_of  s    	z(TestSimpleNodeMethods.test_is_sibling_ofc                 C   sR   ddddddg}|D ]8\}}}|j j|d}|j j|d}|||kstqd S )Nr   r   Fr   r   Fr   r   Tr  r"   r!   Tr"   r"   Frt   )rd   r   Zis_child_ofrj   r  rB   rB   rC   test_is_child_of  s    z&TestSimpleNodeMethods.test_is_child_ofc                 C   sR   ddddddg}|D ]8\}}}|j j|d}|j j|d}|||kstqd S )Nr  r  r  )r"   r   Tr  r  rt   )rd   r   Zis_descendant_ofrj   r  rB   rB   rC   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  rB   rB   rB   rC   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   sF   |j jddjdd dddddd	d
ddddg}| ||ksBtd S )Nr"   rt   2311r)   r+   r-   r/   r0   r"   r2   r*   r  r,   r   r3   r4   r5   r6   rd   r   	add_childrp   rj   r   rB   rB   rC   test_add_child_to_leaf  s    z#TestAddChild.test_add_child_to_leafc                 C   sF   |j jddjdd dddddd	d
ddddg}| ||ksBtd S )Nr   rt   25r)   r   r*   r   r-   r/   r0   r1   r3   )r$  r.   r   r4   r5   r6   r!  r   rB   rB   rC   test_add_child_to_node  s    z#TestAddChild.test_add_child_to_nodec                 C   s\   |dd}|j jddj|d}||ks,tddddd	d
dddddg}| ||ksXtd S )Nr  rt   r"   r   r)   r+   r-   r/   r0   r  r   r3   r4   r5   r6   )rd   r   r"  rj   rp   )rn   rD   childr   r|   rB   rB   rC   #test_add_child_with_passed_instance  s     
z0TestAddChild.test_add_child_with_passed_instancec              	   C   s>   |j jdd}tt |j jddj|d W 5 Q R X d S )Nr   rt   r   r   )rd   r   r   r   r   r"  )rn   rD   r'  rB   rB   rC   *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.t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rd   r   r"  rj   rn   rD   r'  r   rB   rB   rC   test_add_child_with_pk_set  s    z'TestAddChild.test_add_child_with_pk_setc              	   C   sR   z>tt dddd }|jjdd}| s0t|jdd W 5 t jdd X d S )Ntest_add_child_post_save)Zdispatch_uidc                 [   s$   |   }|  | dks td S Nr*   )r   Zrefresh_from_dbr  rj   )r   kwargsr}   rB   rB   rC   on_post_save  s    z;TestAddChild.test_add_child_post_save.<locals>.on_post_saver"   rt   r  )r   Z
disconnectr	   rd   r   r   rj   r"  )rn   rD   r3  r}   rB   rB   rC   r0    s    

z%TestAddChild.test_add_child_post_saveN)	r   r   r   r#  r&  r(  r)  r/  r0  rB   rB   rB   rC   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   s.   t t |jjddd W 5 Q R X d S Nr"   rt   invalid_pos)r   r   r   rd   r   add_siblingr   rB   rB   rC   test_add_sibling_invalid_pos(  s    z+TestAddSibling.test_add_sibling_invalid_posc              	   C   s6   |j jdd}tt |jddd W 5 Q R X d S )Nr   rt   sorted-siblingaaa)rd   r   r   r   r   r7  )rn   rD   node_wchildrenrB   rB   rC   $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,t| jdks>td S )Nr   rt   last-siblingr   r*   rd   r   r7  r^   rj   r   r   )rn   rD   r;  rv   rB   rB   rC   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,t| jdks>td S )Nr"   rt   r=  Z232r2   r>  )rn   rD   r   rv   rB   rB   rC   test_add_sibling_last7  s    z$TestAddSibling.test_add_sibling_lastc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr   rt   first-siblingnewr*   rB  r*   r   r)   r+   r-   r/   r0   r1   r3   r4   r5   r6   rd   r   r7  r^   rj   rp   rn   rD   r;  rv   r|   rB   rB   rC   test_add_sibling_first_root=  s     z*TestAddSibling.test_add_sibling_first_rootc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr!   rt   rA  rB  r.   r)   r%  rB  r.   r   r-   r/   r0   r1   r3   r4   r5   r6   rD  rE  rB   rB   rC   test_add_sibling_firstP  s     z%TestAddSibling.test_add_sibling_firstc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr   rt   leftrB  r*   r)   rC  r+   r-   r/   r0   r1   r3   r4   r5   r6   rD  rE  rB   rB   rC   test_add_sibling_left_rootc  s     z)TestAddSibling.test_add_sibling_left_rootc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr!   rt   rI  rB  r.   r)   r%  r-   r/   rG  r0   r1   r3   r4   r5   r6   rD  rE  rB   rB   rC   test_add_sibling_leftv  s     z$TestAddSibling.test_add_sibling_leftc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr   rt   rI  rB  r*   rC  r)   r+   r-   r/   r0   r1   r3   r4   r5   r6   rD  rn   rD   r   rv   r|   rB   rB   rC   !test_add_sibling_left_noleft_root  s     z0TestAddSibling.test_add_sibling_left_noleft_rootc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr"   rt   rI  rB  r2   r)   r+   r-   r/   r!   r.   r.   rB  r2   r   r1   r3   r4   r5   r6   rD  rL  rB   rB   rC   test_add_sibling_left_noleft  s     z+TestAddSibling.test_add_sibling_left_noleftc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr   rt   rightrB  r*   r)   r+   r-   r/   r0   r1   r3   rC  r4   r5   r6   rD  rE  rB   rB   rC   test_add_sibling_right_root  s     z*TestAddSibling.test_add_sibling_right_rootc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr!   rt   rQ  rB  r.   r)   r%  r-   r/   r0   r1   rG  r3   r4   r5   r6   rD  rE  rB   rB   rC   test_add_sibling_right  s     z%TestAddSibling.test_add_sibling_rightc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr'   rt   rQ  rB  r*   r)   r+   r-   r/   r0   r1   r3   r4   r5   r6   rC  rD  rL  rB   rB   rC   #test_add_sibling_right_noright_root  s     z2TestAddSibling.test_add_sibling_right_noright_rootc                 C   s\   |j jdd}|jddd}| dks,tdddd	d
ddddddg}| ||ksXtd S )Nr"   rt   rQ  rB  r2   r)   r+   r-   r/   rN  r1   rO  r3   r4   r5   r6   rD  rL  rB   rB   rC   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s2t| dksBt| jdksTtd S )Nr   rt   r   r=  r   r*   )rd   r   r7  rj   r^   r   r   )rn   rD   r;  rv   r   rB   rB   rC   %test_add_sibling_with_passed_instance  s    
z4TestAddSibling.test_add_sibling_with_passed_instancec              	   C   sD   |j jdd}|j jdd}tt |jd|d W 5 Q R X d S )Nr   rt   r'   r=  r   )rd   r   r   r   r   r7  )rn   rD   r;  Zexisting_noderB   rB   rC   '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.tdS r*  r-  r.  rB   rB   rC   r/  	  s    z)TestAddSibling.test_add_child_with_pk_setN)r   r   r   r8  r<  r?  r@  rF  rH  rJ  rK  rM  rP  rR  rS  rT  rU  rV  rW  r/  rB   rB   rB   rC   r4  &  s"   r4  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 )
TestDeleter7   c                 C   s   d| d j  d| d j  S )Nbase=r   z dep=r*   r   ZfvrB   rB   rC   <lambda>      zTestDelete.<lambda>r9   r:   r   c                 C   s:   | j \}}|t |j D ]}||d  q||fS )N)r   )r=   r>   r?   rd   r{   save)rA   
base_model	dep_modelr   rB   rB   rC   delete_dep_model_pair  s
    

z TestDelete.delete_dep_model_pairc              	   C   sf   |\}}|j jdd }ddddddd	d
dg	}| ||ksBt|d|jjd|jjdifksbtd S )Nr"   rt   r)   r+   r-   r/   r!   r.   r   r3   r4   r5   r6   r.   r*   rd   r   r   rp   rj   _metalabelrn   rb  delete_modelra  r   r|   rB   rB   rC   test_delete_leaf"  s    zTestDelete.test_delete_leafc                 C   sd   |\}}|j jdd }ddddddd	d
g}| ||ks@t|d|jjd|jjdifks`td S )Nr!   rt   r)   )r   r*   r2   r-   r/   r3   r4   r5   r6   r,   r.   rd  rg  rB   rB   rC   test_delete_node3  s    
zTestDelete.test_delete_nodec                 C   s\   |\}}|j jdd }ddddg}| ||ks8t|d|jjd|jjdifksXtd S )	Nr   rt   r)   r4   r5   r6      r   rd  rg  rB   rB   rC   test_delete_rootC  s
    zTestDelete.test_delete_rootc                 C   sZ   |\}}|j jdd }dddg}| ||ks6t|d|jjd|jjdifksVtd S )Nr   Zdesc__inr)   r5   r6         rd   r   r   rp   rj   re  rf  rg  rB   rB   rC   test_delete_filter_root_nodesJ  s
    
z(TestDelete.test_delete_filter_root_nodesc                 C   s\   |\}}|j jdd }ddddg}| ||ks8t|d|jjd|jjdifksXtd S )	N)r   r!   r"   rm  r)   r4   r5   r6   rk  r   rp  rg  rB   rB   rC   test_delete_filter_childrenQ  s
    z&TestDelete.test_delete_filter_childrenc                 C   s@   |\}}|j jdd }| |tks,t|di fks<td S )N)ZZZZXXXrm  r   )rd   r   r   rp   r   rj   rn   rb  rh  ra  r   rB   rB   rC   test_delete_nonexistant_nodesX  s    z(TestDelete.test_delete_nonexistant_nodesc                 C   s\   |\}}|j jdd }ddddg}| ||ks8t|d|jjd|jjdifksXtd S )	Nr   rm  r)   r4   r5   r6   rk  r   rp  rg  rB   rB   rC   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s4t|j dksFtd S N   
   r   )r   r   re  rf  rj   rd   countrt  rB   rB   rC   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s6t|j  dksHtd S rw  )rd   r{   r   re  rf  rj   rz  rt  rB   rB   rC   test_delete_all_nodesk  s     z TestDelete.test_delete_all_nodesN)r   r   r   staticmethodr   fixturezipr   BASE_MODELSZ
DEP_MODELSrb  ri  rj  rl  rq  rr  ru  rv  r{  r|  rB   rB   rB   rC   rX    s    rX  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestMoveErrorsc              	   C   s4   |j jdd}tt ||d W 5 Q R X d S r5  )rd   r   r   r   r   movern   rD   r   rB   rB   rC   test_move_invalid_post  s    z$TestMoveErrors.test_move_invalid_posc              	   C   sB   |j jdd}|j jdd}tt ||d W 5 Q R X d S )Nr   rt   r"   rA  )rd   r   r   r   r   r  )rn   rD   r   targetrB   rB   rC   test_move_to_descendanty  s    z&TestMoveErrors.test_move_to_descendantc              	   C   sV   |j jdd}tt ||d W 5 Q R X tt ||d W 5 Q R X d S )Nr"   rt   sorted-childr9  )rd   r   r   r   r   r  r  rB   rB   rC   test_move_missing_nodeorderby  s
    z,TestMoveErrors.test_move_missing_nodeorderbyN)r   r   r   r  r  r  rB   rB   rB   rC   r  r  s   r  c                   @   s   e Zd Zdd ZdS )TestMoveSortedErrorsc              	   C   s6   |j dddd}tt ||d W 5 Q R X d S )Nr2   zxyval1val2r   rI  )r   r   r   r   r  )rn   rI   r   rB   rB   rC   test_nonsorted_move_in_sorted  s    z2TestMoveSortedErrors.test_nonsorted_move_in_sortedN)r   r   r   r  rB   rB   rB   rC   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   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   r=  r)   r+   r-   r/   rc  r3   r4   r5   r6   r"   r*   r   rd   r   r  rp   rj   rn   rD   r  r|   rB   rB   rC    test_move_leaf_last_sibling_root  s    z1TestMoveLeafRoot.test_move_leaf_last_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   rA  r  r)   r+   r-   r/   rc  r3   r4   r5   r6   r  r  rB   rB   rC   !test_move_leaf_first_sibling_root  s    z2TestMoveLeafRoot.test_move_leaf_first_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   rI  r)   r  r+   r-   r/   rc  r3   r4   r5   r6   r  r  rB   rB   rC    test_move_leaf_left_sibling_root  s    z1TestMoveLeafRoot.test_move_leaf_left_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   rQ  r)   r+   r-   r/   rc  r3   r  r4   r5   r6   r  r  rB   rB   rC   !test_move_leaf_right_sibling_root  s    z2TestMoveLeafRoot.test_move_leaf_right_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   
last-childr)   r%  r-   r/   rc  r3   r"   r.   r   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_last_child_root  s    z/TestMoveLeafRoot.test_move_leaf_last_child_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r"   first-childr)   r%  r  r-   r/   rc  r3   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_first_child_root  s    z0TestMoveLeafRoot.test_move_leaf_first_child_rootN)	r   r   r   r  r  r  r  r  r  rB   rB   rB   rC   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   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   r=  r)   r%  r-   r/   rc  r3   r  r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_last_sibling  s    z(TestMoveLeaf.test_move_leaf_last_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   rA  r)   r%  r  r-   r/   rc  r3   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_first_sibling  s    z)TestMoveLeaf.test_move_leaf_first_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   rI  r)   r%  r-   r  r/   rc  r3   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_left_sibling  s    z(TestMoveLeaf.test_move_leaf_left_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   rQ  r)   r%  r-   r/   r  rc  r3   r4   r5   r6   r  r  rB   rB   rC   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s6td S )Nr"   rt   rI  rd   r   r  rp   r   rj   rn   rD   r  rB   rB   rC   "test_move_leaf_left_sibling_itself>  s    z/TestMoveLeaf.test_move_leaf_left_sibling_itselfc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   r  r)   r+   r-   r    r.   r*   r1   rc  r3   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_last_childC  s    z&TestMoveLeaf.test_move_leaf_last_childc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr    rt   r"   r  r)   r+   r-   r  r1   rc  r3   r4   r5   r6   r  r  rB   rB   rC   test_move_leaf_first_childT  s    z'TestMoveLeaf.test_move_leaf_first_childN)
r   r   r   r  r  r  r  r  r  r  rB   rB   rB   rC   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   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   rA  r5   r6   r)   r+   r-   r/   r0   r1   r3   r4   r  r  rB   rB   rC   #test_move_branch_first_sibling_rooth  s    z6TestMoveBranchRoot.test_move_branch_first_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   r=  r)   r+   r-   r/   r0   r1   r3   r4   r5   r6   r  r  rB   rB   rC   "test_move_branch_last_sibling_rooty  s    z5TestMoveBranchRoot.test_move_branch_last_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   rI  r)   r5   r6   r+   r-   r/   r0   r1   r3   r4   r  r  rB   rB   rC   "test_move_branch_left_sibling_root  s    z5TestMoveBranchRoot.test_move_branch_left_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   rQ  r)   r+   r-   r/   r0   r1   r3   r5   r6   r4   r  r  rB   rB   rC   #test_move_branch_right_sibling_root  s    z6TestMoveBranchRoot.test_move_branch_right_sibling_rootc              
   C   sV   |j jdd }|j jdd|d ddddd	d
ddddg
}| ||ksRtd S )Nr   rt   r'   rI  r5   r6   r)   r+   r-   r/   r0   r1   r3   r4   rd   r   r   r  rp   rj   r  rB   rB   rC   )test_move_branch_left_noleft_sibling_root  s    z<TestMoveBranchRoot.test_move_branch_left_noleft_sibling_rootc              
   C   sV   |j jdd }|j jdd|d ddddd	d
ddddg
}| ||ksRtd S )Nr   rt   r'   rQ  r)   r+   r-   r/   r0   r1   r3   r4   r5   r6   rd   r   r   r  rp   rj   r  rB   rB   rC   +test_move_branch_right_noright_sibling_root  s    z>TestMoveBranchRoot.test_move_branch_right_noright_sibling_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   r  r)   r%  r'   r.   r*   r(   r2   r   r-   r/   r0   r1   r3   r4   r  r  rB   rB   rC   !test_move_branch_first_child_root  s    z4TestMoveBranchRoot.test_move_branch_first_child_rootc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr   rt   r'   r  r)   r%  r-   r/   r0   r1   r3   r  r  r4   r  r  rB   rB   rC    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  rB   rB   rB   rC   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   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   rA  r)   r%  r  r  r-   r/   r0   r1   r3   r4   r  r  rB   rB   rC   test_move_branch_first_sibling  s    z-TestMoveBranch.test_move_branch_first_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   r=  r)   r%  r-   r/   r0   r1   r3   r  r  r4   r  r  rB   rB   rC   test_move_branch_last_sibling  s    z,TestMoveBranch.test_move_branch_last_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   rI  r)   r%  r-   r/   r  r  r0   r1   r3   r4   r  r  rB   rB   rC   test_move_branch_left_sibling  s    z,TestMoveBranch.test_move_branch_left_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   rQ  r)   r%  r-   r/   r0   r1   r  r  r3   r4   r  r  rB   rB   rC   test_move_branch_right_sibling&  s    z-TestMoveBranch.test_move_branch_right_siblingc              
   C   sV   |j jdd }|j jdd|d ddddd	d
ddddg
}| ||ksRtd S )Nr!   rt   r'   rI  r)   r%  r  r  r-   r/   r0   r1   r3   r4   r  r  rB   rB   rC   $test_move_branch_left_noleft_sibling7  s    z3TestMoveBranch.test_move_branch_left_noleft_siblingc              
   C   sV   |j jdd }|j jdd|d ddddd	d
ddddg
}| ||ksRtd S )Nr!   rt   r'   rQ  r)   r%  r-   r/   r0   r1   r3   r  r  r4   r  r  rB   rB   rC   &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s6td S )Nr'   rt   rI  r  r  rB   rB   rC   $test_move_branch_left_itself_siblingY  s    z3TestMoveBranch.test_move_branch_left_itself_siblingc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   r  r)   r+   r-   r/   rN  r'   r2   r*   r(   r,   r   r1   r3   r4   r  r  rB   rB   rC   test_move_branch_first_child^  s    z+TestMoveBranch.test_move_branch_first_childc              
   C   sR   |j jdd}|j jdd|d ddddd	d
ddddg
}| ||ksNtd S )Nr!   rt   r'   r  r)   r+   r-   r/   rN  r1   r  r  r3   r4   r  r  rB   rB   rC   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  rB   rB   rB   rC   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 rB   )r  r  r   r^   r_   r`   rB   rB   rC   rc     s   z&TestTreeSorted.got.<locals>.<listcomp>rm   )rn   rI   rB   rB   rC   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 ddddddddg}| ||kstd S )Nr2   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   )r2   r.   r  r*   r   )r2   r2   r  r*   r   )r2   r2   r  r*   r   )r,   r*   r  r*   r   r   )rn   rI   r|   rB   rB   rC   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 dddddddddg	}| ||kstd S )Nr   r:  r  r2   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   r2   r.   r  r.   r   r2   r2   r  r.   r   r2   r2   r  r.   r   r,   r*   r  r.   r   )r   r"  rp   rj   )rn   rI   rootr|   rB   rB   rC   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 dddddddg}|  |kstd S )Nc                    s    j j| dS )Nr   )rd   r   )node_idrI   rB   rC   r\    r]  z>TestTreeSorted.test_add_child_nonroot_sorted.<locals>.<lambda>r   ar  acaaavacaaccacb)r   r   r  r*   r2   )r   r   r  r.   r   )r   r   r  r.   r2   )r   r   r  r2   r   )r   r   r  r2   r   )r   r   r  r2   r   )r   r   r  r.   r   )r   r   r"  rp   rj   )rn   rI   get_nodeZroot_idr  r|   rB   r  rC   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 qddddddddg}| ||kstd S )Nr2   r  r  r*   r,   r  r.   r   r  r  r  r  r   r   r  )r*   r,   r  r*   ro  r  r  r  r  r  r  )r   r   rd   r   r   r  rp   rj   rn   rI   Z
root_nodesr  r   r|   rB   rB   rC   test_move_sorted  s0    
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 qddddddddg}| ||kst	d S )Nr2   r  r  r*   r,   r  r.   r   r  r  r  r  r   r   r9  )r   r.   r  r*   r   )r   r   r  r*   r   )r*   r.   r  r*   r   )r*   r2   r  r*   r   )r*   r2   r  r*   r   r  )r.   r*   r  r*   r   )
r   r   rd   r   r   r  r_  r  rp   rj   r  rB   rB   rC   test_move_sortedsibling  s4    
z&TestTreeSorted.test_move_sortedsiblingN)	r   r   r   rp   r  r  r  r  r  rB   rB   rB   rC   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TestInheritedModelsr7   c                 C   s   d| d j  d| d j  S )NrY  r   z inherited=r*   rZ  r[  rB   rB   rC   r\    r]  zTestInheritedModels.<lambda>r^  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   rd   r   r"  )rA   r`  rK   node21node3rB   rB   rC   rK   	  s    


z#TestInheritedModels.inherited_modelc                 C   s4   dd |  D }ddddddd	g}||ks0td S )
Nc                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc      s   z9TestInheritedModels.test_get_tree_all.<locals>.<listcomp>r)   )r   r*   r.   r   r.   r.   r  r2   r   r  r2   r   r/   r4   )rm   rj   rn   rK   rp   r|   rB   rB   rC   r     s    	z%TestInheritedModels.test_get_tree_allc                 C   s<   |j jdd}dd ||D }dddg}||ks8td S )Nr   rt   c                 S   s    g | ]}|j | | fqS rB   r]   r`   rB   rB   rC   rc   2  s   z:TestInheritedModels.test_get_tree_node.<locals>.<listcomp>r  r  r  )rd   r   rm   rj   )rn   rK   r   rp   r|   rB   rB   rC   r   /  s    z&TestInheritedModels.test_get_tree_nodec                 C   s,   |  }dddg}dd |D |ks(td S )Nr   r   r&   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc   @  s     z;TestInheritedModels.test_get_root_nodes.<locals>.<listcomp>r   r  rB   rB   rC   r   =  s    
z'TestInheritedModels.test_get_root_nodesc                 C   s   |  }|jdkstd S r   )r   r   rj   rn   rK   rp   rB   rB   rC   r   B  s    z,TestInheritedModels.test_get_first_root_nodec                 C   s   |  }|jdkstd S )Nr&   )r   r   rj   r  rB   rB   rC   r   F  s    z+TestInheritedModels.test_get_last_root_nodec                 C   s@   |j jdd}|j jdd}| dks,t| dks<td S Nr   rt   r&   FTr   rn   rK   r  r  rB   rB   rC   r   J  s    z TestInheritedModels.test_is_rootc                 C   s@   |j jdd}|j jdd}| dks,t| dks<td S r  r   r  rB   rB   rC   r   P  s    z TestInheritedModels.test_is_leafc                 C   sD   |j jdd}|j jdd}| jdks.t| jdks@td S Nr   rt   r&   r   )rd   r   r   r   rj   r  rB   rB   rC   r   V  s    z!TestInheritedModels.test_get_rootc                 C   sB   |j jdd}|j jdd}| jdks.t| d ks>td S r  )rd   r   r   r   rj   r  rB   rB   rC   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:tdd | D g ksTtd S )	Nr   rt   r&   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc   e  s     z9TestInheritedModels.test_get_children.<locals>.<listcomp>r  r  c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc   f  s     )rd   r   r   rj   r  rB   rB   rC   r   b  s    z%TestInheritedModels.test_get_childrenc                 C   s@   |j jdd}|j jdd}| dks,t| dks<td S Nr   rt   r&   r.   r   r   r  rB   rB   rC   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:tdd | D dd	dgksZtd S )
Nr   rt   r&   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc   q  s     z9TestInheritedModels.test_get_siblings.<locals>.<listcomp>r    c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc   r  s     r   r   )rd   r   r   rj   r  rB   rB   rC   r   n  s    z%TestInheritedModels.test_get_siblingsc                 C   sD   |j jdd}|j jdd}| jdks.t| jdks@td S )Nr   rt   r&   r   )rd   r   r   r   rj   r  rB   rB   rC   r   t  s    z*TestInheritedModels.test_get_first_siblingc                 C   sB   |j jdd}|j jdd}| d ks,t| jdks>td S r  )rd   r   r   rj   r   r  rB   rB   rC   r   z  s    z)TestInheritedModels.test_get_prev_siblingc                 C   sB   |j jdd}|j jdd}| jdks.t| d ks>td S Nr   rt   r&   r    )rd   r   r   r   rj   r  rB   rB   rC   r     s    z)TestInheritedModels.test_get_next_siblingc                 C   sD   |j jdd}|j jdd}| jdks.t| jdks@td S r  )rd   r   r   r   rj   r  rB   rB   rC   r    s    z)TestInheritedModels.test_get_last_siblingc                 C   sB   |j jdd}|j jdd}| jdks.t| d ks>td S )Nr   rt   r&   r  )rd   r   r  r   rj   r  rB   rB   rC   r    s    z(TestInheritedModels.test_get_first_childc                 C   sB   |j jdd}|j jdd}| jdks.t| d ks>td S )Nr   rt   r&   r  )rd   r   r  r   rj   r  rB   rB   rC   r    s    z'TestInheritedModels.test_get_last_childc                 C   sV   |j jdd}|j jdd}dd | D dgks8tdd | D g ksRtd S )Nr   rt   r&   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z:TestInheritedModels.test_get_ancestors.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     )rd   r   r  rj   r  rB   rB   rC   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:tdd | D g ksTtd S )	Nr   rt   r&   c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z<TestInheritedModels.test_get_descendants.<locals>.<listcomp>r  r  c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     )rd   r   r
  rj   r  rB   rB   rC   r    s    z(TestInheritedModels.test_get_descendantsc                 C   s@   |j jdd}|j jdd}| dks,t| dks<td S r  r  r  rB   rB   rC   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 r2tq2dd | D dgksjtd S )	Nr   r   rt   r   )r   r  r  c                 S   s   g | ]
}|j qS rB   rt   r   rB   rB   rC   rc     s     z?TestInheritedModels.test_cascading_deletion.<locals>.<listcomp>r    )	__bases__rd   r   r   r   existsrj   r
  )rn   rK   r`  r  r  r   rB   rB   rC   test_cascading_deletion  s    
z+TestInheritedModels.test_cascading_deletionN)!r   r   r   r}  r   r~  r  r   r  INHERITED_MODELSrK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r  r  r  rB   rB   rB   rC   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@t 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 qX q|r qdd |j D }||kr q }q ds.td|t|dS )z:This isn't actually a test, it's an informational routine.FNr2   r*   r   c                    s   g | ]} d  | qS rw   rB   ra   charalphabetrB   rC   rc     s     z5TestMP_TreeAlphabet.test_alphabet.<locals>.<listcomp>c                    s   g | ]} d  | qS )r*   rB   r  r  rB   rC   rc     s     r.   )numvalTc                 S   s   g | ]
}|j qS rB   pathru   rB   rB   rC   rc     s     z7Best BASE85 based alphabet for your setup: {} (base {}))r   ZBASE85rk   rh   rj   rf   rU   rd   r{   r   r  Znumconv_obj_r   format)	rn   rN   Z	basealphaZgot_errZ	last_goodZalphabetlenr|   posrp   rB   r  rC   test_alphabet  s8    
 z!TestMP_TreeAlphabet.test_alphabetN)	r   r   r   r   markZskipifosgetenvr  rB   rB   rB   rC   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 )
TestHelpersr7   r8   c                 C   s:   | j }|t | D ]}|t| q|jdd |S )Nr   rt   )r=   r>   r?   r   r   )rA   rD   r   rB   rB   rC   helpers_model  s    
zTestHelpers.helpers_modelc                 C   s4   dd |  D }dd | D }||ks0td S )Nc                 S   s   g | ]}|j | fqS rB   r   r  r`   rB   rB   rC   rc     s    zATestHelpers.test_descendants_group_count_root.<locals>.<listcomp>c                 S   s   g | ]}|j |jfqS rB   r   Zdescendants_countr`   rB   rB   rC   rc     s   )r   get_descendants_group_countrj   )rn   r  r|   rp   rB   rB   rC   !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sBtd S )Nr   rt   c                 S   s   g | ]}|j | fqS rB   r  r`   rB   rB   rC   rc     s     zATestHelpers.test_descendants_group_count_node.<locals>.<listcomp>c                 S   s   g | ]}|j |jfqS rB   r  r`   rB   rB   rC   rc     s   )r   r   r   r  rj   )rn   r  r}   r|   rp   rB   rB   rC   !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  rB   rB   rB   rC   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   rO   irB   rB   rC   !test_sorted_by_autonow_workaround
  s
     z:TestMP_TreeSortedAutoNow.test_sorted_by_autonow_workaroundc              	   C   s2   |j dd tt |j dd W 5 Q R X dS )zU
        This test asserts that we have a problem.
        fix this, somehow
        r  rt   r  N)r   r   r   
ValueError)rn   rO   rB   rB   rC   test_sorted_by_autonow_FAIL  s    z4TestMP_TreeSortedAutoNow.test_sorted_by_autonow_FAILN)r   r   r   __doc__r  r  rB   rB   rB   rC   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   s<   |j }tddD ]
}|  qtt |  W 5 Q R X d S Nr*   ry  )r   rk   r   r   r   )rn   rP   methodr  rB   rB   rC   r     s
    z%TestMP_TreeStepOverflow.test_add_rootc              	   C   sD   |  }|j}tddD ]
}|  qtt |  W 5 Q R X d S r  )r   r"  rk   r   r   r   )rn   rP   r  r  r  rB   rB   rC   test_add_child$  s    z&TestMP_TreeStepOverflow.test_add_childc              
   C   sV   |  }tddD ]}|  qd}|D ](}tt | | W 5 Q R X q(d S )Nr*   ry  )rA  rI  rQ  r=  )r   rk   r"  r   r   r   r  r7  )rn   rP   r  r  	positionsr  rB   rB   rC   test_add_sibling,  s    
z(TestMP_TreeStepOverflow.test_add_siblingc           	      C   s   |  }tddD ]}|  q|  }|ddgf| ddddgfg}|D ]4\}}|D ]&}tt ||| W 5 Q R X qXqLd S )	Nr*   ry  r  r  rA  rI  rQ  r=  )r   rk   r"  r  r   r   r   r  )	rn   rP   r  r  Znewroottargetsr  r  r  rB   rB   rC   	test_move5  s    


z!TestMP_TreeStepOverflow.test_moveN)r   r   r   r   r  r  r  rB   rB   rB   rC   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   s:   |  }|   }tt |  W 5 Q R X d S r;   )r   r"  r   r   r   )rn   rM   rv   rB   rB   rC   test_short_pathM  s    z$TestMP_TreeShortPath.test_short_pathN)r   r   r   r  r  rB   rB   rB   rC   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*tddg||ks@td
dg||ksVtdddg||ksntddg||kstd S )NZ01234Z01r*   r   )r  depthnumchildr  r   111abcdzqa#$%!Z0201r.   Z020201r2   Z03Z0301Z030102ry  Z04Z0401rx  c                    s   dd  j j| dD S )Nc                 S   s   g | ]
}|j qS rB   r  r`   rB   rB   rC   rc   f  s     zKTestMP_TreeFindProblems.test_find_problems.<locals>.got.<locals>.<listcomp>r   )rd   r   )r   rN   rB   rC   rp   e  s    z7TestMP_TreeFindProblems.test_find_problems.<locals>.got)r  r_  find_problemsrj   )rn   rN   rp   Z
evil_charsZbad_steplenZorphansZwrong_depthZwrong_numchildrB   r!  rC   test_find_problemsV  s4    	z*TestMP_TreeFindProblems.test_find_problemsN)r   r   r   r#  rB   rB   rB   rC   r  T  s   r  c                   @   s   e Zd Zejddddddddd	d
ddddgejddddddddddddddgiZejddddd dddd	d
dd!d"dgejddddd dddd	d
dd!d"dg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  r2   r*   )Z1111er,   r   )12rb   r.   r   )r   ro   r*   r   )r&   gr*   r   )r'   r  r*   r,   )r(   r  r.   r   )42r  r.   r   )43r'  r.   r*   )Z431r  r2   r*   )Z4311r(  r,   r   )44rb   r.   r   )r   r  r*   r,   )r&  r  r.   r   )r)  r  r.   r   )13rb   r.   r   )14r'  r.   r*   )Z141r  r2   r*   )Z1411r(  r,   r   )r   r%  r*   r.   )r   rb   r.   r   )r    r'  r.   r*   )Z221r  r2   r*   )Z2211r(  r,   r   )r&   ro   r*   r   )r'   r*  r*   r   )r.  r'  r.   r*   )134r  r2   r*   )1343r(  r,   r   )r/  rb   r.   r   )434r  r2   r*   )4343r(  r,   r   c                 C   s   dd |  D S )Nc                 S   s$   g | ]}|j |j| | fqS rB   )r  r   r^   r_   r`   rB   rB   rC   rc     s   z&TestMP_TreeFix.got.<locals>.<listcomp>r  r   rB   rB   rC   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   r.  i  r   r'  r/  r,   i  rb   r0  iA  i  r  r1  r(  r+  r*   r,  r-  r2  r3  r(   r&      iB  r*  r   ry  r2   r%  r   ro   )r_  r   rB   rB   rC   add_broken_test_data  s    z#TestMP_TreeFix.add_broken_test_datac                 C   sB   |  | |jdd | |}| j| }||ks6t|  d S )NFZdestructive)r5  fix_treerp   expected_with_holesrj   r"  rn   rL   rp   r|   rB   rB   rC   test_fix_tree_non_destructive  s    


z,TestMP_TreeFix.test_fix_tree_non_destructivec                 C   sB   |  | |jdd | |}| j| }||ks6t|  d S )NTr6  r5  r7  rp   expected_no_holesrj   r"  r9  rB   rB   rC   test_fix_tree_destructive  s    


z(TestMP_TreeFix.test_fix_tree_destructivec                 C   sB   |  | |jdd | |}| j| }||ks6t|  d S )NT)Z	fix_pathsr;  r9  rB   rB   rC   test_fix_tree_with_fix_paths  s    


z+TestMP_TreeFix.test_fix_tree_with_fix_pathsN)r   r   r   r   MP_TestNodeShortPathZMP_TestSortedNodeShortPathr<  r8  rp   r5  r:  r=  r>  rB   rB   rB   rC   r$  v  s   ##r$  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t d S )Nc                 S   s   g | ]
}|j qS rB   namer`   rB   rB   rC   rc   	  s     zXTestIssues.test_many_to_many_django_user_anonymous.<locals>.qs_check.<locals>.<listcomp>)rj   )qsr|   rB   rB   rC   qs_check	  s    zDTestIssues.test_many_to_many_django_user_anonymous.<locals>.qs_checkc                    s(    |  tddt|dB |  d S )NfirstrA  users)r   r   r   )r|   r  userrD  rB   rC   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 noderA  rE  secondrF  )username)r   rd   Zcreate_userr_  r   r"  r   r   r   r   rG  add)rn   rQ   ZanonuserobjrJ  rH  r  rK  rB   rI  rC   'test_many_to_many_django_user_anonymous  s"    z2TestIssues.test_many_to_many_django_user_anonymousN)r   r   r   rN  rB   rB   rB   rC   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 )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*   rB   )ra   r   strr  rB   rB   rC   rc   #	  s    z4TestMoveNodeForm._get_nodes_list.<locals>.<listcomp>rB   rn   r   rB   rB   rC   _get_nodes_list"	  s    z TestMoveNodeForm._get_nodes_listc                 C   s<   |j d j}|dd d ks"t|dd |D ks8td S )N_ref_node_idr   c                 S   s   g | ]}|d  |d fqS )r   r*   rB   ra   choicerB   rB   rC   rc   *	  s     z=TestMoveNodeForm._assert_nodes_in_choices.<locals>.<listcomp>)fieldschoicespoprj   )rn   formr   rW  rB   rB   rC   _assert_nodes_in_choices'	  s    z)TestMoveNodeForm._assert_nodes_in_choicesc                 C   st   t t|}||d}dddgt|j ks2tdd |jd jD }ddd	g|ksZt| |}| 	|| d S )
Nr   r   	_positionrS  c                 S   s   g | ]}|d  qS rw   rB   rT  rB   rB   rC   rc   0	  s     z6TestMoveNodeForm._move_node_helper.<locals>.<listcomp>r  rI  rQ  )
r   ry   rS   base_fieldskeysrj   rV  rW  rR  rZ  )rn   r   safe_parent_nodes
form_classrY  rp   r   rB   rB   rC   _move_node_helper,	  s    

z"TestMoveNodeForm._move_node_helperc                 C   s   dd |D S )Nc                 S   s    g | ]}|j t|| fqS rB   )r   rP  r^   r   rB   rB   rC   rc   6	  s     zBTestMoveNodeForm._get_node_ids_strs_and_depths.<locals>.<listcomp>rB   rQ  rB   rB   rC   _get_node_ids_strs_and_depths5	  s    z.TestMoveNodeForm._get_node_ids_strs_and_depthsc                 C   s0   t | }|d}| |}| || d S )Nr   )rS   rm   rX  ra  r`  )rn   rD   r   r   r^  rB   rB   rC   test_form_root_node8	  s    

z$TestMoveNodeForm.test_form_root_nodec                 C   s.   t | }| |}| }| || d S r;   )rS   rm   ra  rX  r`  )rn   rD   r   r^  r   rB   rB   rC   test_form_leaf_node>	  s    
z$TestMoveNodeForm.test_form_leaf_nodec                 C   s   d }t | }| |}|j D ]}t }t|}t|}|||}	t |	|j	
 }
dddg}||
ksrt|	|}
d d|ifg}|
|kst|	||}
|
|kst|	| }| |}| || q$d S )Nr   r[  rS  rV  )rS   rm   ra  rd   r{   r   r   r   get_formr\  r]  rj   Zget_fieldsetsrR  rZ  )rn   rD   rA   r   r^  r   siter_  admin_classmarp   Zdesc_pos_refnodeidr|   rY  rB   rB   rC   test_form_adminD	  s&    




z TestMoveNodeForm.test_form_adminN)
r   r   r   rR  rZ  r`  ra  rb  rc  rh  rB   rB   rB   rC   rO   	  s   	rO  c                   @   s   e Zd Zdd ZdS )TestModelAdminc                 C   sF   t  }t|}t|}|||}t|d j dddgksBtd S )Nr   r[  rS  )r   r   r   rS   rd  r\  r]  rj   )rn   rD   re  r_  rf  rg  rB   rB   rC   test_default_fields\	  s    
z"TestModelAdmin.test_default_fieldsN)r   r   r   rj  rB   rB   rB   rC   ri  Z	  s   ri  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 dddddgkst||jjddd}t|j dddddgkstdt|kstdt|kstd S )Nr2   r  r  r*   r,   r  r.   r   r  r  r  r  r  r  r   r[  rS  rt   r   id__positionid__ref_node_id)	r   r   rS   rV  r]  rj   rd   r   rP  )rn   rI   r_  rY  rB   rB   rC   test_sorted_formj	  s6    

zTestSortedForm.test_sorted_formN)r   r   r   rn  rB   rB   rB   rC   rk  h	  s   rk  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   s~   t |}| }t|j dddgks*t||jjddd}t|j dddgksZtdt|ksjtdt|ksztd S )	Nr   r[  rS  r   rt   r   rl  rm  )r   rS   rV  r]  rj   rd   r   rP  )rn   rD   r_  rY  rB   rB   rC   	test_form	  s    zTestForm.test_formc                 C   sX   t |}|jjddjdd}||d}| }d|ks<td|ksHtd|ksTtd S )Nr   rt   z,Benign<script>alert("Compromised");</script>r   ZBenignz<script>z&lt;script&gt;)r   rd   r   r"  Zas_prj   )rn   rD   r_  Zbad_noderY  Zrendered_htmlrB   rB   rC   test_move_node_form	  s    
zTestForm.test_move_node_formc                 C   s   t |}|jjdd}||d}||dddks8t|jjdd}||d}||d|jjddjdkstt|jjd	d}||d}||d
|jjddjdkst|jjdd}||d}||d|jjddjdkstd S )Nr   rt   r   r  rR   )r[  rS  r   r   r    rQ  r"   r!   )r   rd   r   Z_get_position_ref_noderj   r   )rn   rD   r_  instance_parentrY  Zinstance_childZinstance_grandchildrB   rB   rC   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@t| ||fksTtd S )Nr   rt   r  rR   r[  rS  r   r   r   )rd   r   r   r   is_validrj   Z_clean_cleaned_data)rn   rD   rr  r[  rS  r_  rY  rB   rB   rC   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}| sRt|	 }||j  
 kspt| dkst| dkst| rt| stt|}||dd	|jdd}| st|	 }||j  
 kst| dkst| d
kst| s"t| s0td S )Nr   rt   r  r   rt  ru  r   r.   rR   r*   )rd   r   rh   r{   r   r   r   rv  rj   r_  rz  r_   r^   r   r   )rn   rD   rr  original_countr_  rY  Zsaved_instanceZrestored_instancerB   rB   rC   test_save_edit	  s@    zTestForm.test_save_editc                 C   sl   |j   }|dkstd}t|}||ddd}| sBt| d k	sRt||j   k shtd S )Nry  r  New Form Testr[  r   r   )rd   r{   rz  rj   r   rv  r_  rn   rD   rx  r[  r_  rY  rB   rB   rC   test_save_new	  s    zTestForm.test_save_newc                 C   sv   |j   }|dkstd}t|}||dddd}| sDtd|j_| dk	s\t||j   k srtdS )r+  ry  r  r,  rz  )r[  idr   r|  N)	rd   r{   rz  rj   r   rv  r   r  r_  r}  rB   rB   rC   test_save_new_with_pk_set
  s    
z"TestForm.test_save_new_with_pk_setc                 C   sF   t |}|dddd}| s$td|j_| }|jdksBtd S )Nr  zTest Instancer{  r|  zModified Instance)r   rv  rj   r   r   r_  )rn   rD   r_  rY  r   rB   rB   rC   test_save_instance
  s    zTestForm.test_save_instanceN)r   r   r   rp  rq  rs  rw  ry  r~  r  r  rB   rB   rB   rC   ro  	  s   
&
ro  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st|j D ]*}|
|}d|t|f }||kstqd|kstdS )z
        Verifies that inclusion tag result_list generates a table when with
        default ModelAdmin settings.
        /admin/tree/NclrA   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   rH  r   r   r   get_list_displayget_list_display_linksr   rX   list_filterdate_hierarchysearch_fieldslist_select_relatedlist_per_pagelist_max_show_alllist_editableformsetr   templaterenderrz  rd   rj   r{   url_for_resultrP  )rn   rG   rD   rA   re  r_  rf  mlist_displaylist_display_linksr  contexttable_outputdrag_handlerobjecturlr   rB   rB   rC   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st|j D ](}||}d	||jf }||kstqd
|kst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  rB   rB   rB   rC   UnicodeModelAdmin_
  s   r  Nr  r  r  r  )r   r   r   r   rH  r   r   r   r  r  r   rX   r  r  r  r  r  r  r  r  r   r  r  rz  rd   rj   r{   r  r   )rn   rH   rD   rA   re  r_  Z
ModelAdminr  r  r  r  r  r  r  r  r  r  r   rB   rB   rC   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|kstt  d}t |_||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|ks6tt  d}t |_||}|||}	t	t
||||	|j|j|j|j|j|j|j|g  }
d|
_t|
|d}| j|}d|kst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   rH  r   r   r   r  r  r   rX   r  r  r  r  r  r  r  r  r   r  r  rj   )rn   rG   rD   rA   re  r_  rf  r  r  r  r  r  r  rB   rB   rC   test_result_filtered
  s    



z"TestAdminTree.test_result_filteredN)r   r   r   r
   r  r  r  r  rB   rB   rB   rC   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 }||kstqdS )r  r  Nr  z<li><a href="%s/" >%s</a>r   r   r   rH  r   r   r   r  r  r   rX   r  r  r  r  r  r  r  r  r   r  r  rd   r{   r   rP  rj   rn   rG   rD   rA   re  r_  rf  r  r  r  r  r  r  output_templater  expected_outputrB   rB   rC   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 }||kstqd S )Nr  T)r  rA   Zaction_formzg<input type="checkbox" class="action-select" value="%s" name="_selected_action" /><a href="%s/" >%s</a>r  r  rB   rB   rC   !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 }||kstqd S )Nz/admin/tree/?{0}={1}r  z/opener.dismissRelatedLookupPopup(window, '%s');)re  r   Zattnamer   r   r  r   r   rH  r   admin_register_allr   r   r  r  r   rX   r  r  r  r  r  r  r  r  r   r  r  rd   r{   rj   )rn   rG   rD   Zpk_fieldrA   re  r_  rf  r  r  r  r  r  r  r  r  r  rB   rB   rC   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}||kstdS )r  z<>rt   r  Nr  z<li><a href="z/" >&lt;&gt;</a>)r   r   r   r   rH  r   r   r   r  r  r   rX   r  r  r  r  r  r  r  r  r   r  r  r   rj   )rn   rH   r  rA   re  r_  rf  r  r  r  r  r  r  r  rB   rB   rC   $test_result_tree_list_escapes_labelsP  s:    

z6TestAdminTreeList.test_result_tree_list_escapes_labelsN)	r   r   r   r
   r  r  r  r  r  rB   rB   rB   rC   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)rL  Zis_superuser)r   rd   create)rn   rL  rB   rB   rC   _create_superuserx  s    zTestTreeAdmin._create_superuserc                 C   s   t  }||}||_|S r;   )r   r   rH  )rn   r  rH  request_factoryrA   rB   rB   rC   _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  rA   messagesrB   rB   rC   _mocked_request  s    zTestTreeAdmin._mocked_requestc                 C   s   t |}t|}||| jS r;   )r   r   re  )rn   Zmodel_classr_  rf  rB   rB   rC   _get_admin_obj  s    zTestTreeAdmin._get_admin_objc                 C   sb   |  d}| d|}| tj}|| |jdks:t| tj}|| |jdks^td S )NZchangelist_tmpr  zadmin/tree_list.html)	r  r  r  r   ZAL_TestNodeZchangelist_viewZchange_list_templaterj   MP_TestNode)rn   Ztmp_userrA   	admin_objrB   rB   rC   test_changelist_view  s    


z"TestTreeAdmin.test_changelist_viewc                 C   s0   |  |}|jjdd}||j|ks,td S )Nr   rt   )r  rd   r   r  r   rj   )rn   rD   r  r  rB   rB   rC   test_get_node  s    
zTestTreeAdmin.test_get_nodec                 C   sZ   |  |}| ji d}||}|jdks.t| jddid}||}|jdksVtd S )Nr|    r  r*   r  r  	move_nodestatus_coderj   rn   rD   r  rA   responserB   rB   rC    test_move_node_validate_keyerror  s    


z.TestTreeAdmin.test_move_node_validate_keyerrorc                 C   s:   |  |}| jddddd}||}|jdks6td S )Nr*   r.   invalidr  Z
sibling_idZas_childr|  r  r  r  rB   rB   rC   "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sFt|jd|d||d}|jdkshtd S )	Nr"   rt   r|  Tr  r  r  r9  rd   r   r  r  Ztry_to_move_noder  rj   rn   rD   r   r  rA   r  rB   rB   rC   &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sFtd S )Nr"   rt   r|  Tr6  r  r  r  r  rB   rB   rC   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sRtd S )Nr   rt   r"   r|  TrA  r  r  )rn   rD   r   r  r  rA   r  rB   rB   rC    test_move_validate_to_descendant  s    
    z.TestTreeAdmin.test_move_validate_to_descendantc              
   C   s   |j jdd}|j jdd}| |}| j|j|jddd}||}|jdksVtdd	d
dddddddg
}| ||kstd S )Nr"   rt   r   r   r  r|     r)   r  r+   r-   r/   rc  r3   r4   r5   r6   	rd   r   r  r  r   r  r  rj   rp   rn   rD   r   r  r  rA   r  r|   rB   rB   rC   test_move_left  s(    

zTestTreeAdmin.test_move_leftc              
   C   s   |j jdd}|j jdd}| |}| j|j|jddd}||}|jdksVtdd	d
dddddddg
}| ||kstd S )Nr"   rt   r   r*   r  r|  r  r)   r%  r-   r/   rc  r3   r  r4   r5   r6   r  r  rB   rB   rC   test_move_last_child  s(    

z"TestTreeAdmin.test_move_last_childN)r   r   r   r   re  r  r  r  r  r  r  r  r  r  r  r  r  r  rB   rB   rB   rC   r  t  s   		
r  c                   @   s   e Zd Zdd ZdS )TestMPFormPerformancec              	   C   sL   t j}|t t|}| }|t| d  || W 5 Q R X d S r1  )r   r  r>   r?   r   rh   r   Zmk_dropdown_tree)rn   django_assert_num_queriesrD   r_  rY  rB   rB   rC   #test_form_add_subtree_no_of_queries  s    
z9TestMPFormPerformance.test_form_add_subtree_no_of_queriesN)r   r   r   r  rB   rB   rB   rC   r    s   r  c                   @   s   e Zd Zdd ZdS )!TestMP_TreeDescendantsPerformancec              
   C   s^   t j}|t dddddg}|D ]6\}}|jj|d}|| t|  W 5 Q R X q"d S )N)r   r*   r   r   r  r  rt   )r   r  r>   r?   rd   r   rS   r
  )rn   r  rD   r   r   r|   r   rB   rB   rC   "test_get_descendants_no_of_queries  s    

zDTestMP_TreeDescendantsPerformance.test_get_descendants_no_of_queriesN)r   r   r   r  rB   rB   rB   rC   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   djangor   rT   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	  rD   rF   rG   ZUNICODE_MODELSrH   ZSORTED_MODELSrI   ZRELATED_MODELSrJ   r  rK   ZMP_SHORTPATH_MODELSrL   r?  rM   ZMP_TestNodeAlphabetrN   ZMP_TestNodeSortedAutoNowrO   ZMP_TestNodeSmallSteprP   ZMP_TestManyToManyWithUserrQ   rX   rY   r  Z	django_dbr   r   r   r   r  r4  rX  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r$  r@  rO  ri  rk  ro  r  r  r  r  r  r  rB   rB   rB   rC   <module>   s4  



















/ L  V m^hm    1*+!v29!  9  
