
    Si=!                         d Z ddlZddlZddlmZmZ ej                  j                  dd       ddlZd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)uS   
통합 테스트: scripts/codex_gate_check.py
task-1837_5.1 - 닌기르수 작성
    N)	MagicMockpatchz/home/jay/workspace/scriptsc                  `    d} t        j                  |       }|J |d   du sJ |d   g k(  sJ y)u@   ```json ... ``` 코드 블록에서 JSON을 추출해야 한다.z<Here is the result:
```json
{"pass": true, "risks": []}
```
NpassTriskscodex_gate_check_extract_json_from_outputoutputresults     R/home/jay/workspace/.worktrees/task-2117-dev1/tests/integration/test_codex_gate.py(test_extract_json_from_output_code_blockr      sG    OF77?F&>T!!!'?b       c                  r    d} t        j                  |       }|J |d   du sJ t        |d         dk(  sJ y)uJ   코드 블록 없이 직접 JSON 객체가 있을 때 추출해야 한다.zYSome text {"pass": false, "risks": [{"severity": "critical", "description": "test"}]} endNr   Fr      )r	   r
   lenr   s     r   )test_extract_json_from_output_direct_jsonr      sL    hF77?F&>U"""vg1$$$r   c                  6    t        j                  d      } | J y)uE   JSON이 없거나 잘못된 형식이면 None을 반환해야 한다.zNo JSON here at all.Nr   )r   s    r   2test_extract_json_from_output_invalid_returns_noner   "   s    778NOF>>r   c                  :    d} t        j                  |       }|J y)u`   코드 블록 내 JSON이 파싱 불가이면 직접 JSON도 시도하고 없으면 None 반환.z,```json
{broken json
```
also no direct jsonNr   r   s     r   2test_extract_json_from_output_broken_json_in_blockr   (   s!    >F77?F>>r   c                  N    d} t        j                  |       }|J |d   dk(  sJ y)uY   코드 블록이 있으면 직접 JSON보다 코드 블록을 우선 처리해야 한다.z4```json
{"source": "block"}
```
{"source": "direct"}Nsourceblockr   r   s     r   7test_extract_json_from_output_code_block_takes_priorityr   /   s6    FF77?F(w&&&r   c                     t        | dz        }t        j                  |g t        |             }|d   du sJ |d   dk(  sJ t        d |d   D              sJ y)	uR   task_file이 없으면 critical 리스크가 포함되고 pass=False여야 한다.znonexistent_task.mdr   Fr   maat_fallbackc              3   ,   K   | ]  }|d    dk(    ywseveritycriticalN .0rs     r   	<genexpr>z=test_maat_fallback_check_task_file_missing.<locals>.<genexpr>?        Dqq}
*D   r   N)strr	   _maat_fallback_checkany)tmp_pathmissing_taskr   s      r   *test_maat_fallback_check_task_file_missingr/   9   sg    x"778L22<S]SF&>U"""(...DF7ODDDDr   c                    | dz  }|j                  dd       | dz  }|j                  dd       t        j                  t        |      t        |      gt        |             }|d   du sJ |d	   g k(  sJ |d
   dk(  sJ y)uM   task_file이 존재하고 affected_files도 있으면 pass=True여야 한다.task.mdu'   # 설계 문서
내용이 있습니다.utf-8encodingzcode.pyzdef foo(): passr   Tr   r   r   N)
write_textr	   r+   r*   )r-   	task_fileaffectedr   s       r   .test_maat_fallback_check_task_file_exists_passr8   B   s    9$ICgV)#H)G<22IXXF &>T!!!'?b   (...r   c                 $   | dz  }|j                  dd       t        | dz        }t        j                  t        |      |gt        |             }|d   du sJ |d   D cg c]  }|d	   d
k(  s|d    }}t	        d |D              sJ yc c}w )u^   task_file은 존재하지만 affected_files 중 하나가 없으면 critical 리스크 발생.r1      # 설계 문서
내용r2   r3   not_here.pyr   Fr   r!   r"   descriptionc              3   $   K   | ]  }d |v  
 yw)r;   Nr#   )r%   ds     r   r'   zAtest_maat_fallback_check_affected_file_missing.<locals>.<genexpr>\   s     :a}!:s   N)r5   r*   r	   r+   r,   )r-   r6   missing_filer   r&   critical_descss         r   .test_maat_fallback_check_affected_file_missingrA   Q   s    9$I2WEx-/0L22IHF &>U"""06w_11Z=T^C^a&_N_:>:::: `s   !B/Bc                     | dz  }|j                  dd       t        j                  t        |      g t        |             }|d   du sJ t	        d |d   D              sJ y	)
uW   task_file이 존재하지만 비어있으면 critical 리스크가 발생해야 한다.zempty_task.mdz   r2   r3   r   Fc              3   ,   K   | ]  }|d    dk(    ywr    r#   r$   s     r   r'   z;test_maat_fallback_check_empty_task_file.<locals>.<genexpr>f   r(   r)   r   N)r5   r	   r+   r*   r,   r-   r6   r   s      r   (test_maat_fallback_check_empty_task_filerE   _   se    ?*I1223y>2s8}UF&>U"""DF7ODDDDr   c                    | dz  }|j                  dd       t               }d|_        t        j                  dg dgd      |_        d	|_        t        d
|      5  t        j                  t        |      g t        |             }ddd       d   du sJ |d   g k(  sJ |d   dk(  sJ |d   J y# 1 sw Y   .xY w)uM   Codex CLI가 pass=True JSON을 반환하면 결과도 pass=True여야 한다.r1   r:   r2   r3   r   TzGood design)r   r   suggestions subprocess.runreturn_valueNr   r   r   codex_companionerror)
r5   r   
returncodejsondumpsstdoutstderrr   r	   r*   r-   r6   mock_resultr   s       r   test_codex_gate_check_successrU   k   s    9$I2WE+KK%% K
 K	k	: 
!22	NBH


 &>T!!!'?b   (0000'?"""
 
s   *B44B=c                    | dz  }|j                  dd       t               }d|_        t        j                  dddgd	gd
      |_        d|_        t        d|      5  t        j                  t        |      g t        |             }ddd       d   du sJ |d   dk(  sJ t        d |d   D              sJ y# 1 sw Y   4xY w)uH   Codex CLI가 critical 리스크를 반환하면 pass=False여야 한다.r1   u   # 설계 문서r2   r3   r   r"   zSQL injection risk)r!   r<   zFix it)r   rG   rH   rI   rJ   Nr   Fr   rL   c              3   ,   K   | ]  }|d    dk(    ywr    r#   r$   s     r   r'   z;test_codex_gate_check_with_critical_risk.<locals>.<genexpr>   r(   r)   r   )r5   r   rN   rO   rP   rQ   rR   r   r	   r*   r,   rS   s       r   (test_codex_gate_check_with_critical_riskrX      s    9$I*W=+KK):NOP z% K K	k	: 
!22	NBH


 &>U"""(0000DF7ODDDD
 
s    *B==Cc                    | dz  }|j                  dd       t               }d|_        d|_        d|_        t        d|	      5  t        j                  t        |      g t        |             }d
d
d
       d   dk(  sJ y
# 1 sw Y   xY w)uV   Codex CLI 비정상 종료(returncode!=0) 시 maat_fallback으로 전환해야 한다.r1   r:   r2   r3   r   rH   zError: codex failedrI   rJ   Nr   r   r5   r   rN   rQ   rR   r   r	   r*   rS   s       r   ;test_codex_gate_check_nonzero_returncode_falls_back_to_maatr[      s    9$I2WE+KKK.K	k	: 
!22	NBH


 (...
 
   *BBc                    ddl }| dz  }|j                  dd       t        d|j                  dd	
            5  t	        j                  t        |      g t        |             }ddd       d   dk(  sJ y# 1 sw Y   xY w)uC   Codex CLI 타임아웃 시 maat_fallback으로 전환해야 한다.r   Nr1   r:   r2   r3   rI   codexx   )cmdtimeoutside_effectr   r   )
subprocessr5   r   TimeoutExpiredr	   r*   )r-   rd   r6   r   s       r   0test_codex_gate_check_timeout_falls_back_to_maatrf      s    9$I2WE	Z-F-F7\_-F-`	a 
!22	NBH


 (...
 
s   *A88Bc                     | dz  }|j                  dd       t        dt        d            5  t        j                  t	        |      g t	        |             }ddd       d	   d
k(  sJ y# 1 sw Y   xY w)u`   Codex CLI 실행파일 없을 때 FileNotFoundError → maat_fallback으로 전환해야 한다.r1   r:   r2   r3   rI   zcodex not foundrb   Nr   r   )r5   r   FileNotFoundErrorr	   r*   rD   s      r   7test_codex_gate_check_file_not_found_falls_back_to_maatri      s{    9$I2WE	->?P-Q	R 
!22	NBH


 (...
 
s   *A,,A5c                    | dz  }|j                  dd       t               }d|_        d|_        d|_        t        d|	      5  t        j                  t        |      g t        |             }d
d
d
       d   dk(  sJ y
# 1 sw Y   xY w)uZ   Codex CLI가 JSON 파싱 불가 응답 반환 시 maat_fallback으로 전환해야 한다.r1   r:   r2   r3   r   zThis is not JSON at all!rH   rI   rJ   Nr   r   rZ   rS   s       r   >test_codex_gate_check_invalid_json_response_falls_back_to_maatrk      s    9$I2WE+KK3KK	k	: 
!22	NBH


 (...
 
r\   )__doc__rO   sysunittest.mockr   r   pathinsertr	   r   r   r   r   r   r/   r8   rA   rE   rU   rX   r[   rf   ri   rk   r#   r   r   <module>rq      sy   
  
 * 0 1 
!%'E/;E#2E./$/
//r   