
     i                         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	de
de
fdZ G d d      Z G d d	      Z G d
 d      Z G d d      Zy)u   
test_gemini_parser_1970.py — Gemini 코멘트 파서 severity 감지 테스트 (task-1970)

실제 Gemini 코멘트 포맷으로 _parse_gemini_comments가 올바르게 severity를 분류하는지 검증.
    N	body_textreturnc                 j   d}| j                         }t        j                  dt        j                        }t        j                  dt        j                        }d|v s)d|v s%d| v s!d| v sd| v s|j	                  |       sd	|v sd
|v rd}|S d|v s!d| v sd| v sd| v s|j	                  |       sd|v rd}|S )uS   worktree_manager.py의 _parse_gemini_comments 내부 severity 감지 로직 복제.lowz&!\[(security-critical|critical|high)\]z!\[(medium)\]zseverity: highzseverity: criticalu   🔴HIGHCRITICALzhigh-priority.svgzcritical.svghighzseverity: mediumu   ⚠️MEDIUMWARNINGzmedium-priority.svgmedium)lowerrecompile
IGNORECASEsearch)r   severity
body_lower_high_img_re_medium_img_res        4/home/jay/workspace/tests/test_gemini_parser_1970.pyparse_severityr      s    H"J::GWLZZ 0"--@NJ&:-9$Y"y)*,Z' O 	j(Y&y 	!  + J.O    c                   L    e 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)TestGeminiHighDetectionu@   Gemini의 ![high](...) 포맷이 high로 감지되는지 검증.c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nup   ![high](https://www.gstatic.com/codereviewagent/high-priority.svg)

subprocess.run은 동기식 호출입니다.r	   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   bodypy0py1py3py6assert %(py8)spy8	r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfr   @py_assert2@py_assert5@py_assert4@py_format7@py_format9s          r   test_high_markdown_imagez0TestGeminiHighDetection.test_high_markdown_image/   s     Dd#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nu   ![security-critical](https://www.gstatic.com/codereviewagent/critical.svg) ![critical](https://www.gstatic.com/codereviewagent/critical.svg)

API 키 노출r	   r   r   r   r   r    r%   r&   r'   r0   s          r   %test_security_critical_markdown_imagez=TestGeminiHighDetection.test_security_critical_markdown_image3   s     pd#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
NuZ   ![critical](https://www.gstatic.com/codereviewagent/critical.svg)

보안 취약점 발견r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_critical_markdown_imagez4TestGeminiHighDetection.test_critical_markdown_image7   s    md#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
NzASome text with high-priority.svg in the URL

Description of issuer	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_high_priority_svg_urlz2TestGeminiHighDetection.test_high_priority_svg_url;   s    Td#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz/Issue with critical.svg severity badge

Detailsr	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_critical_svg_urlz-TestGeminiHighDetection.test_critical_svg_url?   s    Bd#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz&severity: HIGH

This is a serious bug.r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_uppercase_HIGHz+TestGeminiHighDetection.test_uppercase_HIGHC   s    9d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz+severity: CRITICAL

Security vulnerability.r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_uppercase_CRITICALz/TestGeminiHighDetection.test_uppercase_CRITICALG   s    >d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz"severity: high

Issue description.r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_severity_colon_highz0TestGeminiHighDetection.test_severity_colon_highK   s    5d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nzseverity: critical

Details.r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_severity_colon_criticalz4TestGeminiHighDetection.test_severity_colon_criticalO   s    /d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nu   🔴 Critical issue found.r	   r   r   r   r   r    r%   r&   r'   r0   s          r   test_red_circle_emojiz-TestGeminiHighDetection.test_red_circle_emojiS   s    +d#-v-#v----#v------~---~------d---d---#---v-------r   N)__name__
__module____qualname____doc__r7   r9   r;   r=   r?   rA   rC   rE   rG   rI    r   r   r   r   ,   s7    J..........r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestGeminiMediumDetectionuG   Gemini의 ![medium](...) 포맷이 medium으로 감지되는지 검증.c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nua   ![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)

AsyncClient 매번 생성r   r   r   r   r   r    r%   r&   r'   r0   s          r   test_medium_markdown_imagez4TestGeminiMediumDetection.test_medium_markdown_image[   s    td#/x/#x////#x//////~///~//////d///d///#///x///////r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz;Text with medium-priority.svg badge

Performance suggestionr   r   r   r   r   r    r%   r&   r'   r0   s          r   test_medium_priority_svg_urlz6TestGeminiMediumDetection.test_medium_priority_svg_url_   s    Nd#/x/#x////#x//////~///~//////d///d///#///x///////r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nzseverity: MEDIUM

Minor issue.r   r   r   r   r   r    r%   r&   r'   r0   s          r   test_uppercase_MEDIUMz/TestGeminiMediumDetection.test_uppercase_MEDIUMc   s    1d#/x/#x////#x//////~///~//////d///d///#///x///////r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nu!   ⚠️ Consider refactoring this.r   r   r   r   r   r    r%   r&   r'   r0   s          r   test_warning_emojiz,TestGeminiMediumDetection.test_warning_emojig   s    2d#/x/#x////#x//////~///~//////d///d///#///x///////r   N)rJ   rK   rL   rM   rR   rT   rV   rX   rN   r   r   rP   rP   X   s    Q0000r   rP   c                   "    e Zd ZdZd Zd Zd Zy)TestGeminiLowDetectionuE   severity 표시가 없는 코멘트는 low로 분류되는지 검증.c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nz:Consider adding a docstring here for better documentation.r   r   r   r   r   r    r%   r&   r'   r0   s          r   test_plain_commentz)TestGeminiLowDetection.test_plain_commento   s    Kd#,u,#u,,,,#u,,,,,,~,,,~,,,,,,d,,,d,,,#,,,u,,,,,,,r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d x}x}}y )
NzT![low](https://www.gstatic.com/codereviewagent/low-priority.svg)

Minor style issue.r   r   r   r   r   r    r%   r&   r'   r0   s          r   test_suggestion_onlyz+TestGeminiLowDetection.test_suggestion_onlys   s    gd#,u,#u,,,,#u,,,,,,~,,,~,,,,,,d,,,d,,,#,,,u,,,,,,,r   c                    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}}y )	N r   r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   )r!   py2py4py7zassert %(py9)spy9r'   )r1   @py_assert1@py_assert3@py_assert6r3   @py_format8@py_format10s          r   test_empty_bodyz&TestGeminiLowDetection.test_empty_bodyw   s     *~b!*U*!U****!U******~***~***b***!***U*******r   N)rJ   rK   rL   rM   r\   r^   rj   rN   r   r   rZ   rZ   l   s    O--+r   rZ   c                   "    e Zd ZdZd Zd Zd Zy)TestRealGeminiCommentsuM   task-1964에서 실제로 발생한 Gemini 코멘트 포맷 재현 테스트.c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u9   InsuRo PR #1 코멘트 1번: security-critical + criticalu;  ![security-critical](https://www.gstatic.com/codereviewagent/critical.svg) ![critical](https://www.gstatic.com/codereviewagent/critical.svg)

API 키가 request body에 평문으로 전달되고 있습니다. 이는 로그, 네트워크 스니핑, 브라우저 히스토리 등을 통해 노출될 수 있습니다.r	   r   r   r   r   r    r%   r&   Nr'   r0   s          r   !test_insuro_pr1_security_criticalz8TestRealGeminiComments.test_insuro_pr1_security_critical~   s    y 	 d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u<   InsuRo PR #1 코멘트 2번: high (subprocess.run 블로킹)u   ![high](https://www.gstatic.com/codereviewagent/high-priority.svg)

subprocess.run은 동기식 호출로, async endpoint에서 이벤트 루프를 블로킹합니다. asyncio.create_subprocess_exec 또는 run_in_executor를 사용하세요.r	   r   r   r   r   r    r%   r&   Nr'   r0   s          r   test_insuro_pr1_high_subprocessz6TestRealGeminiComments.test_insuro_pr1_high_subprocess   s    X 	
 d#-v-#v----#v------~---~------d---d---#---v-------r   c                 (   d}t        |      }d}||k(  }|st        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  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u;   InsuRo PR #1 코멘트 6번: medium (AsyncClient 비효율)u   ![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)

AsyncClient를 매 요청마다 생성하는 것은 비효율적입니다. 앱 레벨에서 공유 클라이언트를 사용하세요.r   r   r   r   r   r    r%   r&   Nr'   r0   s          r   "test_insuro_pr1_medium_asyncclientz9TestRealGeminiComments.test_insuro_pr1_medium_asyncclient   s    J 	
 d#/x/#x////#x//////~///~//////d///d///#///x///////r   N)rJ   rK   rL   rM   rn   rp   rr   rN   r   r   rl   rl   {   s    W..0r   rl   )rM   builtinsr*   _pytest.assertion.rewrite	assertionrewriter(   jsonr   pyteststrr   r   rP   rZ   rl   rN   r   r   <module>rz      sU      	 c c :). ).X0 0(+ +0 0r   