
    %Li#                        d Z ddlZddlmc m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(  }|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}}|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}}|j                  }d}||u }|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}}|j                  }d}||u }|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}}|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)u   필수 필드 확인@ i    T	anthropiccontext_window
max_outputsupports_visionsupports_toolsprovider==z6%(py2)s
{%(py2)s = %(py0)s.context_window
} == %(py5)smetapy0py2py5assert %(py7)spy7N)z2%(py2)s
{%(py2)s = %(py0)s.max_output
} == %(py5)sisz7%(py2)s
{%(py2)s = %(py0)s.supports_vision
} is %(py5)sz6%(py2)s
{%(py2)s = %(py0)s.supports_tools
} is %(py5)sz0%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py5)s)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   r   r   selfr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          6/home/jay/workspace/utils/tests/test_model_metadata.pytest_metadata_required_fieldsz/TestModelMetadata.test_metadata_required_fields   sM   "  
 ""-g-"g----"g------t---t---"---g-------&$&$&&&&$&&&&&&t&&&t&&&&&&$&&&&&&&##+t+#t++++#t++++++t+++t+++#+++t+++++++""*d*"d****"d******t***t***"***d*******}}++}++++}++++++t+++t+++}++++++++++    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*   r   s     r0   test_metadata_frozenz&TestModelMetadata.test_metadata_frozen$   sK    "!
 ]]NI67 	*")D	* 	* 	*s   AA
returnN)__name__
__module____qualname____doc__r1   r:    r2   r0   r   r      s    +,
*r2   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                 V   t        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}}|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}}|j                  }d}||u }|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}}|j                  }d}||u }|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	)u!   Claude Sonnet 4.6 메타데이터claude-sonnet-4-6@B r   r   r   r   r   r   Nr   r    Tr   r   r   r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r   r   r)   s          r0   test_claude_sonnet_4_6z&TestGetMetadata.test_claude_sonnet_4_64   s   /0""/i/"i////"i//////t///t///"///i///////}}++}++++}++++++t+++t+++}++++++++++##+t+#t++++#t++++++t+++t+++#+++t+++++++""*d*"d****"d******t***t***"***d*******r2   c                    t        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}}|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}}|j                  }d}||u }|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	)u   Claude Opus 4.6 메타데이터claude-opus-4-6rF   r   r   r   r   r   r   Nr   r    Tr   r   )r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r   r)   s          r0   test_claude_opus_4_6z$TestGetMetadata.test_claude_opus_4_6<   s^   -.""/i/"i////"i//////t///t///"///i///////}}++}++++}++++++t+++t+++}++++++++++##+t+#t++++#t++++++t+++t+++#+++t+++++++r2   c                 :   t        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}}|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	)u    Claude Haiku 3.5 메타데이터zclaude-3-5-haiku-20241022r
   r   r   r   r   r   r   Nr   r    r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r)   s          r0   test_claude_haiku_3_5z%TestGetMetadata.test_claude_haiku_3_5C   s    78""-g-"g----"g------t---t---"---g-------}}++}++++}++++++t+++t+++}++++++++++r2   c                 V   t        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}}|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}}|j                  }d}||u }|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}}|j                  }d}||u }|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	)u   GPT-4o 메타데이터gpt-4or4   r   r   r   r   r   r   Nr5   r    Tr   r   r   rG   r)   s          r0   
test_gpt4ozTestGetMetadata.test_gpt4oI   s   H%""-g-"g----"g------t---t---"---g-------}}((}((((}((((((t(((t(((}((((((((((##+t+#t++++#t++++++t+++t+++#+++t+++++++""*d*"d****"d******t***t***"***d*******r2   c                 :   t        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}}|j                  }d
}||kD  }|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	)u   GPT-4o-mini 메타데이터zgpt-4o-minir5   r   r    r   r   r   r   Nr   >z1%(py2)s
{%(py2)s = %(py0)s.max_output
} > %(py5)sr   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r)   s          r0   test_gpt4o_minizTestGetMetadata.test_gpt4o_miniQ   s    M*}}((}((((}((((((t(((t(((}((((((((((""""""""""""t"""t"""""""""""""r2   c                    t        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}}|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}}|j                  }d}||u }|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	)u   Gemini 2.5 Pro 메타데이터zgemini-2.5-progoogler   r    r   r   r   r   NrF   )>=)z6%(py2)s
{%(py2)s = %(py0)s.context_window
} >= %(py5)sTr   r   )r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r   r)   s          r0   test_gemini_prozTestGetMetadata.test_gemini_proW   s^   ,-}}((}((((}((((((t(((t(((}((((((((((""/i/"i////"i//////t///t///"///i///////##+t+#t++++#t++++++t+++t+++#+++t+++++++r2   c                    t        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	)
u    Gemini 2.5 Flash 메타데이터zgemini-2.5-flashrY   r   r    r   r   r   r   N)
r   r   r!   r"   r#   r$   r%   r&   r'   r(   r)   s          r0   test_gemini_flashz!TestGetMetadata.test_gemini_flash^   sz    ./}}((}((((}((((((t(((t(((}((((((((((r2   c                 :   t        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}}|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	)u   DeepSeek Chat 메타데이터deepseek-chatdeepseekr   r    r   r   r   r   Ni   r   )r   r   r!   r"   r#   r$   r%   r&   r'   r(   r   r)   s          r0   test_deepseek_chatz"TestGetMetadata.test_deepseek_chatc   s    O,}}*
*}
****}
******t***t***}***
*******"",f,"f,,,,"f,,,,,,t,,,t,,,",,,f,,,,,,,r2   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)r6   r7   KeyErrorr   )r*   s    r0   test_unknown_model_raisesz)TestGetMetadata.test_unknown_model_raisesi   s,    ]]8$ 	201	2 	2 	2s   /8c                 :   t        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}}|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	)u&   Claude 3 Opus (구형) 메타데이터zclaude-3-opus-20240229r
   r   r   r   r   r   r   Nr   r    rM   r)   s          r0   test_claude_3_opusz"TestGetMetadata.test_claude_3_opusn   s    45""-g-"g----"g------t---t---"---g-------}}++}++++}++++++t+++t+++}++++++++++r2   c                 :   t        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}}|j                  }d
}||kD  }|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	)u'   Claude 3 Haiku (구형) 메타데이터zclaude-3-haiku-20240307r   r   r    r   r   r   r   Nr   rS   rU   rV   r)   s          r0   test_claude_3_haikuz#TestGetMetadata.test_claude_3_haikut   s    56}}++}++++}++++++t+++t+++}++++++++++""""""""""""t"""t"""""""""""""r2   r;   )r=   r>   r?   r@   rH   rK   rN   rQ   rW   r[   r]   ra   rd   rf   rh   rA   r2   r0   rC   rC   1   s<    "+,,+#,)
-2
,#r2   rC   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                 f   t        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    claude-opus → 정식 모델 IDzclaude-opusrJ   r   z%(py0)s == %(py3)sresolvedr   py3assert %(py5)sr   N	r   r!   r"   r#   r$   r%   r&   r'   r(   r*   rm   @py_assert2r+   @py_format4r.   s         r0   test_resolve_claude_opus_aliasz/TestResolveModel.test_resolve_claude_opus_alias~   sh     /,,x,,,,,x,,,,,,,x,,,x,,,,,,,,,,,r2   c                 f   t        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"   claude-sonnet → 정식 모델 IDzclaude-sonnetrE   r   rl   rm   rn   rp   r   Nrq   rr   s         r0    test_resolve_claude_sonnet_aliasz1TestResolveModel.test_resolve_claude_sonnet_alias   sh     1..x.....x.......x...x...........r2   c                    t        d      }d}|j                  } |       }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y	)
u   claude-haiku → 최신 Haikuzclaude-haikuhaikuinzD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}rm   py1ro   r   r   assert %(py9)spy9N
r   lowerr!   r"   r&   r#   r$   r%   r'   r(   r*   rm   @py_assert0r,   @py_assert6rs   r/   @py_format10s           r0   test_resolve_claude_haiku_aliasz0TestResolveModel.test_resolve_claude_haiku_alias   s     0*(..*.**w*****w****w******(***(***.***********r2   c                    d}t        |      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      nddt        j                         v st        j
                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	}y	)
u   정식 ID는 그대로 반환rE   r   )z%(py0)s == %(py2)srm   model_id)r   r   zassert %(py4)spy4Nrq   )r*   r   rm   r+   @py_format3@py_format5s         r0   !test_resolve_exact_id_passthroughz2TestResolveModel.test_resolve_exact_id_passthrough   sy    & *8####x8######x###x######8###8#######r2   c                 d   t        d      }d}||v }|st        j                  d|fd||f      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   gpt4o 별칭gpt4orP   rz   )z%(py1)s in %(py3)srm   )r~   ro   rp   r   N)	r   r!   r"   r&   r#   r$   r%   r'   r(   )r*   rm   r   rs   rt   r.   s         r0   test_resolve_gpt4o_aliasz)TestResolveModel.test_resolve_gpt4o_alias   se     )#x8####x8###x######8###8#######r2   c                 f   t        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)	u0   알 수 없는 별칭은 입력 그대로 반환ztotally-unknown-alias-xyzr   rl   rm   rn   rp   r   Nrq   rr   s         r0   "test_resolve_unknown_returns_inputz3TestResolveModel.test_resolve_unknown_returns_input   si     !<=66x66666x6666666x666x66666666666r2   c                 f   t        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   deepseek-v3 → deepseek-chatzdeepseek-v3r_   r   rl   rm   rn   rp   r   Nrq   rr   s         r0   test_resolve_deepseek_aliasz,TestResolveModel.test_resolve_deepseek_alias   se     /**x?****x?******x***x***?*******r2   c                    t        d      }d}|j                  } |       }||v }|st        j                  d|fd||f      t        j                  |      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}x}}d
}|j                  } |       }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y	)u    gemini-pro → 최신 Gemini Proz
gemini-progeminirz   r|   rm   r}   r   r   Npror   r   s           r0   test_resolve_gemini_pro_aliasz.TestResolveModel.test_resolve_gemini_pro_alias   s    .+8>>+>++x+++++x++++x++++++8+++8+++>+++++++++++((((u(((((u((((u(((((((((((((((((((((((r2   r;   )r=   r>   r?   r@   ru   rw   r   r   r   r   r   r   rA   r2   r0   rj   rj   {   s-    #-
/
+
$$
7
+
)r2   rj   )r@   builtinsr#   _pytest.assertion.rewrite	assertionrewriter!   syspathlibr   r6   pathinsertstr__file__parentutils.model_metadatar   r   r   r   rC   rj   rA   r2   r0   <module>r      sm    1   
   3tH~,,33::; < * *>G# G#T+) +)r2   