
    |iO                         d Z ddlZddlmc mZ ddlZddlZddl	Z	e	j                  j                  dd       d Zd Zd Zd Zd Zd	 Zy)
uz   
test_finish_task_gates.py — finish-task.sh 게이트 통합 테스트
모리건(개발3팀 테스터) 작성
task-2152
    Nz/home/jay/workspacec                     ddl m}  g d}|D ]  } | |      }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   }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}}	|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)uG   5개 게이트가 모두 gate-config.json에 존재하고 정상 반환r   load_gate_config)impact_scannerci_preflightl1_smoketestgoal_assertionsunresolved_gateenabledinz%(py1)s in %(py3)scfgpy1py3assert %(py5)spy5Nmodez5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancebool)py0py2r   r   )warnfail)z%(py1)s in %(py4)s)r   py4zassert %(py6)spy6)utils.gate_config_loaderr   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr   r   )r   gatesgater   @py_assert0@py_assert2@py_format4@py_format6@py_assert1@py_assert4@py_assert3@py_format5@py_format7s                3/home/jay/workspace/tests/test_finish_task_gates.pytest_gate_config_all_gatesr3      s   9dE /t$yCyCyCCv}vvi./z.$////////z///z///.//////$///$//////////6{...{.....{....{.........../    c                     h d} t        d      5 }|j                         }ddd       t        j                  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	      }| 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      dz   d|iz  }	t        t	        j                  |	            d} y# 1 sw Y   xY w)uI   gate_results 딕셔너리가 5개 필드를 모두 포함하는 스키마>   r   r   r   r	   r
   */home/jay/workspace/scripts/finish-task.shNz'gate_results':\s*\{([^}]+)\}u9   gate_results 블록이 finish-task.sh에 존재해야 함z
>assert %(py0)sr   match   r   )z%(py0)s in %(py2)skeyblockr   r   u   gate_results에 u    키가 없음
>assert %(py4)sr   )openreadresearchr   _format_assertmsgr"   r#   r$   r!   r%   r&   groupr    )
expected_keysfcontentr7   @py_format1r:   r9   r-   @py_format3r0   s
             r2   test_gate_results_schemarH      s   lM	:	; q&&( II6@EMMMMMMMMM5MMM5MMMMMKKNE De|CCCseCCCCCCsCCCsCCCCCCeCCCeCCCC/uNCCCCCCCD s   F==Gc                     t        d      5 } | j                         }ddd       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}}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}}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# 1 sw Y   <xY w)u5   task-timer.py에 gate_results 보존 로직이 존재z(/home/jay/workspace/memory/task-timer.pyNexisting_extrar   r   rE   r   u)   existing_extra 변수가 존재해야 함z
>assert %(py5)sr   gate_resultsu.   gate_results 보존 로직이 존재해야 함zevent.update(existing_extra)u*   existing_extra를 event에 merge해야 함)r=   r>   r   r    r!   r"   r#   r$   rA   r%   r&   )rD   rE   r)   r*   r+   r,   s         r2   &test_task_timer_preserves_gate_resultsrL   )   sb   	8	9 Q&&(Sw&SSSwSSSSSSSSSwSSSwSSSS(SSSSSSSV>W$VVV>WVVV>VVVVVVWVVVWVVVV&VVVVVVV)b)W4bbb)Wbbb)bbbbbbWbbbWbbbb6bbbbbbb	 s   II!c                     ddl m}   | d      }|j                  dg       }t        |      }d}||kD  }|st	        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  }t	        j                  d
      dz   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}}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      dz   d|iz  }t        t	        j                  |            d} y)uN   goal_assertions의 allowed_commands가 gate-config.json에 정의되어 있음r   r   r	   allowed_commands)>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenallowed)r   r   r   r   u+   allowed_commands가 비어있으면 안 됨z
>assert %(py8)spy8Ngrepr   r   r   r   r   python3>   ddrmmkfssudochmodchown)not in)z%(py0)s not in %(py2)scmdr;   u   위험 명령 u!   이 allowed_commands에 포함됨r<   r   )r   r   getrP   r   r    r"   r#   r$   r!   rA   r%   r&   )r   r   rQ   r*   @py_assert5r.   r1   @py_format9r)   r+   r,   	dangerousr\   r-   rG   r0   s                   r2   %test_goal_assertions_allowed_commandsra   2   s   9
,
-Cgg("-Gw<J!J<!JJJ<!JJJJJJ3JJJ3JJJJJJwJJJwJJJ<JJJ!JJJJJJJJJJJ6W6W6WW999>I ['!ZZZs'ZZZZZZsZZZsZZZZZZ'ZZZ'ZZZZ^C58Y#ZZZZZZZ[r4   c                     t        j                  g 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
z   d|iz  }t        t        j                  |            dx}x}}y)u*   finish-task.sh의 bash 구문이 유효함)bashz-nr6   T)capture_outputtextr   )==)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sresult)r   r   r   zbash syntax error: z
>assert %(py7)spy7N)
subprocessrun
returncoder   r    r"   r#   r$   r!   rA   stderrr%   r&   )rg   r-   r.   r/   r,   @py_format8s         r2   test_finish_task_bash_syntaxrn   A   s    ^^DF
 HH!HHHHHHHHH6HHH6HHHHHHHHH%8#HHHHHHHHr4   c            
      b   t        d      5 } | j                         }ddd       d}d}t        j                  }t        j                  } |||      }|st        j                  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                  |      rt        j                  |      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                  |      t        j                  |      d
z  }t        t        j                  |            dx}x}}t        j                  }t        j                  } ||||      }|st        j                  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                  |      rt        j                  |      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                  |      t        j                  |      d
z  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u/   각 게이트에 set +e/set -e 격리가 있음r6   Nz"# 2\.6\. Impact.*?set \+e.*?set -ez+# 2\.6\.5\. CI Preflight.*?set \+e.*?set -eu-   Impact Scanner에 set +e/set -e 격리 없음zx
>assert %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s, %(py4)s, %(py7)s
{%(py7)s = %(py5)s.DOTALL
})
}r?   pattern_impactrE   )r   r   r   r   r   rh   py9u+   CI Preflight에 set +e/set -e 격리 없음
pattern_ci)r=   r>   r?   r@   DOTALLr   rA   r"   r#   r$   r!   r%   r&   )rD   rE   rp   rr   r-   @py_assert6@py_assert8@py_format10s           r2   test_set_e_isolationrw   K   s   	:	; q&&( ;N?J99ibiii9^Wi8i8ii:iiiiiii2iii2iii9iiiiii^iii^iiiiiiWiiiWiiiiiibiiibiiiiiii8iiiiii99c"))c9Z)4c4cc6ccccccc2ccc2ccc9ccccccZcccZccccccccccccccc"ccc"ccc)ccc4cccccc s   N$$N.)__doc__builtinsr"   _pytest.assertion.rewrite	assertionrewriter   r?   ri   syspathinsertr3   rH   rL   ra   rn   rw    r4   r2   <module>r      sQ     	  
 ( )
/
Dc[Idr4   