
    ƴ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dl
Z
dZee	j                  vre	j                  j                  de       ddlmZ ddlmZmZm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_gate_config_loader.py — gate_config_loader 단위 테스트 (5개 시나리오, 14건)

담당: 닌기르수 (QA 테스터), dev5-team, task-2149
    Nz/home/jay/workspace)load_gate_configis_gate_enabledget_gate_modec                     t        d      } | 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
   }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}}y	)uJ   impact_scanner 게이트가 올바른 설정으로 반환되어야 한다.impact_scannerenabledTisz%(py1)s is %(py4)spy1py4assert %(py6)spy6Nmodewarn==z%(py1)s == %(py4)stimeout_per_symbol   max_symbols   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationcfg@py_assert0@py_assert3@py_assert2@py_format5@py_format7s         4/home/jay/workspace/tests/test_gate_config_loader.py test_json_parsing_impact_scannerr(      sN   
+
,Cy>!T!>T!!!!>T!!!>!!!T!!!!!!!v; & ;&    ;&   ;   &       #$))$))))$)))$))))))))))}"""""""""""""""""""    c                     t        d      } | 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
   }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	)uQ   ci_preflight 게이트가 enabled=True, mode="warn"으로 반환되어야 한다.ci_preflightr   Tr	   r   r   r   r   Nr   r   r   r   r   r    s         r'   test_json_parsing_ci_preflightr,   '       
>
*Cy>!T!>T!!!!>T!!!>!!!T!!!!!!!v; & ;&    ;&   ;   &       r)   c                     t        d      } | 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
   }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	)uN   l1_smoketest 게이트가 enabled=True, mode="fail"로 반환되어야 한다.l1_smoketestr   Tr	   r   r   r   r   Nr   failr   r   r   r    s         r'   test_json_parsing_l1_smoketestr1   .   r-   r)   c                     t        d      } | 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
   }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   }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	)uT   goal_assertions 게이트가 allowed_commands 9개와 함께 반환되어야 한다.goal_assertionsr   Tr	   r   r   r   r   Nr   r0   r   r   allowed_commands	   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenpy0py2r   py7assert %(py9)spy9)
r   r   r   r   r   r   r7   @py_builtinslocals_should_repr_global_name)r!   r"   r#   r$   r%   r&   @py_assert1@py_assert6@py_assert5@py_format8@py_format10s              r'   !test_json_parsing_goal_assertionsrF   5   s2   
,
-Cy>!T!>T!!!!>T!!!>!!!T!!!!!!!v; & ;&    ;&   ;   &       %&,3&',1,'1,,,,'1,,,,,,3,,,3,,,&,,,',,,1,,,,,,,r)   c                     t        d      } | 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
   }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}}y	)uT   unresolved_gate 게이트가 max_in_scope_unresolved=3으로 반환되어야 한다.unresolved_gater   Tr	   r   r   r   r   Nr   r   r   r   max_in_scope_unresolvedr   r   r    s         r'   !test_json_parsing_unresolved_gaterJ   =   s    
,
-Cy>!T!>T!!!!>T!!!>!!!T!!!!!!!v; & ;&    ;&   ;   &       ().Q.)Q....)Q...)...Q.......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t        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}}y	)
uA   is_gate_enabled("impact_scanner")은 True를 반환해야 한다.r   Tr	   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   r8   r<   r=   N	r   r   r   r>   r?   r@   r   r   r   rA   r#   rB   rC   rD   rE   s         r'   #test_is_gate_enabled_impact_scannerrO   I   s    +4?+,44,4444,444444?444?444+444,4444444444r)   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t        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}}y	)
u?   is_gate_enabled("nonexistent")은 False를 반환해야 한다.nonexistentFr	   rL   r   r8   r<   r=   NrM   rN   s         r'    test_is_gate_enabled_nonexistentrR   N   s    (2?=)2U2)U2222)U222222?222?222=222)222U2222222r)   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	)
u?   get_gate_mode("l1_smoketest")은 "fail"을 반환해야 한다.r/   r0   r   r6   r   r8   r<   r=   N	r   r   r   r>   r?   r@   r   r   r   rN   s         r'   test_get_gate_mode_l1_smoketestrU   S       '2=(2F2(F2222(F222222=222=222222(222F2222222r)   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	)
u?   get_gate_mode("ci_preflight")은 "warn"을 반환해야 한다.r+   r   r   r6   r   r8   r<   r=   NrT   rN   s         r'   test_get_gate_mode_ci_preflightrX   X   rV   r)   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  }d	d
|iz  }t        t        j                  |            dx}x}}y)ua   subprocess로 get_gate_mode('impact_scanner')를 호출하면 stdout이 'warn\n'이어야 한다.)python3z-czimport sys; sys.path.insert(0, '/home/jay/workspace'); from utils.gate_config_loader import get_gate_mode; print(get_gate_mode('impact_scanner'))T)capture_outputtextzwarn
r   )z.%(py2)s
{%(py2)s = %(py0)s.stdout
} == %(py5)sresult)r9   r:   py5zassert %(py7)sr;   N)
subprocessrunstdoutr   r   r>   r?   r@   r   r   r   )r]   rA   @py_assert4r#   @py_format6rD   s         r'   1test_bash_subprocess_get_gate_mode_impact_scannerrd   a   s    ^^		
 F ==$H$=H$$$$=H$$$$$$6$$$6$$$=$$$H$$$$$$$r)   c                  l   t        d      } ddd}| |k(  }|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}}y)u]   load_gate_config("nonexistent")은 {"enabled": False, "mode": "warn"}을 반환해야 한다.rQ   Fr   r   r   r   )z%(py0)s == %(py3)sr!   )r9   py3zassert %(py5)sr^   N)	r   r   r   r>   r?   r@   r   r   r   )r!   r$   rA   @py_format4rc   s        r'   1test_load_gate_config_nonexistent_returns_defaultri   x   sm    
=
)C#V4434444434444444344434444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t        j                  |       t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x} x}x}}y	)
u>   get_gate_mode("nonexistent")은 "warn"을 반환해야 한다.rQ   r   r   r6   r   r8   r<   r=   NrT   rN   s         r'   +test_get_gate_mode_nonexistent_returns_warnrk   ~   s    &1='161'61111'6111111=111=111111'11161111111r)   c                     |dz  }|j                  dd       | j                  t        dt        |             t	        j
                  t              5  t        d       ddd       y# 1 sw Y   yxY w)ud   잘못된 JSON 파일을 사용하면 load_gate_config 호출 시 ValueError가 발생해야 한다.zbad_gate_config.jsonz{ this is not valid json }utf-8encoding_CONFIG_PATHr   N)
write_textsetattrgate_config_loaderstrpytestraises
ValueErrorr   )monkeypatchtmp_pathbad_json_files      r'   8test_load_gate_config_raises_value_error_on_invalid_jsonr{      sc    55M9GL*NC<NO	z	" +)*+ + +s   A''A0c           	         |dz  }|j                  t        j                  dddddii      d       | j                  t        d	t        |             t        j                  t        d
      5  t        d       ddd       y# 1 sw Y   yxY w)u   mode 필드가 'warn'/'fail'이 아닌 경우 ValueError가 발생하고 메시지에 'warn 또는 fail'이 포함되어야 한다.zinvalid_mode_config.jsongates	test_gateTinvalidrf   rm   rn   rp   u   또는)matchN)
rq   jsondumpsrr   rs   rt   ru   rv   rw   r   )rx   ry   invalid_mode_files      r'   8test_load_gate_config_raises_value_error_on_invalid_moder      s     #==  

GktY+OPQR ! 
 *NC@Q<RS	z	2 &%& & &s   .BB)!__doc__builtinsr>   _pytest.assertion.rewrite	assertionrewriter   r   r_   sysru   
_WORKSPACEpathinsertutils.gate_config_loaderrs   r   r   r   r(   r,   r1   rF   rJ   rO   rR   rU   rX   rd   ri   rk   r{   r    r)   r'   <module>r      s       
  #
SXXHHOOAz" 5 #!!-/5
3
3
3%.52+&r)   