
    {i	+                       d Z ddlmZ ddlZddlZddlmZ ddlZ ee      j                         j                  d   Zedz  Z ee      ej                  vr"ej                  j                  d ee              ej                   d      Zg dZd	 Zej(                  j+                  d
g d      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d  Z*d! Z+d" Z,y)#uo  IDS Phase 6 — natural-language routing regression tests.

Covers:
- intent classification per category (5 + ambiguous)
- 50-sample accuracy ≥ 90%
- routing matrix dual-version cross-use (satori vs threadauto_render)
- size/style extractors
- external API blocking gate
- confidence + needs_confirmation thresholds
- SLA P95 ≤ 2000ms
- diagnostic logging fields
    )annotationsN)Path   scriptsids_natural_routing)2)u.   인스타그램 카드뉴스 5장 만들어줘cardnews)u"   카드뉴스 supabase 스타일로r   )u   페이스북 카드뉴스 3장r   )u$   인포그래픽 한 장 만들어줘r   )u   카드 뉴스 자동 생성r   )u    instagram 카드뉴스 디자인r   )u    배너 만들어줘 인스타용r   )u   토스 스타일 카드뉴스r   )u-   threads에 올릴 스레드 카드뉴스 8장r   )zinfographic for instagramr   )"   supabase 스타일 보험 PPT 5장ppt)u%   PPT 발표 자료 매거진 스타일r
   )u!   덱 만들어줘 stripe 스타일r
   )u%   프레젠테이션 슬라이드 12장r
   )u   pitch deck 작성해줘r
   )u    발표자료 키노트 스타일r
   )u   회사 소개 PPT 만들어줘r
   )u"   매거진 PPT 보험 상품 소개r
   )u   슬라이드 덱 ppt 한글r
   )z presentation slides for chairmanr
   u'   iPhone 15 Pro 모바일 프로토타입mobile)u-   아이폰 시연용 모바일 프로토타입r   )u   Pixel 9 Pro 앱 시연 영상r   )u-   픽셀 모바일 프로토타입 만들어줘r   )u+   앱 화면 모바일 프로토타입 합성r   )u   iphone 베타테스트 시연r   )u-   모바일 프로토타입 신기능 보여줘r   )u$   프로토타입 iphone 가입 흐름r   )u   Pixel 앱 화면 시연r   )u   mobile prototype 회장 베타r   )u&   모션 카드뉴스 만들어줘 reelsmotion)u   동영상 카드뉴스 30초r   )u   MP4 카드뉴스 fade 효과r   )u   쇼츠용 모션 카드뉴스r   )u    리얼스 동영상 카드뉴스r   )u   html to video 변환r   )u    threads 모션 카드뉴스 3초r   )u    애니메이션 카드뉴스 BGMr   )zvideo for instagram reelsr   )u'   모션 카드뉴스 슬라이드 효과r   )u,   광고 포토 이미지 한글 카피 가득image)$   광고 사진 포토리얼 인스타r   )u   광고 이미지 facebook용r   )u   ad image 보험 상품 광고r   )u$   포토리얼 광고 이미지 페북r   )u   실사 배경 광고 이미지r   )zad photo for facebook insurancer   )u(   배경 이미지 광고용 사진 느낌r   )u/   광고 포토 이미지 텍스트 많은 카피r   )u$   photoreal 광고 이미지 instagramr   c                 ,    t        t              dk(  sJ y )N2   )lenSAMPLES     A/home/jay/workspace/tests/dev6/test_ids_phase6_natural_routing.pytest_sample_countr   ]   s    w<2r   zprompt,expected))u!   인스타그램 카드뉴스 5장r   )   supabase 스타일 PPT 5장r
   r   )u   MP4 모션 카드뉴스 reelsr   )   광고 포토 이미지 페북r   )u   React 랜딩 페이지 코드codec                z    t         j                  |       }|j                  |k(  sJ d| d|j                          y )Nzprompt=u    → 
ids_routerrouteintent)promptexpecteddecisions      r   test_intent_classificationr#   d   s=     'H??h&R'&5@Q(RR&r   c                    d} g }t         D ]M  \  }}t        j                  |      }|j                  |k(  r| dz  } 0|j	                  |||j                  f       O | t        t               z  }|dk\  sJ d|dd|        y )Nr      g?z	accuracy=z.2%z	; misses=)r   r   r   r   appendr   )correctmissesr    r!   daccuracys         r    test_routing_accuracy_50_samplesr+   w   s    GF# 8V$88xqLGMM68QXX678 W%HtHy#ixHHr   c                 P    t         j                  d      } | j                  dk(  sJ y )Nr	   zmagazine-ppt-kor   r   skillr)   s    r    test_route_ppt_to_magazine_skillr0      s&    =>A77''''r   c                 P    t         j                  d      } | j                  dk(  sJ y )Nu.   iPhone 15 Pro 모바일 프로토타입 시연zmobile-prototype-kor-   r/   s    r   +test_route_mobile_to_mobile_prototype_skillr2      s&    IJA77++++r   c                 P    t         j                  d      } | j                  dk(  sJ y )Nu#   MP4 모션 카드뉴스 reels 30초zmotion-cardnews-kor-   r/   s    r   !test_route_motion_to_motion_skillr4      s&    >?A77****r   c                 P    t         j                  d      } | j                  dk(  sJ y )Nu4   토스 스타일 React 랜딩 페이지 컴포넌트zfrontend-designr-   r/   s    r   "test_route_code_to_frontend_designr6      s&    OPA77''''r   c                     t         j                  d      } | j                  dk(  sJ | j                  dk(  sJ | j                  dk(  sJ y )Nu   인스타 카드뉴스 1장r   satori-cardnewsthreadauto_renderr   r   r   r.   fallback_skillr/   s    r   ,test_cardnews_short_body_uses_satori_primaryr<      sM    67A88z!!!77''''2222r   c                     d} t         j                  |       }|j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ y )Nu   스레드에 올릴 카드뉴스 8장. 본문은 길게 — 보험 가입 흐름을 설명하고, 각 단계별 카피를 자세히 풀어서 작성해줘 supabase 스타일r   r9   r8   r:   )long_promptr)   s     r   4test_cardnews_long_or_thread_uses_threadauto_primaryr?      sY    	V  	%A88z!!!77))))0000r   c                     t         j                  d      } | j                  dk(  sJ | j                  dk(  sJ | j                  dk(  sJ y )Nu6   광고 포토 이미지 한글 텍스트 많은 카피r   hybrid-imagegemini-imager:   r/   s    r   !test_image_heavy_text_uses_hybridrC      sK    QRA88w77n$$$~---r   c                     t         j                  d      } | j                  dk(  sJ | j                  dk(  sJ | j                  dk(  sJ y )Nr   r   rB   rA   r:   r/   s    r   test_image_default_uses_geminirE      sK    ?@A88w77n$$$~---r   c                     t        j                  t        j                        5  t        j	                  dd       d d d        y # 1 sw Y   y xY w)Nr   external_callercallerpytestraisesr   RoutingErrorr   r   r   r   ;test_block_direct_api_for_image_when_caller_not_design_teamrN      sB    	z..	/ U9BSTU U Us   AAc                     t        j                  t        j                        5  t        j	                  dd       d d d        t        j	                  dd       t        j	                  dd       y # 1 sw Y   8xY w)Nr
   dispatchrH   design_teamr   anything)rK   rL   r   rM   block_direct_api_callr   r   r   !test_block_direct_api_call_helperrT      sh    	z..	/ C((z(BC $$U=$A$$VJ$?C Cs   A33A<c                     t         j                  d      } | j                  t         j                  k\  sJ | j                  du sJ | j
                  J y )NuD   supabase 스타일 매거진 발표자료 PPT 슬라이드 덱 12장F)r   r   
confidenceAUTO_CONFIDENCEneeds_confirmationconfirm_messager/   s    r   /test_high_confidence_does_not_need_confirmationrZ      sQ    _`A<<:555555((($$$r   c                     t         j                  d      } | j                  dk(  sJ | j                  du sJ | j                  J y )Nu   뭔가 만들어줘 멋있게	ambiguousT)r   r   r   rX   rY   r/   s    r   .test_ambiguous_prompt_returns_ambiguous_intentr]      sK    89A88{"""4'''(((r   c                 P    t         j                  d      } | j                  dk(  sJ y )Nu)   인스타그램 카드뉴스 만들어줘instagram_square)r   r   sizer/   s    r   test_extracts_size_instagramra      s&    DEA66''''r   c                 P    t         j                  d      } | j                  dk(  sJ y )Nr   supabase)r   r   styler/   s    r   test_extracts_style_brandre      s%    67A77j   r   c                 ~   g } t         D ]Y  \  }}t        j                  |      }| j                  |j                         |j
                  rCJ d|d|j                   d        | j                          | t        t        |       dz           }|t        j                  k  sJ d| dt        j                   d       y )Nzsla_ok=False for z (zms)gffffff?zP95=zms exceeds ms)
r   r   r   r&   
elapsed_mssla_oksortintr   SLA_ROUTE_MS)elapsedr    _r)   p95s        r   test_routing_sla_p95rp      s    G K	V$q||$xxJ,VJbcJJxK LLN
#c'lT)*
+C*)))]T#k*BYBYAZZ\+]])r   c                     t         j                  d      } | j                  d   dk(  sJ d| j                  v sJ d| j                  v sJ d| j                  v sJ t        | j                  d   t              sJ y )Nu   PPT 발표자료 매거진phaser   model_qualitycli_constraintscores
body_chars)r   r   
diagnostic
isinstancerk   r/   s    r   test_diagnostic_fields_presentry     sy    56A<< G+++all***q||+++q||###all<0#666r   c                     d} t         j                  |       }t        |j                        dk(  sJ d|j                  vsJ d|j                  vsJ |j	                         }| |vsJ y )Nu8   주민등록번호 901010-1234567 카드뉴스 인스타   u   주민등록번호901010)r   r   r   prompt_hashto_json)rawr)   
serializeds      r   )test_prompt_hash_does_not_leak_raw_promptr     sk    
DCAq}}###q}}4441==(((Jj   r   c                     t        j                  t        j                        5  t        j	                  d       d d d        y # 1 sw Y   y xY w)N rJ   r   r   r   test_empty_prompt_raisesr     s7    	z..	/   s   AAc                 D    t        t        j                        h dk(  sJ y )N>   r
   r   r   r   r   r   r\   )setr   INTENTSr   r   r   test_intent_set_completer     s$    z!!" '   r   c            
        i } t         D ]&  \  }}| j                  |g       j                  |       ( | j                         D ]D  \  }t	        fd|D              }|t        |      z  dk\  r,J d d| dt        |       d        y)zGSmoke-check: each category has at least 80% accuracy in its sub-bucket.c              3  h   K   | ])  }t         j                  |      j                  k(  s&d  + yw)r%   Nr   ).0pr   s     r   	<genexpr>z5test_routing_accuracy_per_category.<locals>.<genexpr>1  s)     QAJ,<,<Q,?,F,F&,PaQs   '22g?zintent=z per-bucket accuracy /z below 0.80N)r   
setdefaultr&   itemssumr   )	by_intentr    r!   promptsr'   r   s        @r   "test_routing_accuracy_per_categoryr   *  s     I# :Xr*11&9:$??, 
QQQW%, 	
fX27)1S\N+V	
,
r   c                     dd l } t        j                  d      }| j                  |j	                               }|d   dk(  sJ |d   dv sJ d|v sJ y )Nr   u   인스타 카드뉴스r   r   r.   )r8   r9   rh   )jsonr   r   loadsr~   )r   r)   parseds      r   test_to_json_round_tripr   7  s^    12AZZ		$F(z)))'?FFFF6!!!r   )-__doc__
__future__r   	importlibsyspathlibr   rK   __file__resolveparentsROOTSCRIPTSstrpathinsertimport_moduler   r   r   markparametrizer#   r+   r0   r2   r4   r6   r<   r?   rC   rE   rN   rT   rZ   r]   ra   re   rp   ry   r   r   r   r   r   r   r   r   <module>r      s)   #  
   H~''*

w<sxxHHOOAs7|$$Y$$%:;
8v 
S
S
I (
,
+
(31..U
@%)(
!^7!
	

"r   