
    ?i&                    :   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Zddlm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
ZddZddZy)u  
tests/test_session_integration.py

TDD RED Phase: 세션 자동 압축 모듈 통합 테스트 (task-1458.1)

테스트 항목:
1. test_dispatch_has_check_sessions_arg: dispatch.py의 argparse에 --check-sessions 인자 확인
2. test_dispatch_check_sessions_returns_json: dispatch.py --check-sessions 실행 시 JSON 반환 확인
3. test_team_prompts_include_session_monitoring: team_prompts.build_prompt()에 세션 모니터링 텍스트 포함
4. test_session_resilience_importable_from_dispatch: dispatch에서 SessionResilience import 가능 확인
5. test_session_auto_compress_importable: SessionAutoCompress 직접 import 가능 확인
6. test_session_resilience_check_all_sessions: SessionResilience.check_all_sessions() 구조 확인
    )annotationsN)PathWORKSPACE_ROOTz/home/jay/workspacec                    t         dz  } | j                  } |       }|st        j                  d|        dz   dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        j                  t        j                  t        |       dgddt        t               i t        j                   d	t        t               id
      }|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  }t        j                  d|j&                         dz   d|iz  }t        t        j                  |            dx}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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}	}y)u@   dispatch.py의 argparse에 --check-sessions 인자 존재 확인dispatch.pydispatch.py not found at C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}dispatch_pathpy0py2py4Nz--helpTr      capture_outputtextcwdenvtimeoutr   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresultr   r   py5zdispatch.py --help failed: 
>assert %(py7)spy7zcheck-sessionsin)z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
})py1py3r   zDdispatch.py --help output does not contain 'check-sessions' argument)
_WORKSPACEexists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation
subprocessrunsys
executablestrosenviron
returncode_call_reprcomparestderrstdout)
r
   @py_assert1@py_assert3@py_format5r   @py_assert4@py_format6@py_format8@py_assert0@py_assert2s
             5/home/jay/workspace/tests/test_session_integration.py$test_dispatch_has_check_sessions_argr@   !   s   .MN!N!NN%>}o#NNNNNNN=NNN=NNNNNN!NNNNNN ^^	]+X6
O=rzz=+S_=F PP!PPPPPPPPP6PPP6PPPPPPPPP%@#PPPPPPPPtv}}t},ttt}tttttttttvtttvttt}ttt.tttttttt    c                    t         dz  } | j                  } |       }|st        j                  d|        dz   dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        j                  t        j                  t        |       dgddt        t               i t        j                   d	t        t               id
      }|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  }t        j                  d|j&                         dz   d|iz  }t        t        j                  |            dx}x}}|j(                  j+                         }|s{t        j                  d      dz   ddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }	t        t        j                  |	            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  }t        j                  d|
       dz   d|iz  }t        t        j                  |            dx}}y) uD   dispatch.py --check-sessions 실행 시 유효한 JSON 반환 확인r   r   r	   r
   r   Nz--check-sessionsTr   r   r   r   r   r   r   r   z%dispatch.py --check-sessions failed: r   r   z,dispatch.py --check-sessions output is empty
>assert %(py0)sr   outputcheckedr   )z%(py1)s in %(py3)sdata)r    r!   z/JSON response missing 'checked' key. Response: 
>assert %(py5)sr   )r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   stripjsonloads)r
   r7   r8   r9   r   r:   r;   r<   rD   @py_format1rF   r=   r>   @py_format4s                 r?   )test_dispatch_check_sessions_returns_jsonrM   9   s   .MN!N!NN%>}o#NNNNNNN=NNN=NNNNNN!NNNNNN ^^	]+-?@
O=rzz=+S_=F ZZ!ZZZZZZZZZ6ZZZ6ZZZZZZZZZ%J6==/#ZZZZZZZZ ]]  "FAAAAAAAAA6AAA6AAAAA::fD V9VVV9VVV9VVVVVVVVVVVVV OPTvVVVVVVVrA   c                 \   ddl m}   | dddd      }|s{t        j                  d      d	z   d
dt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |j                         }d|v xs
 d|v xs d|v }|s{t        j                  d      d	z   d
dt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            y)uQ   team_prompts.build_prompt()에 세션 모니터링 관련 텍스트 포함 확인r   )build_prompt	dev2-teamz
task-999.1u   테스트 작업입니다.normal)team_idtask_id	task_desclevelz"build_prompt returned empty stringrC   r   promptu   세션 모니터링sessionu   세션zHteam_prompts.build_prompt() output does not contain session-related texthas_session_textN)prompts.team_promptsrO   r$   r%   r&   r'   r(   r)   r*   r+   lower)rO   rV   rK   prompt_lowerrX   s        r?   ,test_team_prompts_include_session_monitoringr\   Y   s    1 .	F 7777777776777677777 <<>L,6i)|:SiW_ciWigggggggggggggggggrA   c                    ddl } d}t        | |      }|st        j                  d      dz   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  }t        t        j                  |            dx}}| j                  }d	}||u }|st        j                  d
|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)u?   dispatch 모듈에서 SessionResilience import 가능성 확인r   N_SESSION_RESILIENCE_AVAILABLEzGdispatch module does not have '_SESSION_RESILIENCE_AVAILABLE' attributez7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrdispatch)r   r    r!   r   T)is)zE%(py2)s
{%(py2)s = %(py0)s._SESSION_RESILIENCE_AVAILABLE
} is %(py5)sr   z2dispatch._SESSION_RESILIENCE_AVAILABLE is not Truer   r   )r`   r_   r$   r%   r&   r'   r(   r)   r*   r+   r^   r4   )r`   r>   r:   r;   r7   r8   r<   s          r?   0test_session_resilience_importable_from_dispatchrb   s   s    2Q71 Q  Q?P?PPQ QJP&Q Q8P8P  Q QGPy  Q QJP&Q Q8P8P 	Q QGPy 	Q QGPy 2Q QGPy Q Q Q=P=PQ Q
 11oTo1T9ooo1Toooooo8ooo8ooo1oooTooo;oooooooorA   c                    ddl m}  d}| |u}|st        j                  d|fd| |f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      dz  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}t        | t              }|s!t        j                  d      dz   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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)uE   session_auto_compress.SessionAutoCompress 직접 import 가능 확인r   )SessionAutoCompressN)is not)z%(py0)s is not %(py3)srd   )r   r!   z2SessionAutoCompress import failed or returned NonerG   r   z"SessionAutoCompress is not a class7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancetyper   r    r   r   )utils.session_auto_compressrd   r$   r4   r&   r'   r(   r)   r%   r*   r+   rg   rh   )rd   r>   r7   rL   r;   r8   r9   s          r?   %test_session_auto_compress_importablerk      s   ?&*`d*```d````````````d```,``````` )40V0VV2VVVVVVV:VVV:VVVVVV)VVV)VVVVVV4VVV4VVV0VVVVVVrA   c                   ddl m} | dz  }|j                  dd       ddddd	d
ii}|dz  }|j                  t	        j
                  |d      d       dddddii}|dz  }|j                  t	        j
                  |d      d        |t        |             }|j                         }t        |t              }	|	s.t        j                  dt        |       d      dz   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dt        j                         v st        j                  t              rt        j                   t              ndt        j                   |	      dz  }
t#        t        j$                  |
            d}	h d}|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  }t        j                  d!|       d"z   d#|iz  }
t#        t        j$                  |
            d} |d$   }t        |t(              }|st        j                  d%t        |d$          d&      d'z   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}}|d*   }t        |t*              }|st        j                  d+t        |d*          d,      d'z   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}}|d.   }t        |t*              }|st        j                  d/t        |d.          d,      d'z   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}}|d0   }t        |t(              }|st        j                  d1t        |d0          d&      d'z   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)2uM   SessionResilience.check_all_sessions() 올바른 구조의 dict 반환 확인r   )SessionResiliencememoryT)parentsexist_oktasksz
task-100.1rP   running)rS   rR   statusztask-timers.jsonF)ensure_asciizutf-8)encodingi )rR   total_tokensztoken-ledger.json)workspace_rootzcheck_all_sessions() returned z, expected dictrf   rg   r   dictri   N>   rE   normalswarnings	criticalsr   )z%(py0)s in %(py2)skey)r   r   z4check_all_sessions() response missing required key: z
>assert %(py4)sr   rE   z'checked' value is z, expected intz7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}int)r   r   r!   r   rz   z'warnings' value is z, expected listlistr{   z'criticals' value is ry   z'normals' value is )utils.session_resiliencerm   mkdir
write_textrI   dumpsr0   check_all_sessionsrg   rx   r$   r%   rh   r&   r'   r(   r)   r*   r+   r4   r}   r~   )tmp_pathrm   
memory_dirfake_timerstimers_pathfake_ledgerledger_path
resiliencer   r8   r9   required_keysr|   r7   @py_format3r:   r;   s                    r?   *test_session_resilience_check_all_sessionsr      s   : H$JTD1 	'&#
K 11K4::kFQXY 	& &
K 22K4::kFQXY ##h-@J **,F fd#c#cc'Ed6l^Sb%ccccccc:ccc:ccccccfcccfccccccdcccdccc#cccccc DM [f}ZZZsfZZZZZZsZZZsZZZZZZfZZZfZZZZ TUXTYZZZZZZZ[ Y'l:'-l-ll1DT&QZJ[E\D]]k/lllllll:lll:lll'llllllllllll-llllll Z(q:($/q/qq3GVT^M_H`Gaap1qqqqqqq:qqq:qqq(qqqqqq$qqq$qqq/qqqqqq[)t:)40t0tt4I$vVaObJcIdds2ttttttt:ttt:ttt)tttttt4ttt4ttt0tttttt Y'l:'-l-ll1DT&QZJ[E\D]]k/lllllll:lll:lll'llllllllllll-llllllrA   )returnNone)r   r   r   r   )__doc__
__future__r   builtinsr&   _pytest.assertion.rewrite	assertionrewriter$   rI   r1   r,   r.   pathlibr   r2   getr"   r0   pathinsertr@   rM   r\   rb   rk   r    rA   r?   <module>r      s    #    	  
 "**..!13HIJ
z?#(("HHOOAs:'u0W@h4
p$W6mrA   