
    .Zi9                        d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlZ ee      j                   Ze
j$                  j'                  d ee             ddlZej.                  dedefd       Zej.                  dedefd       Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$y)u   todo-manager.py 테스트 (task-864.1)

모든 서브커맨드 정상 동작, 에러 케이스, JSON 무결성 검증 테스트.
    N)Pathtmp_pathreturnc              #   
  K   t         j                  }t         j                  }t         j                  }| dz  t         _        | dz  t         _        | dz  t         _        |  |t         _        |t         _        |t         _        yw)u$   임시 디렉토리에서 테스트.z	todo.jsonztodo.json.bakztodo-removed.jsonN)tm	TODO_FILEBACKUP_FILEREMOVED_FILE)r   	orig_todoorig_backuporig_removeds       //home/jay/workspace/memory/test_todo_manager.pytemp_todo_dirr      sb      I..K??Lk)BL/BN!44BO
NBL BN"BOs   BBr   c                     ddddddddd	g d
dd	dddddgd
dddddddd	dgg d
gd	d}t        j                  |       |S )u   샘플 todo.json 생성.1.0	issue-001TestProj   테스트 이슈 1u   설명highpendingz2026-01-01T00:00:00N   서브1F)titledonetask_idu   서브2Tztask-001)
idprojectr   descriptionprioritystatus
created_atcompleted_atlinked_tasks	sub_items	issue-002	OtherProju   테스트 이슈 2 mediumin_progressz2026-01-02T00:00:00task-002)versionissueslast_synced)r   	save_todo)r   datas     r   sample_todor/   (   s      "%-'"#3 $ "'4H'*M  "&-!$'3 $!+!
: ? DB LLK    c                       e Zd ZdZdeddfdZdededdfdZdeddfdZdededdfd	Z	dededdfd
Z
dededdfdZy)TestLoadSaveu   로드/저장 테스트.r   r   Nc                 ,   t        j                         }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d	   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)
u   빈 파일 로드.r*   r   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6Nr+   )r   	load_todo
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation)selfr   r.   @py_assert0@py_assert3@py_assert2@py_format5@py_format7s           r   test_load_emptyzTestLoadSave.test_load_emptyS   s    ||~I'%'%''''%''''''%'''''''H~##~####~###~##########r0   r/   c                    t        j                         }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d	x}x}x}}|d   d
   d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}
x}}y	)u   기존 파일 로드.r+      r4   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenpy0py2r9   py7assert %(py9)spy9Nr   r   r   r6   r7   r:   r;   )r   r<   rL   r=   r>   @py_builtinslocals_should_repr_global_namer?   r@   rA   )rB   r   r/   r.   @py_assert1rD   @py_assert6@py_assert5@py_format8@py_format10rC   rE   rF   rG   s                 r   test_load_existingzTestLoadSave.test_load_existingY   s    ||~>'s>"'a'"a''''"a''''''s'''s'''>'''"'''a'''''''H~a &5+5&+5555&+555&555+5555555r0   c                    dg d}t        j                  |       t         j                  }|j                  } |       }|sddt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}y)u   저장 시 파일 생성.r   )r*   r+   z`assert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.TODO_FILE
}.exists
}()
}r   rN   rO   r9   r;   N)r   r-   r   existsrS   rT   r=   rU   r?   r@   rA   )rB   r   r.   rV   rD   rX   rG   s          r   test_save_creates_filez#TestLoadSave.test_save_creates_file_   s     B/
T||$|""$"$$$$$$$$r$$$r$$$|$$$"$$$$$$$$$$r0   c                    t        j                         }d|d   d   d<   t        j                  |       t         j                  }|j                  } |       }|sddt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}y)	u   저장 시 백업 생성.u	   수정됨r+   r   r   zbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.BACKUP_FILE
}.exists
}()
}r   r]   N)r   r<   r-   r	   r^   rS   rT   r=   rU   r?   r@   rA   )rB   r   r/   r.   rV   rD   rX   rG   s           r   test_save_creates_backupz%TestLoadSave.test_save_creates_backupe   s    ||~%0Xq'"
T~~&~$$&$&&&&&&&&r&&&r&&&~&&&$&&&&&&&&&&r0   c                    t        j                         }|d   j                  dddd       t        j                  |       t        j                         }|d   }t	        |      }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)u   atomic write 검증.r+   z	issue-003XY)r   r   r      r4   rK   rL   rM   rQ   rR   N)r   r<   appendr-   rL   r=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r/   r.   reloadedrV   rD   rW   rX   rY   rZ   s              r   test_atomic_writezTestLoadSave.test_atomic_writel   s    ||~X[S3OP 	T <<>H%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++r0   c                 ~   t        j                         }t        j                  |       t        t         j                  d      5 }t        j                  |      }ddd       |k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d}y# 1 sw Y   xY w)u(   JSON 검증 (깨진 JSON 저장 방지).utf-8encodingNr4   )z%(py0)s == %(py2)srg   r.   )rN   rO   zassert %(py4)sr9   )r   r<   r-   openr   jsonloadr=   r>   rS   rT   rU   r?   r@   rA   )	rB   r   r/   r.   frg   rV   @py_format3rF   s	            r   test_json_validationz!TestLoadSave.test_json_validationx   s    ||~
T ",,1 	$Qyy|H	$4x4xx44	$ 	$s   D33D<)__name__
__module____qualname____doc__r   rH   dictr[   r_   ra   rh   rr    r0   r   r2   r2   P   s    "$T $d $6 64 6D 6%D %T %'d ' 'RV '
,t 
,$ 
,4 
,	 $ 	 T 	 d 	 r0   r2   c                   L    e Zd ZdZdededdfdZdededdfdZdededdfdZy)	TestListu   list 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  ddd      }t        j                  |       |j	                         }d}|j
                  }||v }	|	st        j                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }
d
d|
iz  }t        t        j                  |            dx}x}	}d}|j
                  }||v }	|	st        j                  d|	fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }
d
d|
iz  }t        t        j                  |            dx}x}	}y)u   전체 목록.r   NFr   r   rn   r   inz+%(py1)s in %(py5)s
{%(py5)s = %(py3)s.out
}capturedr8   py3py5assert %(py7)srP   r$   argparse	Namespacer   cmd_list
readouterroutr=   r>   r?   rS   rT   rU   r@   rA   rB   r   r/   capsysr   argsr   rC   @py_assert4rE   @py_format6rY   s               r   test_list_allzTestList.test_list_all   s   !!$t%!H
D$$&*hll*{l****{l***{******h***h***l********hll*{l****{l***{******h***h***l*******r0   c                    ddl }|j                  ddd      }t        j                  |       |j	                         }d}|j
                  }||v }	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}d}|j
                  }||v}	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   프로젝트 필터.r   Nr   Fr|   r   r}   r   r   r   r   rP   r$   not inz/%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.out
}r   r   s               r   test_list_filter_projectz!TestList.test_list_filter_project   s    	!!*T!N
D$$&*hll*{l****{l***{******h***h***l*******.(,,.{,....{,...{......(...(...,.......r0   c                    ddl }|j                  ddd      }t        j                  |       |j	                         }d}|j
                  }||v}	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}d}|j
                  }||v }	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   상태 필터.r   Nr(   Fr|   r   r   r   r   r   r   rP   r$   r}   r   r   r   s               r   test_list_filter_statusz TestList.test_list_filter_status   s    	!!$}5!Q
D$$&.(,,.{,....{,...{......(...(...,.......*hll*{l****{l***{******h***h***l*******r0   )	rs   rt   ru   rv   r   rw   r   r   r   rx   r0   r   rz   rz      sY    )+4 +d +t +
/!
/04
/	
/
+!
+04
+	
+r0   rz   c                   8    e Zd ZdZdededdfdZdededdfdZy)TestShowu   show 서브커맨드 테스트.r   r/   r   Nc                 
   ddl }|j                  dd      }t        j                  |       |j	                         }d}|j
                  }||v }	|	st        j                  d|	fd||f      t        j                  |      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   존재하는 이슈 조회.r   Nr   Fissue_idrn   r   r}   r   r   r   r   rP   )r   r   r   cmd_showr   r   r=   r>   r?   rS   rT   rU   r@   rA   r   s               r   test_show_existingzTestShow.test_show_existing   s     	!!;U!C
D$$&#3x||3#|3333#|333#333333x333x333|3333333r0   c                    ddl }|j                  dd      }t        j                  t              5 }t        j                  |       ddd       j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                   |            dx}x}x}	}y# 1 sw Y   xY w)   존재하지 않는 이슈.r   N	issue-999Fr      r4   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)sexcrM   rQ   rR   )r   r   pytestraises
SystemExitr   r   valuecoder=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r/   r   r   r   rV   rD   rW   rX   rY   rZ   s               r   test_show_not_foundzTestShow.test_show_not_found   s    !!;U!C]]:& 	#KK	yy"y~~""~""""~""""""s"""s"""y"""~""""""""""	 	s   D::E)rs   rt   ru   rv   r   rw   r   r   rx   r0   r   r   r      s<    )	4!	404	4		4# #D #T #r0   r   c                   @    e Zd ZdZdeddfdZdeddfdZdeddfdZy)TestAddu   add 서브커맨드 테스트.r   r   Nc                    ddl }|j                  dddddd      }t        j                  |       |j	                         }g }d}|j
                  }|j                  }	 |	       }
||
v }|}|sd}|j
                  }||v }|}|st        j                  d	|fd
||
f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }|j                  |       |st        j                  d	fdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                   |            dx}x}x}x}x}x}	x}
x}x}}t        j"                         }|d   }t%        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}x}x}}|d   d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d d!|iz  }t        t        j                   |            dx}x}}y)"u   최소 필드로 추가.r   NNewProju
   새 이슈Fr   r   r   r   r   rn   successz"id"r}   )z_%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.out
}.lower
}()
}r   )r   r   rP   rR   py11z%(py13)spy13)z/%(py16)s in %(py20)s
{%(py20)s = %(py18)s.out
})py16py18py20z%(py22)spy22r   zassert %(py25)spy25r+   r4   rK   rL   rM   rQ   rR   r   r6   r7   r:   r;   )r   r   r   cmd_addr   r   lowerr=   r>   r?   rS   rT   rU   rf   _format_boolopr@   rA   r<   rL   )rB   r   r   r   r   r   rV   rE   rW   @py_assert8@py_assert10r   rC   @py_assert15@py_assert19@py_assert17@py_format12@py_format14@py_format21@py_format23@py_format24@py_format26r.   rD   rX   rY   rZ   rF   rG   s                                r   test_add_minimalzTestAdd.test_add_minimal   sQ   !! " 
 	

4$$&JyJHLLJL..J.0Jy00JFJhllJFl4JJJJJy0JJJyJJJJJJHJJJHJJJLJJJ.JJJ0JJJJJJJFlJJJFJJJJJJhJJJhJJJlJJJJJJJJJJJJJJJ||~>'s>"'a'"a''''"a''''''s'''s'''>'''"'''a'''''''H~a +8y8+y8888+y888+888y8888888r0   c                    ddl }|j                  dddddd	      }t        j                  |       t        j                         }|d
   d   }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)u   모든 필드로 추가.r   NFullProju   전체 이슈r   r(   u   상세 설명Fr   r+   r   r4   r6   r7   r:   r;   r   r   )
r   r   r   r   r<   r=   r>   r?   r@   rA   )rB   r   r   r   r.   issuerC   rD   rE   rF   rG   s              r   test_add_fullzTestAdd.test_add_full   sE   !!! ' " 
 	

4||~Xq!Z *F* F**** F*** ***F*******X/-/-////-//////-///////]#66#6666#666#6666666666r0   c           	         ddl }|j                  dddddd      }t        j                  |       |j                  dddddd      }t        j                  |       t        j                         }|d   D cg c]  }|d	   	 }}t        |      }t        |      }	d
}
|	|
k(  }|sSt        j                  d|fd|	|
f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}	x}}
yc c}w )u   ID 자동 생성.r   NPT1Fr   T2r+   r   rJ   r4   )zN%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py9)srL   setids)rN   r8   rO   r9   r;   rR   zassert %(py11)sr   )r   r   r   r   r<   r   rL   r=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r   args1args2r.   ir   rD   rX   r   @py_assert7rZ   r   s                 r   test_auto_id_generationzTestAdd.test_auto_id_generation   sU    ""td4TX] # 
 	

5 ""td4TX] # 
 	

5||~ $X/1qw//s8!s8}!!}!!!!}!!!!!!s!!!s!!!!!!3!!!3!!!!!!s!!!s!!!8!!!}!!!!!!!!!! 0s   8H)rs   rt   ru   rv   r   r   r   r   rx   r0   r   r   r      s>    (9d 9t 9(74 7D 7("T "d "r0   r   c                   L    e Zd ZdZdededdfdZdededdfdZdededdfdZy)	
TestUpdateu!   update 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  ddddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   }d}||k(  }	|	slt        j                  d|	fd	||f      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   }d}||u}	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   상태 수정.r   Nr   r   Fr   r   r   r   rn   r   r4   r6   r7   r:   r;   r!   )is not)z%(py1)s is not %(py4)sr   r   r   
cmd_updater<   
find_issuer=   r>   r?   r@   rA   rB   r   r/   r   r   r.   r   rC   rD   rE   rF   rG   s               r   test_update_statuszTestUpdate.test_update_status  s    !! $dQV " 
 	d||~dK0X(&(&((((&((((((&(((((((^$0D0$D0000$D000$000D0000000r0   c                    ddl }|j                  ddddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   }d}	||	k(  }
|
slt        j                  d|
fd	||	f      t        j                  |      t        j                  |	      d
z  }dd|iz  }t        t        j                  |            dx}x}
}	y)u   우선순위 수정.r   Nr   lowFr   r   r4   r6   r7   r:   r;   r   )rB   r   r/   r   r   r   r.   r   rC   rD   rE   rF   rG   s                r   test_update_priorityzTestUpdate.test_update_priority  s     	!! TPU " 
 	d||~dK0Z )E) E)))) E))) )))E)))))))r0   c                     ddl }|j                  ddddd      }t        j                  t              5  t        j                  |       ddd       y# 1 sw Y   yxY w)r   r   Nr   r   Fr   )r   r   r   r   r   r   r   rB   r   r/   r   r   s        r   test_update_not_foundz TestUpdate.test_update_not_found"  sU    !! $dQV " 
 ]]:& 	 MM$	  	  	    AA)	rs   rt   ru   rv   r   rw   r   r   r   rx   r0   r   r   r     sV    +1 14 1D 1*!*04*	* 4  d  t  r0   r   c                   L    e Zd ZdZdededdfdZdededdfdZdededdfdZy)	
TestRemoveu!   remove 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  dd        |j                  ddd      }t        j                  |       t        j
                         }|d   }t        |      }d	}	||	k(  }
|
st        j                  d
|
fd||	f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}
}	|d   d   d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u   확인 후 삭제.r   Nzbuiltins.inputc                      y)Nyrx   )_s    r   <lambda>z5TestRemove.test_remove_with_confirm.<locals>.<lambda>6  s    r0   r   Fr   forcern   r+   r   r4   rK   rL   rM   rQ   rR   r   r$   r6   r7   r:   r;   )r   setattrr   r   
cmd_remover<   rL   r=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r/   monkeypatchr   r   r.   rV   rD   rW   rX   rY   rZ   rC   rE   rF   rG   s                    r   test_remove_with_confirmz#TestRemove.test_remove_with_confirm0  s&    	,m<!!;e%!P
d||~>'s>"'a'"a''''"a''''''s'''s'''>'''"'''a'''''''H~a &5+5&+5555&+555&555+5555555r0   c                 Z   ddl }|j                  ddd      }t        j                  |       t        j                         }|d   }t        |      }d}||k(  }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}	}y)u   강제 삭제.r   Nr   TFr   r+   r   r4   rK   rL   rM   rQ   rR   )r   r   r   r   r<   rL   r=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r/   r   r   r.   rV   rD   rW   rX   rY   rZ   s               r   test_remove_forcezTestRemove.test_remove_force>  s    !!;d!O
d||~>'s>"'a'"a''''"a''''''s'''s'''>'''"'''a'''''''r0   c                 r   ddl }|j                  ddd      }t        j                  |       t        j                  }|j
                  } |       }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        t        j                  |            dx}x}}t        t        j                  d
      5 }	t        j                  |	      }
ddd       
d   }t!        |      }d}||k(  }|st        j"                  d|fd||f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|
d   d   d   }d}||k(  }|slt        j"                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   {xY w)u   삭제된 이슈 백업.r   Nr   TFr   zcassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.REMOVED_FILE
}.exists
}()
}r   r]   rj   rk   removedr   r4   rK   rL   rM   rQ   rR   r   r6   r7   r:   r;   )r   r   r   r   r
   r^   rS   rT   r=   rU   r?   r@   rA   rm   rn   ro   rL   r>   )rB   r   r/   r   r   rV   rD   rX   rG   rp   r   rW   rY   rZ   rC   rE   rF   s                    r   test_remove_creates_backupz%TestRemove.test_remove_creates_backupH  s    	!!;d!O
d'%%'%''''''''r'''r''''''%''''''''''"//G4 	#iilG	#9%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++y!!$T*9k9*k9999*k999*999k9999999	# 	#s   J,,J6)	rs   rt   ru   rv   r   rw   r   r   r   rx   r0   r   r   r   -  sY    +6!6046	6(t ($ (4 (:!:04:	:r0   r   c                   $    e Zd ZdZdededdfdZy)
TestSubAddu"   sub-add 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  ddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   }t        |      }d}	||	k(  }
|
st        j                  d	|
fd
||	f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}
}	|d   d   d   }d}||k(  }|slt        j                  d	|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u   sub_item 추가.r   Nr   u
   새 서브F)r   r   rn   r#   re   r4   rK   rL   rM   rQ   rR   rJ   r   r6   r7   r:   r;   r   isz%(py1)s is %(py4)s)r   r   r   cmd_sub_addr<   r   rL   r=   r>   rS   rT   rU   r?   r@   rA   )rB   r   r/   r   r   r.   r   rV   rD   rW   rX   rY   rZ   rC   rE   rF   rG   s                    r   test_sub_addzTestSubAdd.test_sub_add[  s   !!;lQV!W
t||~dK0%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++[!!$W-==-====-===-==========[!!$V,55,5555,555,5555555555r0   )rs   rt   ru   rv   r   rw   r   rx   r0   r   r   r   X  s    ,6$ 6T 6d 6r0   r   c                   `    e Zd ZdZdededdfdZdededdfdZdededdfdZdededdfd	Z	y)
TestSubDoneu#   sub-done 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  ddddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   d   d   }d	}||u }	|	slt        j                  d
|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   d   d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   인덱스로 완료.r   Nr   ztask-123Fr   indexmatchr   rn   r#   r   Tr   r   r7   r:   r;   r   r4   r6   r   r   r   cmd_sub_doner<   r   r=   r>   r?   r@   rA   r   s               r   test_sub_done_by_indexz"TestSubDone.test_sub_done_by_indexl  s   !! zPU " 
 	||~dK0[!!$V,44,4444,444,4444444444[!!$Y/=:=/:====/:===/===:=======r0   c                    ddl }|j                  ddddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   d   d	   }d
}||u }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   매칭으로 완료.r   Nr   r   ztask-456Fr  r#   r   Tr   r   r7   r:   r;   r  r   s               r   test_sub_done_by_matchz"TestSubDone.test_sub_done_by_matchz  s    !! IzX] " 
 	||~dK0[!!$V,44,4444,444,4444444444r0   c                     ddl }|j                  ddddd      }t        j                  t              5  t        j                  |       ddd       y# 1 sw Y   yxY w)u   잘못된 인덱스.r   Nr   c   task-789Fr  r   r   r   r   r   r   r  r   s        r   test_sub_done_invalid_indexz'TestSubDone.test_sub_done_invalid_index  sW     	!! $
QV " 
 ]]:& 	"OOD!	" 	" 	"r   c                     ddl }|j                  ddddd      }t        j                  t              5  t        j                  |       ddd       y# 1 sw Y   yxY w)u   매칭 없음.r   Nr   u	   없는거ztask-000Fr  r  r   s        r   test_sub_done_no_matchz"TestSubDone.test_sub_done_no_match  sX    !!  " 
 ]]:& 	"OOD!	" 	" 	"r   )
rs   rt   ru   rv   r   rw   r  r
  r  r  rx   r0   r   r  r  i  ss    ->D >t >PT >5D 5t 5PT 5
"!
"04
"	
""D "t "PT "r0   r  c                   8    e Zd ZdZdededdfdZdededdfdZy)TestLinku   link 서브커맨드 테스트.r   r/   r   Nc                    ddl }|j                  ddd      }t        j                  |       t        j                         }t        j
                  |d      }d}|d   }||v }	|	slt        j                  d|	fd	||f      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            dx}x}	}y)u   새 링크 추가.r   Nr   r  Fr   r   rn   r"   r}   )z%(py1)s in %(py4)sr7   r:   r;   )r   r   r   cmd_linkr<   r   r=   r>   r?   r@   rA   r   s               r   test_link_newzTestLink.test_link_new  s    !!;
QV!W
D||~dK02U>22z22222z2222z22222222222r0   c                 b   ddl }|j                  ddd      }t        j                  |       t        j                         }t        j
                  |d      }|d   }|j                  }d}	 ||	      }
d}|
|k(  }|st        j                  d	|fd
|
|f      t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}	x}
x}}y)u   중복 링크 방지.r   Nr$   r)   Fr  r"   r   r4   )zL%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.count
}(%(py5)s)
} == %(py10)s)r8   r   r   rP   py10zassert %(py12)spy12)r   r   r   r  r<   r   countr=   r>   r?   r@   rA   )rB   r   r/   r   r   r.   r   rC   rE   r   rW   @py_assert9r   @py_format11@py_format13s                  r   test_link_duplicatezTestLink.test_link_duplicate  s    !!;
QV!W
D||~dK0^$;$**;:;*:6;!;6!;;;;6!;;;$;;;*;;;:;;;6;;;!;;;;;;;;r0   )rs   rt   ru   rv   r   rw   r  r  rx   r0   r   r  r    s9    )	34 	3d 	3t 	3	< 	<D 	<T 	<r0   r  c                   $    e Zd ZdZdededdfdZy)TestJsonIntegrityu   JSON 무결성 테스트.r   r/   r   Nc                    t         j                  d }dgfd}|j                  t         d|       t        j                         }d|d   d   d<   t        j                  t         j                        5  t        j                  |       ddd       t        t        j                  d	
      5 }t        j                  |      }ddd       d   d   d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
y# 1 sw Y   xY w# 1 sw Y   xY w)u   저장 전 JSON 검증.c                 0    t        j                  ddd      )Ntestr&   r   rn   JSONDecodeError)fps    r   failing_loadz@TestJsonIntegrity.test_save_validates_json.<locals>.failing_load  s    &&vr155r0   r   c                 l    dxx   dz  cc<   d   dk(  rt        j                  ddd       |       S )Nr   r   rJ   r$  r&   r%  )r'  
call_countoriginal_loads    r   tracked_loadz@TestJsonIntegrity.test_save_validates_json.<locals>.tracked_load  s=    qMQM!}!**62q99 $$r0   ro   u   수정r+   r   Nrj   rk   r   r4   r6   r7   r:   r;   )rn   ro   r   r   r<   r   r   r&  r-   rm   r   r=   r>   r?   r@   rA   )rB   r   r/   r   r(  r,  r.   rp   originalrC   rD   rE   rF   rG   r*  r+  s                 @@r   test_save_validates_jsonz*TestJsonIntegrity.test_save_validates_json  s    			6 S
	% 	D&,7||~%-Xq'"]]4//0 	LL	 ",,1 	$Qyy|H	$!!$W-E1EE-1EEEEE-1EEEE-EEE1EEEEEEEE	 		$ 	$s   8E1E"E"E+)rs   rt   ru   rv   r   rw   r.  rx   r0   r   r!  r!    s&    #F!F04F	Fr0   r!  )%rv   builtinsrS   _pytest.assertion.rewrite	assertionrewriter=   rn   osshutilsystempfilepathlibr   r   __file__parent
SCRIPT_DIRpathinsertstrtodo_managerr   fixturer   rw   r/   r2   rz   r   r   r   r   r   r  r  r!  rx   r0   r   <module>r@     s  
   	  
    (^""
 3z? #  #D #T # #" $t $ $ $N1  1 h#+ #+L# #0=" ="@(  ( V(: (:V6 6"6" 6"r< <4"F "Fr0   