
    Mi                        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
mZ ddlZej                  j                  d e ee      j"                  j"                  j"                               ddlmZmZ  G d d      Z G d d      Zy)	u*   utils/config_loader.py 테스트 스위트    N)Path)Configload_configc                   P    e Zd ZdZddZddZddZddZddZddZ	dd	Z
dd
Zy)
TestConfigu   Config 클래스 테스트Nc                    t        ddi      }|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}x}}y	)
u   단순 키 접근modelclaude-sonnet-4-6==zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)scfgpy0py2py4py6py9assert %(py11)spy11N
r   get
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	selfr   @py_assert1@py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12s	            5/home/jay/workspace/utils/tests/test_config_loader.pytest_get_simple_keyzTestConfig.test_get_simple_key   s    g234ww6w6ww6#66#66666#6666666s666s666w666w666666#666666666    c                    t        ddddi      }|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}x}}|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}x}}y)u%   점 표기법으로 중첩 키 접근modelsr
   gpt-4o)defaultfallbackmodels.defaultr   r   r   r   r   r   Nzmodels.fallbackr   r!   s	            r*   test_get_nested_dot_notationz'TestConfig.test_get_nested_dot_notation   sN   h,?X VWXww?'?w'(?,??(,?????(,???????s???s???w???'???(???,????????ww5(5w()5X5)X5555)X555555s555s555w555(555)555X55555555r,   c           	      B   t        i       }|j                  }d} ||      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}}|j                  }d}d	} |||      }d	}	||	k(  }
|
st        j                  d
|
fd||	f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}x}
}	y)u   없는 키는 default 반환zmissing.keyNiszI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)sr   r   r   r   r1   r   zS%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s, %(py6)s)
} == %(py11)sr   r   r   r   py8r   assert %(py13)spy13r   )r"   r   r#   r$   r%   r&   r'   r(   r)   @py_assert10@py_assert9@py_format14s               r*   $test_get_missing_key_returns_defaultz/TestConfig.test_get_missing_key_returns_default   sJ   Rjww-}-w}%--%----%------s---s---w---}---%----------ww?}?j?w}j1?Z?1Z????1Z??????s???s???w???}???j???1???Z????????r,   c                 "   t        ddddiii      }|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}x}}y)u   3단계 중첩 키abcdeepza.b.cr   r   r   r   r   r   Nr   r!   s	            r*   test_get_deeply_nestedz!TestConfig.test_get_deeply_nested$   s    cC#v/01ww)w)ww)6)6))))6))))))s)))s)))w)))w))))))6))))))))r,   c                    t        ddi      }|j                  }d} ||      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}x}x}}y)u$   존재하지 않는 키 default Nonex   yNr5   r7   r   r   r   r   r   r!   s	            r*   %test_get_returns_none_for_nonexistentz0TestConfig.test_get_returns_none_for_nonexistent)   s    c1Xww#s#ws|#t#|t####|t######s###s###w###s###|###t########r,   c                    t        dddii      }|j                  }d} ||      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}x}x}}y)u)   중간 경로가 없으면 default 반환r.   r0   sonnetzmodels.unknown.deepNr5   r7   r   r   r   r   r   r!   s	            r*   test_get_partial_path_missingz(TestConfig.test_get_partial_path_missing.   s    hH 567ww5,5w,-55-5555-555555s555s555w555,555-55555555555r,   c           	      H   t        i       }|j                  }d}d} |||      }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d	x}x}x}x}x}}y	)
u
   빈 ConfiganythingrH   r   r8   r   r9   r;   r<   Nr   )
r"   r   r#   r$   r%   r'   r=   r>   r)   r?   s
             r*   test_config_emptyzTestConfig.test_config_empty3   s    Rjww.z.3.wz3'.3.'3....'3......s...s...w...z...3...'...3........r,   c                    ddi}t        |      }|j                  }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d
x}}y
)u   data 딕셔너리 접근 가능keyvaluer   )z,%(py2)s
{%(py2)s = %(py0)s.data
} == %(py4)sr   data)r   r   r   zassert %(py6)sr   N)
r   rU   r   r   r   r   r   r   r   r    )r"   rU   r   r#   r$   @py_format5@py_format7s          r*   test_config_data_propertyz$TestConfig.test_config_data_property8   s    wTlxxx4x4ssx44r,   returnN)__name__
__module____qualname____doc__r+   r3   r@   rF   rK   rN   rQ   rX    r,   r*   r   r      s.    $7
6@*
$
6
/
 r,   r   c                       e Zd ZdZddZddZddZdej                  ddfdZ	dej                  ddfd	Z
dej                  ddfd
ZddZdej                  ddfdZddZy)TestLoadConfigu   load_config() 함수 테스트rZ   Nc                    d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 t	              }|j
                  }d} ||      }d}||k(  }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j
                  }d} ||      }d}||k(  }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}t        j                  |       y# 1 sw Y   (xY w# t        j                         w xY w)u   유효한 YAML 파일 로드z<models:
  default: claude-sonnet-4-6
agent:
  max_turns: 60
w.yamlFmodesuffixdeleteNr2   r
   r   r   r   r   r   r   agent.max_turns<   )tempfileNamedTemporaryFilewritenamer   r   r   r   r   r   r   r   r   r    osunlinkr"   yaml_contentftmp_pathr   r#   r$   r%   r&   r'   r(   r)   s               r*   test_load_valid_yamlz#TestLoadConfig.test_load_valid_yamlB   s   Y((c'%P 	TUGGL!vvH		 h'C77C+C7+,C0CC,0CCCCC,0CCCCCCC3CCC3CCC7CCC+CCC,CCC0CCCCCCCC773,37,-33-3333-333333333333337333,333-3333333333IIh	 	 IIhs   IHI, I),Jc                 T   t        d      }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}|j                  }d} ||      }d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}y)u/   존재하지 않는 경로는 빈 Config 반환z/nonexistent/path/system.yaml5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   r   r   py1r   r   NrP   r5   r7   r   r   r   )r   rx   r   r   r   r   r   r   r   r    r   r   )
r"   r   r$   rV   r#   r%   r&   r'   r(   r)   s
             r*   (test_load_nonexistent_path_returns_emptyz7TestLoadConfig.test_load_nonexistent_path_returns_emptyO   s-   9:#v&&&&&&&&z&&&z&&&&&&#&&&#&&&&&&v&&&v&&&&&&&&&&ww*z*wz"*d*"d****"d******s***s***w***z***"***d********r,   c                    d}t        j                  ddd      5 }|j                  |       t        |j                        }ddd       	 t              }|j                  }d} ||      }d}||k(  }	|	st        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}	}|j                          y# 1 sw Y   %xY w# j                          w xY w)u   Path 객체로도 로드 가능zkey: value
rc   rd   Fre   NrS   rT   r   r   r   r   r   r   )rk   rl   rm   r   rn   r   r   r   r   r   r   r   r   r   r    rp   rq   s               r*   test_load_path_as_pathlibz(TestLoadConfig.test_load_path_as_pathlibU   s   %((c'%P 	$TUGGL!AFF|H	$	h'C77,5,75>,W,>W,,,,>W,,,,,,3,,,3,,,7,,,5,,,>,,,W,,,,,,,OO	$ 	$ OOs   'E%D	E2 %E/2Fmonkeypatchc                 4   d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 |j	                  dd       t              }|j                  }d	} ||      }d}	||	k(  }
|
st        j                  d
|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	t        j                   |       y# 1 sw Y   <xY w# t        j                          w xY w)u$   SYSTEM_ 환경변수 오버라이드z%models:
  default: claude-sonnet-4-6
rc   rd   Fre   NSYSTEM_MODELS_DEFAULTzclaude-opus-4-6r2   r   r   r   r   r   r   rk   rl   rm   rn   setenvr   r   r   r   r   r   r   r   r   r    ro   rp   r"   r~   rr   rs   rt   r   r#   r$   r%   r&   r'   r(   r)   s                r*   test_env_override_simplez'TestLoadConfig.test_env_override_simplea   s   @((c'%P 	TUGGL!vvH		 68IJh'C77A+A7+,A0AA,0AAAAA,0AAAAAAA3AAA3AAA7AAA+AAA,AAA0AAAAAAAAIIh	 	 IIh   E3DF  3E= Fc                 :   |j                  dd       t        d      }|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            dx}x}x}x}}y)u6   YAML 없어도 환경변수만으로 값 접근 가능r   r/   /nonexistent/path.yamlr2   r   r   r   r   r   r   Nr   r   r   r   r   r   r   r   r   r   r    
r"   r~   r   r#   r$   r%   r&   r'   r(   r)   s
             r*   test_env_override_without_yamlz-TestLoadConfig.test_env_override_without_yamln   s    2H=23ww4'4w'(4H4(H4444(H444444s444s444w444'444(444H44444444r,   c                 4   d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 |j	                  dd       t              }|j                  }d	} ||      }d
}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}
}	t        j                   |       y# 1 sw Y   <xY w# t        j                          w xY w)u:   SYSTEM_ 접두사 없는 변수는 오버라이드 안 됨zkey: original
rc   rd   Fre   NKEYshould_not_overriderS   originalr   r   r   r   r   r   r   r   s                r*   test_env_override_prefix_onlyz,TestLoadConfig.test_env_override_prefix_onlyt   s   (((c'%P 	TUGGL!vvH		 u&;<h'C77/5/75>/Z/>Z////>Z//////3///3///7///5///>///Z///////IIh	 	 IIhr   c                 Z   t        d      }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)uK   path=None이면 기본 경로 시도 (존재하지 않아도 에러 없음)Nrw   rx   r   r   ry   
r   rx   r   r   r   r   r   r   r   r    r"   r   r$   rV   s       r*    test_load_none_path_uses_defaultz/TestLoadConfig.test_load_none_path_uses_default   s     $#v&&&&&&&&z&&&z&&&&&&#&&&#&&&&&&v&&&v&&&&&&&&&&r,   c                 :   |j                  dd       t        d      }|j                  }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            dx}x}x}x}}y)u*   SYSTEM_AGENT_MAX_TURNS → agent.max_turnsSYSTEM_AGENT_MAX_TURNS100r   ri   r   r   r   r   r   r   Nr   r   s
             r*   test_env_lowercase_key_mappingz-TestLoadConfig.test_env_lowercase_key_mapping   s    3U;23ww2(2w()2U2)U2222)U222222s222s222w222(222)222U22222222r,   c                 Z   t        d      }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u   반환 타입이 Configr   rw   rx   r   r   ry   Nr   r   s       r*   test_returns_config_instancez+TestLoadConfig.test_returns_config_instance   s    23#v&&&&&&&&z&&&z&&&&&&#&&&#&&&&&&v&&&v&&&&&&&&&&r,   rY   )r[   r\   r]   r^   ru   r{   r}   pytestMonkeyPatchr   r   r   r   r   r   r_   r,   r*   ra   ra   ?   s    ( +
 F4F4F  4  5&:L:L 5QU 5 9K9K  PT  '3&:L:L 3QU 3'r,   ra   )r^   builtinsr   _pytest.assertion.rewrite	assertionrewriter   ro   sysrk   pathlibr   r   pathinsertstr__file__parentutils.config_loaderr   r   r   ra   r_   r,   r*   <module>r      sb    0   	 
    3tH~,,33::; < 3,  , ^Q' Q'r,   