
    in                     d   d Z ddlZddlmZ ddlmZ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mZ  G d d      Z G d d	      Z G d
 d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u/   utils/model_router.py 테스트 스위트 (TDD)    N)Path)	MagicMockpatch)MODEL_HAIKU
MODEL_OPUSMODEL_SONNETroute_modelc                   (    e Zd ZdZddZddZddZy)TestConstantsu   모델명 상수 테스트Nc                     t         dk(  sJ y)u   MODEL_HAIKU 상수 값 확인zclaude-haiku-4-5-20251001N)r   selfs    N/home/jay/workspace/.worktrees/task-2116-dev1/utils/tests/test_model_router.pytest_model_haiku_constantz'TestConstants.test_model_haiku_constant   s    9999    c                     t         dk(  sJ y)u   MODEL_SONNET 상수 값 확인zclaude-sonnet-4-6N)r   r   s    r   test_model_sonnet_constantz(TestConstants.test_model_sonnet_constant   s    2222r   c                     t         dk(  sJ y)u   MODEL_OPUS 상수 값 확인zclaude-opus-4-6N)r   r   s    r   test_model_opus_constantz&TestConstants.test_model_opus_constant   s    ....r   returnN)__name__
__module____qualname____doc__r   r   r    r   r   r   r      s    $:3/r   r   c                   8    e Zd ZdZddZddZddZddZddZy)	TestSimpleTaskRoutingu+   단순 작업 → haiku 라우팅 테스트Nc                 ,    t        d      t        k(  sJ y)u'   짧은 단순 텍스트는 haiku 반환u   안녕하세요Nr	   r   r   s    r   $test_short_simple_text_returns_haikuz:TestSimpleTaskRouting.test_short_simple_text_returns_haiku"   s    ,-<<<r   c                 ,    t        d      t        k(  sJ y)u%   'Hello' 같은 단어 하나는 haikuHelloNr    r   s    r   test_hello_world_returns_haikuz4TestSimpleTaskRouting.test_hello_world_returns_haiku&   s    7#{222r   c                 ,    t        d      t        k(  sJ y)u   짧은 질문 haiku 반환u   오늘 날씨가 어때요?Nr    r   s    r   !test_short_question_returns_haikuz7TestSimpleTaskRouting.test_short_question_returns_haiku*   s    89[HHHr   c                 0    d}t        |      t        k(  sJ y)u/   정확히 160자 텍스트는 haiku (경계값)ڠaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNr    r   tasks     r   $test_exactly_160_chars_returns_haikuz:TestSimpleTaskRouting.test_exactly_160_chars_returns_haiku.   s    4 K///r   c                 V    dj                  dgdz        }t        |      t        k(  sJ y)u1   정확히 28단어 텍스트는 haiku (경계값) word   N)joinr	   r   r)   s     r   #test_exactly_28_words_returns_haikuz9TestSimpleTaskRouting.test_exactly_28_words_returns_haiku3   s)    xx2&4 K///r   r   )	r   r   r   r   r!   r$   r&   r+   r1   r   r   r   r   r      s    5=3I0
0r   r   c                   `    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y)TestComplexTaskRoutingu-   복잡 키워드 → opus 라우팅 테스트Nc                 ,    t        d      t        k(  sJ y)u   'analyze' 키워드 → opuszPlease analyze this codeNr	   r   r   s    r   !test_analyze_keyword_returns_opusz8TestComplexTaskRouting.test_analyze_keyword_returns_opus<   s    56*DDDr   c                 ,    t        d      t        k(  sJ y)u   'implement' 키워드 → opuszimplement a new featureNr5   r   s    r   #test_implement_keyword_returns_opusz:TestComplexTaskRouting.test_implement_keyword_returns_opus@   s    45CCCr   c                 ,    t        d      t        k(  sJ y)u!   'architecture' 키워드 → opusz'design the architecture for this systemNr5   r   s    r   &test_architecture_keyword_returns_opusz=TestComplexTaskRouting.test_architecture_keyword_returns_opusD   s    DESSSr   c                 ,    t        d      t        k(  sJ y)u   'security' 키워드 → opuszCheck the security of this APINr5   r   s    r   "test_security_keyword_returns_opusz9TestComplexTaskRouting.test_security_keyword_returns_opusH   s    ;<
JJJr   c                 ,    t        d      t        k(  sJ y)u    'performance' 키워드 → opusz)Improve performance of the database queryNr5   r   s    r   %test_performance_keyword_returns_opusz<TestComplexTaskRouting.test_performance_keyword_returns_opusL   s    FG:UUUr   c                 ,    t        d      t        k(  sJ y)u   'debug' 키워드 → opuszdebug this errorNr5   r   s    r   test_debug_keyword_returns_opusz6TestComplexTaskRouting.test_debug_keyword_returns_opusP   s    -.*<<<r   c                 ,    t        d      t        k(  sJ y)u   'refactor' 키워드 → opuszrefactor the moduleNr5   r   s    r   "test_refactor_keyword_returns_opusz9TestComplexTaskRouting.test_refactor_keyword_returns_opusT   s    01Z???r   c                 T    t        d      t        k(  sJ t        d      t        k(  sJ y)u   키워드 대소문자 무관zANALYZE this codezImplement the featureNr5   r   s    r   test_keyword_case_insensitivez4TestComplexTaskRouting.test_keyword_case_insensitiveX   s*    ./:===23zAAAr   c                 ,    t        d      t        k(  sJ y)u   'optimize' 키워드 → opuszoptimize the algorithmNr5   r   s    r   "test_optimize_keyword_returns_opusz9TestComplexTaskRouting.test_optimize_keyword_returns_opus]   s    34
BBBr   c                 ,    t        d      t        k(  sJ y)u   'migrate' 키워드 → opuszmigrate the database schemaNr5   r   s    r   !test_migrate_keyword_returns_opusz8TestComplexTaskRouting.test_migrate_keyword_returns_opusa   s    89ZGGGr   r   )r   r   r   r   r6   r8   r:   r<   r>   r@   rB   rD   rF   rH   r   r   r   r3   r3   9   s@    7EDTKV=@B
CHr   r3   c                   (    e Zd ZdZddZddZddZy)TestMediumTaskRoutingu6   보통 길이 텍스트 → sonnet 라우팅 테스트Nc                 0    d}t        |      t        k(  sJ y)u!   161자 단순 텍스트는 sonnetڡaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaN)r	   r   r)   s     r   0test_161_chars_no_complex_keyword_returns_sonnetzFTestMediumTaskRouting.test_161_chars_no_complex_keyword_returns_sonneti   s    4 L000r   c                 V    dj                  dgdz        }t        |      t        k(  sJ y)u#   29단어 단순 텍스트는 sonnetr-   r.      N)r0   r	   r   r)   s     r   /test_29_words_no_complex_keyword_returns_sonnetzETestMediumTaskRouting.test_29_words_no_complex_keyword_returns_sonnetn   s)    xx2&4 L000r   c                     dj                  dgdz        }t        |j                               dkD  sJ t        |      }|t        k(  sJ y)uF   복잡 키워드 없는 중간 길이 문단은 sonnet (161자 초과)r-   r.   rO   r/   N)r0   lensplitr	   r   )r   r*   results      r   $test_medium_paragraph_returns_sonnetz:TestMediumTaskRouting.test_medium_paragraph_returns_sonnets   sI     xx2&4::< 2%%%T"%%%r   r   )r   r   r   r   rM   rP   rU   r   r   r   rJ   rJ   f   s    @1
1
&r   rJ   c                   0    e Zd ZdZddZddZddZddZy)TestBoundaryConditionsu   경계값 테스트Nc                 0    d}t        |      t        k(  sJ y)u)   161자 + 복잡 키워드 조합 → opuszanalyze aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNr5   r)   s     r   0test_161_chars_with_complex_keyword_returns_opuszGTestBoundaryConditions.test_161_chars_with_complex_keyword_returns_opus   s    %4 J...r   c                 ,    t        d      t        k(  sJ y)u   빈 문자열은 haiku Nr    r   s    r   test_empty_string_returns_haikuz6TestBoundaryConditions.test_empty_string_returns_haiku   s    2+---r   c                 ,    t        d      t        k(  sJ y)u   공백만 있는 경우 haikuz   Nr    r   s    r   "test_whitespace_only_returns_haikuz9TestBoundaryConditions.test_whitespace_only_returns_haiku   s    5![000r   c                 0    d}t        |      t        k(  sJ y)u1   긴 텍스트에 복잡 키워드 포함 → opusa  Please help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me help me to diagnose this issueNr5   r)   s     r   !test_complex_keyword_in_long_textz8TestBoundaryConditions.test_complex_keyword_in_long_text   s    E4 J...r   r   )r   r   r   r   rY   r\   r^   r`   r   r   r   rW   rW   }   s    /
.1/r   rW   c                        e Zd ZdZddZddZy)TestCfgFallbacku   cfg=None fallback 테스트Nc                 4    t        dd      }|t        k(  sJ y)u%   cfg=None 일 때 기본 모델 사용r#   Ncfgr    r   rT   s     r   test_cfg_none_uses_defaultsz+TestCfgFallback.test_cfg_none_uses_defaults   s    W$/$$$r   c                 4    t        dd      }|t        k(  sJ y)u,   cfg=None 복잡 작업은 기본 opus 반환zanalyze this codeNrd   r5   rf   s     r   test_cfg_none_complex_uses_opusz/TestCfgFallback.test_cfg_none_complex_uses_opus   s    0d;###r   r   )r   r   r   r   rg   ri   r   r   r   rb   rb      s    %%
$r   rb   c                   0    e Zd ZdZddZddZddZddZy)TestConfigOverrideu'   config에서 모델명 읽기 테스트Nc                 f    t               }dd|j                  _        t        d|      }|dk(  sJ y)u,   config에서 haiku 모델명 오버라이드Nc                 >    dt         t        dj                  | |      S )Ncustom-haiku-modelmodels.router.haikuzmodels.router.sonnetzmodels.router.opus)r   r   getkeydefaults     r   <lambda>zFTestConfigOverride.test_config_overrides_haiku_model.<locals>.<lambda>   s#    #7$0",>
 #c7
	 r   r#   rd   rn   Nr   rq   side_effectr	   r   mock_cfgrT   s      r   !test_config_overrides_haiku_modelz4TestConfigOverride.test_config_overrides_haiku_model   s4    ;$  W(3----r   c                 f    t               }dd|j                  _        t        d|      }|dk(  sJ y)u+   config에서 opus 모델명 오버라이드Nc                 >    t         t        ddj                  | |      S )Ncustom-opus-modelro   )r   r   rq   rr   s     r   ru   zETestConfigOverride.test_config_overrides_opus_model.<locals>.<lambda>   s#    #.$0"5>
 #c7
	 r   zanalyze this architecturerd   r~   rv   rw   ry   s      r    test_config_overrides_opus_modelz3TestConfigOverride.test_config_overrides_opus_model   s5    ;$  8hG,,,,r   c                 n    t               }dd|j                  _        t        d|      }|t        k(  sJ y)u?   config에 일부 키만 있으면 나머지는 기본값 사용Nc                     |S rv   r   rr   s     r   ru   zATestConfigOverride.test_config_partial_fallback.<locals>.<lambda>   s    W r   r#   rd   rv   )r   rq   rx   r	   r   ry   s      r   test_config_partial_fallbackz/TestConfigOverride.test_config_partial_fallback   s/    ;#D W(3$$$r   c                     t               }d|j                  _        t        d|       |j                  j                  D cg c]  }|j
                  d    }}d|v sJ yc c}w )u7   config.get()이 올바른 키로 호출되는지 확인Nr#   rd   r   rp   )r   rq   return_valuer	   call_args_listargs)r   rz   callcalled_keyss       r   $test_config_called_with_correct_keysz7TestConfigOverride.test_config_called_with_correct_keys   sX    ;$(!G*080K0KLtyy|LL$333 Ms   A r   )r   r   r   r   r{   r   r   r   r   r   r   rk   rk      s    1
.
-%4r   rk   )r   syspathlibr   unittest.mockr   r   pytestpathinsertstr__file__parentutils.model_routerr   r   r   r	   r   r   r3   rJ   rW   rb   rk   r   r   r   <module>r      s    5 
  *  3tH~,,33::; < Q Q/ / 0 04*H *HZ& &./ /,$ $,4 ,4r   