
     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mZ  ee      j                         j                   d   ZddZ edd      Zddddd	d
	 ddZd Zd Zd Zd Zy)u*  tests/lifecycle_guards/test_gemini_gate_validator.py — Group 4 (4건).

task-2472 regression: Gemini gate 검증 강화.

12. test_body_high_zero_thread_medium_blocks_gate
13. test_image_markdown_high_severity_detected
14. test_no_gemini_review_fails_gate
15. test_unresolved_thread_blocks_merge
    )annotationsN)Path   c                p   t         |z  }t        j                  j                  | t	        |            }g }d }||u}|}|r|j
                  }d }	||	u}
|
}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j                  |       |rt        j                  d
fd	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }d	d
|iz  }|j                  |       t        j                  |d      i z  }t        j                  d|       dz   d|iz  }t        t        j                   |            d x}x}x}x}x}x}
}	t        j                  j#                  |      }|t$        j&                  | <   |j
                  j)                  |       |S )N)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   u   spec load 실패: z
>assert %(py19)spy19)WORKTREE	importlibutilspec_from_file_locationstrloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specsysmodulesexec_module)mod_namerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     H/home/jay/workspace/tests/lifecycle_guards/test_gemini_gate_validator.py_loadr8      sM   c>D>>11(CIFDTtT4tTT4T4 7TTTT4tTTTTTT4TTT4TTTtTTTTTTT4TTTTTTTTTTTTTTT4TTTTTTTTTT;MdV9TTTTTTTTT
..
)
)$
/CCKKKKC J    gemini_gate_validatorzutils/gemini_gate_validator.pyTreviewscommentsthreadsissue_commentsfetch_okc                @    | ddiddg} |g }|g }|g }| ||||g dS )u(   테스트용 PR 데이터 구성 헬퍼.logingemini-code-assist[bot]zLGTM no issues founduserbody)r<   r=   r>   r?   r@   errors r;   s        r7   _make_pr_datarI       sY     $&?@J`ab( r9   c                    t        ddiddgddddg	      } t        j                  | d
      }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|       dz   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   }t        |      }d}||k\  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      t        j
                  |      t        j
                  |      dz  }
dd |
iz  }t        t        j                  |            dx}x}x}	}d! |d   D        }t        |      }|sd"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)%uH   review body에 high=0이어도 unresolved medium thread 존재 → FAIL.rB   rC   z:Review complete. No high severity issues in the code body.rD   zthread-medium-001Fu2   severity: medium — This logic needs improvement.id
isResolvedrF   r<   r>   T)block_unresolved_mediumverdictFAIL==z%(py1)s == %(py4)spy1py4u*   medium unresolved thread → FAIL 필수: 
>assert %(py6)spy6Ngemini_review_presentisz%(py1)s is %(py4)sassert %(py6)sunresolved_threads   >=z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slenpy0r	   rW   r   assert %(py9)sr   c              3  ,   K   | ]  }|d    dk(    yw)severitymediumNrH   ).0ts     r7   	<genexpr>z@test_body_high_zero_thread_medium_blocks_gate.<locals>.<genexpr>W   s     OQq}(Os   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)rf   r	   rW   )rI   ggvevaluate_gater   r   r   r   r    r!   rd   r   r   r   rn   )pr_dataresultr,   r+   @py_assert2@py_format5@py_format7r)   @py_assert6@py_assert5r1   @py_format10s               r7   -test_body_high_zero_thread_medium_blocks_gatery   @   s    !";<T
 *#L
G  wEF)]]&]]]]]]]]]]]]*TU[T\(]]]]]]]])*2d2*d2222*d222*222d2222222*+13+,11,1111,11111131113111+111,1111111111O&9M2NOO3OOOOOOOOO3OOO3OOOOOOOOOOOOOOr9   c                    d} t         j                  |       }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|       dz   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}||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}}t        ddiddg      }t         j                  |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   d	|iz  }t        t        j                  |            d
x}x}}|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?   ![high](...) 패턴 → detect_image_severity가 high=1 반환.zOHere is the review: ![high](https://img.shields.io/badge/severity-high-red.svg)highr`   rR   rT   rU   u   image_high 탐지 실패: rX   rY   Nrj   r   r^   criticallowrB   rC   zV![high](https://img.shields.io/badge/severity-high-red.svg) critical path issue found.rD   r<   rP   rQ   u%   image badge high → gate FAIL 필수severity_counts
image_highra   )z%(py1)s >= %(py4)s)
ro   detect_image_severityr   r   r   r   r    r!   rI   rp   )	textrr   r,   r+   rs   rt   ru   rq   gate_results	            r7   *test_image_markdown_high_severity_detectedr   ^   sV   \D&&t,F&>EQE>QEEE>QEEE>EEEQEEE"<VH EEEEEEEE( q q    q      q       *"""""""""""""""""""%=A=A=A=A  !";<p
G ##G,Ky!TVT!V+TTT!VTTT!TTTVTTT-TTTTTTTT(),7<1<71<<<<71<<<7<<<1<<<<<<<r9   c                 d   t        ddiddddiddg      } t        j                  |       }|d   }d	}||k(  }|st        j                  d
|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d      dz   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}}g }d}|d   }||v }	|	}|	s d}
|d   }|j                  } |       }|
|v }|}|s&t        j                  d|	fd||f      t        j
                  |      t        j
                  |      dz  }dd|iz  }|j                  |       |	st        j                  dfd
f      t        j
                  |
      t        j
                        t        j
                        t        j
                  |      dz  }d d!|iz  }|j                  |       t        j                  |d"      i z  }d#d$|iz  }t        t        j                  |            dx}x}x}x}	x}x}
x}x}x}}y)%u>   Gemini bot 리뷰 없음 → FAIL with 'Gemini review 부재'.rB   zhuman-reviewerzLooks good to me.rD   z	other-botz
CI passed.r~   rP   rQ   rR   rT   rU   u$   Gemini 리뷰 부재 → FAIL 필수rX   rY   NrZ   Fr[   r]   r^   Geminireasongemini)in)z%(py3)s in %(py6)s)py3rY   z%(py8)spy8)zJ%(py11)s in %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.lower
}()
})r   r   r   py18z%(py20)spy20r`   zassert %(py23)spy23)rI   ro   rp   r   r   r   r   r    r!   lowerr   r   )rq   rr   r,   r+   rs   rt   ru   r)   rw   r*   r-   r.   @py_assert15@py_assert17r/   @py_format9@py_format19@py_format21@py_format22@py_format24s                       r7    test_no_gemini_review_fails_gater   {   s   /0:MN{+\B
G w'F)NN&NNNNNNNNNNNN(NNNNNNNN)*3e3*e3333*e333*333e3333333O8Ovh'O8''O8Ovh7GO7G7M7MO7M7OO87O+OOOOO8'OOO8OOO'OOOOOOO87OOOO8OOO7GOOO7MOOO7OOOOOOOOOOOOOOOOr9   c                    t        ddiddgddddg	      } t        j                  |       }|d
   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}x}}|d   }t        |      }d}||k\  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      t        j
                  |      t        j
                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}	}|d   D cg c]  }|d   dk(  s| }}t        |      }d}	||	k\  }|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}}	yc c}w )#u5   unresolved high thread 존재 → FAIL, verdict=FAIL.rB   rC   zReview completed.rD   zthread-high-blockerFuB   severity: high — Security vulnerability detected in auth module.rK   rN   rP   rQ   rR   rT   rU   u(   unresolved high thread → FAIL 필수: rX   rY   Nr_   r`   ra   rc   rd   re   rg   r   ri   r{   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)shigh_threads)rf   rV   r   rY   u@   high severity unresolved thread가 목록에 포함되어야 함z
>assert %(py8)sr   )rI   ro   rp   r   r   r   r   r    r!   rd   r   r   r   )rq   rr   r,   r+   rs   rt   ru   r)   rv   rw   r1   rx   rl   r   r*   r   s                   r7   #test_unresolved_thread_blocks_merger      s    !";<+
 ,#\
G  w'F)[[&[[[[[[[[[[[[*RSYRZ([[[[[[[[*+13+,11,1111,11111131113111+111,1111111111%&:;W!q}PV?VAWLW|ee!eeeeeeeee3eee3eeeeee|eee|eeeeeeeee#eeeeeeee Xs   8K4K4)r&   r   r'   r   )returndict)__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r#   pathlibr   __file__resolveparentsr   r8   ro   rI   ry   r   r   r   rH   r9   r7   <module>r      s    #     
 >!!#++A. #%EF
  
@P<=:P(fr9   