
    iH                    6   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlZ eej                  j                  dd            Z ee      ej                   vr"ej                   j#                  d ee             ddZdd	Zdd
ZdddZ G d d      Zy)u8  
tests/test_session_resilience.py

SessionResilience 단위 테스트 (TDD - RED 단계)

테스트 항목:
- test_init_defaults: 초기화 시 기본 경로 확인
- test_check_all_sessions_no_running: 실행 중인 세션 없을 때 빈 결과
- test_check_all_sessions_normal_level: normal 레벨 세션은 actions 없음
- test_check_all_sessions_warning_level: warning 레벨 감지 시 이벤트 기록
- test_check_all_sessions_critical_level: critical 레벨 감지 시 이벤트 + resume 트리거
- test_check_session_returns_status: 개별 세션 체크 결과 형식 확인
- test_handle_warning_creates_event_file: WARNING 이벤트 파일 생성 확인
- test_handle_critical_creates_event_file: CRITICAL 이벤트 파일 생성 확인
- test_handle_critical_saves_session_summary: CRITICAL 시 세션 요약 저장 확인
- test_handle_critical_triggers_resume: CRITICAL 시 resume 트리거 (dispatch 호출 mock)
- test_already_handled_session_not_re_triggered: 이미 처리된 세션 중복 트리거 방지
- test_get_bot_mapping: 봇 ID ↔ 팀 매핑 확인
    )annotationsN)Path)	MagicMockpatchWORKSPACE_ROOTz/home/jay/workspacec                
    d| iS Ntasks r
   s    N/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_session_resilience.py_make_timersr   )       U    c                
    d| iS r	   r   r   s    r   _make_ledgerr   -   r   r   c                    | |ddS )Nrunningtask_idteam_idstatusr   )r   r   s     r   _make_running_taskr   1   s     r   c                    || | dz  | dz  dS )N   )r   total_tokensinput_tokensoutput_tokensr   r   r   s     r   _make_ledger_entryr    9   s"    $$)%*	 r   c                      e Zd 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y)TestSessionResilienceu1   SessionResilience 오케스트레이터 테스트c                R   ddl m}  |t        |            }|j                  dk(  sJ |j                  dk(  sJ |j
                  dk(  sJ |j                  |dz  dz  k(  sJ |j                  |dz  d	z  k(  sJ |j                  |dz  d
z  k(  sJ |j                  |dz  dz  k(  sJ y)u"   초기화 시 기본 경로 확인r   SessionResilienceworkspace_rooti@ gffffff?g333333?memorytask-timers.jsontoken-ledger.jsoneventssessionsN)
utils.session_resiliencer%   strcontext_limitwarning_pctcritical_pcttimers_pathledger_path
events_dirsessions_dir)selftmp_pathr%   srs       r   test_init_defaultsz(TestSessionResilience.test_init_defaultsJ   s    >c(m< 7***~~%%%$&&& ~~H!47I!IIII~~H!47J!JJJJ}}8 3h >>>>(X"5
"BBBBr   c                   ddl m} t        di t        dd      ddii      }t	        i       }|dz  j                  d	       |dz  d
z  j                  t        j                  |             |dz  dz  j                  t        j                  |              |t        |            }|j                         }|d   dk(  sJ |d   g k(  sJ |d   g k(  sJ |d   dk(  sJ d|v sJ y)u1   실행 중인 세션 없을 때 빈 결과 반환r   r$   z
task-100.1	dev2-teamr   	completedr(   Tparentsr)   r*   r&   checkedwarnings	criticalsnormals	timestampN)r-   r%   r   r   r   mkdir
write_textjsondumpsr.   check_all_sessions)r6   r7   r%   timers_dataledger_datar8   results          r   "test_check_all_sessions_no_runningz8TestSessionResilience.test_check_all_sessions_no_running[   s   > # ({Ck
 #2&	H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<&&(i A%%%j!R'''k"b(((i A%%%f$$$r   c                   ddl m} d}d}d}t        |t        ||      i      }t	        |t        ||      i      }|dz  j                  d       |dz  d	z  j                  t        j                  |             |dz  d
z  j                  t        j                  |              |t        |            }|j                         }	|	d   dk(  sJ |	d   g k(  sJ |	d   g k(  sJ |	d   dk(  sJ y)u>   normal 레벨 세션은 warnings/criticals 리스트에 없음r   r$   順 z
task-200.1r;   r(   Tr=   r)   r*   r&   r?      r@   rA   rB   N)r-   r%   r   r   r   r    rD   rE   rF   rG   r.   rH   )
r6   r7   r%   r   r   r   rI   rJ   r8   rK   s
             r   $test_check_all_sessions_normal_levelz:TestSessionResilience.test_check_all_sessions_normal_levelw   s   > "G-?-Q#RS"G-?g-V#WX	H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<&&(i A%%%j!R'''k"b(((i A%%%r   c                ,   ddl m} d}d}d}t        |t        ||      i      }t	        |t        ||      i      }|dz  j                  d       |dz  d	z  j                  t        j                  |             |dz  d
z  j                  t        j                  |              |t        |            }|j                         }	|	d   dk(  sJ t        |	d         dk(  sJ |	d   g k(  sJ |	d   dk(  sJ |	d   d   }
|
d   |k(  sJ d|
v sJ d|
v sJ y)uK   warning 레벨 감지 시 이벤트 기록 및 warnings 리스트에 포함r   r$   I z
task-300.1r;   r(   Tr=   r)   r*   r&   r?   rO   r@   rA   rB   r   	usage_pct
event_pathN)r-   r%   r   r   r   r    rD   rE   rF   rG   r.   rH   len)r6   r7   r%   r   r   r   rI   rJ   r8   rK   warnings              r   %test_check_all_sessions_warning_levelz;TestSessionResilience.test_check_all_sessions_warning_level   sI   > "G-?-Q#RS"G-?g-V#WX	H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<&&(i A%%%6*%&!+++k"b(((i A%%%$Q'y!W,,,g%%%w&&&r   c                   ddl m} d}d}d}t        |t        ||      i      }t	        |t        ||      i      }|dz  j                  d       |dz  d	z  j                  t        j                  |             |dz  d
z  j                  t        j                  |              |t        |            }t        d      5 }	t        d      |	_        |j                         }
ddd       
d   dk(  sJ |
d   g k(  sJ t        |
d         dk(  sJ |
d   dk(  sJ |
d   d   }|d   |k(  sJ d|v sJ d|v sJ d|v sJ d|v sJ y# 1 sw Y   exY w)u>   critical 레벨 감지 시 이벤트 기록 + resume 트리거r   r$     z
task-400.1r;   r(   Tr=   r)   r*   r&   subprocess.run
returncodeNr?   rO   r@   rA   rB   r   rS   rT   summary_pathresume_triggeredr-   r%   r   r   r   r    rD   rE   rF   rG   r.   r   r   return_valuerH   rU   )r6   r7   r%   r   r   r   rI   rJ   r8   mock_runrK   criticals               r   &test_check_all_sessions_critical_levelz<TestSessionResilience.test_check_all_sessions_critical_level   s   > "G-?-Q#RS"G-?g-V#WX	H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<#$ 	-$-$;H!**,F	- i A%%%j!R'''6+&'1,,,i A%%%+&q)	"g---h&&&x''')))!X---	- 	-s   "EEc                    ddl m}  |t        |            }d}|ddd}ddd	}|j                  |||      }|d
   |k(  sJ |d   dk(  sJ |d   dk(  sJ d|v sJ |d   dv sJ y)u)   개별 세션 체크 결과 형식 확인r   r$   r&   z
task-500.1r;   r   r   rN   r   r   r   r   rS   level)normalrV   rb   Nr-   r%   r.   check_sessionr6   r7   r%   r8   r   	task_infoledger_infor   s           r   !test_check_session_returns_statusz7TestSessionResilience.test_check_session_returns_status   s    >c(m< 'K9U	'.;G!!'9kBi G+++i K///n%000f$$$g"CCCCr   c                   ddl m} |dz  dz  }|j                  d        |t        |            }d}d	}||d
ddd}|j	                  |||      }d|v sJ |d   dk(  sJ t        |d         }	|	j                         sJ d| |	j                  v sJ t        j                  |	j                               }
|
d   dk(  sJ |
d   |k(  sJ y)u&   WARNING 이벤트 파일 생성 확인r   r$   r(   r+   Tr=   r&   z
task-600.1r;   rR        R@rV   r   r   r   rS   re   rT   re   zsession-warning-r   N)r-   r%   rD   r.   handle_warningr   existsnamerF   loads	read_text)r6   r7   r%   r4   r8   r   r   session_statusrK   rT   
event_datas              r   &test_handle_warning_creates_event_filez<TestSessionResilience.test_handle_warning_creates_event_file   s   >(83
&c(m<#
 ""7G^Dv%%%g)+++&./
  """!'+z>>> ZZ
 4 4 67
'"i///)$///r   c                0   ddl m} |dz  dz  }|dz  dz  }|j                  d       |j                  d        |t        |            }d	}d
}||dddd}t	        d      5 }	t        d      |	_        |j                  |||      }
ddd       d
v sJ |
d   dk(  sJ t        |
d         }|j                         sJ d| |j                  v sJ t        j                  |j                               }|d   dk(  sJ |d   |k(  sJ y# 1 sw Y   xY w)u'   CRITICAL 이벤트 파일 생성 확인r   r$   r(   r+   r,   Tr=   r&   z
task-700.1r;   rY        V@rb   ro   rZ   r[   NrT   re   session-critical-r   )r-   r%   rD   r.   r   r   r`   handle_criticalr   rq   rr   rF   rs   rt   )r6   r7   r%   r4   r5   r8   r   r   ru   ra   rK   rT   rv   s                r   'test_handle_critical_creates_event_filez=TestSessionResilience.test_handle_critical_creates_event_file  sU   >(83
(*Z7&4(c(m<#
 #$ 	J$-$;H!''.IF	J v%%%g*,,,&./
  """"7),
??? ZZ
 4 4 67
'"j000)$///	J 	Js   $%DDc                   ddl m} |dz  dz  }|dz  dz  }|j                  d       |j                  d        |t        |            }d	}d
}||dddd}t	        d      5 }	t        d      |	_        |j                  |||      }
ddd       d
v sJ t        |
d         }|j                         sJ d| |j                  v sJ |j                  dk(  sJ |j                         }||v sJ ||v sJ y# 1 sw Y   pxY w)u/   CRITICAL 시 세션 요약 파일 저장 확인r   r$   r(   r+   r,   Tr=   r&   z
task-800.1r;   rY   ry   rb   ro   rZ   r[   Nr]   zsummary-z.md)r-   r%   rD   r.   r   r   r`   r{   r   rq   rr   suffixrt   )r6   r7   r%   r4   r5   r8   r   r   ru   ra   rK   r]   contents                r   *test_handle_critical_saves_session_summaryz@TestSessionResilience.test_handle_critical_saves_session_summary&  sF   >(83
(*Z7&4(c(m<#
 #$ 	J$-$;H!''.IF	J '''F>23""$$$'#|'8'8888""e+++ ((*'!!!'!!!	J 	Js   $%C88Dc                   ddl m} |dz  dz  }|dz  dz  }|j                  d       |j                  d        |t        |            }d	}d
}||dddd}t	        d      5 }	t        d      |	_        |j                  |||      }
|	j                          |	j                  }|d   d   }d|v st        d |D              sJ ddd       
d   du sJ y# 1 sw Y   xY w)u4   CRITICAL 시 resume 트리거 (dispatch 호출 mock)r   r$   r(   r+   r,   Tr=   r&   z
task-900.1r;   rY   ry   rb   ro   rZ   r[   --resume-fromc              3  6   K   | ]  }d t        |      v   yw)r   N)r.   ).0args     r   	<genexpr>zMTestSessionResilience.test_handle_critical_triggers_resume.<locals>.<genexpr>g  s     0\QTCH1L0\s   Nr^   )r-   r%   rD   r.   r   r   r`   r{   assert_called_once	call_argsany)r6   r7   r%   r4   r5   r8   r   r   ru   ra   rK   r   cmds                r   $test_handle_critical_triggers_resumez:TestSessionResilience.test_handle_critical_triggers_resumeJ  s   >(83
(*Z7&4(c(m<#
 #$ 	]$-$;H!''.IF '') **IA,q/C"c)S0\X[0\-\\\	] ()T111	] 	]s   $A!CC c                    ddl m} |dz  dz  }|dz  dz  }|j                  d       |j                  d       d}d	}|d
| dz  }|j                  t	        j
                  d|d             d}t        |t        ||      i      }	t        |t        ||      i      }
|dz  j                  dd       |dz  dz  j                  t	        j
                  |	             |dz  dz  j                  t	        j
                  |
              |t        |            }t        d      5 }t        d      |_        |j                         }|j                          ddd       d   r|d   d   }|j!                  d      du sJ yy# 1 sw Y   -xY w)u2   이미 처리된 세션은 중복 트리거 방지r   r$   r(   r+   r,   Tr=   ztask-1000.1r;   rz   z-20240101T000000.jsonrb   )re   r   rY   )r>   exist_okr)   r*   r&   rZ   r[   NrA   r^   F)r-   r%   rD   rE   rF   rG   r   r   r   r    r.   r   r   r`   rH   assert_not_calledget)r6   r7   r%   r4   r5   r   r   existing_eventr   rI   rJ   r8   ra   rK   rb   s                  r   -test_already_handled_session_not_re_triggeredzCTestSessionResilience.test_already_handled_session_not_re_triggeredk  s   >(83
(*Z7&4( $(9'BW&XX!!$**zg-V"WX "G-?-Q#RS"G-?g-V#WX	H	##D4#@	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<#$ 	)$-$;H!**,F &&(	) +k*1-H<< 23u<<< 	) 	)s   &2FFc                    ddl m}m} d|v sJ d|v sJ d|v sJ |d   dk(  sJ  |t        |            }t	        |d      s|J y	y	)
u   봇 ID ↔ 팀 매핑 확인r   )	BOT_TEAMSr%   anu	dev1-teamr;   dev2r&   	bot_teamsN)r-   r   r%   r.   hasattr)r6   r7   r   r%   r8   s        r   test_get_bot_mappingz*TestSessionResilience.test_get_bot_mapping  so    I 	!!!i'''i'''%/// c(m<r;'9+@@@+@'r   c                    ddl m}  |t        |            }d}|ddd}ddd	}|j                  |||      }|d
   dk(  sJ |d   t	        j
                  d      k(  sJ y)u7   check_session이 70% 이상에서 warning 레벨 반환r   r$   r&   ztask-1100.1	dev3-teamr   r   rR   r   re   rV   rS   rn   N)r-   r%   r.   rh   pytestapproxri   s           r    test_check_session_warning_levelz6TestSessionResilience.test_check_session_warning_level  sp    >c(m< 'K9U	'.;G!!'9kBg)+++k"fmmD&9999r   c                    ddl m}  |t        |            }d}|ddd}ddd	}|j                  |||      }|d
   dk(  sJ y)u8   check_session이 85% 이상에서 critical 레벨 반환r   r$   r&   ztask-1200.1z	dev4-teamr   r   rY   r   re   rb   Nrg   ri   s           r   !test_check_session_critical_levelz7TestSessionResilience.test_check_session_critical_level  sT    >c(m< 'K9U	'.;G!!'9kBg*,,,r   c                   ddl m} t        t        dd      t        dd      t        dd      d	      }t	        t        d
d      t        dd      t        dd      d	      }|dz  j                  d       |dz  dz  j                  t        j                  |             |dz  dz  j                  t        j                  |              |t        |            }t        d      5 }t        d      |_        |j                         }ddd       d   dk(  sJ |d   dk(  sJ t        |d         dk(  sJ t        |d         dk(  sJ y# 1 sw Y   DxY w)u=   여러 세션 동시 체크: normal, warning, critical 혼합r   r$   task-n.1r   task-w.1r;   task-c.1r   )r   r   r   rN   rR   rY   r(   Tr=   r)   r*   r&   rZ   r[   Nr?      rB   rO   r@   rA   r_   )r6   r7   r%   rI   rJ   r8   ra   rK   s           r   &test_check_all_sessions_multiple_tasksz<TestSessionResilience.test_check_all_sessions_multiple_tasks  s`   > #.z;G.z;G.z;G
 #.wD.wD.wD
 
H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<#$ 	-$-$;H!**,F	- i A%%%i A%%%6*%&!+++6+&'1,,,	- 	-s   '"EEN)r7   r   returnNone)__name__
__module____qualname____doc__r9   rL   rP   rW   rc   rl   rw   r|   r   r   r   r   r   r   r   r   r   r   r"   r"   G   sY    ;C"%8&0': .DD$0B#0J""H2B%=NA:-!-r   r"   )r
   dictr   r   )r   r.   r   r.   r   r   )r;   )r   intr   r.   r   r   )r   
__future__r   rF   ossyspathlibr   unittest.mockr   r   r   environr   
_WORKSPACEr.   pathinsertr   r   r   r    r"   r   r   r   <module>r      s   ( #  	 
  * "**..!13HIJ
z?#(("HHOOAs:'W- W-r   