
    ;i(H                       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 ddlmZmZmZ ddlZ ee
j*                  j-                  dd            Z ee      ej2                  vr"ej2                  j5                  d ee             dd	lm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  
tests/test_session_monitor.py

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

테스트 항목:
- 초기 상태: total_tokens=0, level="normal"
- update()로 토큰 누적 → 70% 도달 시 level="warning"
- update()로 토큰 누적 → 85% 도달 시 level="critical"
- 임계값 커스텀 설정 테스트
- reset() 후 상태 초기화 확인
- 콜백 등록 + 호출 확인
- CLI --status 테스트 (mock으로)
    )annotationsN)Path)Any)	MagicMock	mock_openpatchWORKSPACE_ROOTz/home/jay/workspace)SessionMonitorc                  :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestInitialStateu3   SessionMonitor 초기 상태가 올바른지 확인c                8   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}}y )Nlimit@ ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6r
   get_usage_status
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationselfmonitorstatus@py_assert0@py_assert3@py_assert2@py_format5@py_format7s           1/home/jay/workspace/tests/test_session_monitor.pytest_default_context_limitz+TestInitialState.test_default_context_limit)   sf     "))+g)')'))))'))))))')))))))    c                8   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}}y )Ntotal_tokensr   r   r   r   r   r   r   r   s           r(   test_initial_total_tokens_zeroz/TestInitialState.test_initial_total_tokens_zero.   sj     "))+n%**%****%***%**********r*   c                8   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}}y )Nlevelnormalr   r   r   r   r   r   r   s           r(   test_initial_level_normalz*TestInitialState.test_initial_level_normal3   sf     "))+g*(*(****(******(*******r*   c                8   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}}y )N	usage_pct        r   r   r   r   r   r   r   s           r(   test_initial_usage_pct_zeroz,TestInitialState.test_initial_usage_pct_zero8   sj     "))+k")c)"c))))"c)))")))c)))))))r*   c                <   t        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 )	N順 context_limitr   r   r   r   r   r   r   r   s           r(   test_custom_context_limitz*TestInitialState.test_custom_context_limit=   sh     w7))+g)')'))))'))))))')))))))r*   c                f   t        dd      }|j                  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 )Nr7   g333333?)r9   warning_pct`  r   input_tokensoutput_tokensr/   warningr   r   r   r   r   r
   updater   r   r   r   r   r   r   s           r(   test_custom_warning_pctz(TestInitialState.test_custom_warning_pctB   s{     wDICD))+g+)+)++++)++++++)+++++++r*   c                f   t        dd      }|j                  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 )Nr7   g?)r9   critical_pcti_ r   r>   r/   criticalr   r   r   r   r   rB   r   s           r(   test_custom_critical_pctz)TestInitialState.test_custom_critical_pctI   s{     wTJCD))+g,*,*,,,,*,,,,,,*,,,,,,,r*   N)__name__
__module____qualname____doc__r)   r-   r1   r5   r:   rD   rH    r*   r(   r   r   &   s(    =*
+
+
*
*
,-r*   r   c                  L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)
TestUpdateuP   update()가 올바르게 토큰을 누적하고 레벨을 반환하는지 확인c                   t        ddd      }|j                  ddd      }d}||k(  }|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  }t        t        j                  |            d x}}y )Nr   ffffff?333333?r9   r<   rF   r7   ip  r>   r0   r   z%(py0)s == %(py3)sr/   py0py3assert %(py5)spy5
r
   rC   r   r   @py_builtinslocals_should_repr_global_namer   r   r   r    r!   r/   r%   @py_assert1@py_format4@py_format6s          r(   (test_update_returns_normal_below_warningz3TestUpdate.test_update_returns_normal_below_warningY   s}     wDW[\&QR  u    u      u   u          r*   c                   t        ddd      }|j                  ddd      }d}||k(  }|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  }t        t        j                  |            d x}}y )Nr   rQ   rR   rS   r7   i@  r>   rA   r   rT   r/   rU   rX   rY   rZ   r^   s          r(   $test_update_returns_warning_at_70pctz/TestUpdate.test_update_returns_warning_at_70pct_   }     wDW[\&QR!!u	!!!!u	!!!!!!u!!!u!!!	!!!!!!!r*   c                   t        ddd      }|j                  ddd      }d}||k(  }|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  }t        t        j                  |            d x}}y )Nr   rQ   rR   rS   r7   P  r>   rA   r   rT   r/   rU   rX   rY   rZ   r^   s          r(   -test_update_returns_warning_between_70_and_85z8TestUpdate.test_update_returns_warning_between_70_and_85e   re   r*   c                   t        d      }|j                  ddd      }d}||k(  }|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  }t        t        j                  |            d x}}y )Nr   r8   r7   ip r>   rG   r   rT   r/   rU   rX   rY   rZ   r^   s          r(   %test_update_returns_critical_at_85pctz0TestUpdate.test_update_returns_critical_at_85pctk   sx     w7&QR""u
""""u
""""""u"""u"""
"""""""r*   c                   t        d      }|j                  ddd       |j                  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 )Nr   r8   rg   i'  r>   0u  i  r,   is r   r   r   r   r   rB   r   s           r(   test_update_accumulates_tokensz)TestUpdate.test_update_accumulates_tokensq   s     w7HIGH))+n%//%////%///%//////////r*   c                d   t        d      }|j                  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 )Nr   r8   rl   i N  r>   r,   rg   r   r   r   r   r   rB   r   s           r(   (test_update_uses_input_and_output_tokensz3TestUpdate.test_update_uses_input_and_output_tokensx   s}     w7HI))+n%//%////%///%//////////r*   c                b   t        d      }|j                  ddi       |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 )Nr   r8   r?   rg   r,   r   r   r   r   r   rB   r   s           r(   "test_update_with_only_input_tokensz-TestUpdate.test_update_with_only_input_tokens~   s}     w7/0))+n%//%////%///%//////////r*   c                b   t        d      }|j                  ddi       |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 )Nr   r8   r@   rl   r,   r   r   r   r   r   rB   r   s           r(   #test_update_with_only_output_tokensz.TestUpdate.test_update_with_only_output_tokens   s}     w701))+n%//%////%///%//////////r*   c                   t        d      }|j                  i       }d}||k(  }|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  }t        t        j                  |            d x}}y )
Nr   r8   r0   r   rT   r/   rU   rX   rY   rZ   r^   s          r(   #test_update_empty_dict_stays_normalz.TestUpdate.test_update_empty_dict_stays_normal   ss     w7r"  u    u      u   u          r*   c                ~   t        d      }|j                  ddd       |j                         }|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 )Nr   r8   r7   rg   r>   r3   g     R@r   zL%(py1)s == %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py7)s)
}pytestr   rW   rY   py7py9assert %(py11)spy11)r
   rC   r   rx   approxr   r   r   r[   r\   r]   r   r   )
r    r!   r"   r#   @py_assert4@py_assert6@py_assert8r%   @py_format10@py_format12s
             r(   test_usage_pct_calculationz%TestUpdate.test_usage_pct_calculation   s     w7&IJ))+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*   N)rI   rJ   rK   rL   rb   rd   rh   rj   rm   ro   rq   rs   ru   r   rM   r*   r(   rO   rO   V   s7    Z!""#0000!
:r*   rO   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestGetUsageStatusu@   get_usage_status()가 올바른 형식을 반환하는지 확인c                `   t               }|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}||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 )Nr,   inz%(py1)s in %(py3)sr"   r   rW   rX   rY   r   r3   r/   )
r
   r   r   r   r   r[   r\   r]   r   r   )r    r!   r"   r#   r%   r`   ra   s          r(   test_returns_required_keysz-TestGetUsageStatus.test_returns_required_keys   s|    "))+'~''''~'''~'''''''''''''''' w&    w&   w      &   &       ${f$$$${f$$${$$$$$$f$$$f$$$$$$$ w&    w&   w      &   &       r*   c                h   t        ddd      }|j                  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 )Nr   rQ   rR   rS   " r   r>   r/   rA   r   r   r   r   r   rB   r   s           r(   test_level_warning_in_statusz/TestGetUsageStatus.test_level_warning_in_status   s~     wDW[\!DE))+g+)+)++++)++++++)+++++++r*   c                d   t        d      }|j                  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 )Nr   r8    r   r>   r/   rG   r   r   r   r   r   rB   r   s           r(   test_level_critical_in_statusz0TestGetUsageStatus.test_level_critical_in_status   sy     w7!DE))+g,*,*,,,,*,,,,,,*,,,,,,,r*   c                V   t        d      }|j                  ddd       |j                         }|d   }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d x}}y )Nr   r8   rg   r   r>   r3   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancefloat)rV   py2rW   rY   )r
   rC   r   r   r   r[   r\   r   r]   r   r   r   )r    r!   r"   r_   r   ra   s         r(   test_usage_pct_is_floatz*TestGetUsageStatus.test_usage_pct_is_float   s     w7CD))+ -5z-u55555555z555z555-555555u555u5555555555r*   N)rI   rJ   rK   rL   r   r   r   r   rM   r*   r(   r   r      s    J!,-6r*   r   c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)		TestResetuE   reset()이 올바르게 토큰 카운터를 초기화하는지 확인c                   t        d      }|j                  ddd       |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}}y )Nr   r8   r7   rg   r>   r,   r   r   r   r   r   r   	r
   rC   resetr   r   r   r   r   r   r   s           r(   test_reset_clears_tokensz"TestReset.test_reset_clears_tokens   s     w7&IJ))+n%**%****%***%**********r*   c                   t        d      }|j                  ddd       |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}}y )Nr   r8   r   r   r>   r/   r0   r   r   r   r   r   r   r   s           r(   test_reset_level_returns_normalz)TestReset.test_reset_level_returns_normal   s     w7!DE))+g*(*(****(******(*******r*   c                   t        d      }|j                  ddd       |j                  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 )Nr   r8   r   r   r>   rg   	new_totalr,   r   r   r   r   r   r   r   s           r(   test_reset_with_new_totalz#TestReset.test_reset_with_new_total   s     w7!DE'))+n%//%////%///%//////////r*   c                   t        d      }|j                  ddd       |j                  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 )Nr   r8   r   r   r>   rg   r   r/   r0   r   r   r   r   r   r   r   s           r(   'test_reset_with_new_total_updates_levelz1TestReset.test_reset_with_new_total_updates_level   s     w7!DE'))+g*(*(****(******(*******r*   c                d   t        ddd      }|j                  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 )Nr   rQ   rR   rS   I r   r/   rA   r   r   r   r   r   )r
   r   r   r   r   r   r   r   r   s           r(   !test_reset_with_new_total_warningz+TestReset.test_reset_with_new_total_warning   s{     wDW[\())+g+)+)++++)++++++)+++++++r*   c                   t        d      }|j                  ddd       |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}}y )Nr   r8   r7   rg   r>   r3   r4   r   r   r   r   r   r   r   s           r(   test_reset_usage_pct_zeroz#TestReset.test_reset_usage_pct_zero   s     w7&IJ))+k")c)"c))))"c)))")))c)))))))r*   N)
rI   rJ   rK   rL   r   r   r   r   r   r   rM   r*   r(   r   r      s#    O++0+,*r*   r   c                  @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestCallbacksuF   콜백 등록 및 자동 호출이 올바르게 동작하는지 확인c                    t        ddd      }t               }|j                  d|       |j                  ddd       |j	                          y 	Nr   rQ   rR   rS   rA   r   r   r>   r
   r   register_callbackrC   assert_called_oncer    r!   callbacks      r(   %test_register_warning_callback_calledz3TestCallbacks.test_register_warning_callback_called   sE     wDW[\;!!)X6!DE##%r*   c                    t        d      }t               }|j                  d|       |j                  ddd       |j	                          y )Nr   r8   rG   r   r   r>   r   r   s      r(   &test_register_critical_callback_calledz4TestCallbacks.test_register_critical_callback_called   s@     w7;!!*h7!DE##%r*   c                    t        d      }t               }|j                  d|       |j                  ddd       |j	                          y )Nr   r8   rA   i r   r>   )r
   r   r   rC   assert_not_calledr   s      r(   0test_warning_callback_not_called_below_thresholdz>TestCallbacks.test_warning_callback_not_called_below_threshold  s@     w7;!!)X6!DE""$r*   c                    t        ddd      }t               }t               }|j                  d|       |j                  d|       |j                  ddd	       |j	                          |j                          y )
Nr   rQ   rR   rS   rA   rG   r   r   r>   r
   r   r   rC   r   r   r    r!   
warning_cbcritical_cbs       r(   ,test_critical_callback_not_called_at_warningz:TestCallbacks.test_critical_callback_not_called_at_warning  sh     wDW[\[
k!!)Z8!!*k:!DE%%'%%'r*   c                  
 t        ddd      }g 
|j                  d
fd       |j                  ddd	       t        
      }d
}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nd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}}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}}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 )Nr   rQ   rR   rS   rA   c                &    j                  |       S )N)append)sreceiveds    r(   <lambda>zBTestCallbacks.test_callback_receives_status_dict.<locals>.<lambda>  s    xq7I r*   r   r   r>      r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr   )rV   r   rW   r   zassert %(py8)spy8r,   r   )z%(py1)s in %(py4)sr   r   r   r/   )r
   r   rC   r   r   r   r[   r\   r]   r   r   r   )r    r!   r%   @py_assert5r   r'   @py_format9r#   r$   r&   r   s             @r(   "test_callback_receives_status_dictz0TestCallbacks.test_callback_receives_status_dict  sa    wDW[\!!!)-IJ!DE8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!,!,~,,,,~,,,~,,,,,,,,,,%(1+%w+%%%%w+%%%w%%%+%%%%%%%r*   c                    t        ddd      }t               }t               }|j                  d|       |j                  d|       |j                  ddd       |j	                          |j	                          y r   r   )r    r!   cb1cb2s       r(   "test_multiple_callbacks_same_levelz0TestCallbacks.test_multiple_callbacks_same_level!  sh     wDW[\kk!!)S1!!)S1!DE  r*   c                    t        ddd      }t               }|j                  d|       |j                  ddd       |j                  d	dd       |j	                          y
)uS   warning에서 한 번만 호출되고, 이미 warning 상태에서 재호출 안됨r   rQ   rR   rS   rA   r   r   r>   i  Nr   r   s      r(   -test_callback_called_only_on_level_transitionz;TestCallbacks.test_callback_called_only_on_level_transition+  sV     wDW[\;!!)X6!DEBC##%r*   c                `   t        ddd      }t               }t               }|j                  d|       |j                  d|       |j                  ddd	       |j	                          |j                          |j                  d
dd	       |j	                          |j	                          y)u>   warning에서 critical로 전환 시 critical 콜백만 호출r   rQ   rR   rS   rA   rG   r   r   r>   rl   Nr   r   s       r(   1test_critical_callback_on_transition_from_warningz?TestCallbacks.test_critical_callback_on_transition_from_warning6  s     wDW[\[
k!!)Z8!!*k:!DE%%'%%'CD%%'&&(r*   N)rI   rJ   rK   rL   r   r   r   r   r   r   r   r   rM   r*   r(   r   r      s-    P&&%	(&!	&)r*   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestCLIStatusu?   CLI --status 모드가 올바른 JSON을 출력하는지 확인c           	     
   ddddddii}ddddddd	d
dii}|dz  }|dz  }|j                  t        j                  |             |j                  t        j                  |             ddlm}  |t        |      t        |            }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   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|d   d   }|d    }d}||k(  }	|	slt        j                  d|	fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}	}|d%   }d}||k(  }	|	slt        j                  d|	fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}	}|d&   }d	}||k(  }	|	slt        j                  d|	fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}	}|d'   }d(}||k(  }	|	slt        j                  d|	fd!||f      t        j                  |      t        j                  |      d"z  }d#d$|iz  }t        t        j                  |            dx}x}	}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),uN   mock으로 task-timers.json과 token-ledger.json을 제공하고 출력 검증tasksz
task-100.1z	dev6-teamrunningtask_idteam_idr"   abc123i8 r=   r   
   )
session_idr   r?   r@   r,   message_counttask-timers.jsontoken-ledger.jsonr   get_active_sessions_statustimers_pathledger_pathsessionsr   r   resultr   rX   rY   Nr   r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   rV   r   r   rz   assert %(py9)sr{   r   r   r   r   r   r   r,   r   r   r3   sessionr/   )
write_textjsondumpsutils.session_monitorr   strr   r   r   r[   r\   r]   r   r   r   )r    tmp_pathtask_timers_datatoken_ledger_datar   r   r   r   r#   r%   r`   ra   r_   r$   r   r   @py_format8r   r   r&   r'   s                        r(   test_cli_status_output_formatz+TestCLIStatus.test_cli_status_output_formatO  s    +*'
 "**$*%+$+%'	
 !33!44tzz*:;<tzz*;<=D+K(K(

 #zV####zV###z######V###V#######*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++$Q'y!1\1!\1111!\111!111\1111111y!0[0![0000![000!000[0000000~&1'1&'1111&'111&111'1111111w*7*7****7******7*******%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%!w'!!!!w'!!!w!!!!!!'!!!'!!!!!!!r*   c                :   ddddddii}ddddiii}|dz  }|d	z  }|j                  t        j                  |             |j                  t        j                  |             d
dlm}  |t        |      t        |            }|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   }	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)uM   55% 토큰 사용 시 warning 레벨 반환 (기본 임계값 50%/65% 기준)r   z
task-200.1	dev1-teamr   r   r,   i r   r   r   r   r   r   r/   rA   r   r   r   r   r   Nr3   g     K@rw   rx   ry   r|   r}   )r   r   r   r   r   r   r   r   r   r   r   rx   r~   r[   r\   r]   )r    r   r   r   r   r   r   r   r   r#   r$   r%   r&   r'   r   r   r   r   r   s                      r(   test_cli_status_warning_levelz+TestCLIStatus.test_cli_status_warning_level}  s    +*'
 "G
 !33!44tzz*:;<tzz*;<=D+K(K(
 $Q'w,9,9,,,,9,,,,,,9,,,,,,,{#:v}}:T:}T'::#':::::#'::::#::::::v:::v:::}:::T:::':::::::::r*   c                   ddddddii}di i}|dz  }|dz  }|j                  t        j                  |             |j                  t        j                  |             dd	lm}  |t        |      t        |      
      }|d   }g }	||	k(  }
|
slt        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}
}	y)u8   실행 중인 태스크가 없으면 빈 sessions 반환r   z
task-300.1r   	completedr   r   r   r   r   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   )r    r   r   r   r   r   r   r   r#   r$   r%   r&   r'   s                r(    test_cli_status_no_running_tasksz.TestCLIStatus.test_cli_status_no_running_tasks  s     +*)
 %bM!33!44tzz*:;<tzz*;<=D+K(K(
 j!'R'!R''''!R'''!'''R'''''''r*   c                   ddddddii}di i}|dz  }|dz  }|j                  t        j                  |             |j                  t        j                  |             dd	lm}  |t        |      t        |      
      }|d   }t        |      }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}	x}}
|d   d   d   }d}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}}	|d   d   d   }d}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}}	y)uD   running 태스크가 token-ledger에 없으면 0 토큰으로 표시r   z
task-400.1z	dev2-teamr   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   Nr,   r   r   r   r   r/   r0   )r   r   r   r   r   r   r   r   r   r[   r\   r]   r   r   r   )r    r   r   r   r   r   r   r   r_   r$   r   r   r   r   r#   r%   r&   r'   s                     r(   "test_cli_status_task_not_in_ledgerz0TestCLIStatus.test_cli_status_task_not_in_ledger  s    +*'
 %bM!33!44tzz*:;<tzz*;<=D+K(K(
 *%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++j!!$^49949999499949999999999j!!$W-99-9999-999-9999999999r*   N)rI   rJ   rK   rL   r   r   r   r   rM   r*   r(   r   r   L  s    I,"\ ;D(4:r*   r   )#rL   
__future__r   builtinsr[   _pytest.assertion.rewrite	assertionrewriter   r   ossyspathlibr   typingr   unittest.mockr   r   r   rx   environget
_WORKSPACEr   pathinsertr   r
   r   rO   r   r   r   r   rM   r*   r(   <module>r     s    #    	 
   5 5 "**..!13HIJ
z?#(("HHOOAs:' 0(- (-`=: =:J6 6F,* ,*hR) R)tG: G:r*   