
    	iH                    P   d Z ddlm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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    4/home/jay/workspace/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                d   ddl m}  |t        |            }|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                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|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                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|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                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|j                  }d}	||	z  }
d}|
|z  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}	x}
x}}|j                  }d}	||	z  }
d}|
|z  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}	x}
x}}|j                   }d}	||	z  }
d}|
|z  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}	x}
x}}|j"                  }d}	||	z  }
d}|
|z  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}	x}
x}}y)u"   초기화 시 기본 경로 확인r   SessionResilienceworkspace_rooti@ ==)z5%(py2)s
{%(py2)s = %(py0)s.context_limit
} == %(py5)ssrpy0py2py5assert %(py7)spy7Ngffffff?)z3%(py2)s
{%(py2)s = %(py0)s.warning_pct
} == %(py5)sg333333?)z4%(py2)s
{%(py2)s = %(py0)s.critical_pct
} == %(py5)smemorytask-timers.json)zK%(py2)s
{%(py2)s = %(py0)s.timers_path
} == ((%(py4)s / %(py6)s) / %(py9)s)tmp_pathr,   r-   py4py6py9zassert %(py12)spy12token-ledger.json)zK%(py2)s
{%(py2)s = %(py0)s.ledger_path
} == ((%(py4)s / %(py6)s) / %(py9)s)events)zJ%(py2)s
{%(py2)s = %(py0)s.events_dir
} == ((%(py4)s / %(py6)s) / %(py9)s)sessions)zL%(py2)s
{%(py2)s = %(py0)s.sessions_dir
} == ((%(py4)s / %(py6)s) / %(py9)s))utils.session_resiliencer%   strcontext_limit
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationwarning_pctcritical_pcttimers_pathledger_path
events_dirsessions_dir)selfr3   r%   r*   @py_assert1@py_assert4@py_assert3@py_format6@py_format8@py_assert5@py_assert7@py_assert8@py_assert10@py_format11@py_format13s                  r   test_init_defaultsz(TestSessionResilience.test_init_defaultsJ   sA   >c(m< *7*7****7******r***r******7*******~~%%~%%%%~%%%%%%r%%%r%%%~%%%%%%%%%%&$&$&&&&$&&&&&&r&&&r&&&&&&$&&&&&&& ~~IHIH!4I7II!47I!II~!IIIII~!IIIIIIIrIIIrIII~IIIIIIIIIIIIHIII7IIIIIIIII~~JHJH!4J7JJ!47J!JJ~!JJJJJ~!JJJJJJJrJJJrJJJ~JJJJJJJJJJJJHJJJ7JJJJJJJJJ}}>8>8 3>h> 3h >>} >>>>>} >>>>>>>r>>>r>>>}>>>>>>>>>>>>8>>>h>>>>>>>>BXB(X"5B
B"5
"BB"BBBBB"BBBBBBBrBBBrBBBBBBBBB(BBB(BBBXBBB
BBBB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(  }	|	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}	}|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}	}|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}||v }	|	st        j                  d|	fd||f      t        j                  |      dt!        j"                         v st        j$                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            dx}}	y)u1   실행 중인 세션 없을 때 빈 결과 반환r   r$   z
task-100.1	dev2-teamr   	completedr1   Tparentsr2   r9   r&   checkedr(   z%(py1)s == %(py4)spy1r5   assert %(py6)sr6   Nwarnings	criticalsnormals	timestampinz%(py1)s in %(py3)sresultrb   py3assert %(py5)sr.   )r<   r%   r   r   r   mkdir
write_textjsondumpsr=   check_all_sessionsr?   r@   rD   rE   rF   rA   rB   rC   )rM   r3   r%   timers_dataledger_datar*   rk   @py_assert0rP   @py_assert2@py_format5@py_format7@py_format4rQ   s                 r   "test_check_all_sessions_no_runningz8TestSessionResilience.test_check_all_sessions_no_running[   sZ   > # ({Ck
 #2&	H	##D#1	H	1	1==djj>UV	H	2	2>>tzz+?VWc(m<&&(i %A% A%%%% A%%% %%%A%%%%%%%j!'R'!R''''!R'''!'''R'''''''k"(b("b(((("b((("(((b(((((((i %A% A%%%% A%%% %%%A%%%%%%%${f$$$${f$$${$$$$$$f$$$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(  }|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}}|	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}}|	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>   normal 레벨 세션은 warnings/criticals 리스트에 없음r   r$   順 z
task-200.1r[   r1   Tr]   r2   r9   r&   r_      r(   r`   ra   rc   r6   Nrd   re   rf   )r<   r%   r   r   r   r    ro   rp   rq   rr   r=   rs   r?   r@   rD   rE   rF   )rM   r3   r%   r   r   r   rt   ru   r*   rk   rv   rP   rw   rx   ry   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% A%%%% A%%% %%%A%%%%%%%j!'R'!R''''!R'''!'''R'''''''k"(b("b(((("b((("(((b(((((((i %A% A%%%% A%%% %%%A%%%%%%%r   c                X
   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(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                   |            dx}
x}}|	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   }
g }|
|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   }|d   }
|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      dt%        j&                         v st        j(                  |      rt        j                  |      nddz  }dd |iz  }t        t        j                   |            dx}
}d!}
|
|v }|st        j                  d"|fd#|
|f      t        j                  |
      d$t%        j&                         v st        j(                  |      rt        j                  |      nd$dz  }dd |iz  }t        t        j                   |            dx}
}d%}
|
|v }|st        j                  d"|fd#|
|f      t        j                  |
      d$t%        j&                         v st        j(                  |      rt        j                  |      nd$dz  }dd |iz  }t        t        j                   |            dx}
}y)&uK   warning 레벨 감지 시 이벤트 기록 및 warnings 리스트에 포함r   r$   I z
task-300.1r[   r1   Tr]   r2   r9   r&   r_   r~   r(   r`   ra   rc   r6   Nrd   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenr,   r-   r5   r0   assert %(py9)sr7   re   rf   r   z%(py1)s == %(py3)srl   rn   r.   	usage_pctrh   rj   warning
event_path)r<   r%   r   r   r   r    ro   rp   rq   rr   r=   rs   r?   r@   rD   rE   rF   r   rA   rB   rC   )rM   r3   r%   r   r   r   rt   ru   r*   rk   rv   rP   rw   rx   ry   rN   @py_assert6rS   rR   @py_format10r   rz   rQ   s                          r   %test_check_all_sessions_warning_levelz;TestSessionResilience.test_check_all_sessions_warning_level   sZ   > "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% A%%%% A%%% %%%A%%%%%%%*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++k"(b("b(((("b((("(((b(((((((i %A% A%%%% A%%% %%%A%%%%%%%$Q'y!,!W,,,,!W,,,!,,,,,,W,,,W,,,,,,,%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%&|w&&&&|w&&&|&&&&&&w&&&w&&&&&&&r   c                P   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(  }|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}}|
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}||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   }||k(  }|st        j                   d|fd||f      t        j"                  |      dt+        j,                         v st        j.                  |      rt        j"                  |      ndd z  }d!d"|iz  }t%        t        j&                  |            dx}}d#}||v }|st        j                   d$|fd%||f      t        j"                  |      d&t+        j,                         v st        j.                  |      rt        j"                  |      nd&d z  }d!d"|iz  }t%        t        j&                  |            dx}}d'}||v }|st        j                   d$|fd%||f      t        j"                  |      d&t+        j,                         v st        j.                  |      rt        j"                  |      nd&d z  }d!d"|iz  }t%        t        j&                  |            dx}}d(}||v }|st        j                   d$|fd%||f      t        j"                  |      d&t+        j,                         v st        j.                  |      rt        j"                  |      nd&d z  }d!d"|iz  }t%        t        j&                  |            dx}}d)}||v }|st        j                   d$|fd%||f      t        j"                  |      d&t+        j,                         v st        j.                  |      rt        j"                  |      nd&d z  }d!d"|iz  }t%        t        j&                  |            dx}}y# 1 sw Y   xY w)*u>   critical 레벨 감지 시 이벤트 기록 + resume 트리거r   r$     z
task-400.1r[   r1   Tr]   r2   r9   r&   subprocess.run
returncodeNr_   r~   r(   r`   ra   rc   r6   rd   re   r   r   r   r   r7   rf   r   r   rl   rn   r.   r   rh   rj   criticalr   summary_pathresume_triggeredr<   r%   r   r   r   r    ro   rp   rq   rr   r=   r   r   return_valuers   r?   r@   rD   rE   rF   r   rA   rB   rC   )rM   r3   r%   r   r   r   rt   ru   r*   mock_runrk   rv   rP   rw   rx   ry   rN   r   rS   rR   r   r   rz   rQ   s                           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% A%%%% A%%% %%%A%%%%%%%j!'R'!R''''!R'''!'''R'''''''+&,s&',1,'1,,,,'1,,,,,,s,,,s,,,&,,,',,,1,,,,,,,i %A% A%%%% A%%% %%%A%%%%%%%+&q)	"-"g----"g---"------g---g-------&{h&&&&{h&&&{&&&&&&h&&&h&&&&&&&'|x''''|x'''|''''''x'''x''''''')~))))~)))~))))))))))))))))!-!X----!X---!------X---X-------	- 	-s   "ZZ%c                   ddl m}  |t        |            }d}|ddd}ddd	}|j                  |||      }|d
   }||k(  }	|	st	        j
                  d|	fd||f      t	        j                  |      d
t        j                         v st	        j                  |      rt	        j                  |      nd
dz  }
dd|
iz  }t        t	        j                  |            d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}	}d}||v }	|	st	        j
                  d|	fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }
dd|
iz  }t        t	        j                  |            dx}}	|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   r$   r&   z
task-500.1r[   r   r   r}   r   r   r(   r   rl   rn   r.   Nr   r`   ra   rc   r6   r   r   rh   rj   r   level)normalr   r   )z%(py1)s in %(py4)s)r<   r%   r=   check_sessionr?   r@   rD   rA   rB   rC   rE   rF   )rM   r3   r%   r*   r   	task_infoledger_infor   rv   rw   rz   rQ   rP   rx   ry   s                  r   !test_check_session_returns_statusz7TestSessionResilience.test_check_session_returns_status   s   >c(m< 'K9U	'.;G!!'9kBi + G++++ G+++ ++++++G+++G+++++++i /K/ K//// K/// ///K///////n%00%0000%000%0000000000${f$$$${f$$${$$$$$$f$$$f$$$$$$$gC"CC"CCCCC"CCCCCCC"CCCC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 }
|
st        j                  d|
fd|	|f      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d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}
}t        |d         }|j                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d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}
}t!        j"                  |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#   }	|	|k(  }
|
st        j                  d|
fd$|	|f      t        j                  |	      d#t        j                         v st        j                  |      rt        j                  |      nd#dz  }dd|iz  }t        t        j                  |            dx}	}
y)%u&   WARNING 이벤트 파일 생성 확인r   r$   r1   r:   Tr]   r&   z
task-600.1r[   r        R@r   r   r   r   r   r   r   rh   rj   rk   rl   rn   r.   Nr   r(   r`   ra   rc   r6   Aassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r,   r-   r5   zsession-warning-z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.name
}rb   rm   r.   r/   r0   r   r   )r<   r%   ro   r=   handle_warningr?   r@   rD   rA   rB   rC   rE   rF   r   existsnamerq   loads	read_text)rM   r3   r%   rK   r*   r   r   session_statusrk   rv   rw   rz   rQ   rP   rx   ry   r   rN   rO   rR   
event_datas                        r   &test_handle_warning_creates_event_filez<TestSessionResilience.test_handle_warning_creates_event_file   s   >(83
&c(m<#
 ""7G^D%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%g+)+)++++)++++++)+++++++&./
  " """"""""z"""z""" """"""""""!'+>z>+>>>>+>>>+>>>>>>z>>>z>>>>>>>>>> ZZ
 4 4 67
'"/i/"i////"i///"///i///////)$/$////$///$////////////////r   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 }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            d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}}t!        |
d         }|j"                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d z  }t        t        j                  |            d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}}t'        j(                  |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&   }||k(  }|st        j                  d|fd'||f      t        j                  |      d&t        j                         v st        j                  |      rt        j                  |      nd&dz  }dd|iz  }t        t        j                  |            dx}}y# 1 sw Y   xY w)(u'   CRITICAL 이벤트 파일 생성 확인r   r$   r1   r:   r;   Tr]   r&   z
task-700.1r[   r        V@r   r   r   r   Nr   rh   rj   rk   rl   rn   r.   r   r(   r`   ra   rc   r6   r   r   session-critical-r   r   r/   r0   r   r   )r<   r%   ro   r=   r   r   r   handle_criticalr?   r@   rD   rA   rB   rC   rE   rF   r   r   r   rq   r   r   )rM   r3   r%   rK   rL   r*   r   r   r   r   rk   rv   rw   rz   rQ   rP   rx   ry   r   rN   rO   rR   r   s                          r   'test_handle_critical_creates_event_filez=TestSessionResilience.test_handle_critical_creates_event_file  s   >(83
(*Z7&4(c(m<#
 #$ 	J$-$;H!''.IF	J %|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%g,*,*,,,,*,,,,,,*,,,,,,,&./
  " """"""""z"""z""" """""""""""7),?
?,????,???,??????
???
?????????? ZZ
 4 4 67
'"0j0"j0000"j000"000j0000000)$/$////$///$////////////////	J 	Js   $%RRc                l
   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 }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                  |            dx}}t!        |
d         }|j"                  } |       }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d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}}|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                  |      d#z  }dd|iz  }t        t        j                  |            dx}x}}|j)                         }||v }|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}||v }|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/   CRITICAL 시 세션 요약 파일 저장 확인r   r$   r1   r:   r;   Tr]   r&   z
task-800.1r[   r   r   r   r   r   r   Nr   rh   rj   rk   rl   rn   r.   r   r   zsummary-r   r   r/   r0   z.mdr(   )z.%(py2)s
{%(py2)s = %(py0)s.suffix
} == %(py5)sr+   )z%(py0)s in %(py2)sr   content)r,   r-   zassert %(py4)sr5   r   )r<   r%   ro   r=   r   r   r   r   r?   r@   rD   rA   rB   rC   rE   rF   r   r   r   suffixr   )rM   r3   r%   rK   rL   r*   r   r   r   r   rk   rv   rw   rz   rQ   r   rN   rP   rx   rO   rR   r   @py_format3s                          r   *test_handle_critical_saves_session_summaryz@TestSessionResilience.test_handle_critical_saves_session_summary&  sP   >(83
(*Z7&4(c(m<#
 #$ 	J$-$;H!''.IF	J '~''''~'''~''''''''''''''''F>23""$"$$$$$$$$|$$$|$$$"$$$$$$$$$$'#8|'8'88#'88888#'8888#888888|888|888'88888888""+e+"e++++"e++++++|+++|+++"+++e+++++++ ((*'!!!!w'!!!!!!w!!!w!!!!!!'!!!'!!!!!!!'!!!!w'!!!!!!w!!!w!!!!!!'!!!'!!!!!!!	J 	Js   $%T))T3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   }g }d}||v }|}|sd |D        }t        |      }|}|sTt        j                  d|fd||f      t        j                  |      dt        j                         v st        j                   |      rt        j                  |      nddz  }dd|iz  }|j#                  |       |sddt        j                         v st        j                   t              rt        j                  t              ndt        j                        t        j                        dz  }|j#                  |       t        j$                  |d      i z  }dd|iz  }t'        t        j(                  |            dx}x}x}x}x}}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# 1 sw Y   xY w)&u4   CRITICAL 시 resume 트리거 (dispatch 호출 mock)r   r$   r1   r:   r;   Tr]   r&   z
task-900.1r[   r   r   r   r   r   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   rh   )z%(py3)s in %(py5)scmd)rm   r.   z%(py7)sr0   z(%(py13)s
{%(py13)s = %(py9)s(%(py11)s)
}any)r7   py11py13r~   zassert %(py16)spy16Nr   is)z%(py1)s is %(py4)sra   rc   r6   )r<   r%   ro   r=   r   r   r   r   assert_called_once	call_argsr   r?   r@   rD   rA   rB   rC   append_format_booloprE   rF   )rM   r3   r%   rK   rL   r*   r   r   r   r   rk   r   r   rN   rw   rO   rv   rV   @py_assert12rQ   rR   @py_format14@py_format15@py_format17rP   rx   ry   s                              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)\0\X[0\\S0\-\\-\\\\?c\\\?\\\\\\c\\\c\\\\\\\\\\S\\\S\\\0\\\\-\\\\\\\\\\\\\\	] ()1T1)T1111)T111)111T1111111	] 	]s   $GJ::K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 }|st#        j$                  d|fd||f      dt'        j(                         v st#        j*                  |      rt#        j,                  |      ndt#        j,                  |      t#        j,                  |      t#        j,                  |      t#        j,                  |      dz  }dd|iz  }t/        t#        j0                  |            dx}x}x}x}}yy# 1 sw Y   xY w)u2   이미 처리된 세션은 중복 트리거 방지r   r$   r1   r:   r;   Tr]   ztask-1000.1r[   r   z-20240101T000000.jsonr   )r   r   r   )r^   exist_okr2   r9   r&   r   r   Nre   r   Fr   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)sr4   assert %(py11)sr   )r<   r%   ro   rp   rq   rr   r   r   r   r    r=   r   r   r   rs   assert_not_calledgetr?   r@   rA   rB   rC   rD   rE   rF   )rM   r3   r%   rK   rL   r   r   existing_eventr   rt   ru   r*   r   rk   r   rN   rP   rS   rU   rT   r   @py_format12s                         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<< 23<u<3u<<<<3u<<<<<<8<<<8<<<<<<< 2<<<3<<<u<<<<<<<< 	) 	)s   &2I--I7c                   ddl m}m} d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d
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}} |t        |            }g }d}t        ||      }|}|sd
}||u}|}|sd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
                  |      dz  }|j                  |       |st        j                  dfd|f      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}}y
)!u   봇 ID ↔ 팀 매핑 확인r   )	BOT_TEAMSr%   anurh   rj   r   rl   rn   r.   N	dev1-teamr[   dev2r(   r`   ra   rc   r6   r&   	bot_teamsz.%(py7)s
{%(py7)s = %(py2)s(%(py3)s, %(py5)s)
}hasattrr*   )r-   rm   r.   r0   )is not)z%(py9)s is not %(py12)s)r7   r8   z%(py14)spy14r~   zassert %(py17)spy17)r<   r   r%   r?   r@   rD   rA   rB   rC   rE   rF   r=   r   r   r   )rM   r3   r   r%   rv   rw   rz   rQ   rP   rx   ry   r*   rN   rO   r   @py_assert11rV   rR   rX   r   @py_format16@py_format18s                         r   test_get_bot_mappingz*TestSessionResilience.test_get_bot_mapping  sb   I !u	!!!!u	!!!u!!!!!!	!!!	!!!!!!!'{i''''{i'''{''''''i'''i''''''''{i''''{i'''{''''''i'''i'''''''%//%////%///%////////// c(m<@;@wr;'@'@'D@9D+@@@@@@@w@@@w@@@@@@r@@@r@@@;@@@'@@@@'@@@9D@@@@@@9@@@9@@@D@@@@@@@@@@@@@@r   c                   ddl m}  |t        |            }d}|ddd}ddd	}|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   }t        j                  }d} ||      }||k(  }
|
st	        j
                  d|
fd||f      t	        j                  |      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}x}}y)u7   check_session이 70% 이상에서 warning 레벨 반환r   r$   r&   ztask-1100.1	dev3-teamr   r   r   r   r   r   r(   r`   ra   rc   r6   Nr   r   )zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}pytest)rb   rm   r.   r0   r7   r   r   )r<   r%   r=   r   r?   r@   rD   rE   rF   r   approxrA   rB   rC   )rM   r3   r%   r*   r   r   r   r   rv   rP   rw   rx   ry   rO   r   rU   r   r   s                     r    test_check_session_warning_levelz6TestSessionResilience.test_check_session_warning_level  s0   >c(m< 'K9U	'.;G!!'9kBg+)+)++++)++++++)+++++++k"9fmm9D9mD&99"&99999"&9999"999999f999f999m999D999&999999999r   c                t   ddl m}  |t        |            }d}|ddd}ddd	}|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}
}	y)u8   check_session이 85% 이상에서 critical 레벨 반환r   r$   r&   ztask-1200.1z	dev4-teamr   r   r   r   r   r   r(   r`   ra   rc   r6   N)	r<   r%   r=   r   r?   r@   rD   rE   rF   )rM   r3   r%   r*   r   r   r   r   rv   rP   rw   rx   ry   s                r   !test_check_session_critical_levelz7TestSessionResilience.test_check_session_critical_level  s    >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(  }
|
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   }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%   }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# 1 sw Y   xY w)&u=   여러 세션 동시 체크: normal, warning, critical 혼합r   r$   task-n.1r   task-w.1r[   task-c.1r   )r   r   r   r}   r   r   r1   Tr]   r2   r9   r&   r   r   Nr_      r(   r`   ra   rc   r6   rf   r~   rd   r   r   r   r   r7   re   r   )rM   r3   r%   rt   ru   r*   r   rk   rv   rP   rw   rx   ry   rN   r   rS   rR   r   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% A%%%% A%%% %%%A%%%%%%%i %A% A%%%% A%%% %%%A%%%%%%%*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!++++++++&,s&',1,'1,,,,'1,,,,,,s,,,s,,,&,,,',,,1,,,,,,,	- 	-s   '"O&&O0N)r3   r   returnNone)__name__
__module____qualname____doc__rY   r{   r   r   r   r   r   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   builtinsrA   _pytest.assertion.rewrite	assertionrewriter?   rq   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   