
     j/                    8   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   Zej                  j                  d ee              eej$                        D  cg c]  } | dk(  s| j'                  d      s|  c} D ]  Zej$                  j+                  ed         dd	lmZ ddlmZ  eej                  xs d
      Z ee      ev s
J de        edz  Z ee
      Zd Zd Zd Zd Z d Z!d Z"d Z#yc c} w )uP  task-2524+1 회귀 테스트 — automation observability v0

검증 7건:
1. mutation 정적 검사 PASS (gh pr merge / cokacdir --cron / --apply / git push 부재)
2. chat=6937032012 격리 (다른 chat record 자동 필터)
3. token raw value 0 노출 (ghs_/ghp_/github_pat_ prefix 부재)
4. 7 source 정합 (observability 7 키 모두 존재)
5. 기존 자동화 탭 회귀 (load_automation_status 응답에 observability 키 존재)
6. dead code 제거 검증 (routes_post.py 토글 2 함수 부재 + server.py router 등록 부재)
7. task-2526 영역 무수정 (parallel_safe 정합)
    )annotationsN)Path)patch   	dashboardz
dashboard.)
DataLoader z$wrong dashboard.data_loader loaded: c            	     T   t         dz  dz  t         dz  dz  g} g d}| D ]  }|j                         s
J d|        |j                  d      }|D ]T  }t        j                  ||t        j
                  t        j                  z        }|s<J d| d	|j                   d
|          t         dz  j                  d      }t        j                  d|t        j                        }|sJ d       |j                  d      }dD ]#  }t        j                  ||      sJ d| d        y)uC   변경 4 파일에서 mutation 명령어 부재 (read-only 강제).
componentsAutomationView.js!AutomationObservabilitySection.js)gh\s+pr\s+mergecokacdir\s+--cron	--apply\bzsubprocess.*git\s+pushzsubprocess.*commitz9fetch\(['\"][^'\"]*['\"]\s*,\s*\{[^}]*method:\s*['\"]POSTz8fetch\(['\"][^'\"]*['\"]\s*,\s*\{[^}]*method:\s*['\"]PUTz;fetch\(['\"][^'\"]*['\"]\s*,\s*\{[^}]*method:\s*['\"]DELETEz	missing: utf-8encodingzmutation pattern 'z' found in z: data_loader.pyu7   # ── observability v0.*?def toggle_pipeline_enabledzcollector section not foundr   )r   r   r   z
git\s+pushzgit.*commitz' found in collectorsN)
	DASHBOARDexists	read_textrefindall	MULTILINEDOTALLnamesearchgroup)	targetsforbidden_patternstargetcontentpatmatches
dl_contentcollector_sectionsection_texts	            >/home/jay/workspace/tests/dashboard/test_observability_2524.py test_observability_mutation_zeror)   .   sT    	L #66L #FFG	  ^}}4)F8 44""G"4% 	^Cjjgr||bii/GHG]"4SEV[[MQST[S\ ]];	^^ ..9979KJ		B
		
 ;;;$**1-Lf a99S,/`3EcUJ_1``/a    c           	     N  	
 | dz  		j                          	dz  }ddddddd	d
dddddd	ddddddd	g}|j                  dj                  d |D              dz   d       | dz  }|dz  j                  d       t        |      }t	        d      5 }t
        
	
fd}||_        |j                  d      }ddd       d   du sJ |d    dk(  sJ t        j                  |d!"      }d|vsJ d|vsJ t        |d#         d$k(  sJ |d#   d%   d&   dk(  sJ y# 1 sw Y   cxY w)'uE   다른 chat record는 schedule_history 응답에서 자동 필터됨.schedule_historyzTEST0001.logz2026-05-10T09:00:00+09:00TEST0001l   L5: okownerd   )tsschedule_idchat_idstatuspromptduration_msz2026-05-10T09:01:00+09:00l   c(	 OTHER_CHAT_LEAK_PROBE   z2026-05-10T09:02:00+09:00i5:BerrorOTHER_CHAT_ERROR_PROBEi,  
c              3  F   K   | ]  }t        j                  |        y w)N)jsondumps).0rs     r(   	<genexpr>z:test_chat_isolation_filters_other_chats.<locals>.<genexpr>`   s     !AA$**Q-!As   !r   r   	workspacememoryTparentszdashboard.data_loader.Pathc                "    | dk(  rS  |       S )Nz$/home/jay/.cokacdir/schedule_history )arghistory_diroriginals    r(   
_path_sidez;test_chat_isolation_filters_other_chats.<locals>._path_sidej   s    <<""C= r*   )r3   N	availabler3   Fensure_asciirecords   r   r2   )mkdir
write_textjoinr   r   r   side_effect'_collect_schedule_history_chat_filteredr=   r>   len)tmp_pathlog_pathrO   rB   dl	mock_pathrK   resultblobrI   rJ   s            @@r(   'test_chat_isolation_filters_other_chatsr]   V   s   //K^+H*:R\hlx  QT  	U*:R\hl  yP  ad  	e*:R\ho  |T  eh  	iG
 		!A!AADHSZ[;&I   .	I	B	+	, 
P		!
 !+	;;J;O
P +$&&&)
***::f51D"$...#4///vi !Q&&&)Q.*<<<)
P 
Ps   &DD$c           
     T   | dz  }|dz  j                  d       t        |      }t        d      5 } t        dddd	d	d
             |_        |j                         }ddd       t        j                  d      }d|vsJ d       d|vsJ d       d|vsJ d       y# 1 sw Y   BxY w)u:   load_automation_status 응답 JSON에 token prefix 부재.rB   rC   TrD   $dashboard.data_loader.subprocess.runRrG   rP   r	   
returncodestdoutstderrNFrM   ghs_zreal token prefix ghs_ leakedghp_zreal token prefix ghp_ leakedgithub_pat_z$real token prefix github_pat_ leaked)rQ   r   r   typereturn_valueload_automation_statusr=   r>   )rW   rB   rY   mock_runr[   r\   s         r(   "test_token_raw_value_zero_exposurerl      s    ;&I   .	I	B	5	6 -( \S"Q"XZ.[ \ ^**,- ::f51D>>>>>>$L&LL$- -s   ,BB'c           
        | dz  }|dz  j                  d       t        |      }t        d      5 } t        dddd	d	d
             |_        |j                         }d d d        dv sJ |d   }h d}t        |j                               |k(  s$J dt        |j                                d|        y # 1 sw Y   YxY w)NrB   rC   TrD   r_   r`   rG   rP   r	   ra   observability>   pr_state	ci_gemini	lifecycle
critical_7
task_timertoken_sourcer,   z7 source mismatch: z != )rQ   r   r   rh   ri   rj   setkeys)rW   rB   rY   rk   r[   obsexpected_keyss          r(   !test_observability_7_keys_presentry      s    ;&I   .	I	B	5	6 -( \S"Q"XZ.[ \ ^**,- f$$$

!CM sxxz?m+g/B3sxxz?BSSWXeWf-gg+- -s   ,B55B>c           
     ,   | dz  }|dz  j                  d       t        |      }t        d      5 } t        dddd	d	d
             |_        |j                         }ddd       t        t              sJ d|v sJ d|v sJ d|v sJ y# 1 sw Y   .xY w)uM   load_automation_status() 응답 200 등가 + observability 키 + active flag.rB   rC   TrD   r_   r`   rG   rP   r	   ra   Nrn   last_updatedactive)rQ   r   r   rh   ri   rj   
isinstancedict)rW   rB   rY   rk   r[   s        r(   &test_load_automation_status_regressionr      s    ;&I   .	I	B	5	6 -( \S"Q"XZ.[ \ ^**,- fd###f$$$V###v- -s   ,B

Bc                 ~   t         dz  j                  d      } d| vsJ d       d| vsJ d       d| vsJ d	       d
| vsJ d       t         dz  j                  d      }d|vsJ d       d|vsJ d       t         dz  dz  j                  d      }d|vsJ d       d|vsJ d       d|vsJ d       d|vsJ d|vsJ y)uG   routes_post.py 토글 2 함수 부재 + server.py router 등록 부재.routes_post.pyr   r   z!def handle_post_automation_togglez7handle_post_automation_toggle still present (dead code)z(def handle_post_automation_system_togglez>handle_post_automation_system_toggle still present (dead code)handle_post_automation_togglez9handle_post_automation_toggle still referenced in __all__$handle_post_automation_system_togglez@handle_post_automation_system_toggle still referenced in __all__	server.pyz/api/automation/togglez./api/automation/toggle router still registeredz/api/automation/system-togglez5/api/automation/system-toggle router still registeredr   r   COMPLETED_FEATURESz$COMPLETED_FEATURES dead code presenthandleSystemTogglez$handleSystemToggle dead code presenthandlePipelineTogglez&handlePipelineToggle dead code presentN)r   r   )routes_post	server_pyavs      r(   test_dead_code_removedr      s=   //::G:LK.kA BABA5[H IHIH*+= DCD=1D KJKD [(33W3EI#94f6ff4*);t=tt; l
"%8
8	C	CW	C	UBr)Q+QQ)r)Q+QQ)!+U-UU+#2---*"444r*   c                 B   t         dz  dz  t         dz  dz  t         dz  dz  dz  t         dz  d	z  d
z  g} t        dz  dz  t        dz  dz  t        dz  t        dz  t        dz  t        h}|D ]  }|j                         rJ d|         | D ]  }||vrJ d|         y)uL   parallel_safe — task-2526 / task-2523 영역의 본 task 변경분 부재.scriptszsafe_cron_dispatch.pyutilszcron_targeting_audit.pytests
regressionz&test_cron_session_safety_guard_2526.pyrC   specszcron-targeting-spec.mdr   r   r   r   r   r   zexpected file missing: u   task-2526 영역 침범: N)PROJECT_ROOTr   
TESTS_2524r   )forbidden_pathsexpected_filesffps       r(   test_task_2526_area_untouchedr      s     	y #::w!::w-0XXx'),DD	O 	L #66L #FF$$$$KN  9xxz84QC88z9  J'I+DRD)II'Jr*   )$__doc__
__future__r   r=   r   syspathlibr   unittest.mockr   __file__resolverE   r   pathinsertstrlistmodules
startswith	_mod_namepopdashboard.data_loaderr   data_loader_dashboard_data_loader_mod_loaded_pathr   r   r)   r]   rl   ry   r   r   r   )ms   0r(   <module>r      s%  
 #  	 
   H~%%'//2 3|$ %!#++.a!{2BallS_F`!a %IKKOOIt$% - ;-66<"=
<L( *<.9( ;&	(^
"aP$=TM&h2$58JA bs   :DD