
    j?:                       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ZddlZddlmZ ddlZ ee      j)                         j*                  j*                  j*                  Zedz  dz  Zedz  dz  Zedz  d	z  d
z  Zedz  dz  ZdZdZddZej<                  dd       ZdddddZ d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*y)u  task-2591 regression — dry-run activation harness acceptance (§4.1~§4.5).

회장 LOCKED_v6 verbatim 박제 (memory/tasks/task-2591.md):
- R-02 (§4.1): single in-flight flock — 2nd concurrent invocation 즉시 reject (binary).
- R-03 (§4.2): production file sha256 pre/post invariant fixture (read-only).
- R-04 (§4.3): audit log path always assertion (prod audit-trail read-only).
- R-05 (§4.4): escalation_marker.ALLOWED_KINDS 에 'escalated' contract assertion.
- R-01 (§4.5): production mode FIFTH_TRUNCATE_GUARD_ESCALATION_MARKER_PATH override
  harness-level strip/unset + refuse 기록 (guard 본문 sha256 무변경).
- R-08 (§5.1): telegram mock path 는 isolated tmp prefix 내에서만.
- R-10 (§5.1): 부재 WORKSPACE env 부정 테스트.

R-07 verbatim: task-2590 test 상수 직접 import 금지 — 본 파일은 harness 만 wrap 호출.
대상: scripts/replacement_pr_dry_run_activation_harness.py (guard 본문 미수정 contract wrap)
    )annotationsN)Pathscriptsz,replacement_pr_dry_run_activation_harness.pyz*replacement_pr_dry_run_activation_guard.pymemoryeventsz'task-2590.guard-interface-contract.jsonzescalation_marker.pyW   K   c                   t        j                         }| j                  d      5 t        fdd      D ]  }|j	                  |        	 d d d        |j                         S # 1 sw Y   |j                         S xY w)Nrbc                 &     j                  d      S )Ni    )read)fps   Q/home/jay/workspace/tests/regression/test_task_2591_dry_run_activation_harness.py<lambda>z_sha256.<locals>.<lambda>)   s    "''$-     r   )hashlibsha256openiterupdate	hexdigest)pathhchunkr   s      @r   _sha256r   &   sj    A	4 B/5 	EHHUO	 ;;= ;;=s   &A&&A>c           
        | dz  }|dz  j                  d       |dz  dz  j                  d       d}d}|dz  d	z  }|dz  dz  d
z  }|j                  |       |j                  |       | dz  dz  }|j                  d       | |||t        j                  |      j	                         t        j                  |      j	                         t        |      t        |      dS )uJ   R-07: task-2590 fixture 상수 직접 import 않고 독립 fixture 구성.fixture_repoutilsT)parentstests
regressions   # fx runner baseline
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs   # fx test baseline
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBreplacement_pr_runner.py"test_replacement_pr_runner_2510.pyr   r   )tmp_rootevidence_dirrunner_path	test_path
runner_shatest_sharunner_size	test_size)mkdirwrite_bytesr   r   r   len)tmp_pathreporunner_contenttest_contentrunnertestevids          r   fxr6   .   s     n$D	G^4(	G^l"))$)7;N7LG^88F'>L(+OOD
~&\"h)DJJtJnn^4>>@NN<0::<>*&	 	r   	extra_env	lock_pathc               :   t         j                  j                         }t        | d         |d<   d|d<   t        | d   dz        |d<   |j	                  dd        |r|j                  |       t        j                  t        t              dd	t        t              d
t        | d         dt        | d         dt        | d         d| d   d| d   dt        | d         dt        | d         dt        |xs | d   dz        g}t        j                  |dd|dd      S )Nr$   	WORKSPACEmock"FIFTH_TRUNCATE_GUARD_TELEGRAM_MODEztg_mock.json'FIFTH_TRUNCATE_GUARD_TELEGRAM_MOCK_PATHFIFTH_TRUNCATE_GUARD_PRODUCTIONdry-run--workspace-root--evidence-dirr%   --runner-pathr&   --test-pathr'   --runner-baseline-sha256r(   --test-baseline-sha256r)   --runner-baseline-sizer*   --test-baseline-sizer+   --lock-pathh.lockT<   Fcapture_outputtextenvtimeoutcheck)osenvironcopystrpopr   sys
executableHARNESSr;   
subprocessrun)r6   r8   r9   rO   cmds        r   _dry_runr]   H   s   
**//
C2j>*C06C,-58J.9X5YC12GG-t4

9GiC	N#b01R./s2k?+"B|$4 "Z. #b&7"8B{O 4s9CJ()BDC >>#d3PRZ_``r   c                    dd l } | j                  t        j                  d            }g }| j	                  |      D ]i  }t        || j                        st        d |j                  D              s7|j                  t        | j                  |j                                     k |s{t        j                  d      dz   ddt        j                          v st        j"                  |      rt        j$                  |      ndiz  }t'        t        j(                  |            d	 |D        }t        |      }|st        j                  d
|       dz   dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      t        j$                  |      dz  }t'        t        j(                  |            d x}}y )Nr   utf-8encodingc              3  <   K   | ]  }t        |d d      dk(    yw)id ALLOWED_KINDSN)getattr).0ts     r   	<genexpr>z<test_r05_allowed_kinds_contains_escalated.<locals>.<genexpr>h   s#      0
89GAtR O30
s   u   ALLOWED_KINDS 상수 미발견z
>assert %(py0)spy0foundc              3  $   K   | ]  }d |v  
 yw)	escalatedN )rg   vs     r   ri   z<test_r05_allowed_kinds_contains_escalated.<locals>.<genexpr>m   s     /A{a/s   u   'escalated' 미포함: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyrj   py2py4)astparseESCALATION_MARKER	read_textwalk
isinstanceAssignrp   targetsappendlistliteral_evalvalue
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)rt   treerk   node@py_format1@py_assert1@py_assert3@py_format5s           r   )test_r05_allowed_kinds_contains_escalatedr   b   s4   99&00'0BCDE =dCJJ'C 0
=A\\0
 -
 LLc..tzz:;<	=
 2222222225222522222//R3//R/RR3J5'1RRRRRRR3RRR3RRR/RRR/RRRRRRr   c                   t         j                  j                         }t        | d         |d<   t	        j
                  t        j                  t        t              ddt        t              dt        t              dt        | d         dt        | d   d	z        gd
d
|d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|j(                         dz   d|iz  }t+        t        j,                  |            dx}x}}t/        j0                  |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   }	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
}|	|u }
|
slt        j                  d!|
fd"|	|f      t        j"                  |	      t        j"                  |      dz  }dd|iz  }t+        t        j,                  |            dx}	x}
}y)#u<   preflight 가 real contract MATCH 시 exit 0 + status MATCH.r$   r;   	preflight
--contractrA   rB   r%   z--emitztask-2591.preflight-result.jsonTrK   FrL   r   ==z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sprocrj   rr   py5zpreflight FAIL: 

>assert %(py7)spy7NstatusMATCHz%(py1)s == %(py4)spy1rs   assert %(py6)spy6mismatch_countmeasured_contract allowed_kinds_contains_escalatedisz%(py1)s is %(py4)s)rR   rS   rT   rU   rZ   r[   rW   rX   rY   CONTRACTr;   
returncoder   _call_reprcomparer   r   r   r   r   stdoutstderrr   r   jsonloads)r6   rO   r   r   @py_assert4r   @py_format6@py_format8payload@py_assert0@py_assert2r   @py_format7s                r   test_r05_preflight_match_passesr   p   s*   
**//
C2j>*C>>NNCL+#h-Ic"^"45c"^,/PPQ	
 $C5	D ??PaP?aPPP?aPPPPPP4PPP4PPP?PPPaPPP#3DKK=4;;-!PPPPPPPPjj%G8'''''''''''''''''''#$))$))))$)))$))))))))))&'(JKStSKtSSSSKtSSSKSSStSSSSSSSr   c                
   t        j                  t        j                  d            }d|d   d<   | d   dz  }|j	                  t        j
                  |      d       t        j                  j                         }t        | d         |d<   d	|d
<   t        | d   dz        |d<   t        j                  t        j                  t        t              ddt        |      dt        t              dt        | d         g	dd|dd      }|j                   }|t"        k(  }|s	t%        j&                  d|fd|t"        f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      dt)        j*                         v st%        j,                  t"              rt%        j.                  t"              nddz  }t%        j0                  d|j                          dz   d|iz  }t3        t%        j4                  |            dx}}t        j                  |j6                        }	|	d   }
d }|
|k(  }|slt%        j&                  d|fd!|
|f      t%        j.                  |
      t%        j.                  |      d"z  }d#d|iz  }t3        t%        j4                  |            dx}
x}}|	d$   }
d}|
|u }|slt%        j&                  d%|fd&|
|f      t%        j.                  |
      t%        j.                  |      d"z  }d#d|iz  }t3        t%        j4                  |            dx}
x}}d' |	d(   D        }t9        |      }|sd)d*t)        j*                         v st%        j,                  t8              rt%        j.                  t8              nd*t%        j.                  |      t%        j.                  |      dz  }t3        t%        j4                  |            dx}}| d   d+z  d,z  d-z  }|j:                  } |       }|st%        j0                  d.|       d/z   d0t)        j*                         v st%        j,                  |      rt%        j.                  |      nd0t%        j.                  |      t%        j.                  |      dz  }t3        t%        j4                  |            dx}}t        j                  |j                  d            }|d1   }
d2}|
|k(  }|slt%        j&                  d|fd!|
|f      t%        j.                  |
      t%        j.                  |      d"z  }d#d|iz  }t3        t%        j4                  |            dx}
x}}y)3uM   contract sha 변조 → §2.3 HOLD action (exit 87 + escalation marker emit).r_   r`   @0000000000000000000000000000000000000000000000000000000000000000contract_invariantsscript_sha256r$   zbad-contract.jsonr;   r<   r=   tg.jsonr>   r   r   rA   rB   r%   TrK   FrL   r   z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py4)sr   HALT_EXIT_CODErq   zexpected 87, got z
>assert %(py6)sr   Nr   HOLD_FOR_CHAIRr   r   r   replacement_pr_runner_executedr   r   c              3  ,   K   | ]  }|d    dk(    yw)fieldr   Nrn   )rg   ms     r   ri   z8test_preflight_mismatch_triggers_hold.<locals>.<genexpr>   s     Lqz_,Ls   
mismatchesz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rp   r   r   ztask-2591.done.escalatedu   escalation marker 미생성: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}emkindrm   )r   r   r   rw   
write_textdumpsrR   rS   rT   rU   rZ   r[   rW   rX   rY   r;   r   r   r   r   r   r   r   r   r   r   r   r   rp   exists)r6   badbad_pathrO   r   r   r   r   r   r   r   r   r   
em_payloads                 r   %test_preflight_mismatch_triggers_holdr      s   
**X'''9
:C2:C/*~ 33H

3':
**//
C2j>*C06C,-58J)9S5TC12>>NNCL+#h-Ic"^"45		
 $C5D ??S?n,SSS?nSSSSSS4SSS4SSS?SSSSSSnSSSnSSSS0A$//AR.SSSSSSSjj%G80 00 00000 0000000 0000000034==4====4===4==========Lgl6KLL3LLLLLLLLL3LLL3LLLLLLLLLLLLLL	J(	"X	-0J	JB99<9;<;<<7t<<<<<<<2<<<2<<<9<<<;<<<<<<BLL'L:;Jf,,,,,,,,,,,,,,,,,,,r   c                   | d   dz  }ddi}t         j                  j                  d      5 }|j                  t        | ||      }|j                  t        | ||      }|j                         |j                         }}ddd       t        j                  j                  g      }d	t        g}	||	k(  }
|
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|j                    d|j                          dz   d|iz  }t#        t        j$                  |            dx}
}	|j                  t        k(  r|n|}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}	}y# 1 sw Y   xY w)u@   2 concurrent dry-run → 1 PASS, 1 SINGLE_IN_FLIGHT_REJECT (75).r$   zshared.lock#FIFTH_TRUNCATE_HARNESS_LOCK_HOLD_MS1500   )max_workersr7   Nr   r   )z%(py0)s == %(py3)scodes)rj   py3zexpected [0, 75], got r   z
>assert %(py5)sr   r   SINGLE_IN_FLIGHT_REJECTr   r   r   r   )
concurrentfuturesThreadPoolExecutorsubmitr]   resultsortedr   SINGLE_IN_FLIGHT_REJECT_CODEr   r   r   r   r   r   r   r   r   r   r   r   )r6   lockhold_envexf1f2r1r2r   r   r   @py_format4r   rejectedr   r   r   r   s                     r   +test_r02_single_in_flight_concurrent_rejectr      s   j>M)D5v>H				.	.1	.	= *YYxx4YHYYxx4YHbiikB* BMM2==12E45 555  55              6    !r"))BryykB     ]]&BBrH::hoo&x0M4MM04MMMMM04MMMM0MMM4MMMMMMMM* *s   AH==Ic                   t         dz  dz  }t         dz  dz  dz  }t        |      t        |      f}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  }t	        j                  |j                   d|j                         dz   d|iz  }	t        t	        j                  |	            d x}x}}t        |      t        |      f}
||
k(  }|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 }t        j                   | d   dz  j#                               }|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}}|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 ) Nr   r"   r    r!   r#   r   r   r   r   r   r   r   r   )z%(py0)s == %(py2)sprepost)rj   rr   u:   production runner/test sha256 변경 감지 (§4.2 위반)z
>assert %(py4)srs   r%   #task-2591.replacement-decision.jsonforbidden_path_guard	unchangedTr   r   r   r   r   guard_body_unchanged)r;   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   )r6   prod_runner	prod_testr   r   r   r   r   r   r   r   @py_format3r   decisionr   r   r   s                    r   )test_r03_production_file_sha256_invariantr      s#   g%(BBKG#l25YYI;!3
4CB<D??@a@?a@@@?a@@@@@@4@@@4@@@?@@@a@@@DKK=4;;-!@@@@@@@@K ')"45D$;TTT3$TTTTTT3TTT3TTTTTT$TTT$TTTTTTTTTTTzz2n-0UU``bcH*+K8@D@8D@@@@8D@@@8@@@D@@@@@@@*+3t3+t3333+t333+333t3333333r   c                d   t        j                  t        j                  d            }d|d   d<   | d   dz  }|j	                  t        j
                  |      d       t        j                  j                         }t        | d         |d<   t        j                  t        j                  t        t              d	d
t        |      dt        t              dt        | d         g	dd|dd      }|j                   }|t"        k(  }|st%        j&                  d|fd|t"        f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      dt)        j*                         v st%        j,                  t"              rt%        j.                  t"              nddz  }dd|iz  }t1        t%        j2                  |            dx}}| d   dz  dz  dz  }	t        |	      }
|
j4                  }| d   }t        |      } ||      }|s[d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t)        j*                         v st%        j,                  t              rt%        j.                  t              ndt%        j.                  |      t%        j.                  |      t%        j.                  |      d z  }t1        t%        j2                  |            dx}
x}x}x}}t        |	      }
|
j4                  }d}t        |z  }d!}||z  }t        |      } ||      }| }|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t)        j*                         v st%        j,                  t              rt%        j.                  t              nddt)        j*                         v st%        j,                  t              rt%        j.                  t              ndt%        j.                  |      t%        j.                  |      t%        j.                  |      t%        j.                  |      d#
z  }t1        t%        j2                  |            dx}
x}x}x}x}x}x}x}}t        dz  d!z  d$z  }|j7                         rot9        |      }|j                  dd%&      }t9        |      }
|
|k(  }|s9t%        j&                  d|fd'|
|f      d(t)        j*                         v st%        j,                  t8              rt%        j.                  t8              nd(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*d+z  }t%        j:                  d,      d-z   d.|iz  }t1        t%        j2                  |            dx}
}yy)/uP   tmp WORKSPACE 격리 — prod audit-trail 존재 여부 무관 always assertion.r_   r`   @ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffr   test_sha256r$   z	bad2.jsonr;   r   r   rA   rB   r%   TrK   FrL   r   r   r   r   rq   r   r   Nr   zorchestration-auditzstate-recovery.jsonlassert %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.startswith
}(%(py10)s
{%(py10)s = %(py6)s(%(py8)s)
})
}rU   
audit_pathrj   r   r   r   r   py8py10py12logszassert not %(py17)s
{%(py17)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.startswith
}(%(py15)s
{%(py15)s = %(py6)s(((%(py7)s / %(py9)s) / %(py12)s))
})
})
rj   r   r   r   r   r   py9r   py15py17zaudit-trail.jsonlignore)ra   errors)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr   
prod_auditbefore)rj   r   r   r   u*   prod audit-trail 변경 금지 (read-only)r   r   )r   r   r   rw   r   r   rR   rS   rT   rU   rZ   r[   rW   rX   rY   r;   r   r   r   r   r   r   r   r   r   r   
startswithr   r   r   )r6   r   r   rO   r   r   r   r   r   r   r   r   @py_assert7@py_assert9@py_assert11@py_format13@py_assert8@py_assert10@py_assert13@py_assert14@py_assert16@py_assert18@py_format19r  r  _r   r   s                               r   #test_r04_audit_path_always_isolatedr     s_   
**X'''9
:C08C}-*~+H

3':
**//
C2j>*C>>NNCL+#h-Ic"^"45		
 $C5D ??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,J(*-BBE[[Jz?:?%%:"Z.:c.&9:%&9::::::::3:::3::::::z:::z:::?:::%::::::c:::c:::.:::&9::::::::::::M))M(Mi(.BMVM.BV.KM#.K*LM)*LMMMMMMMMMMMsMMMsMMMMMM:MMM:MMMMMM)MMMMMM#MMM#MMMMMMiMMMiMMM(MMMVMMM*LMMMMMMMMMMMMX%.1DDJ$  '( Cz"Z"f,ZZZ"fZZZZZZwZZZwZZZZZZzZZZzZZZ"ZZZZZZfZZZfZZZZ.ZZZZZZZ	 r   c                	   t        | dd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                  |j                   d
|j                         dz   d|iz  }t        t        j                  |            dx}x}}t        j                  | d   dz  j                               }t        j                  | d   dz  j                               }|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}}|	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}}|	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}|
|u }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|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}}|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}}|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) uV   production mode + override set → harness 가 guard env 에서 strip + refuse 기록.1z/tmp/evil_escalation.py)r?   +FIFTH_TRUNCATE_GUARD_ESCALATION_MARKER_PATHr8   r   r   r   r   r   r   r   r   Nr%   r   ztask-2591.no-write-proof.jsonr01_override_refuseproduction_modeTr   r   r   r   r   override_detectedoverride_valuer   stripped(guard_env_escalation_marker_path_presentFr   )r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   )r6   r   r   r   r   r   r   r   proofr01r   r   r   r   s                 r   1test_r01_production_strips_escalation_marker_pathr     s?   
/2;T
D ??@a@?a@@@?a@@@@@@4@@@4@@@?@@@a@@@DKK=4;;-!@@@@@@@@zz2n-0UU``bcHJJ>*-LLWWYZE
(
)C !)T)!T))))!T)))!)))T)))))))"#+t+#t++++#t+++#+++t+++++++ =$== $===== $==== ===$========z?"d"?d""""?d"""?"""d""""""">?H5H?5HHHH?5HHH?HHH5HHHHHHH&'
3;t;3t;;;;3t;;;3;;;t;;;;;;;*+3t3+t3333+t333+333t3333333r   c                ~   t        | dt        t              i      }|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                  |j                   d|j                         d	z   d
|iz  }t        t	        j                  |            dx}x}}t        j                   | d   dz  j#                               }|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}
}|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}
}|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}
}|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)uV   test mode (no prod flag) → override 허용 유지 (기존 guard test 격리 호환).r  r  r   r   r   r   r   r   r   r   Nr%   r   r  r  Fr   r   r   r   r   r  Tr  r  )r]   rU   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   )r6   r   r   r   r   r   r   r   r  r   r   r   r   s                r   %test_r01_test_mode_preserves_overrider    s   
@#FWBXYD ??@a@?a@@@?a@@@@@@4@@@4@@@?@@@a@@@DKK=4;;-!@@@@@@@@zz2n-0UU``bcH
(
)C !*U*!U****!U***!***U*******"#+t+#t++++#t+++#+++t+++++++z?#e#?e####?e###?###e#######>?G4G?4GGGG?4GGG?GGG4GGGGGGGr   c                
   t        j                  t        j                  d            }d|d   d<   | d   dz  }|j	                  t        j
                  |      d       | d   dz  }t        j                  j                         }t        | d         |d	<   d
|d<   t        |      |d<   t        j                  t        j                  t        t              ddt        |      dt        t              dt        | d         g	dd|dd      }|j                   }|t"        k(  }|st%        j&                  d|fd|t"        f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      dt)        j*                         v st%        j,                  t"              rt%        j.                  t"              nddz  }dd|iz  }	t1        t%        j2                  |	            d x}}|j4                  } |       }|sddt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      t%        j.                  |      dz  }t1        t%        j2                  |            d x}}t        |      }
|
j6                  }| d   }t        |      } ||      }|s[d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 t)        j*                         v st%        j,                  t              rt%        j.                  t              nd t%        j.                  |      t%        j.                  |      t%        j.                  |      d!z  }t1        t%        j2                  |            d x}
x}x}x}}t        j                  |j8                        }|d"   }|j:                  }d#} ||      }d
}||k(  }|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  }t1        t%        j2                  |            d x}x}x}x}}y ))Nr_   r`      r   script_size_bytesr$   z	bad3.jsonztg_mock_r08.jsonr;   r<   r=   r>   r   r   rA   rB   r%   TrK   FrL   r   r   r   r   rq   r   r   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	mock_pathr   rU   r   telegram_alert_resulteffective_mode)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)stg)rj   rr   rs   r   r   zassert %(py11)spy11)r   r   r   rw   r   r   rR   rS   rT   rU   rZ   r[   rW   rX   rY   r;   r   r   r   r   r   r   r   r   r   r   r   r  r   get)r6   r   r   r#  rO   r   r   r   r   r   r   r   r  r  r  r  r   r&  @py_assert5r  @py_format10@py_format12s                         r   (test_r08_telegram_mock_within_tmp_prefixr,    sh   
**X'''9
:C67C23*~+H

3'::!33I
**//
C2j>*C06C,-58^C12>>NNCL+#h-Ic"^"45		
 $C5D ??,?n,,,,?n,,,,,,4,,,4,,,?,,,,,,n,,,n,,,,,,,99y>9>$$9J9S%89$%89999999939993999999y999y999>999$999999S999S999999%899999999999jj%G	(	)B66-"-6"#-v-#v----#v------2---2---6---"---#---v--------r   c                Z   t         j                  j                         }|j                  dd       |j                  dd       d|d<   t	        | d   dz        |d<   t
        j                  t	        t              d	d
t	        t              dt	        | d         dt	        | d         dt	        | d         d| d   d| d   dt	        | d         dt	        | d         dt	        | d   dz        g}t        j                  |dd|d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$                  |j&                   d$|j(                         d%z   d&|iz  }t+        t        j,                  |            dx}x}}t/        j0                  | d   d'z  j3                               }	|	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}}|	d(   d/   }
d0}|
|k(  }|slt        j                  d |fd1|
|f      t        j"                  |
      t        j"                  |      d,z  }d-d.|iz  }t+        t        j,                  |            dx}
x}}y)2uR   WORKSPACE 부재 + no prod flag → production False, crash 없이 dry-run 정상.r;   Nr?   r<   r=   r$   r   r>   r@   rA   rB   r%   rC   r&   rD   r'   rE   r(   rF   r)   rG   r*   rH   r+   rI   rJ   TrK   FrL   r   r   r   r   r   r   r   r   r   r  
productionr   r   r   r   r   workspace_envrd   r   )rR   rS   rT   rV   rU   rW   rX   rY   r;   rZ   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   )r6   rO   r\   r   r   r   r   r   r   r   r   r   r   r   s                 r   test_r10_absent_workspace_envr0  4  sZ   
**//
CGGKGG-t406C,-58J)9S5TC12GiC	N#b01R./s2k?+"B|$4 "Z. #b&7"8B{O 4s2j>H45C >>#d3PRZ_`D??@a@?a@@@?a@@@@@@4@@@4@@@?@@@a@@@DKK=4;;-!@@@@@@@@zz2n-0UU``bcH%&|4==4====4===4==========%&7=2=72====72===7===2=======r   )r   r   returnrU   )r/   r   r1  dict)r6   r2  r8   zdict | Noner9   zPath | None)+__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   concurrent.futuresr   r   r   rR   rZ   rW   pathlibr   pytest__file__resolveparentr;   rY   GUARDr   rv   r   r   r   fixturer6   r]   r   r   r   r   r   r  r  r  r,  r0  rn   r   r   <module>rA     s   #       	  
  N""$++2299	
i
"P
PI LLx(*-VV	),BB !   2 48RV a4ST*-DN&4"[B40H$.<>r   