
    a.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mZ ddlZej                  dd       ZddZddZddZdd	Zdd
Zy)u   Phase β-2 watchdog verdict 통합 + archived/escalated 영구 박제 회귀 테스트.

task-2387: 회장 stalled 알림 영구 종료를 위한 4건 회귀 테스트.
    )annotationsN)Pathc                    dddddddddddd	ddd
dddi}| dz  }|j                  t        j                  |d             |S )uL   3개 status (running, archived, escalated)를 가진 임시 task-timers.jsontasksrunning	dev3-teamz2026-05-03T01:00:00Z)statusteam_id
start_timearchivedz2026-05-03T00:00:00Z	escalatedz2026-05-03T00:30:00Zz
anu-direct)task-runningtask-archivedtask-escalatedtask-anutask-timers.jsonF)ensure_ascii)
write_textjsondumps)tmp_pathdataps      ;/home/jay/workspace/tests/dev3/test_phase_beta2_watchdog.pyfixture_timers_filer      sh     	'0[Xno(2{Zpq)4\rs#,Ukl	
D 	%%ALLDu56H    c                    dddt        |       g}t        j                  |ddd      }|j                  j	                         j                  d      D cg c]  }|s|	 c}S c c}w )u=   session-watchdog.sh line 59 jq 쿼리 재현 (Phase β-2 후)jqz-rz.tasks | to_entries[] | select(.value.status == "running") | select(.value.status != "archived" and .value.status != "escalated") | select(.value.team_id != "anu-direct") | .keyT)capture_outputtextcheck
)str
subprocessrunstdoutstripsplit)timers_filecmdresultlines       r   _watchdog_jq_queryr-      sc     	d	8 	KC ^^C4tLF#]]00288>GT$DGGGs   A#A#c                   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	}||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)uH   Fix 1: archived task는 watchdog jq 쿼리에서 제외되어야 한다.r   not inz%(py1)s not in %(py3)skeyspy1py3assert %(py5)spy5Nr   )in)z%(py1)s in %(py3)s	r-   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   r2   @py_assert0@py_assert2@py_format4@py_format6s         r   )test_archived_task_excluded_from_watchdogrG   +   s    12D&?$&&&&?$&&&?&&&&&&$&&&$&&&&&&&!>T!!!!>T!!!>!!!!!!T!!!T!!!!!!!r   c                   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	}||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)
uI   Fix 1: escalated task는 watchdog jq 쿼리에서 제외되어야 한다.r   r/   r1   r2   r3   r6   r7   Nr   r9   rB   s         r   *test_escalated_task_excluded_from_watchdogrI   2   s    12D'4''''4'''''''''4'''4'''''''!:T!!!!:T!!!:!!!!!!T!!!T!!!!!!!r   c           
     L   dddddddii}| dz  }|j                  t        j                  |             | dz  }t        j                  d	d
dddt        |      gt        |d      d       |j                  |       t        j                  |j                               }|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)u<   Fix 3: jq로 status="escalated" 영구 박제 동작 검증.r   z	task-failr   r      )r	   r
   retry_count	max_retryr   ztask-timers.json.tmpr   z--argtidz!.tasks[$tid].status = "escalated"wT)r&   r!   r	   r   )==)z%(py1)s == %(py4)s)r4   py4zassert %(py6)spy6N)r   r   r   r$   r%   r#   openreplaceloads	read_textr:   r;   r<   r@   rA   )
r   r   timerstmp_outafterrC   @py_assert3rD   @py_format5@py_format7s
             r   (test_retry_max_triggers_escalated_statusr]   9   s    kiK`apq#rstD**F
djj&' //GNN	w{,OQTU[Q\]GS! OOFJJv'')*E>+&x0?K?0K????0K???0???K???????r   c           	     	   ddl }|j                  j                  dd       ddl}dddiddiddid	i}| d
z  }|j	                          |dz  }|j                  t        j                  |             |j                  |d|        |j                  }d}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                  |
      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            dx}x}x}	x}
x}}|j                  }d}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                  |
      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            dx}x}x}	x}
x}}|j                  }d}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                  |
      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            dx}x}x}	x}
x}}|j                  }d}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                  |
      t        j                  |      dz  }dd|iz  }t!        t        j"                  |            dx}x}x}	x}
x}}y)u\   Fix 2: _set_task_status는 archived/escalated를 영구 박제하여 변경을 차단한다.r   Nz/home/jay/workspacer   r	   r   r   r   )r   r   r   memoryr   	WORKSPACEr   F)is)z`%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s._set_task_status
}(%(py4)s, %(py6)s)
} is %(py11)sdispatch)py0py2rQ   rR   py8py11zassert %(py13)spy13r   r   	completedTztask-nonexistent)syspathinsertrb   mkdirr   r   r   setattr_set_task_statusr:   r;   r=   r>   r?   r<   r@   rA   )r   monkeypatchri   rb   r   
memory_dirr)   @py_assert1rZ   @py_assert5@py_assert7@py_assert10@py_assert9@py_format12@py_format14s                  r   2test_set_task_status_blocks_archived_and_escalatedrx   K   sN   HHOOA,- 	%y1&
3'5
D H$J11K4::d+,+x8$$I_IiI$_i@IEI@EIIII@EIIIIII8III8III$III_IIIiIII@IIIEIIIIIIII$$J%5JyJ$%5yAJUJAUJJJJAUJJJJJJ8JJJ8JJJ$JJJ%5JJJyJJJAJJJUJJJJJJJJ$$I^I[I$^[AITIATIIIIATIIIIII8III8III$III^III[IIIAIIITIIIIIIII$$K%7KK$%7CKtKCtKKKKCtKKKKKK8KKK8KKK$KKK%7KKKKKKCKKKtKKKKKKKKr   )r   r   returnr   )r)   r   ry   z	list[str])r   r   ry   None)r   r   ry   rz   )r   r   ro   zpytest.MonkeyPatchry   rz   )__doc__
__future__r   builtinsr=   _pytest.assertion.rewrite	assertionrewriter:   r   r$   pathlibr   pytestfixturer   r-   rG   rI   r]   rx    r   r   <module>r      sS    #        
H""@$Lr   