
    jKj9                      F   d Z ddlmZmZmZ ddlmZmZmZmZm	Z	 ddl
mZmZ ddlmZmZmZmZ ddlmZmZmZ ddlmZmZ d Z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  Z0d! Z1d" Z2d# Z3d$ Z4d% Z5d& Z6d' Z7d( Z8y	)*zUnit tests for branch-heavy internal helpers: intent resolution, conversation_id
schema/loop-back, session-id rollover, and the identity cache. These complement the
end-to-end adapter tests by exercising edge branches directly.    )datetime	timedeltatimezone)add_conversation_id_to_schemacan_inject_prompt_backextract_conversation_idinject_prompt_backresolve_conversation_id)_get_context_argumentresolve_tool_call_intent)IdentityCacheMCPAnalyticsDataare_identities_equalmerge_identities)"derive_session_id_from_mcp_sessionnew_session_idresolve_session_id)MCPAnalyticsOptionsUserIdentityc                  ,    t        t        di |       S )N)options )r   r   )optss    l/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/mcp/test_units.py_datar      s    $7$?$$?@@    Nc                     d| |xs i ddS )Nz
tools/call)name	arguments)methodparamsr   r   argss     r   _callr$   !   s    "t$*RT.UVVr   c                  n   K   t        t               t        ddi             d {   } | dk(  sJ y 7 w)Ncontextdo the thing)r#   )r'   context_parameterr   r   r$   outs    r   !test_intent_from_context_argumentr,   (   s<     (Y78 C 7777s   $535c                  j   K   t        t               t        dddi             d {   } | J y 7 	w)Nget_more_toolsr&   zneed csv exportr"   r)   r*   s    r   5test_intent_skips_context_for_missing_capability_toolr/   /   s;     (,I?P3QR C ;;s   %31
3c                  l   K   t        d       } t        | t                      d {   dk(  sJ y 7 
w)Nc                      y)Ninferred itr   reqextras     r   <lambda>z+test_intent_fallback_sync.<locals>.<lambda>8   s    Mr   intent_fallback)r2   inferredr   r   r$   datas    r   test_intent_fallback_syncr=   7   s/     !ABD)$88<WWWW8   %424c                  l   K   d } t        t        |       t                      d {   dk(  sJ y 7 
w)Nc                    K   yw)Nasync inferredr   r3   s     r   fbz&test_intent_fallback_async.<locals>.fb=   s	     s   r7   )rA   r9   r)   )rB   s    r   test_intent_fallback_asyncrC   <   s9       *%*CUWMM R   Mr>   c                  f   K   d } t        t        |       t                      d {   J y 7 w)Nc                     t        d      )Nnope)
ValueErrorr3   s     r   boomz5test_intent_fallback_error_is_swallowed.<locals>.boomG   s      r   r7   r)   )rH   s    r   'test_intent_fallback_error_is_swallowedrI   F   s-     ! *%*EuwOOWWWO   %1/1c                  f   K   t        d       } t        | t                      d {   J y 7 w)Nc                      y)N   r   r3   s     r   r6   z9test_intent_fallback_blank_returns_none.<locals>.<lambda>N   s    Er   r7   r:   r;   s    r   'test_intent_fallback_blank_returns_nonerN   M   s,     !9:D)$88@@@8rJ   c                  j    t        ddddiii      J t        ddddiii      J t        i       J y )Nr!   r   r&   {   z  )r   r   r   r   6test_get_context_argument_ignores_non_string_and_blankrQ   R   sS     ([9c:J,K!LMUUU ([9d:K,L!MNVVV $,,,r   c                  J    t        ddddiidd      } | d   d   d   dk(  sJ y )	NobjectxtypestringrU   
propertiestrX   conversation_idr   r*   s    r   &test_add_conversation_id_adds_propertyr\   [   s@    
'#/A)BCSC |./78CCCr   c                  6    ddddiid} t        | d      | u sJ y )NrS   rZ   rU   rV   rW   rY   r[   schemas    r   3test_add_conversation_id_skips_when_already_presentr`   b   s,    /@68BT.UVF(5???r   c                  2    dddigi} t        | d      | u sJ y )NoneOfrU   rS   rY   r[   r^   s    r   -test_add_conversation_id_skips_complex_schemarc   g   s)    *+,F(5???r   c                  B    t        di ddd      } d| vsJ d| d   v sJ y )NrS   F)rU   rX   additionalPropertiesrY   re   rZ   rX   r[   r*   s    r   ;test_add_conversation_id_strips_additional_properties_falserf   l   s;    
'UKSC ",,,L 1111r   c                  .    t        d d      } d| d   v sJ y )NrY   rZ   rX   r[   r*   s    r   ,test_add_conversation_id_handles_none_schemarh   t   s!    
'c
2CL 1111r   c                  ~    t        ddi      dk(  sJ t        ddi      J t        ddi      J t        d      J y )NrZ   z abc abcrP   rM   
not a dict)r   r   r   r   test_extract_conversation_idrl   y   sZ    "$5w#?@EIII"$5s#;<DDD"$5u#=>FFF"<0888r   c                  *    t        di dd      dk(  sJ y )NFrY   r.   NFr
   r   r   r   %test_resolve_conversation_id_disabledrp      s    "5"c3CDUUUr   c                  *    t        di dd      dk(  sJ y )NTr.   rn   ro   r   r   r   :test_resolve_conversation_id_skips_missing_capability_toolrr      s'    "4-=?OP U   r   c                  .    t        dddidd      dk(  sJ y )NTrZ   conv-1rY   r.   )rt   Fro   r   r   r   *test_resolve_conversation_id_uses_suppliedru      s,    " (+S2B	  r   c                  V    t        di dd      \  } }|du rt        | t              r| sJ y )NTrY   r.   )r
   
isinstancestr)cidminteds     r   .test_resolve_conversation_id_mints_when_absentr{      s1    )$C9IJKCT>jc2s::sr   c                      t        dg i      du sJ t        g dd      du sJ t        ddi      du sJ t        d      du sJ y )NcontentT)r}   isErrorFz
not a listrk   )r   r   r   r   test_can_inject_prompt_backr      s\    !9b/2d:::!bT"BCuLLL!9l";<EEE!,/5888r   c                  h    t        ddddgid      } t        | d         dk(  rd| d   d   d   v sJ y )Nr}   texthi)rU   r   conv-9      )r	   lenr*   s    r   %test_inject_prompt_back_appends_blockr      sJ    
i64*H)IJH
UCs9~!#C	N14Ef4M(MMM(Mr   c                  .    dg d} t        | d      | u sJ y )NT)r~   r}   r   )r	   )results    r   0test_inject_prompt_back_noop_when_not_injectabler      s!    "-Ffh/6999r   c                  8    t               } t               | _        | S N)r   r   
session_idr;   s    r   _session_datar      s    7D$&DOKr   c                  Z    t        d      } | t        d      k(  sJ | t        d      k7  sJ y )Nzmcp-123zmcp-456)r   )as    r   'test_derive_session_id_is_deterministicr      s4    *95A29====29====r   c                     K   t               } t        | d       d {   }|t        d      k(  sJ | j                  dk(  sJ y 7 &w)Nmcp-abcmcp)r   r   r   session_source)r<   sids     r   (test_resolve_session_id_uses_mcp_sessionr      sI     ?D"43
3C4Y????%''' 4s   AA'Ac                     K   t               } t        | d       d {   }t        | d        d {   |k(  sJ y 7 7 w)Nr   )r   r   )r<   firsts     r   =test_resolve_session_id_keeps_mcp_session_without_fragmentingr      s=     ?D$T955E#D$//5888 6/s   ?;?=??c                  n   K   t               } | j                  }t        | d        d {   |k(  sJ y 7 
wr   )r   r   r   )r<   befores     r   2test_resolve_session_id_no_rollover_within_timeoutr      s1     ?D__F#D$//6999/s   &535c                     K   t               } | j                  }t        j                  t        j
                        t        d      z
  | _        t        | d        d {   }||k7  r| j                  dk(  sJ y 7 w)N   )minutes	generated)
r   r   r   nowr   utcr   last_activityr   r   )r<   r   afters      r   3test_resolve_session_id_rolls_over_after_inactivityr      sf     ?D__F!hll3i6KKD$T400EF?t22kAAAA 1s   AA;A9A;c                      t        dddiddi      } t        dddiddi      }t        | |      sJ t        | t        d            rJ y )	Nu1planproorgo1)distinct_idrX   groupsu2r   )r   r   r   bs     r   test_are_identities_equalr      sX    65/5RV-XA65/5RV-XA1%%%#A|'EFFFFr   c                  x    t        t        dddi      t        dddi            } | j                  dddk(  sJ y )Nr   r   r   )r   rX   r   r   r   )r   r   rX   )mergeds    r   =test_merge_identities_merges_properties_and_keeps_distinct_idr      sC    3(;3(;F aa 0000r   c                  <    t        d      } t        d |       | u sJ y )Nr   r   )r   r   )nxts    r   3test_merge_identities_with_no_previous_returns_nextr      s!    
4
(CD#&#---r   c                  P   t        d      } | j                  dt        d             | j                  dt        d             | j                  d       | j                  dt        d	             | j	                  d      r"| j	                  d      r| j	                  d      rJ y )
Nr   )max_sizes1r   r   s2r   s3u3)r   setr   gethas)caches    r   .test_identity_cache_evicts_least_recently_usedr      sw    1%E	IIdLT23	IIdLT23	IIdO	IIdLT2399T?uyyuyyFFr   )toolN)9__doc__r   r   r   posthog.mcp._conversation_idr   r   r   r	   r
   posthog.mcp._intentr   r   posthog.mcp._internalr   r   r   r   posthog.mcp.sessionr   r   r   posthog.mcp.typesr   r   r   r$   r,   r/   r=   rC   rI   rN   rQ   r\   r`   rc   rf   rh   rl   rp   rr   ru   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   B 3 2  P  
 @AW8X
XA
-D@
@
22
9V;
9N
:>(9:BG1.
Gr   