
    jKj/                     :   d Z ddlmZmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZmZ dd	lmZmZ dd
lmZmZm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% Z5y&)'zHUnit tests for the MCP analytics core pipeline (Milestone 1, no server).    )datetimetimezone)POSTHOG_MCP_ANALYTICS_SOURCEPostHogMCPAnalyticsEventPostHogMCPAnalyticsProperty)MCPAnalyticsEventTypecapture_exception)deterministic_prefixed_idnew_prefixed_id)build_posthog_capture_events)build_captured_mcp_parameterssanitize_captured_valuesanitize_event)McpCaptureOptionsprocess_mcp_event)MAX_EVENT_BYTES	normalizetruncate_eventc                      t        d      } | j                  d      sJ | t        d      d  }t        |j                  d            dk(  sJ |d   dk(  sJ y )Nsesses_-      7)r   
startswithlensplit)sid	uuid_parts     o/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/mcp/test_pipeline.pytest_new_prefixed_id_shaper#      s\    
%
 C>>&!!!CKM"Iys#$)))R=C    c                  0   dd l } t        d      D cg c]  }t        d       }}| j                  d       t        d      D cg c]  }t        d       }}t	        t        ||z               dk(  sJ t        |      t        |      k  sJ y c c}w c c}w )Nr      evtg{Gzt?2   )timeranger   sleepr   setmaxmin)r)   _firstseconds       r"   ,test_new_prefixed_id_unique_and_time_orderedr2   "   s    -22Y7Y_U#YE7JJu.3Bi8ioe$iF8s56>"#r)))u:F### 88s   BBc                      t        dd      } t        dd      }t        dd      }| |k(  sJ | |k7  sJ | j                  d      sJ t        | t        d      d        dk(  sJ y )Nr   zmcp-session-123otherr       )r   r   r   )abcs      r"   (test_deterministic_prefixed_id_is_stabler9   -   sn    !%):;A!%):;A!%1A6M66M6<<qV B&&&r$   c                  2    t        d      } d| vsJ d| v sJ y )Nz.my key is phx_abcdefghijklmnopqrstuvwxyz123 okphx_
[redacted]r   outs    r"   #test_sanitize_redacts_posthog_tokenr@   :   s)    
!"R
SC3r$   c                  ^    t        dddd      } | d   dk(  sJ | d   dk(  sJ | d   dk(  sJ y )	NzBearer xkkeep)authorizationapi_keysaferD   r<   rE   rF   r=   r>   s    r"   $test_sanitize_redacts_sensitive_keysrG   @   sO    
!$fEC <///y>\)))v;&   r$   c                  F    ddz  } t        |       j                  d      sJ y )NAi*  z[binary data redacted)r   r   )blobs    r"   "test_sanitize_redacts_large_base64rK   I   s%    ;D"4(334KLLLr$   c                      ddddddddd	d
ddd	gii} t        |       }|d   d   }|d   dddk(  sJ |d   d   dk(  r
d|d   d   v sJ |d   d   dk(  r
d|d   d   v sJ y )NresponsecontenttexthellotyperO   imagez	base64...z	image/png)rR   datamimeTypeaudioz	audio/wavr      rR   zimage content redacted   zaudio content redactedr   )eventr?   blockss      r"   3test_sanitize_event_replaces_image_and_audio_blocksr\   N   s    1 +;O +;O
E 
C_Y'F!99999!9V&+CvayQWGX+XXX!9V&+CvayQWGX+XXX+Xr$   c                  X    dddddddgii} t        |       }d|d   d   d	   d
   v sJ y )NrM   rN   resourceAAAAx)rJ   uri)rR   r^   z binary resource content redactedr   rO   rY   )rZ   r?   s     r"   )test_sanitize_event_redacts_blob_resourcerb   _   sQ    &QT9UVW
E
 
C-Z1KA1Nv1VVVVr$   c                  @    dddii} t        |        | d   d   dk(  sJ y )N
parameterstokenphx_aaaaaaaaaaaaaaaaaaaaaaaarY   )rZ   s    r"   #test_sanitize_does_not_mutate_inputrg   i   s3    G%CDEE5w'+IIIIr$   c                  f    t        ddz        } | j                  d      sJ t        |       dk(  sJ y )Nr`   i@  z...i  )r   endswithr   r>   s    r"    test_normalize_caps_long_stringsrj   r   s4    
C%K
 C<<s8z!!!r$   c                  <    i } | | d<   t        |       }|d   dk(  sJ y )Nselfz[Circular ~])r   )r6   r?   s     r"   test_normalize_detects_cyclesrm   x   s+    
AAfI
A,Cv;.(((r$   c                      dddddddiiiiii} t        | d	      }|d   d   d
dd
ifv st        |d   d   t        t        f      sJ y y )Nr6   r7   r8   defdeeprX   )depthz[Object])r   
isinstancedictstr)rr   r?   s     r"   test_normalize_limits_depthrw      sv    #cC#v#789:;D
D
"Cs8C=Z#z):;;zCc{@   @;r$   c                      t        t        d            dk(  sJ t        t        d            dk(  sJ t        t        d            dk(  sJ y )Nnanz[NaN]infz
[Infinity]z-infz[-Infinity])r   float r$   r"   'test_normalize_handles_nan_and_infinityr}      sG    U5\"g---U5\"l222U6]#}444r$   c            	      F   t         j                  dt        j                  t        j
                        dt        d      D  cg c]  } ddz  	 c} id}t        |      }dd l}t        |j                  |t        d	      j                  d
            }|t        k  sJ y c c} w )Nses_xbig<   yi  )
event_type
session_id	timestamprd   r   ),:)default
separatorszutf-8)r   MCP_TOOLS_CALLr   nowr   utcr*   r   jsonr   dumpsrv   encoder   )r/   rZ   r?   r   sizes        r"   (test_truncate_event_enforces_byte_budgetr      s    +::\\(,,/59=9asTz9=>	E 
Ctzz#szzBII'RSD?""" >s   Bc                     t         j                  ddddddddt        j                  t        j
                        d	
} t        |       \  }|d
   }|d   t        j                  k(  sJ |d   dk(  sJ |t        j                     t        k(  sJ |t        j                     dk(  sJ |t        j                     dk(  sJ |t        j                     dk(  sJ |t        j                     dk(  sJ |t        j                      dk(  sJ |d   du sJ y )Nses_abcsearch_eventszSearch eventsLogsg      )@zfind churn cohortcontext_parameterF)
r   r   resource_nametool_descriptiontool_categorydurationuser_intentuser_intent_sourceis_errorr   
propertiesrZ   distinct_id$process_person_profile)r   r   r   r   r   r   r   r   	TOOL_CALLr   SOURCEr   	TOOL_NAMETOOL_CATEGORYINTENTINTENT_SOURCE
SESSION_IDrZ   capturepropss      r"   %test_build_tool_call_event_propertiesr      s2   +::(+*1\\(,,/E -U3IWL!E77AAAAA=!Y...,3348TTTT,667?JJJ,::;vEEE,3348KKKK,::;?RRRR,778IEEE*+u444r$   c                      t         j                  ddddiddit        j                  t        j
                        d} t        |       \  }|d   }|d	   dk(  sJ d
|vsJ |d   ddik(  sJ |d   ddik(  sJ y )Nr   user_1emailza@b.comorganizationorg_1)r   r   identify_actor_given_ididentify_actor_datagroupsr   r   r   r   z$setz$groups)r   r   r   r   r   r   r   r   s      r"   /test_identity_enables_person_processing_and_setr      s    +::#+ '3!7+\\(,,/E -U3IWL!E=!X---$E111=Wi00008888r$   c                      t         j                  dddgt        j                  t        j
                        d} t        |       \  }|d   t        j                  k(  sJ |d   t        j                     ddgk(  sJ y )Nr   r6   r7   )r   r   listed_tool_namesr   rZ   r   )r   MCP_TOOLS_LISTr   r   r   r   r   r   
TOOLS_LISTr   LISTED_TOOL_NAMESrZ   r   s     r"   )test_listed_tool_names_only_on_tools_listr      s    +::!3Z\\(,,/	E -U3IW77BBBBB< !<!N!NOT   r$   c                      t         j                  ddddit        j                  t        j
                        d} t        |       \  }|d   dk(  sJ |d   d   dk(  sJ y )Nfeedback_submittedr   ratingr   )r   
event_namer   r   r   rZ   r   )r   CUSTOMr   r   r   r   r   r   s     r"   "test_custom_event_name_is_verbatimr      si    +22*m\\(,,/E -U3IW73333< *a///r$   c            	         t         j                  dddt        t        d            t	        j
                  t        j                        d} t        |       }t        |      dk(  sJ |\  }}|d   t        j                  k(  sJ |d   t        j                  k(  sJ |d   d	   d
   d   dk(  sJ |d   t        j                     dk(  sJ y )Nr   broken_toolTboom)r   r   r   r   errorr   rX   rZ   r   $exception_listr   value)r   r   r
   
ValueErrorr   r   r   r   r   r   r   r   	EXCEPTIONr   r   )rZ   capturesmainexcs       r"   test_exception_fan_outr      s    +::&":f#56\\(,,/E ,E2Hx=AID#=4>>>>>w<3=====|./27;vEEE|8BBC}TTTr$   c                      t         j                  ddt        d      t        j                  t
        j                        d} t        | d      }t        |      dk(  sJ y )Nr   Tr   )r   r   r   r   r   F)enable_exception_autocapturerW   )	r   r   r
   r   r   r   r   r   r   )rZ   r   s     r"   test_exception_fan_out_disabledr      sQ    +::"6*\\(,,/E ,EPUVHx=Ar$   c                      	 t        d      # t         $ r} t        |       }Y d } ~ nd } ~ ww xY w|d   dk(  sJ |d   d   }|d   dk(  sJ |d   dk(  sJ d	|v sJ y )
Nkaboomz$exception_levelr   r   r   r   rR   RuntimeError
stacktrace)r   r
   )rp   r   entrys      r"   4test_capture_exception_from_exception_has_stacktracer     s    %8$$ %!!$%#$///#$Q'E>X%%%=N***5   s    	+&+c                  L    ddddgd} t        |       }|d   d   d   dk(  sJ y )	NTrO   ztool failed badlyrQ   )isErrorrN   r   r   r   r	   )resultr   s     r"   1test_capture_exception_from_call_tool_result_dictr     sC    #-@ABF f%E"#A&w/3FFFFr$   c                  Z    t        d      } | d   d   d   dk(  sJ | d   d   d   dk(  sJ y )Nzplain messager   r   r   rR   Errorr	   )r   s    r"   "test_capture_exception_from_stringr     sH    o.E"#A&w/?BBB"#A&v.'999r$   c                      ddddddd} t        |       }|d   d	   d
   }d|vsJ |d   dk(  sJ |d   d   dk(  sJ y )Nz
tools/callsearchr`   intent textqcontext)name	arguments)methodparamsrequestr   r   r   r   r   )r   )r   capturedargss      r"   1test_build_captured_mcp_parameters_strips_contextr   &  ss    #2VWG -W5HIx(5D9Ix(L888r$   c            
        K   t         j                  ddt        dddddii      t        j                  t
        j                        d} t        | t                      d {   }|J |\  }}|d	   j                  d
      sJ t        |      dk(  sJ |d   d   t        j                     d   d   d   }d|vsJ |d   dk(  sJ y 7 fw)Nr   tr   r   r`   r   r   )r   r   r   rd   r   idevt_rW   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   
PARAMETERS)rZ   r   
full_eventr   r   s        r"   test_process_mcp_event_basicr   4  s     +::33=%IJK
 \\(,,/E %U,=,?@@F!Jd&&v...x=AA;|$%@%K%KLYWD D   9 As   AC
!C"A'C
c                     K   t         j                  dt        j                  t        j
                        d} t        | t        d              d {   }|J |\  }}|g k(  sJ y 7 w)Nr   r   r   r   c                      y )Nr|   rp   s    r"   <lambda>z1test_before_send_can_drop_event.<locals>.<lambda>Q  s    tr$   before_sendr   r   r   r   r   r   r   r   )rZ   r   r/   r   s       r"   test_before_send_can_drop_eventr   J  sm     +::\\(,,/E
 % ^< F KAxr>>s   AA*A(A*c                     K   d } t         j                  dt        j                  t        j
                        d}t        |t        |              d {   }|\  }}|d   d   d   du sJ y 7 w)	Nc                    K   d| d   d<   | S w)NTr   addedr|   r   s    r"   r   z<test_before_send_can_mutate_event_async.<locals>.before_sendY  s     #', s   r   r   r   r   r   r   Tr   )r   rZ   r   r/   r   s        r"   'test_before_send_can_mutate_event_asyncr   X  sr     
 ,::\\(,,/E
 %U,=+,VWWFKAxA;|$W-555 Xs   AA0A.A0N)6__doc__r   r   posthog.mcp.constantsr   r   r   posthog.mcp._event_typesr   posthog.mcp._exceptionsr
   posthog.mcp._idsr   r   posthog.mcp._posthog_eventsr   posthog.mcp._sanitizationr   r   r   posthog.mcp._sinkr   r   posthog.mcp._truncationr   r   r   r#   r2   r9   r@   rG   rK   r\   rb   rg   rj   rm   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r|   r$   r"   <module>r	     s    N ' 
 ; 5 G D 
 C N N
 $'!M
Y"WJ")5#"569"
0U$		!G:9,6r$   