
    r>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	m
Z
 dZej                  j                  edd      Zdedefd	Zd
edef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 d Z!d Z"y)u   
test_finish_task_lv4_audit.py — finish-task.sh L369~L444 Lv.4 보안 감사 검증 테스트
작성자: 벨레스 (QA 테스터)
태스크: task-2089
    N)patchz/home/jay/workspacescriptszfinish-task.shtask_file_contentreturnc                     t        j                  d| t         j                        }|rL|j                  d      j	                         j                         }d|v sd|v st        j                  d|      ryy)u<   finish-task.sh L371-L388의 Lv.4 판정 Python 로직 재현u   ## 레벨\s*\n(.*?)(?=\n## |\Z)   criticalsecurityzlv\.?4|level\s*4TF)researchDOTALLgroupstriplower)r   msections      7/home/jay/workspace/tests/test_finish_task_lv4_audit.pyis_lv4r      s`    
		46GSA''!*""$**, J'$9RYYGZ\c=d    report_contentc                     t        t        j                  d|             }t        t        j                  d| t        j                              }|r|ry|ryy)uZ   finish-task.sh L405-L421의 로키 보안 감사 참여 기록 파싱 Python 로직 재현u   로키|Loki|lokiu0   보안 감사|security audit|레드팀|red.?teamPASSPARTIALMISSING)boolr   r   
IGNORECASE)r   has_lokihas_securitys      r   check_loki_securityr      sI    BII1>BCH		"UWegigtgtuvLL	r   c                  &   d} t        |       }d}||u }|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'   ## 레벨 섹션에 'critical' → Trueu>   # task-2089

## 레벨
- critical

## 작업 목록
- 항목1
Tisz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   contentpy0py1py3py6assert %(py8)spy8N	r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr$   @py_assert2@py_assert5@py_assert4@py_format7@py_format9s         r   test_is_lv4_criticalr;   -       UG'?"d"?d""""?d""""""6"""6""""""'"""'"""?"""d"""""""r   c                  &   d} t        |       }d}||u }|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'   ## 레벨 섹션에 'security' → Trueu>   # task-2089

## 레벨
- security

## 작업 목록
- 항목1
Tr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   test_is_lv4_securityr>   3   r<   r   c                  &   d} t        |       }d}||u }|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#   ## 레벨 섹션에 'lv.4' → Trueu:   # task-2089

## 레벨
- lv.4

## 작업 목록
- 항목1
Tr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   test_is_lv4_lv_dot_4r@   9   s    QG'?"d"?d""""?d""""""6"""6""""""'"""'"""?"""d"""""""r   c                  &   d} t        |       }d}||u }|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"   ## 레벨 섹션에 'lv4' → Trueu7   # task-2089

## 레벨
lv4

## 작업 목록
- 항목1
Tr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   test_is_lv4_lv4_no_dotrB   ?   s    NG'?"d"?d""""?d""""""6"""6""""""'"""'"""?"""d"""""""r   c                  &   d} t        |       }d}||u }|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&   ## 레벨 섹션에 'level 4' → Trueu=   # task-2089

## 레벨
- level 4

## 작업 목록
- 항목1
Tr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   test_is_lv4_level_4_with_spacerD   E   s    TG'?"d"?d""""?d""""""6"""6""""""'"""'"""?"""d"""""""r   c                  &   d} t        |       }d}||u }|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&   ## 레벨 섹션에 'normal' → Falseu<   # task-2089

## 레벨
- normal

## 작업 목록
- 항목1
Fr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r    test_is_lv4_normal_returns_falserF   K   s    SG'?#e#?e####?e######6###6######'###'###?###e#######r   c                  &   d} t        |       }d}||u }|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$   ## 레벨 섹션에 'lv.3' → Falseu:   # task-2089

## 레벨
- lv.3

## 작업 목록
- 항목1
Fr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   test_is_lv4_lv3_returns_falserH   Q   s    QG'?#e#?e####?e######6###6######'###'###?###e#######r   c                  &   d} t        |       }d}||u }|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!   ## 레벨 섹션 없음 → FalseuA   # task-2089

## 개요
내용 없음

## 작업 목록
- 항목1
Fr!   r#   r   r$   r%   r*   r+   Nr,   r5   s         r   *test_is_lv4_no_level_section_returns_falserJ   W   s    XG'?#e#?e####?e######6###6######'###'###?###e#######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   로키 + 보안 감사 → PASSu1   로키가 보안 감사에 참여하였습니다.r   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   r$   r%   r*   r+   N	r   r-   r.   r/   r0   r1   r2   r3   r4   r5   s         r   7test_check_loki_security_korean_loki_and_security_auditrP   a   s    AGw'161'61111'6111111111111111w111w111'11161111111r   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   로키만 포함 → PARTIALu*   로키가 작업을 완료하였습니다.r   rL   rN   r   r$   r%   r*   r+   NrO   r5   s         r   )test_check_loki_security_korean_loki_onlyrR   g   s    :Gw'494'94444'9444444444444444w444w444'44494444444r   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
)u2   로키 및 보안 감사 모두 없음 → MISSINGu(   일반 작업 완료 보고서입니다.r   rL   rN   r   r$   r%   r*   r+   NrO   r5   s         r    test_check_loki_security_missingrT   m   s    8Gw'494'94444'9444444444444444w444w444'44494444444r   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'   Loki + security audit (영문) → PASSz(Loki participated in the security audit.r   rL   rN   r   r$   r%   r*   r+   NrO   r5   s         r   8test_check_loki_security_english_loki_and_security_auditrV   s   s    8Gw'161'61111'6111111111111111w111w111'11161111111r   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   로키 + 레드팀 → PASSu4   로키가 레드팀 활동에 참여하였습니다.r   rL   rN   r   r$   r%   r*   r+   NrO   r5   s         r   0test_check_loki_security_korean_loki_and_redteamrX   y   s    DGw'161'61111'6111111111111111w111w111'11161111111r   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   loki + red team → PASSz"loki joined the red team exercise.r   rL   rN   r   r$   r%   r*   r+   NrO   r5   s         r   4test_check_loki_security_lowercase_loki_and_red_teamrZ      s    2Gw'161'61111'6111111111111111w111w111'11161111111r   c                  <   t         j                  j                  t        dd      } t	        dd      5 }t         j                  j                  |       }|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  }t        t        j                  |            dx}}ddd       y# 1 sw Y   yxY w)ub   security-audit 파일 경로에 대해 os.path.isfile이 True를 반환하는지 mock으로 확인reportssecurity-audit.mdos.path.isfileTreturn_valuer!   z%(py0)s is %(py3)sresultr&   r(   assert %(py5)spy5NospathjoinWORKSPACE_ROOTr   isfileassert_called_once_withr-   r.   r/   r0   r1   r2   r3   r4   audit_file_pathmock_isfilerb   r6   @py_assert1@py_format4@py_format6s          r   $test_security_audit_file_exists_mockrs      s    ggll>9>QRO	d	3 {0++O<v~vvv     CDDc                  <   t         j                  j                  t        dd      } t	        dd      5 }t         j                  j                  |       }|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  }t        t        j                  |            dx}}ddd       y# 1 sw Y   yxY w)u`   security-audit 파일이 없을 때 os.path.isfile이 False를 반환하는지 mock으로 확인r\   r]   r^   Fr_   r!   ra   rb   rc   rd   re   Nrf   rm   s          r   %test_security_audit_file_missing_mockrv      s    ggll>9>QRO	e	4 0++O<vvvv  rt   )#__doc__builtinsr/   _pytest.assertion.rewrite	assertionrewriter-   r   rg   unittest.mockr   rj   rh   ri   FINISH_TASK_PATHstrr   r   r   r;   r>   r@   rB   rD   rF   rH   rJ   rP   rR   rT   rV   rX   rZ   rs   rv    r   r   <module>r      s     	 	 &77<<	;KL c d 	 	 	 #####$$$255222r   