
    SiW#                     $   d Z ddlZddlm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mZ  G d d      Z G d d	      Z G d
 d      Z G d d      Zy)u*   utils/usage_pricing.py 테스트 스위트    N)Decimal)Path)
CostResultPricingEntrycalculate_costformat_costc                   (    e Zd ZdZddZddZddZy)TestPricingEntryu    PricingEntry dataclass 테스트Nc                     t        t        d      t        d      t        d            }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   기본 필드 생성 확인3.0015.00z0.30)input_per_1moutput_per_1mcache_read_per_1mN)r   r   r   r   r   selfentrys     O/home/jay/workspace/.worktrees/task-2117-dev1/utils/tests/test_usage_pricing.pytest_pricing_entry_basic_fieldsz0TestPricingEntry.test_pricing_entry_basic_fields   sm     !'*%fo

 !!WV_444""gg&6666&&'&/999    c                 ^    t        t        d      t        d            }|j                  J y)u&   cache_read_per_1m 없이 생성 가능0.140.28r   r   N)r   r   r   r   s     r   !test_pricing_entry_optional_cachez2TestPricingEntry.test_pricing_entry_optional_cache"   s.     !&/
 &&...r   c                     t        t        d      t        d            }t        j                  t        t
        f      5  t        d      |_        ddd       y# 1 sw Y   yxY w)u    frozen dataclass - 수정 불가z1.00z2.00r   z99.00N)r   r   pytestraisesAttributeError	TypeErrorr   r   s     r   test_pricing_entry_frozenz*TestPricingEntry.test_pricing_entry_frozen*   sO     !&/
 ]]NI67 	2!(!1E	2 	2 	2s   AA"returnN)__name__
__module____qualname____doc__r   r   r!    r   r   r
   r
      s    *	:/2r   r
   c                        e Zd ZdZddZddZy)TestCostResultu   CostResult dataclass 테스트Nc                    t        t        d      t        d      t        d      t        d            }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   CostResult 필드 구조 확인z0.003z0.0150.0z0.018
input_costoutput_costcache_savings
total_costN)r   r   r.   r/   r1   r   results     r   test_cost_result_fieldsz&TestCostResult.test_cost_result_fields7   sx    w'(!%.w'	
   GG$4444!!WW%5555  GG$4444r   c                     t        t        d      t        d      t        d      t        d            }|j                  |j                  |j                  z   k(  sJ y)z%total_cost = input_cost + output_costz0.005z0.020r,   z0.025r-   N)r   r   r1   r.   r/   r2   s     r   !test_cost_result_total_equals_sumz0TestCostResult.test_cost_result_total_equals_sumC   sR    w'(!%.w'	
   F$5$58J8J$JJJJr   r"   )r$   r%   r&   r'   r4   r6   r(   r   r   r*   r*   4   s    (
5Kr   r*   c                   x    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ddZddZy)TestCalculateCostu   calculate_cost() 테스트Nc                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u&   Claude Sonnet 4.6 기본 비용 계산claude-sonnet-4-6@B modelinput_tokensoutput_tokensr   r   18.00Nr   r.   r   r/   r1   r2   s     r   test_claude_sonnet_basicz*TestCalculateCost.test_claude_sonnet_basicQ   sa    %"#
   GFO333!!WW%5555  GG$4444r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   Claude Opus 4.6 비용 계산zclaude-opus-4-6r;   r<   r   z75.00Nr   r.   r   r/   r2   s     r   test_claude_opus_basicz(TestCalculateCost.test_claude_opus_basic]   sI    #"#
   GG$4444!!WW%5555r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   Claude Haiku 비용 계산zclaude-3-5-haiku-20241022r;   r<   z0.80z4.00NrD   r2   s     r   test_claude_haiku_basicz)TestCalculateCost.test_claude_haiku_basich   sG    -"#

   GFO333!!WV_444r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   GPT-4o 기본 비용 계산zgpt-4or;   r<   z2.5010.00NrD   r2   s     r   test_gpt4o_basicz"TestCalculateCost.test_gpt4o_basicr   sH    "#

   GFO333!!WW%5555r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   GPT-4o-mini 비용 계산gpt-4o-minir;   r<   0.150.60NrD   r2   s     r   test_gpt4o_mini_basicz'TestCalculateCost.test_gpt4o_mini_basic|   sG    "#

   GFO333!!WV_444r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   Gemini Pro 비용 계산zgemini-2.5-pror;   r<   z1.25rI   NrD   r2   s     r   test_gemini_pro_basicz'TestCalculateCost.test_gemini_pro_basic   sH    ""#

   GFO333!!WW%5555r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u   Gemini Flash 비용 계산zgemini-2.5-flashr;   r<   rM   rN   NrD   r2   s     r   test_gemini_flash_basicz)TestCalculateCost.test_gemini_flash_basic   sG    $"#

   GFO333!!WV_444r   c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ y)u)   DeepSeek v3 (deepseek-chat) 비용 계산zdeepseek-chatr;   r<   r   r   NrD   r2   s     r   test_deepseek_v3_basicz(TestCalculateCost.test_deepseek_v3_basic   sG    !"#

   GFO333!!WV_444r   c                 V    t        dddd      }|j                  t        d      kD  sJ y)uB   캐시 읽기 절약 계산 - 캐시는 일반 입력보다 저렴r:   r   r;   r=   r>   r?   cache_read_tokens0N)r   r0   r   r2   s     r   test_cache_read_savingsz)TestCalculateCost.test_cache_read_savings   s2    %'	
 ##gcl222r   c                 T    t        ddd      }|j                  t        d      k(  sJ y)u   토큰 0개면 비용 0r:   r   r<   rY   N)r   r1   r   r2   s     r   test_zero_tokensz"TestCalculateCost.test_zero_tokens   s/    %

   GCL000r   c                 |    t        j                  t              5  t        ddd       ddd       y# 1 sw Y   yxY w)u!   알 수 없는 모델은 KeyErrorzunknown-model-xyzd   r<   N)r   r   KeyErrorr   )r   s    r   test_unknown_model_raisesz+TestCalculateCost.test_unknown_model_raises   s4    ]]8$ 	) !	 	 	s   2;c                     t        ddd      }|j                  t        d      k(  sJ |j                  t        d      k(  sJ |j                  t        d      k(  sJ y)	u!   소량 토큰도 정확히 계산rL   i  i  r<   0.000150.000300.00045NrA   r2   s     r   test_small_token_countz(TestCalculateCost.test_small_token_count   sb    
   GI$6666!!WY%7777  GI$6666r   c                     t        dddd      }t        d      t        d      z   t        d      z   }|j                  |k(  sJ y)u"   total_cost에 캐시 비용 포함r:   i  rW   z1.50z7.50rM   N)r   r   r1   )r   r3   expected_totals      r   test_total_includes_cache_costz0TestCalculateCost.test_total_includes_cache_cost   sI    % !%	
 !76?:WV_L  N222r   r"   )r$   r%   r&   r'   rB   rE   rG   rJ   rO   rQ   rS   rU   rZ   r\   r`   re   rh   r(   r   r   r8   r8   N   sF    $
5	6565655
3173r   r8   c                   0    e Zd ZdZddZddZddZddZy)TestFormatCostu   format_cost() 테스트Nc                     t        t        d      t        d      t        d      t        d            }t        |      }t        |t              sJ t        |      dkD  sJ y)u0   소액 포맷 - $0.001 미만은 sub-cent 표시rb   rc   rY   rd   r-   r   N)r   r   r   
isinstancestrlenr   r3   	formatteds      r   test_format_small_costz%TestFormatCost.test_format_small_cost   sY    y)	*!#,y)	
  '	)S)))9~!!!r   c                     t        t        d      t        d      t        d      t        d            }t        |      }d|v sJ d|v sJ y)	u   달러 단위 포맷r   r   rY   r@   r-   $18N)r   r   r   ro   s      r   test_format_dollar_costz&TestFormatCost.test_format_dollar_cost   sR    v(!#,w'	
  '	iy   r   c                     t        t        d      t        d      t        d      t        d            }t        |      }t        |t              sJ y)u   비용 0 포맷rY   r-   Nr   r   r   rl   rm   ro   s      r   test_format_zero_costz$TestFormatCost.test_format_zero_cost   sD    s|!#,s|	
  '	)S)))r   c                     t        t        d      t        d      t        d      t        d            }t        |      }t        |t              sJ y)u&   캐시 절약 있을 때 표시 포함rM   z0.75z2.70z0.90r-   Nrw   ro   s      r   test_format_with_savingsz'TestFormatCost.test_format_with_savings  sD    v!&/v	
  '	)S)))r   r"   )r$   r%   r&   r'   rq   ru   rx   rz   r(   r   r   rj   rj      s    !
"
!	*	*r   rj   )r'   sysdecimalr   pathlibr   r   pathinsertrm   __file__parentutils.usage_pricingr   r   r   r   r
   r*   r8   rj   r(   r   r   <module>r      sy    0 
    3tH~,,33::; < 2 2@K K4M3 M3`/* /*r   