
    (<i                         d 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                 J    t        ddi      }|j                  d      dk(  sJ y)u   단순 키 접근modelclaude-sonnet-4-6Nr   getselfcfgs     O/home/jay/workspace/.worktrees/task-2057-dev2/utils/tests/test_config_loader.pytest_get_simple_keyzTestConfig.test_get_simple_key   s*    g234www#6666    c                 |    t        ddddi      }|j                  d      dk(  sJ |j                  d      dk(  sJ y)u%   점 표기법으로 중첩 키 접근modelsr
   gpt-4o)defaultfallbackmodels.defaultzmodels.fallbackNr   r   s     r   test_get_nested_dot_notationz'TestConfig.test_get_nested_dot_notation   sH    h,?X VWXww'(,????ww()X555r   c                 n    t        i       }|j                  d      J |j                  dd      dk(  sJ y)u   없는 키는 default 반환zmissing.keyNr   r   r   s     r   $test_get_missing_key_returns_defaultz/TestConfig.test_get_missing_key_returns_default   s9    Rjww}%---ww}j1Z???r   c                 R    t        ddddiii      }|j                  d      dk(  sJ y)u   3단계 중첩 키abcdeepza.b.cNr   r   s     r   test_get_deeply_nestedz!TestConfig.test_get_deeply_nested$   s1    cC#v/01www6)))r   c                 D    t        ddi      }|j                  d      J y)u$   존재하지 않는 키 default Nonex   yNr   r   s     r   %test_get_returns_none_for_nonexistentz0TestConfig.test_get_returns_none_for_nonexistent)   s$    c1Xwws|###r   c                 H    t        dddii      }|j                  d      J y)u)   중간 경로가 없으면 default 반환r   r   sonnetzmodels.unknown.deepNr   r   s     r   test_get_partial_path_missingz(TestConfig.test_get_partial_path_missing.   s,    hH 567ww,-555r   c                 H    t        i       }|j                  dd      dk(  sJ y)u
   빈 Configanythingr#   Nr   r   s     r   test_config_emptyzTestConfig.test_config_empty3   s$    Rjwwz3'3...r   c                 D    ddi}t        |      }|j                  |k(  sJ y)u   data 딕셔너리 접근 가능keyvalueN)r   data)r   r0   r   s      r   test_config_data_propertyz$TestConfig.test_config_data_property8   s'    wTlxx4r   returnN)__name__
__module____qualname____doc__r   r   r   r!   r&   r)   r,   r1    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() 함수 테스트r3   Nc                 l   d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 t	              }|j                  d      dk(  sJ |j                  d	      d
k(  sJ 	 t        j                  |       y# 1 sw Y   Xx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deleteNr   r
   agent.max_turns<   )tempfileNamedTemporaryFilewritenamer   r   osunlinkr   yaml_contentftmp_pathr   s        r   test_load_valid_yamlz#TestLoadConfig.test_load_valid_yamlB   s    Y((c'%P 	TUGGL!vvH		 h'C77+,0CCCC77,-333IIh	 	 IIhs   B7B BB3c                 d    t        d      }t        |t              sJ |j                  d      J y)u/   존재하지 않는 경로는 빈 Config 반환z/nonexistent/path/system.yamlr+   N)r   
isinstancer   r   r   s     r   (test_load_nonexistent_path_returns_emptyz7TestLoadConfig.test_load_nonexistent_path_returns_emptyO   s2    9:#v&&&wwz"***r   c                 >   d}t        j                  ddd      5 }|j                  |       t        |j                        }ddd       	 t              }|j                  d      dk(  sJ 	 |j                          y# 1 sw Y   =xY w# j                          w xY w)	u   Path 객체로도 로드 가능zkey: value
r<   r=   Fr>   Nr.   r/   )rD   rE   rF   r   rG   r   r   rI   rJ   s        r   test_load_path_as_pathlibz(TestLoadConfig.test_load_path_as_pathlibU   s    %((c'%P 	$TUGGL!AFF|H	$	h'C775>W,,,OO	$ 	$ OOs   'A>!B
 >B
Bmonkeypatchc                 d   d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 |j	                  dd       t              }|j                  d	      dk(  sJ 	 t        j                  |       y# 1 sw Y   TxY w# t        j                         w xY w)
u$   SYSTEM_ 환경변수 오버라이드z%models:
  default: claude-sonnet-4-6
r<   r=   Fr>   NSYSTEM_MODELS_DEFAULTzclaude-opus-4-6r   	rD   rE   rF   rG   setenvr   r   rH   rI   r   rT   rK   rL   rM   r   s         r   test_env_override_simplez'TestLoadConfig.test_env_override_simplea   s    @((c'%P 	TUGGL!vvH		 68IJh'C77+,0AAAAIIh	 	 IIh   B3B BB/c                 j    |j                  dd       t        d      }|j                  d      dk(  sJ y)u6   YAML 없어도 환경변수만으로 값 접근 가능rV   r   /nonexistent/path.yamlr   NrX   r   r   r   rT   r   s      r   test_env_override_without_yamlz-TestLoadConfig.test_env_override_without_yamln   s6    2H=23ww'(H444r   c                 d   d}t        j                  ddd      5 }|j                  |       |j                  }ddd       	 |j	                  dd       t              }|j                  d	      d
k(  sJ 	 t        j                  |       y# 1 sw Y   TxY w# t        j                         w xY w)u:   SYSTEM_ 접두사 없는 변수는 오버라이드 안 됨zkey: original
r<   r=   Fr>   NKEYshould_not_overrider.   originalrW   rY   s         r   test_env_override_prefix_onlyz,TestLoadConfig.test_env_override_prefix_onlyt   s    (((c'%P 	TUGGL!vvH		 u&;<h'C775>Z///IIh	 	 IIhr[   c                 >    t        d      }t        |t              sJ y)uK   path=None이면 기본 경로 시도 (존재하지 않아도 에러 없음)Nr   rP   r   r   s     r    test_load_none_path_uses_defaultz/TestLoadConfig.test_load_none_path_uses_default   s     $#v&&&r   c                 j    |j                  dd       t        d      }|j                  d      dk(  sJ y)u*   SYSTEM_AGENT_MAX_TURNS → agent.max_turnsSYSTEM_AGENT_MAX_TURNS100r]   rB   Nr^   r_   s      r   test_env_lowercase_key_mappingz-TestLoadConfig.test_env_lowercase_key_mapping   s6    3U;23ww()U222r   c                 >    t        d      }t        |t              sJ y)u   반환 타입이 Configr]   Nrg   r   s     r   test_returns_config_instancez+TestLoadConfig.test_returns_config_instance   s    23#v&&&r   r2   )r4   r5   r6   r7   rN   rQ   rS   pytestMonkeyPatchrZ   r`   re   rh   rl   rn   r8   r   r   r:   r:   ?   s    ( +
 F4F4F  4  5&:L:L 5QU 5 9K9K  PT  '3&:L:L 3QU 3'r   r:   )r7   rH   sysrD   pathlibr   ro   pathinsertstr__file__parentutils.config_loaderr   r   r   r:   r8   r   r   <module>ry      s^    0 	 
    3tH~,,33::; < 3,  , ^Q' Q'r   