
    Qi;                        d 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                  j                  dz  Zej                  j                  d ee             ddlZej"                  j%                  dedz        Zej"                  j)                  e      Zej,                  j/                  e       ddlZej4                  dedefd	       Zej4                  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memorytodo_managerztodo-manager.py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]   임시 디렉토리에서 테스트 (todo_utils의 파일 경로를 임시 경로로 패치).z	todo.jsonztodo.json.bakztodo-removed.jsonN)tu	TODO_FILEBACKUP_FILEREMOVED_FILE)r   	orig_todoorig_backuporig_removeds       I/home/jay/workspace/.worktrees/task-2117-dev1/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)tm	save_todo)r   datas     r   sample_todor2   0   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    t         j                         }|d   dk(  sJ |d   g k(  sJ y)u   빈 파일 로드.r,   r   r-   N)r/   	load_todoselfr   r1   s      r   test_load_emptyzTestLoadSave.test_load_empty[   s1    ||~I%'''H~###r3   r2   c                 r    t         j                         }t        |d         dk(  sJ |d   d   d   dk(  sJ y)u   기존 파일 로드.r-      r   r   r   N)r/   r7   lenr9   r   r2   r1   s       r   test_load_existingzTestLoadSave.test_load_existinga   s@    ||~4>"a'''H~a &+555r3   c                 x    dg d}t         j                  |       t        j                  j	                         sJ y)u   저장 시 파일 생성.r   )r,   r-   N)r/   r0   r	   r
   existsr8   s      r   test_save_creates_filez#TestLoadSave.test_save_creates_fileg   s.     B/
T||""$$$r3   c                     t         j                         }d|d   d   d<   t         j                  |       t        j                  j                         sJ y)u   저장 시 백업 생성.u	   수정됨r-   r   r   N)r/   r7   r0   r	   r   rA   r>   s       r   test_save_creates_backupz%TestLoadSave.test_save_creates_backupm   sB    ||~%0Xq'"
T~~$$&&&r3   c                     t         j                         }|d   j                  dddd       t         j                  |       t         j                         }t	        |d         dk(  sJ y)u   atomic write 검증.r-   z	issue-003XY)r   r   r      N)r/   r7   appendr0   r=   )r9   r   r2   r1   reloadeds        r   test_atomic_writezTestLoadSave.test_atomic_writet   sY    ||~X[S3OP 	T <<>8H%&!+++r3   c                     t         j                         }t         j                  |       t        t        j
                  d      5 }t        j                  |      }ddd       |k(  sJ y# 1 sw Y   xY w)u(   JSON 검증 (깨진 JSON 저장 방지).utf-8encodingN)r/   r7   r0   openr	   r
   jsonload)r9   r   r2   r1   frJ   s         r   test_json_validationz!TestLoadSave.test_json_validation   s[    ||~
T ",,1 	$Qyy|H	$4	$ 	$s   A++A4)__name__
__module____qualname____doc__r   r:   dictr?   rB   rD   rK   rT    r3   r   r5   r5   X   s    "$T $d $6 64 6D 6%D %T %'d ' 'RV '
,t 
,$ 
,4 
,	 $ 	 T 	 d 	 r3   r5   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   r2   r   Nc                     ddl }|j                  ddd      }t        j                  |       |j	                         }d|j
                  v sJ d|j
                  v sJ y)u   전체 목록.r   NFr   r!   rQ   r   r&   argparse	Namespacer/   cmd_list
readouterroutr9   r   r2   capsysr`   argscaptureds          r   test_list_allzTestList.test_list_all   sZ    !!$t%!H
D$$&hll***hll***r3   c                     ddl }|j                  ddd      }t        j                  |       |j	                         }d|j
                  v sJ d|j
                  vsJ y)u   프로젝트 필터.r   Nr   Fr^   r   r&   r_   re   s          r   test_list_filter_projectz!TestList.test_list_filter_project   s\     	!!*T!N
D$$&hll***(,,...r3   c                     ddl }|j                  ddd      }t        j                  |       |j	                         }d|j
                  vsJ d|j
                  v sJ y)u   상태 필터.r   Nr*   Fr^   r   r&   r_   re   s          r   test_list_filter_statusz TestList.test_list_filter_status   s\     	!!$}5!Q
D$$&(,,...hll***r3   )	rU   rV   rW   rX   r   rY   ri   rk   rm   rZ   r3   r   r\   r\      sY    )+4 +d +t +
/!
/04
/	
/
+!
+04
+	
+r3   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)TestShowu   show 서브커맨드 테스트.r   r2   r   Nc                     ddl }|j                  dd      }t        j                  |       |j	                         }d|j
                  v sJ y)u   존재하는 이슈 조회.r   Nr   Fissue_idrQ   r   )r`   ra   r/   cmd_showrc   rd   re   s          r   test_show_existingzTestShow.test_show_existing   sH     	!!;U!C
D$$&#x||333r3   c                     ddl }|j                  dd      }t        j                  t              5 }t
        j                  |       ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)   존재하지 않는 이슈.r   N	issue-999Frq      )	r`   ra   pytestraises
SystemExitr/   rs   valuecode)r9   r   r2   r`   rg   excs         r   test_show_not_foundzTestShow.test_show_not_found   s_    !!;U!C]]:& 	#KK	yy~~"""	 	s   A++A4)rU   rV   rW   rX   r   rY   rt   r   rZ   r3   r   ro   ro      s<    )	4!	404	4		4# #D #T #r3   ro   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                 J   ddl }|j                  dddddd      }t        j                  |       |j	                         }d|j
                  j                         v sd|j
                  v sJ t        j                         }t        |d	         d
k(  sJ |d	   d   d   dk(  sJ y)u   최소 필드로 추가.r   NNewProju
   새 이슈Fr   r   r    r!   r   rQ   successz"id"r-   rx   r   )	r`   ra   r/   cmd_addrc   rd   lowerr7   r=   )r9   r   rf   r`   rg   rh   r1   s          r   test_add_minimalzTestAdd.test_add_minimal   s    !! " 
 	

4$$&HLL..00Fhll4JJJ||~4>"a'''H~a +y888r3   c                     ddl }|j                  dddddd	      }t        j                  |       t        j	                         }|d
   d   }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ y)u   모든 필드로 추가.r   NFullProju   전체 이슈r   r*   u   상세 설명Fr   r-   r    r!   r   )r`   ra   r/   r   r7   )r9   r   r`   rg   r1   issues         r   test_add_fullzTestAdd.test_add_full   s    !!! ' " 
 	

4||~Xq!Z F***X-///]#666r3   c                 J   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(  sJ yc c}w )u   ID 자동 생성.r   NPT1Fr   T2r-   r   r<   )r`   ra   r/   r   r7   r=   set)r9   r   r`   args1args2r1   iidss           r   test_auto_id_generationzTestAdd.test_auto_id_generation   s     ""td4TX] # 
 	

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

5||~ $X/1qw//3s8}!!! 0s   8B )rU   rV   rW   rX   r   r   r   r   rZ   r3   r   r   r      s>    (9d 9t 9(74 7D 7("T "d "r3   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   r2   r   Nc                     ddl }|j                  ddddd      }t        j                  |       t        j	                         }t        j                  |d      }|d   dk(  sJ |d   J y)	u   상태 수정.r   Nr   r   Frr   r!   r    r   rQ   r!   r#   r`   ra   r/   
cmd_updater7   
find_issuer9   r   r2   r`   rg   r1   r   s          r   test_update_statuszTestUpdate.test_update_status  sr    !! $dQV " 
 	d||~dK0X&(((^$000r3   c                     ddl }|j                  ddddd      }t        j                  |       t        j	                         }t        j                  |d      }|d   dk(  sJ y)u   우선순위 수정.r   Nr   lowFr   r    r   )r9   r   r2   rf   r`   rg   r1   r   s           r   test_update_priorityzTestUpdate.test_update_priority  sd     	!! TPU " 
 	d||~dK0Z E)))r3   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)rv   r   Nrw   r   Fr   )r`   ra   ry   rz   r{   r/   r   r9   r   r2   r`   rg   s        r   test_update_not_foundz TestUpdate.test_update_not_found*  sU    !! $dQV " 
 ]]:& 	 MM$	  	  	    AA)	rU   rV   rW   rX   r   rY   r   r   r   rZ   r3   r   r   r   
  sV    +1 14 1D 1*!*04*	* 4  d  t  r3   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   r2   r   Nc                     ddl }|j                  dd        |j                  ddd      }t        j	                  |       t        j                         }t        |d         d	k(  sJ |d   d   d
   dk(  sJ y)u   확인 후 삭제.r   Nzbuiltins.inputc                      y)NyrZ   )_s    r   <lambda>z5TestRemove.test_remove_with_confirm.<locals>.<lambda>>  s    r3   r   Frr   forcerQ   r-   rx   r   r&   )r`   setattrra   r/   
cmd_remover7   r=   )r9   r   r2   monkeypatchr`   rg   r1   s          r   test_remove_with_confirmz#TestRemove.test_remove_with_confirm8  sy     	,m<!!;e%!P
d||~4>"a'''H~a &+555r3   c                     ddl }|j                  ddd      }t        j                  |       t        j	                         }t        |d         dk(  sJ y)	u   강제 삭제.r   Nr   TFr   r-   rx   )r`   ra   r/   r   r7   r=   )r9   r   r2   r`   rg   r1   s         r   test_remove_forcezTestRemove.test_remove_forceF  sJ    !!;d!O
d||~4>"a'''r3   c                 n   ddl }|j                  ddd      }t        j                  |       t        j
                  j                         sJ t        t        j
                  d      5 }t        j                  |      }ddd       t        d	         d
k(  sJ |d	   d   d   dk(  sJ y# 1 sw Y   -xY w)u   삭제된 이슈 백업.r   Nr   TFr   rM   rN   removedrx   r   )r`   ra   r/   r   r	   r   rA   rP   rQ   rR   r=   )r9   r   r2   r`   rg   rS   r   s          r   test_remove_creates_backupz%TestRemove.test_remove_creates_backupP  s     	!!;d!O
d%%'''"//G4 	#iilG	#79%&!+++y!!$T*k999	# 	#s   )B++B4)	rU   rV   rW   rX   r   rY   r   r   r   rZ   r3   r   r   r   5  sY    +6!6046	6(t ($ (4 (:!:04:	:r3   r   c                   $    e Zd ZdZdededdfdZy)
TestSubAddu"   sub-add 서브커맨드 테스트.r   r2   r   Nc                    ddl }|j                  ddd      }t        j                  |       t        j	                         }t        j                  |d      }t        |d         dk(  sJ |d   d	   d
   dk(  sJ |d   d	   d   du sJ y)u   sub_item 추가.r   Nr   u
   새 서브F)rr   r   rQ   r%   rH   r<   r   r   )r`   ra   r/   cmd_sub_addr7   r   r=   r   s          r   test_sub_addzTestSubAdd.test_sub_addc  s    !!;lQV!W
t||~dK05%&!+++[!!$W-===[!!$V,555r3   )rU   rV   rW   rX   r   rY   r   rZ   r3   r   r   r   `  s    ,6$ 6T 6d 6r3   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   r2   r   Nc                     ddl }|j                  ddddd      }t        j                  |       t        j	                         }t        j                  |d      }|d   d   d   d	u sJ |d   d   d
   dk(  sJ y)u   인덱스로 완료.r   Nr   ztask-123Frr   indexmatchr   rQ   r%   r   Tr   r`   ra   r/   cmd_sub_doner7   r   r   s          r   test_sub_done_by_indexz"TestSubDone.test_sub_done_by_indext  s    !! zPU " 
 	||~dK0[!!$V,444[!!$Y/:===r3   c                     ddl }|j                  ddddd      }t        j                  |       t        j	                         }t        j                  |d      }|d   d   d	   d
u sJ y)u   매칭으로 완료.r   Nr   r   ztask-456Fr   r%   r   Tr   r   s          r   test_sub_done_by_matchz"TestSubDone.test_sub_done_by_match  sl    !! IzX] " 
 	||~dK0[!!$V,444r3   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`   ra   ry   rz   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   )
rU   rV   rW   rX   r   rY   r   r   r   r   rZ   r3   r   r   r   q  ss    ->D >t >PT >5D 5t 5PT 5
"!
"04
"	
""D "t "PT "r3   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   r2   r   Nc                     ddl }|j                  ddd      }t        j                  |       t        j	                         }t        j                  |d      }d|d   v sJ y)u   새 링크 추가.r   Nr   r   Frr   r   rQ   r$   )r`   ra   r/   cmd_linkr7   r   r   s          r   test_link_newzTestLink.test_link_new  sW    !!;
QV!W
D||~dK0U>2222r3   c                     ddl }|j                  ddd      }t        j                  |       t        j	                         }t        j                  |d      }|d   j                  d      dk(  sJ y)	u   중복 링크 방지.r   Nr&   r+   Fr   r$   rx   )r`   ra   r/   r   r7   r   countr   s          r   test_link_duplicatezTestLink.test_link_duplicate  sb    !!;
QV!W
D||~dK0^$**:6!;;;r3   )rU   rV   rW   rX   r   rY   r   r   rZ   r3   r   r   r     s9    )	34 	3d 	3t 	3	< 	<D 	<T 	<r3   r   c                   $    e Zd ZdZdededdfdZy)TestJsonIntegrityu   JSON 무결성 테스트.r   r2   r   Nc                   	 t         j                  	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(  sJ y# 1 sw Y   SxY w# 1 sw Y   &xY w)u   저장 전 JSON 검증.r   c                 l    dxx   dz  cc<   d   dk(  rt        j                  ddd       |       S )Nr   rx   r<   testr(   )rQ   JSONDecodeError)fp
call_countoriginal_loads    r   tracked_loadz@TestJsonIntegrity.test_save_validates_json.<locals>.tracked_load  s=    qMQM!}!**62q99 $$r3   rR   u   수정r-   r   NrM   rN   r   )rQ   rR   r   r/   r7   ry   rz   r   r0   rP   r	   r
   )
r9   r   r2   r   r   r1   rS   originalr   r   s
           @@r   test_save_validates_jsonz*TestJsonIntegrity.test_save_validates_json  s     		S
	% 	D&,7||~%-Xq'"]]4//0 	LL	 ",,1 	$Qyy|H	$!!$W-1EEEE	 		$ 	$s   5C.C)C&)C2)rU   rV   rW   rX   r   rY   r   rZ   r3   r   r   r     s&    #F!F04F	Fr3   r   )(rX   rQ   osshutilsystempfilepathlibr   ry   __file__parent
MEMORY_DIRpathinsertstrimportlib.util	importlibutilspec_from_file_locationspecmodule_from_specr/   loaderexec_module
todo_utilsr	   fixturer   rY   r2   r5   r\   ro   r   r   r   r   r   r   r   rZ   r3   r   <module>r      sX  
  	  
    (^""))H4
 3z? # ~~--njK\>\]^^$$T*      #D #T # #" $t $ $ $N1  1 h#+ #+L# #0=" ="@(  ( V(: (:V6 6"6" 6"r< <4F Fr3   