
    a&i%                        d Z ddlZddlZddlmZ ddlZej                  j                  dd       ddlZ	e	j                  j                  dd      Zeej                  J e	j                  j                  e      Zeej                   d<   ej                  j#                  e       ej$                  Zej&                  dedefd	       Z G d
 d      Z G d d      Zy)u  
test_cross_status_recovery.py — TaskTimer의 _load_cross_status() 파일 복구 테스트

테스트 항목:
  1. 손상된 JSON 파일을 생성 → _load_cross_status() 호출 → 정상 기본값 반환 확인
  2. 호출 후 디스크 파일이 정상 JSON으로 복구되었는지 확인
  3. 복구된 파일을 다시 로드하면 정상 기본값이 반환되는지 확인
    N)Pathz/home/jay/workspace/memory
task_timerz(/home/jay/workspace/memory/task-timer.pytmp_pathreturnc                 6    | dz  }|j                  dd       | S )u   임시 workspace 생성memoryT)parentsexist_ok)mkdir)r   
memory_dirs     B/home/jay/workspace/teams/dev2/tests/test_cross_status_recovery.pytmp_workspacer      s&     H$JTD1O    c                   p    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deddfdZdeddfd	Z	deddfd
Z
y)TestCrossStatusRecoveryu3   _load_cross_status() 파일 복구 기능 테스트r   r   Nc                    |dz  dz  }|j                  dd       t        t        |            }|j                         }|J d|v sJ d	|d   v sJ d
|d   v sJ d|d   v sJ d|d   v sJ dD ]  }|d   |   d   dk(  rJ  |j	                         sJ |j                  d      }t        j                  |      }d|v sJ d	|d   v sJ |d   d	   d   dk(  sJ y)u   
        손상된 JSON 파일 복구 테스트:
        1. 손상된 JSON 파일 생성
        2. _load_cross_status() 호출
        3. 정상 기본값 반환 확인
        4. 디스크 파일이 정상 JSON으로 복구됨 확인
        r   cross-functional-status.jsonz{"invalid": json}utf-8encodingworkspace_pathNcross_functionallokivenusmaatjanusr   r   r   r   statusidle)
write_text	TaskTimerstr_load_cross_statusexists	read_textjsonloads)selfr   cross_functional_filetimerresultagentrecovered_contentrecovered_datas           r   !test_corrupted_json_file_recoveryz9TestCrossStatusRecovery.test_corrupted_json_file_recovery*   s^    !. 8;Y Y(()<w(O ]);< ))+ !!!!V+++ 23333&!34444 23333&!34444 8 	IE,-e4X>&HHH	I %++---1;;W;M$56!^333(:;;;;01&9(CvMMMr   c                    |dz  dz  }|j                  dd       t        t        |            }|j                         }|J d|v sJ t        t        |            }|j                         }|J d|v sJ ||k(  sJ y)	u  
        복구된 파일이 다시 로드해도 유지되는지 확인:
        1. 손상된 JSON 파일로 첫 번째 로드
        2. 복구 확인
        3. 새로운 TaskTimer 인스턴스로 재로드
        4. 정상 데이터 반환 확인
        r   r   zcorrupted json contentr   r   r   Nr   r!   r"   r#   r$   )r)   r   r*   timer1result1timer2result2s          r   %test_recovery_persists_across_reloadsz=TestCrossStatusRecovery.test_recovery_persists_across_reloadsQ   s     !. 8;Y Y(()AG(T #m*<=++-"""!W,,, #m*<=++-"""!W,,, '!!!r   c                     |dz  dz  }|j                  dd       t        t        |            }|j                         J dv sJ t	        fd	d
D              sJ y)u   
        부분적으로 손상된 JSON 파일 복구:
        1. 부분적으로 손상된 JSON 파일 생성
        2. _load_cross_status() 호출
        3. 정상 기본값 반환 확인
        r   r   z{"cross_functional": {r   r   r   Nr   c              3   ,   K   | ]  }|d    v   yw)r   N ).0r-   r,   s     r   	<genexpr>zOTestCrossStatusRecovery.test_partial_corrupted_json_recovery.<locals>.<genexpr>   s     g55F#566gs   r   )r!   r"   r#   r$   all)r)   r   r*   r+   r,   s       @r   $test_partial_corrupted_json_recoveryz<TestCrossStatusRecovery.test_partial_corrupted_json_recoveryn   sx     !. 8;Y Y(()AG(T]);<))+ !!!!V+++gDfggggr   c                     |dz  dz  }|j                  dd       t        t        |            }|j                         }|J d|v sJ d	D ]  }|d   |   d
   dk(  rJ  y)u   
        빈 파일 복구:
        1. 빈 파일 생성
        2. _load_cross_status() 호출
        3. 정상 기본값 반환 확인
        r   r    r   r   r   Nr   r   r   r    r2   )r)   r   r*   r+   r,   r-   s         r   test_empty_file_recoveryz0TestCrossStatusRecovery.test_empty_file_recovery   s     !. 8;Y Y((g(>]);<))+ !!!!V+++7 	IE,-e4X>&HHH	Ir   c                    |dz  dz  }ddddddiddiddid	i}|j                  t        j                  |      d
       t        t	        |            }|j                         }||k(  sJ |d   d   d   dk(  sJ |d   d   d   dk(  sJ y)u   
        정상 JSON 파일은 덮어쓰지 않음 확인:
        1. 정상 JSON 파일 생성
        2. _load_cross_status() 호출
        3. 파일 내용이 유지되는지 확인
        r   r   r   activetask-100)r   task_idr   r    r   r   r   r   r   rE   N)r!   r'   dumpsr"   r#   r$   )r)   r   r*   original_datar+   r,   s         r   test_valid_json_not_overwrittenz7TestCrossStatusRecovery.test_valid_json_not_overwritten   s     !. 8;Y Y#+
C"F+!6*"F+	!
 	((M)BW(U]);<))+ &&&()&1(;xGGG()&1)<
JJJr   c                    |dz  dz  }|j                         rJ t        t        |            }|j                         }|J d|v sJ |j                         sJ t	        j
                  |j                  d            }||k(  sJ y)u   
        파일이 없으면 생성 확인:
        1. 파일 없음
        2. _load_cross_status() 호출
        3. 정상 파일이 생성됨 확인
        r   r   r   Nr   r   r   )r%   r"   r#   r$   r'   r(   r&   )r)   r   r*   r+   r,   
saved_datas         r   test_nonexistent_file_creationz6TestCrossStatusRecovery.test_nonexistent_file_creation   s     !. 8;Y Y )//111]);<))+ !!!!V+++ %++---ZZ 5 ? ? ? QR
V###r   )__name__
__module____qualname____doc__r   r0   r7   r>   rA   rH   rK   r:   r   r   r   r   '   s    =%Nt %N %NN"4 "D ":h$ h4 h&Id It I&KT Kd K4$D $T $r   r   c                   0    e Zd ZdZdeddfdZdeddfdZy)TestCrossStatusIntegrationu;   cross_start/cross_end와 함께 복구 기능 동작 확인r   r   Nc                 p   |dz  dz  }|j                  dd       t        t        |            }|j                         }|j	                  ddd	      }|d
   dk(  sJ |d   dk(  sJ |d   dk(  sJ t        j                  |j                  d            }|d   d   d
   dk(  sJ |d   d   d   dk(  sJ y)u   
        파일 복구 후 cross_start 정상 동작 확인:
        1. 손상된 파일 생성
        2. _load_cross_status() 복구
        3. cross_start 호출
        4. 에이전트 상태 확인
        r   r   zinvalid jsonr   r   r   r   rD   z	Test taskr   startedr-   rE   r   rC   N)r!   r"   r#   r$   cross_startr'   r(   r&   r)   r   r*   r+   _r,   rJ   s          r   test_cross_start_after_recoveryz:TestCrossStatusIntegration.test_cross_start_after_recovery   s     !. 8;Y Y(('(J]);< $$& ""6:{Ch9,,,g&(((i J... ZZ 5 ? ? ? QR
,-f5h?8KKK,-f5i@JNNNr   c                 ^   |dz  dz  }|j                  dd       t        t        |            }|j                         }|j	                  ddd	       |j                  d      }|d
   dk(  sJ |d   dk(  sJ t        j                  |j                  d            }|d   d   d
   dk(  sJ y)uB   
        파일 복구 후 cross_end 정상 동작 확인
        r   r   	corruptedr   r   r   r   ztask-200zAnother taskr   endedr-   r   r    N)	r!   r"   r#   r$   rT   	cross_endr'   r(   r&   rU   s          r   test_cross_end_after_recoveryz8TestCrossStatusIntegration.test_cross_end_after_recovery   s     !. 8;Y Y((w(G]);< $$& 	':~> )h7***g'))) ZZ 5 ? ? ? QR
,-g6x@FJJJr   )rL   rM   rN   rO   r   rW   r\   r:   r   r   rQ   rQ      s1    EOT Od O8K4 KD Kr   rQ   )rO   r'   syspathlibr   pytestpathinsertimportlib.util	importlibutilspec_from_file_locationspecloadermodule_from_spectask_timer_modulemodulesexec_moduler"   fixturer   r   rQ   r:   r   r   <module>rm      s     
   / 0 ~~--l<fgDKK3 33NN33D9 -L    ) *''	 D T  ]$ ]$@6K 6Kr   