
    Si#                         d 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mZ  G d d      Z G d d      Z G d	 d
      Zy)u+   utils/model_metadata.py 테스트 스위트    N)Path)ModelMetadataget_metadataresolve_modelc                        e Zd ZdZddZddZy)TestModelMetadatau!   ModelMetadata dataclass 테스트Nc                     t        ddddd      }|j                  dk(  sJ |j                  dk(  sJ |j                  du sJ |j                  du sJ |j
                  dk(  sJ y)u   필수 필드 확인@ i    T	anthropiccontext_window
max_outputsupports_visionsupports_toolsproviderN)r   r   r   r   r   r   selfmetas     P/home/jay/workspace/.worktrees/task-2117-dev1/utils/tests/test_model_metadata.pytest_metadata_required_fieldsz/TestModelMetadata.test_metadata_required_fields   s}    "  
 ""g---$&&&##t+++""d***}}+++    c                     t        ddddd      }t        j                  t        t        f      5  d|_        ddd       y# 1 sw Y   yxY w)	u    frozen dataclass - 수정 불가  i   FTopenair   i  N)r   pytestraisesAttributeError	TypeErrorr   r   s     r   test_metadata_frozenz&TestModelMetadata.test_metadata_frozen$   sK    "!
 ]]NI67 	*")D	* 	* 	*s   AA
returnN)__name__
__module____qualname____doc__r   r    r   r   r   r      s    +,
*r   r   c                   h    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ddZddZddZy)TestGetMetadatau   get_metadata() 테스트Nc                     t        d      }|j                  dk(  sJ |j                  dk(  sJ |j                  du sJ |j                  du sJ y)u!   Claude Sonnet 4.6 메타데이터claude-sonnet-4-6@B r   TNr   r   r   r   r   r   s     r   test_claude_sonnet_4_6z&TestGetMetadata.test_claude_sonnet_4_64   s[    /0""i///}}+++##t+++""d***r   c                 ~    t        d      }|j                  dk(  sJ |j                  dk(  sJ |j                  du sJ y)u   Claude Opus 4.6 메타데이터claude-opus-4-6r+   r   TN)r   r   r   r   r   s     r   test_claude_opus_4_6z$TestGetMetadata.test_claude_opus_4_6<   sG    -.""i///}}+++##t+++r   c                 ^    t        d      }|j                  dk(  sJ |j                  dk(  sJ y)u    Claude Haiku 3.5 메타데이터zclaude-3-5-haiku-20241022r
   r   Nr   r   r   r   s     r   test_claude_haiku_3_5z%TestGetMetadata.test_claude_haiku_3_5C   s3    78""g---}}+++r   c                     t        d      }|j                  dk(  sJ |j                  dk(  sJ |j                  du sJ |j                  du sJ y)u   GPT-4o 메타데이터gpt-4or   r   TNr,   r   s     r   
test_gpt4ozTestGetMetadata.test_gpt4oI   sZ    H%""g---}}(((##t+++""d***r   c                 ^    t        d      }|j                  dk(  sJ |j                  dkD  sJ y)u   GPT-4o-mini 메타데이터zgpt-4o-minir   r   Nr   r   r   r   s     r   test_gpt4o_minizTestGetMetadata.test_gpt4o_miniQ   s0    M*}}((("""r   c                 ~    t        d      }|j                  dk(  sJ |j                  dk\  sJ |j                  du sJ y)u   Gemini 2.5 Pro 메타데이터zgemini-2.5-progoogler+   TN)r   r   r   r   r   s     r   test_gemini_prozTestGetMetadata.test_gemini_proW   sG    ,-}}(((""i///##t+++r   c                 <    t        d      }|j                  dk(  sJ y)u    Gemini 2.5 Flash 메타데이터zgemini-2.5-flashr;   N)r   r   r   s     r   test_gemini_flashz!TestGetMetadata.test_gemini_flash^   s    ./}}(((r   c                 ^    t        d      }|j                  dk(  sJ |j                  dk(  sJ y)u   DeepSeek Chat 메타데이터deepseek-chatdeepseeki   N)r   r   r   r   s     r   test_deepseek_chatz"TestGetMetadata.test_deepseek_chatc   s2    O,}}
***""f,,,r   c                 v    t        j                  t              5  t        d       ddd       y# 1 sw Y   yxY w)u!   알 수 없는 모델은 KeyErrorzunknown-model-xyz-999N)r   r   KeyErrorr   )r   s    r   test_unknown_model_raisesz)TestGetMetadata.test_unknown_model_raisesi   s,    ]]8$ 	201	2 	2 	2s   /8c                 ^    t        d      }|j                  dk(  sJ |j                  dk(  sJ y)u&   Claude 3 Opus (구형) 메타데이터zclaude-3-opus-20240229r
   r   Nr2   r   s     r   test_claude_3_opusz"TestGetMetadata.test_claude_3_opusn   s3    45""g---}}+++r   c                 ^    t        d      }|j                  dk(  sJ |j                  dkD  sJ y)u'   Claude 3 Haiku (구형) 메타데이터zclaude-3-haiku-20240307r   r   Nr8   r   s     r   test_claude_3_haikuz#TestGetMetadata.test_claude_3_haikut   s1    56}}+++"""r   r    )r"   r#   r$   r%   r-   r0   r3   r6   r9   r<   r>   rB   rE   rG   rI   r&   r   r   r(   r(   1   s<    "+,,+#,)
-2
,#r   r(   c                   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)TestResolveModelu   resolve_model() 테스트Nc                 (    t        d      }|dk(  sJ y)u    claude-opus → 정식 모델 IDzclaude-opusr/   Nr   r   resolveds     r   test_resolve_claude_opus_aliasz/TestResolveModel.test_resolve_claude_opus_alias~   s     /,,,,r   c                 (    t        d      }|dk(  sJ y)u"   claude-sonnet → 정식 모델 IDzclaude-sonnetr*   NrM   rN   s     r    test_resolve_claude_sonnet_aliasz1TestResolveModel.test_resolve_claude_sonnet_alias   s     1....r   c                 B    t        d      }d|j                         v sJ y)u   claude-haiku → 최신 Haikuzclaude-haikuhaikuNr   lowerrN   s     r   test_resolve_claude_haiku_aliasz0TestResolveModel.test_resolve_claude_haiku_alias   s!     0(..****r   c                 ,    d}t        |      }||k(  sJ y)u   정식 ID는 그대로 반환r*   NrM   )r   model_idrO   s      r   !test_resolve_exact_id_passthroughz2TestResolveModel.test_resolve_exact_id_passthrough   s    & *8###r   c                 &    t        d      }d|v sJ y)u   gpt4o 별칭gpt4or5   NrM   rN   s     r   test_resolve_gpt4o_aliasz)TestResolveModel.test_resolve_gpt4o_alias   s     )8###r   c                 (    t        d      }|dk(  sJ y)u0   알 수 없는 별칭은 입력 그대로 반환ztotally-unknown-alias-xyzNrM   rN   s     r   "test_resolve_unknown_returns_inputz3TestResolveModel.test_resolve_unknown_returns_input   s     !<=6666r   c                 (    t        d      }|dk(  sJ y)u   deepseek-v3 → deepseek-chatzdeepseek-v3r@   NrM   rN   s     r   test_resolve_deepseek_aliasz,TestResolveModel.test_resolve_deepseek_alias   s     /?***r   c                 j    t        d      }d|j                         v sJ d|j                         v sJ y)u    gemini-pro → 최신 Gemini Proz
gemini-progeminiproNrU   rN   s     r   test_resolve_gemini_pro_aliasz.TestResolveModel.test_resolve_gemini_pro_alias   s6     .8>>++++((((r   r    )r"   r#   r$   r%   rP   rR   rW   rZ   r]   r_   ra   re   r&   r   r   rK   rK   {   s-    #-
/
+
$$
7
+
)r   rK   )r%   syspathlibr   r   pathinsertstr__file__parentutils.model_metadatar   r   r   r   r(   rK   r&   r   r   <module>rn      si    1 
   3tH~,,33::; < * *>G# G#T+) +)r   