Xjn^ddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZmZmZddlmZddlmZddlmZddlmZmZmZmZmZmZddlmZmZddl Z ddl!Z ddl"Z dd l#m$Z$dd l%m&Z&dd l'm(Z(dd l)m*Z*m+Z+m,Z,m-Z-m.Z.dd l/m0Z0ejbdk\rddlm2Z2nddl3m2Z2erddl4Z5n ddl4Z5e gee jrjtfZ;e e,e.ge dfZee?e?e e?ze@zfZAd#dZBGddZCGddeZDGddeEZFGdde5je0ZHGddZIGdd e5jZKGd!d"e5jZMy#e6$r0 ddl5Z5ejnde(dn#e6$r e8ddwxYwYwxYw)$) annotationsN) AwaitableCallable GeneratorIterableMappingMutableMappingSequence)Future)AbstractContextManager) GeneratorType) TYPE_CHECKINGAnyLiteral TypedDict TypeGuardcast)unquoteurljoin)StapledObjectStream)is_async_callable)StarletteDeprecationWarning)ASGIAppMessageReceiveScopeSend)WebSocketDisconnect) )SelfzRUsing `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. stacklevelzThe starlette.testclient module requires the httpx2 package to be installed. You can install this with: $ pip install httpx2 cZtj|r t|dSt|S)N __await__)inspectisclasshasattrrapps h/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/starlette/testclient.py _is_asgi3r-?s&ssK(( S !!c eZdZdZddZddZy) _WrapASGI2z7 Provide an ASGI3 interface onto an ASGI2 app. c||_yNr*)selfr+s r,__init__z_WrapASGI2.__init__Js r.cTK|j|}|||d{y7wr2r*)r3scopereceivesendinstances r,__call__z_WrapASGI2.__call__Ms#88E?w%%%s (&(N)r+ASGI2AppreturnNone)r6rr7rr8rr<r=)__name__ __module__ __qualname____doc__r4r:r.r,r0r0Es&r.r0c"eZdZUded<ded<y) _AsyncBackendstrbackenddict[str, Any]backend_optionsN)r>r?r@__annotations__rBr.r,rDrDRs L##r.rDceZdZddZy)_Upgradec||_yr2)session)r3rMs r,r4z_Upgrade.__init__Xs  r.N)rMWebSocketTestSessionr<r=)r>r?r@r4rBr.r,rKrKWsr.rKceZdZdZy)WebSocketDenialResponsez A special case of `WebSocketDisconnect`, raised in the `TestClient` if the `WebSocket` is closed before being accepted with a `send_denial_response()`. N)r>r?r@rArBr.r,rPrP\sr.rPceZdZ ddZddZddZddZddZddZddZ ddZ ddd Z ddd Z dd Z dd ZddZdddZy )rNcJ||_||_d|_||_d|_yr2)r+r6accepted_subprotocolportal_factory extra_headers)r3r+r6rTs r,r4zWebSocketTestSession.__init__gs*  $(!,!r.ctj5}|j|jx|_}|j |j \}}|j|j|j|j|j|jddi|j}|j||jdd|_|jdd|_|j|j"d|j%|_|cdddS#1swYyxYw)Ntypezwebsocket.connect subprotocolheaders) contextlib ExitStack enter_contextrTportal start_task_runcallbackresultcallcancelr8r7_raise_on_closegetrSrUclosepop_all exit_stack)r3stackr^futcsmessages r, __enter__zWebSocketTestSession.__enter__ss  ! ! # u#(#6#6t7J7J7L#M MDK&'' 2GC NN3:: & NN6;; 2 IIv23 4llnG   )(/ M4(HD %!(Y!=D  NN4::t ,#mmoDO   s DD99Ec4|jj|Sr2)ri__exit__r3argss r,rpzWebSocketTestSession.__exit__s't''..r.c Ktjtj}|\}}tjtj}|\}}|5|5|5|5tj5}||_||_|j||j|j|j|jd{tjd{dddddddddddddddy7I7/#1swY.xYw#1swY2xYw#1swY6xYw#1swY:xYw#1swYyxYww)zE The sub-thread in which the websocket session runs. N) anyiocreate_memory_object_streammathinf CancelScope _receive_tx_send_rxstartedr+r6r7r8 sleep_forever) r3 task_statusr8send_txsend_rxr7 receive_tx receive_rxrls r,r`zWebSocketTestSession._runs0C>_>_`d`h`h>i!( J  (g (z (: (u7H7H7J (b)D #DM    #((4::z'9'97<<H H H%%' ' ' ( ( ( ( ( ( I ( ( ( ( ( ( ( ( ( ( (sAEED9D-D! 3AD DD #D$D (D! 0D-8D9E ED D DD! !D* &D--D6 2D99E >EE EcV|ddk(r-t|jdd|jdd|ddk(rl|d }|d }g} |j}|dd k(sJ|j|d |jd dsnBt ||dj |y)NrWzwebsocket.closecoderZreason)rrzwebsocket.http.response.startstatusrYzwebsocket.http.response.bodybody more_bodyFr.) status_coderYcontent)rrfr7appendrPjoin)r3rmrrYrs r,rez$WebSocketTestSession._raise_on_closes 6?/ /%7;;vt+DW[[YaceMfg g V_ ? ?&x0K181CG "D,,.v*HHHH GFO,{{;6  *k7\_\d\dei\jk k@r.cd|jj|jj|yr2)r^rcryr8r3rms r,r8zWebSocketTestSession.sends" ))..8r.c,|jd|dy)Nwebsocket.receiverWtextr8r3datas r, send_textzWebSocketTestSession.send_texts .=>r.c,|jd|dy)NrrWbytesrrs r, send_byteszWebSocketTestSession.send_bytess .>?r.ctj|dd}|dk(r|jd|dy|jd|jddy) N),:F) separators ensure_asciirrrutf-8r)jsondumpsr8encode)r3rmoders r, send_jsonzWebSocketTestSession.send_jsonsHzz$:EJ 6> II2DA B II2T[[=QR Sr.Nc.|jd||dy)Nzwebsocket.disconnect)rWrrr)r3rrs r,rgzWebSocketTestSession.closes 146RSr.c`|jj|jjSr2)r^rcrzr7r3s r,r7zWebSocketTestSession.receives!{{ 5 566r.cj|j}|j|tt|dS)Nr)r7rerrErs r, receive_textz!WebSocketTestSession.receive_texts,,,. W%C))r.cj|j}|j|tt|dS)Nr)r7rerrrs r, receive_bytesz"WebSocketTestSession.receive_bytess-,,. W%E77+,,r.c|j}|j||dk(r|d}n|djd}tj|S)Nrrr)r7redecoderloads)r3rrmrs r, receive_jsonz!WebSocketTestSession.receive_jsonsO,,. W% 6>6?D7#**73Dzz$r.)r+ASGI3Appr6rrT_PortalFactoryTyper<r=r<r!)rrrr<z bool | None)r}z'anyio.abc.TaskStatus[anyio.CancelScope]r<r=rmrr<r=)rrEr<r=)rrr<r=)r)rrrLiteral['text', 'binary']r<r=)rZN)rintrz str | Noner<r=r<r)r<rE)r<r)rrr<r)r>r?r@r4rnrpr`rer8rrrrgr7rrrrBr.r,rNrNfsr "  " "+ "  " /(" l9?@TT7* -  r.rNc<eZdZ d ddZddZy)_TestClientTransportcX||_||_||_||_||_||_yr2)r+raise_server_exceptions root_pathrT app_stateclient)r3r+rTrrrrs r,r4z_TestClientTransport.__init__s0'>$"," r.cjj}jjjd}jj}jj }jj jd}ddddd|}d|vr!|jdd\}} t| } n|}|} djvrg} n1| |k(rd |jfg} nd |d| jfg} | jjD cgc]3\} } | jj| jf5c} } z } |d vrjjd d}|g}n,|jd D cgc]} | j}} d t||jddd|j ||j| |j"|| g||j$j'diid }t)|j*||j,}t/|ddj0t||jddd|j ||j| |j"|| gdii|j$j'd }dddt3j4idddfd }dfd } |j-5}|j7t8j:|j7|j*|||ddd|j>r s!Jdsdgt3j4dtAjBdjEd<tAjFd idi}|_$|_%|Scc} } wcc} w#1swYxYw#t<$r}|j>r|Yd}~d}~wwxYw)!Nascii)encodingPi)httpwshttpswssrhostshost>rrsec-websocket-protocolr websocket?rzwebsocket.http.response) rWpathraw_pathrscheme query_stringrYrserver subprotocolsstate extensionsrz1.1http.response.debug) rW http_versionmethodrrrrrrYrrrrFstreamcKr,jsjd{ddiSj}t|tr|j d}nP|d}nKt|t r9 |jd}t|tr|j d}d|ddS|}dd|dS7#t$r ddddcYSwxYww) NrWzhttp.disconnectrr.z http.requestT)rWrr)rWr) is_setwaitread isinstancerErr r8 StopIteration)r body_byteschunkrequestrequest_completeresponse_completes r,r7z4_TestClientTransport.handle_request..receive,s (//1+00222 122<<>D$$$(KK$8  D-0A IIdOE!%- % W 5$2EPTUU " # *J? ?+3%A'+$$2C@@As4&CB;AC:7B=1 C=C CCCc>K|ddk(rZ rJd|dd<|jdgDcgc]%\}}|j|jf'c}}d<d y|ddk(r sJd jrJd |jd d }|jd d}jdk7rdj ||s%dj dj yy|ddk(r|dd |ddyycc}}ww)NrWzhttp.response.startz1Received multiple "http.response.start" messages.rrrYTzhttp.response.bodyz.sendHsDv"77+`-``+,3H,= =)ZaZeZefoqsZt(uJCQV#**, )G(u 9%#' $88'g)gg',335p7pp5{{63/#KK U; >>V+x(..t4 x(--a0%))+!$99"6?:6!&/)4:)vs/D*DCDz(TestClient did not receive any response.i)rrYrrrrrB)&urlrnetlocrrrquerysplitrrYr multi_itemslowerrfstriprrrrcopyrNr+rTrKrioBytesIOrcrtEvent BaseExceptionrhttpx ByteStreamrResponserr)r3rrrrrr default_portr port_stringportrYrrrXrr6rMr7r8r^excresponserrrrrrs ` @@@@@@r,handle_requestz#_TestClientTransport.handle_requests####**G*<{{;;'' !!(('(: ""s3GO &= & S! 4 D+{#DDD W__ $13G \ !/0GTF!D6"2!:!:!<=>G W__MhMhMjkzsESYY['')5<<>:kk ] "!//--.FMK".0 ;F;L;LS;QR% R R# $NN43A6!^^ % "++, ,,,.8"= E+488UD>@J@@   (H &H wl Sx < < ++ , s<)8O O3O#>OO#O O## P,O??PN)Tr)r+rrTrrboolrrErtuple[str, int]rrGr<r=)rz httpx.Requestr<httpx.Response)r>r?r@r4rrBr.r,rrsY )-  +"&    " "Tr.rc  eZdZUdZded<dZded< d dfd ZejddZ ddddddde jje jje jjdd dfd Z ddde jje jje jjdd  dfd Zddde jje jje jjdd  dfd Zddde jje jje jjdd  dfdZddddddde jje jje jjdd dfdZddddddde jje jje jjdd dfdZddddddde jje jje jjdd dfdZddde jje jje jjdd  dfdZ d d fd Zd!dZd"dZd#dZd#dZd#dZxZS)$ TestClientFz Future[None]taskNzanyio.abc.BlockingPortal | Noner^c Rt||xsi|_t|r|} ntt|}t |} | |_i|_t|j |j|||j| } |i}|jddt |1||| | |y)N)rFrH)rTrrrrz user-agent testclient)base_urlrY transportfollow_redirectscookies) rD async_backendr-rr;r0r+rr_portal_factory setdefaultsuperr4)r3r+r rrrFrHrrYrrasgi_appr  __class__s r,r4zTestClient.__init__}s+7OLa_ab S>Hx%C!#H)+( HH//$;nn   ?G<6 -  r.c#K|j|jytjjdi|j5}|dddy#1swYyxYww)NrB)r^rt from_threadstart_blocking_portalr)r3r^s r,rzTestClient._portal_factorysS ;; "++ ""88N4;M;MN RX    sAA!A A!AA! rrfilesrparamsrYrauthrtimeoutrc | tjurtjdtd|j |}t |||||||||| | | | |  S)NzYou should not use the 'timeout' argument with the TestClient. See https://github.com/Kludex/starlette/issues/1108 for more information.r"r#r)rUSE_CLIENT_DEFAULTwarningswarnr _merge_urlrr)r3rrrrrrrrYrrrrrrs r,rzTestClient.requestsx" %22 2 MM\+   ooc"w  -!  r.rrYrrrrrc 2t |||||||||SNr#)rrf r3rrrYrrrrrrs r,rfzTestClient.gets3w{ -!  r.c 2t |||||||||Sr%)roptionsr&s r,r(zTestClient.optionss3w -!  r.c 2t |||||||||Sr%)rheadr&s r,r*zTestClient.heads3w| -!  r.c :t |||||||||| | | |  SNr)rpostr3rrrrrrrYrrrrrrs r,r-zTestClient.posts? w| -!  r.c :t |||||||||| | | |  Sr,)rputr.s r,r0zTestClient.put:s? w{ -!  r.c :t |||||||||| | | |  Sr,)rpatchr.s r,r2zTestClient.patchYs? w} -!  r.c 2t |||||||||Sr%)rdeleter&s r,r4zTestClient.deletexs3w~ -!  r.c |td|}|jdi}|jdd|jdd|jdd|!|jd d j|||d< t |d |fi|t d #t$r}|j}Yd}~|Sd}~wwxYw) Nzws://testserverrY connectionupgradezsec-websocket-keyz testserver==zsec-websocket-version13rz, GETzExpected WebSocket upgrade) rrfrrrr RuntimeErrorrKrM)r3rrkwargsrYrrMrs r,websocket_connectzTestClient.websocket_connects '-**Y+<3.?2D9  #   7<9P Q#y = GOE3 1& 1;< < "kkG  "s?B B;$ B66B;ctj5}|jtjj dij x_|jdfd }tjtj}tjtj}g||D]}|j|jt|_t|_j!j"_j'j(|jdfd }|j+_dddS#1swYSxYw)Ncd_yr2)r^rsr, reset_portalz*TestClient.__enter__..reset_portals " r.c<jjyr2)rc wait_shutdown)r^r3sr,rAz+TestClient.__enter__..wait_shutdowns D../r.rBr<r=)r[r\r]rtrrrr^rarurvrwrgr stream_sendstream_receivestart_task_soonlifespanr rc wait_startuprhri)r3rjr?r8r7channelrAr^s` @r,rnzTestClient.__enter__s>  ! ! # .u#(#6#6u7H7H7^7^7taeasas7t#u uDK& ^^ # #11$((; TYStStTG-T,G, .w}}- .2D9D "5w"?D ..t}}=DI KK)) * ^^ 0 0$mmoDO1 .4 5 .4 s EE##E-c8|jjyr2)rirgrqs r,rpzTestClient.__exit__s r.cRKd|jd} |j||jj|jj d{|jj dd{y7(7#|jj dd{7wxYww)NrF)rWr)rr+rDr7rCr8)r3r6s r,rFzTestClient.lifespans#dnn= .((5$"5"5"="=t?O?O?T?TU U U""''- - - V -$""''- - -sLB'>A>A:A>B'4A<5B':A><B'>B$B B$$B'cKjjddid{dfd }|d{}|ddvsJ|ddk(r|d{yy7;7(7 w)NrWzlifespan.startupcKjjd{}|jj|S7"wr2rCr7r rbrmr3s r,r7z(TestClient.wait_startup..receive= ,,4466G   "N7AA#A)zlifespan.startup.completelifespan.startup.failedrQr<rrDr8r3r7rms` r,rGzTestClient.wait_startups!!&&0B'CDDD   /v#     6?7 7)OO 8 E" s1!A&A A&A"A&A$A&"A&$A&cKdfd }jjddid{|d{}|ddvsJ|ddk(r|d{yy757(7 w)NcKjjd{}|jj|S7"wr2rMrNs r,r7z)TestClient.wait_shutdown..receiverOrPrWzlifespan.shutdown)zlifespan.shutdown.completelifespan.shutdown.failedrWrRrSrTs` r,rAzTestClient.wait_shutdowns  !!&&0C'DEEE /v#     6?8 8)OO 9 F! s1'A&A A&A"A&A$A&"A&$A&) zhttp://testserverTrasyncioNNNT)r iP)r+rr rErrrrErFzLiteral['asyncio', 'trio']rHdict[str, Any] | Nonerhttpx._types.CookieTypes | NonerYzdict[str, str] | Nonerrrrr<r=)r<z/Generator[anyio.abc.BlockingPortal, None, None])rrErhttpx._types.URLTypesr"httpx._types.RequestContent | Noner_RequestData | Noner httpx._types.RequestFiles | Nonerrr#httpx._types.QueryParamTypes | NonerYhttpx._types.HeaderTypes | NonerrZr7httpx._types.AuthTypes | httpx._client.UseClientDefaultr%bool | httpx._client.UseClientDefaultr:httpx._types.TimeoutTypes | httpx._client.UseClientDefaultrrYr<r)rr[rr_rYr`rrZrrarrbrrcrrYr<r)rr[rr\rr]rr^rrrr_rYr`rrZrrarrbrrcrrYr<rr2)rrErzSequence[str] | Noner;rr<rNr)rrrr<r=rB)r>r?r@__test__rIr^r4r[contextmanagerrr_clientrrrfr(r*r-r0r2r4r<rnrprFrGrA __classcell__)rs@r,rrxsH .2F +2 ,(,.71537)-!%"7& & & "& &  & , & /& 1& '& &  &  & P7;$(266:3737HM HhHhBG--BbBbNSmmNnNn,0' ' #' 4 ' " ' 0' ' 4' 1' 1' F' @' L' *' !' Z7;3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  1  1  F @ L *   67;3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  1  1  F @ L *   67;3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  1  1  F @ L *   67;$(266:3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  "  0   4 1 1 F @ L *   F7;$(266:3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  "  0   4 1 1 F @ L *   F7;$(266:3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  "  0   4 1 1 F @ L *   F7;3737HM HhHhBG--BbBbNSmmNnNn,0 " 4  1  1  F @ L *   4.2 +   .: ."r.r)r+zASGI2App | ASGI3Appr<zTypeGuard[ASGI3App])N __future__rr[r'rrrvsysr collections.abcrrrrrr r concurrent.futuresr r typesr typingrrrrrr urllib.parserrrt anyio.abcanyio.from_threadanyio.streams.stapledrstarlette._utilsrstarlette.exceptionsrstarlette.typesrrrrrstarlette.websocketsr version_infor!typing_extensionshttpx2rModuleNotFoundErrorr!r:abcBlockingPortalr ASGIInstancer;rrEr _RequestDatar-r0rD ExceptionrKrrPrN BaseTransportrClientrrBr.r,rs" ggg%-JJ) 5.<BB4w&"b"89Q9Q"RRS$489 UG\) * UGT*IdO; <sC(3-/%778 " & &$I$ y  NNf f Rf5..fRttg    HMMd+ # -    s*5E77F,=FF,F&&F,+F,