+
    Žvjf  ã                  ó~  € R t ^ RIHt ^ RIt^ RIt^ RIHtHt ^ RIH	t	H
t
 ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ R	IHt ^ R
IHtHt ]'       d   ^ RIHt ]P>                  R R l4       t R R lt!R R lt"R R lt#R R lt$R R lt%R R lt&R R lt'R R lt(R R lt)R  R! lt*R" R# lt+]PX                  P[                  Rb. RcO4      R% R& l4       t.R' R( lt/R) R* lt0]PX                  P[                  R$. RdO4      R+ R, l4       t1R- R. lt2R/ R0 lt3R1 R2 lt4R3 R4 lt5R5 R6 lt6R7 R8 lt7R9 R: lt8R; R< lt9R= R> lt:R? R@ lt;RA RB lt<RC RD lt=RE RF lt>RG RH lt?RI RJ lt@RK RL ltARM RN ltBRO RP ltCRQ RR ltDRS RT ltERU RV ltFRW RX ltGRY RZ ltH]	! R[4      R\ R] l4       tIR^ R_ ltJR` Ra ltKR# )ezLUnit tests for the Mailjet API client routing, internal logic, and security.)ÚannotationsN)ÚAnyÚTYPE_CHECKING)ÚpatchÚ	MagicMock)ÚConnectionError©ÚRequestException)ÚTimeout)ÚApiErrorÚClientÚConfigÚCriticalApiErrorÚTimeoutError)ÚSecurityGuard)Ú_JSON_HEADERSÚ_TEXT_HEADERS)ÚLogCaptureFixturec               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "ÚZ/var/www/html/daimler-pipeline/venv/lib/python3.14/site-packages/tests/unit/test_client.pyÚ__annotate__r       s   € ÷ Nñ N˜ñ Nó    c                 ó   € \        RRR7      # )zDReturn a client with fake credentials for pure offline unit testing.Úv3©ÚauthÚversion)Úfake_public_keyÚfake_private_key)r   r   r   r   Úclient_offliner#      s   € ô Ð>ÈÔMÐMr   c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   r   *   s   € ÷ Hñ H¨tñ Hr   c                 óÞ   € Rp \        V R7      pVP                  P                  e   Q hRVP                  P                  9   g   Q hVP                  P                  R,          RV  28X  g   Q hR# )zNVerify that passing a string to auth configures Bearer token (Content API v1).Úsecret_v1_token_123©r   NÚAuthorizationzBearer )r   Úsessionr   Úheaders)ÚtokenÚclients     r   Ú%test_bearer_token_auth_initializationr/   *   sc   € à!€EÜ˜Ô€Fà�>‰>×ÑÒ&Ð&Ð&Ø˜fŸn™n×4Ñ4Ô4Ð4Ð4Ø�>‰>×!Ñ! /Õ2¸À¸wÐ6GÔGÐGÒGr   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   4   s   € ÷ 8ñ 8¨ñ 8r   c                 ó’   € \        RR7      p RV P                  P                  9  g   Q hV P                  P                  R8X  g   Q hR# )zFVerify that passing a tuple to auth configures Basic Auth (Email API).r)   r*   N©ÚpublicÚprivate)r   r+   r,   r   ©r.   s    r   Útest_basic_auth_initializationr6   4   s>   € äÐ.Ô/€Fà &§.¡.×"8Ñ"8Ô8Ð8Ð8Ø�>‰>×ÑÐ"7Ô7Ð7Ò7r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   <   s   € ÷ /ñ / Tñ /r   c                 ól  € \         P                  ! \        RR7      ;_uu_ 4        \        R
R7       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       \         P                  ! \        R	R7      ;_uu_ 4        \        . ROR7       RRR4       R#   + '       g   i     L¿; i  + '       g   i     L™; i  + '       g   i     Ls; i  + '       g   i     R# ; i)zZVerify that invalid auth formats raise appropriate exceptions to prevent misconfiguration.z2Basic auth tuple must contain exactly two elements©Úmatchr)   Nz&Bearer token cannot be an empty stringz   z(Bearer token contains invalid charactersztoken
with
newlinezInvalid auth type)r3   )ÚlistÚisÚinvalid)ÚpytestÚraisesÚ
ValueErrorr   Ú	TypeErrorr   r   r   Útest_auth_validation_errorsrB   <   s¶   € ä	�Š”zÐ)]×	^Ö	^Ü�KÕ ÷ 
_ô 
�Š”zÐ)Q×	RÖ	RÜ�EÕ÷ 
Sô 
�Š”zÐ)S×	TÖ	TÜÐ*Õ+÷ 
Uô 
�Š”yÐ(;×	<Ö	<ÜÒ-Õ.÷ 
=Ñ	<÷ 
_×	^ú÷ 
S×	Rú÷ 
U×	Tú÷ 
=×	<Ð	<ús/   ¥C)ÁC<ÂDÃD"Ã)C9	Ã<D	ÄD	Ä"D3	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   P   s   € ÷ 2ñ 2¨tñ 2r   c                 ó    € \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       R#   + '       g   i     R# ; i)zKVerify that the SDK refuses to communicate over unencrypted HTTP (CWE-319).zSecure connection requiredr9   zhttp://api.mailjet.com/©Úapi_urlN©r>   r?   r@   r   r   r   r   Ú%test_config_api_url_validation_schemerH   P   s-   € ä	�Š”zÐ)E×	FÖ	FÜÐ0Õ1÷ 
G×	F×	FÒ	Fúó	   ¥<¼A	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   V   s   € ÷ $ñ $°ñ $r   c                 ó    € \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       R#   + '       g   i     R# ; i)z:Verify that malformed URLs without hostnames are rejected.z!Invalid api_url: missing hostnamer9   z	https:///rE   NrG   r   r   r   Ú'test_config_api_url_validation_hostnamerL   V   s,   € ä	�Š”zÐ)L×	MÖ	MÜ�{Õ#÷ 
N×	M×	MÒ	MúrI   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   \   s   € ÷ 	ñ 	¨Dñ 	r   c                 óÐ  € \         P                  ! \        RR7      ;_uu_ 4        \        ^ R7       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        RR7       RRR4       R#   + '       g   i     L„; i  + '       g   i     L^; i  + '       g   i     R# ; i)zYVerify that extreme timeout values are rejected to prevent resource exhaustion (CWE-400).z1Timeout values must be strictly between 1 and 300r9   ©ÚtimeoutNéô  z/Timeout tuple must contain exactly two elements)é
   rG   r   r   r   Ú"test_config_timeout_invalid_valuesrS   \   sŠ   € ä	�Š”zÐ)\×	]Ö	]Ü�qÕ÷ 
^ô 
�Š”zÐ)\×	]Ö	]Ü�sÕ÷ 
^ô 
�Š”zÐ)Z×	[Ö	[Ü�uÕ÷ 
\Ñ	[÷ 
^×	]ú÷ 
^×	]ú÷ 
\×	[Ð	[ús#   ¥B.ÁCÂCÂ.B>	ÃC	ÃC%	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   h   s   € ÷ ñ ¨$ñ r   c                 ó6   € \        ^R7       \        RR7       R# )zWVerify that standard timeout integers and specific (connect, read) tuples are accepted.rO   N)é   é   ©r   r   r   r   Ú test_config_timeout_valid_valuesrY   h   s   € ä
�2ÕÜ
�7×r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   n   s   € ÷ 'ñ '¨dñ 'r   c                 ó„   € \        RRR7      p R R lpWP                  n        V P                  P	                  RR7       R# )	z^Verify that injected resource IDs are strictly URL-encoded to prevent Path Traversal (CWE-22).r   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   ÚmethodÚstrÚurlÚkwargsr   r   úrequests.Responser   )r   s   "r   r   Ú:test_url_sanitization_path_traversal.<locals>.__annotate__r   s)   € ÷ ñ ˜Sð  sð °cð Ð>Oñ r   c                ób   € R V9  g   Q hRV9   g   Q h\         P                  ! 4       p^ÈVn        V# )ú	../deletez..%2Fdelete©ÚrequestsÚResponseÚstatus_code©r^   r`   ra   Úresps   &&, r   Úmock_requestÚ:test_url_sanitization_path_traversal.<locals>.mock_requestr   s9   € à #Ô%Ð%Ð%Ø Ô#Ð#Ð#Ü× Ò Ó"ˆØˆÔØˆr   re   )ÚidN©ÚaÚb)r   r+   ÚrequestÚcontactÚget)r.   rl   s     r   Ú$test_url_sanitization_path_traversalru   n   s4   € ä˜¨TÔ2€Fõð *‡N�NÔà
‡N�N×Ñ˜+ÐÖ&r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r      s   € ÷ *ñ *°ñ *r   c                 ó€   € \        RR7      p \        V 4      p\        V 4      pRV9  g   Q hRV9  g   Q hRV9   g   Q hR# )zJVerify that string representations do not leak the private keys (CWE-316).r)   Úmy_super_secretzMailjet ClientN)Úmy_super_secret_publicÚmy_super_secret_private)r   Úreprr_   )r.   ÚrepÚ
string_reps      r   Ú'test_client_repr_and_str_redact_secretsr~      sI   € äÐNÔO€FÜ
ˆv‹,€CÜ�V“€Jà CÔ'Ð'Ð'Ø JÔ.Ð.Ð.Ø˜zÔ)Ð)Ò)r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   Š   s   € ÷ *ñ *¨ñ *r   c                 óŽ   € \        RR7      p V P                  P                  R4      pVP                  P                  ^8X  g   Q hR# )zKVerify that a Retry adapter is successfully mounted for network resilience.r)   úhttps://api.mailjet.com/Nro   )r   r+   Úget_adapterÚmax_retriesÚtotal)r.   Úadapters     r   Útest_client_mount_retry_adapterr†   Š   s;   € ä˜Ô$€FØ�n‰n×(Ñ(Ð)CÓD€Gà×Ñ×$Ñ$¨Ô)Ð)Ò)r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r#   r   Úmonkeypatchúpytest.MonkeyPatchr   r&   r   )r   s   "r   r   r   ’   s$   € ÷ 'ñ 'Øð'Ø);ð'à	ñ'r   c                ó  € R R lpVP                  V P                  RV4       \        P                  ! \        RR7      ;_uu_ 4        V P
                  P                  4        RRR4       R#   + '       g   i     R# ; i)zUVerify that validate_dx_routing correctly flags API version ambiguities via warnings.c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úargsr   ra   r   rb   r   )r   s   "r   r   Ú4test_ambiguity_warnings_logged.<locals>.__annotate__—   s"   € ÷ ñ ˜Cð ¨3ð Ð3Dñ r   c                 ó>   € \         P                  ! 4       pR Vn        V# )i”  rf   ©rŽ   ra   rk   s   *, r   rl   Ú4test_ambiguity_warnings_logged.<locals>.mock_request—   s   € Ü× Ò Ó"ˆØˆÔØˆr   rr   zAMailjet API Ambiguity: Email API \(v3\) uses singular '/template'r9   N)Úsetattrr+   r>   ÚwarnsÚDeprecationWarningÚ	templatesrt   ©r#   r‰   rl   s   && r   Útest_ambiguity_warnings_loggedr˜   ’   sc   € õ
ð
 ×Ñ˜×.Ñ.°	¸<ÔHô 
�ŠÜØR÷
ö 
ð 	× Ñ ×$Ñ$Ô&÷	
÷ 
÷ 
ò 
ús   ÁA-Á-A>	r    c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r    r_   ÚresourceÚexpected_pathr#   r   r   r&   r   )r   s   "r   r   r   ´   s4   € ÷ =ñ =Øð=Øð=Ø03ð=ØEKð=à	ñ=r   c                ót   € WP                   n        \        W14      pVP                  4       pVRV 28X  g   Q hR# )zMVerify REST URL construction dynamically respects the configured API version.r�   N)Úconfigr    ÚgetattrÚ
_build_url)r    rš   r›   r#   Úendpointr`   s   &&&&  r   Ú#test_dynamic_versions_standard_restr¡   «   s>   € ð %,×ÑÔ!Ü�~Ó0€HØ
×
Ñ
Ó
€CØÐ,¨]¨OÐ<Ô<Ð<Ò<r   c               ó    € V ^8„  d   QhRRRR/# ©r   r#   r   r   r&   r   )r   s   "r   r   r   ¾   s   € ÷ Kñ KÀð KÈDñ Kr   c                ór   € RV P                   n        V P                  P                  ^{R7      pVR8X  g   Q hR# )z<Verify Content API (v1) specific routes construct correctly.Úv1©Úid_valz6https://api.mailjet.com/v1/REST/templates/123/contentsN)r�   r    Útemplates_contentsrŸ   ©r#   r`   s   & r   Ú,test_dynamic_versions_content_api_v1_routingrª   ¾   s8   € à$(€N×ÑÔ!à
×
+Ñ
+×
6Ñ
6¸cÐ
6Ó
B€CØÐJÔJÐJÒJr   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   Æ   s   € ÷ Sñ SÈð SÐTXñ Sr   c                ót   € RV P                   n        V P                  P                  ^{RR7      pVR8X  g   Q hR# )zOVerify deeply nested Content API routes construct correctly using split action.r¥   ÚP)r§   Ú	action_idz>https://api.mailjet.com/v1/REST/templates/123/contents/types/PN)r�   r    Útemplates_contents_typesrŸ   r©   s   & r   Ú4test_dynamic_versions_content_api_v1_complex_routingr°   Æ   s;   € à$(€N×ÑÔ!Ø
×
1Ñ
1×
<Ñ
<ÀCÐSVÐ
<Ó
W€CØÐRÔRÐRÒRr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r    r_   r#   r   r   r&   r   )r   s   "r   r   r   Ñ   s!   € ÷ <ñ <¨Cð <Àð <ÈDñ <r   c                ót   € WP                   n        VP                  P                  4       pVRV  R28X  g   Q hR# )zNVerify the Send API explicitly bypasses the /REST/ prefix across all versions.r�   z/sendN©r�   r    ÚsendrŸ   )r    r#   r`   s   && r   Útest_dynamic_versions_send_apirµ   Í   s<   € ð %,×ÑÔ!Ø
×
Ñ
×
(Ñ
(Ó
*€CØÐ,¨W¨I°UÐ;Ô;Ð;Ò;r   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   Ø   s   € ÷ Fñ F°Fð F¸tñ Fr   c                óL  € RV P                   n        V P                  P                  4       pVR8X  g   Q hV P                  P                  RR7      pVR8X  g   Q hV P                  P                  RR7      pVR8X  g   Q hV P
                  P                  RR7      pVR	8X  g   Q hR
# )zIVerify the highly specific CSV data upload endpoints construct correctly.r   ú,https://api.mailjet.com/v3/DATA/contactslistiÈ  r¦   zChttps://api.mailjet.com/v3/DATA/contactslist/456/CSVData/text:plaini  zBhttps://api.mailjet.com/v3/DATA/contactslist/789/CSVError/text:csviç  z0https://api.mailjet.com/v3/data/contactslist/999N)r�   r    Úcontactslist_csvdatarŸ   Úcontactslist_csverrorÚdata_contactslist)r#   Úurl1Úurl2Úurl3Úurl4s   &    r   Útest_build_csv_url_all_branchesrÀ   Ø   s«   € à$(€N×ÑÔ!à×.Ñ.×9Ñ9Ó;€DØÐAÔAÐAÐAà×.Ñ.×9Ñ9ÀÐ9ÓE€DØÐXÔXÐXÐXà×/Ñ/×:Ñ:À#Ð:ÓF€DØÐWÔWÐWÐWà×+Ñ+×6Ñ6¸cÐ6ÓB€DØÐEÔEÐEÒEr   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   é   s   € ÷ 4ñ 4°fð 4Àñ 4r   c                ón   € RV P                   n        V P                  P                  4       pVR8X  g   Q hR# )zVVerify that unexpected operations on the Send API still attempt to route consistently.r   úhttps://api.mailjet.com/v3/sendNr³   r©   s   & r   Ú!test_send_api_v3_bad_path_routingrÄ   é   s3   € à$(€N×ÑÔ!Ø
×
Ñ
×
(Ñ
(Ó
*€CØÐ3Ô3Ð3Ò3r   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   ð   s   € ÷ Vñ V°fð VÀñ Vr   c                ór   € RV P                   n        V P                  P                  ^{R7      pVR8X  g   Q hR# )zDVerify that deeply nested paths on the Content API format correctly.r¥   r¦   zAhttps://api.mailjet.com/v1/REST/templates/123/contents/fakeactionN)r�   r    Útemplates_contents_fakeactionrŸ   r©   s   & r   Ú!test_content_api_bad_path_routingrÈ   ð   s8   € à$(€N×ÑÔ!Ø
×
6Ñ
6×
AÑ
AÈÐ
AÓ
M€CØÐUÔUÐUÒUr   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   ÷   s   € ÷ Añ A°vð AÀ$ñ Ar   c                ón   € RV P                   n        V P                  P                  4       pVR8X  g   Q hR# )z3Verify statistical routing bypasses standard logic.r   z,https://api.mailjet.com/v3/REST/statcountersN)r�   r    ÚstatcountersrŸ   r©   s   & r   Ú"test_statcounters_endpoint_routingrÌ   ÷   s3   € à$(€N×ÑÔ!Ø
×
%Ñ
%×
0Ñ
0Ó
2€CØÐ@Ô@Ð@Ò@r   c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   þ   s   € ÷ Kñ K°Fð K¸tñ Kr   c                ó\   € V P                   P                  4       pRV9   g   Q RV 24       hR# )zdVerify that CamelCase endpoints correctly translate to dashed paths (e.g., linkClick -> link-click).z
link-clickz"Expected 'link-click' in URL, got N)Ústatistics_linkClickrŸ   r©   s   & r   Útest_camel_case_to_dash_routingrÐ   þ   s1   € à
×
-Ñ
-×
8Ñ
8Ó
:€CØ˜3ÔÐJÐ"DÀSÀEÐ JÓJÒr   c               ó$   € V ^8„  d   QhRRRRRR/# rˆ   r   )r   s   "r   r   r   	  s#   € ÷ #ñ #°&ð #ÐGYð #Ð^bñ #r   c                óÌ  € RR R llpVP                  V P                  RV4       V P                  P                  ^R7      P                  pVR8X  g   Q hV P                  P                  ^R7      P                  pVR8X  g   Q hV P                  P                  ^^R7      P                  pVR	8X  g   Q hV P                  P                  ^^R7      P                  pVR
8X  g   Q hR# )zcVerify that CRUD operations correctly map to their respective HTTP methods and timeouts are passed.Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r^   r_   r`   rP   z
int | Nonera   r   r   rb   r   )r   s   "r   r   Ú3test_http_methods_and_timeout.<locals>.__annotate__  s1   € ÷ ñ ˜Sð  sð °Zð ÐRUð ÐZkñ r   c                óz   € V^8X  g   Q h\         P                  ! 4       p^ÈVn        V P                  4       Vn        V# )é   )rg   rh   ri   ÚencodeÚ_content)r^   r`   rP   ra   rk   s   &&&, r   rl   Ú3test_http_methods_and_timeout.<locals>.mock_request  s6   € Ø˜"Œ}Ðˆ}Ü× Ò Ó"ˆØˆÔàŸ™›ˆŒØˆr   rr   rO   ÚGETÚPOST)rn   rP   ÚPUTÚDELETE©N)r“   r+   rs   rt   ÚtextÚcreateÚupdateÚdelete)r#   r‰   rl   Úget_respÚ	post_respÚupdate_respÚdelete_resps   &&     r   Útest_http_methods_and_timeoutrç   	  sÙ   € ÷ð ×Ñ˜×.Ñ.°	¸<ÔHØ×%Ñ%×)Ñ)°"Ð)Ó5×:Ñ:€HØ�uÔÐÐØ×&Ñ&×-Ñ-°bÐ-Ó9×>Ñ>€IØ˜ÔÐÐà ×(Ñ(×/Ñ/°1¸bÐ/ÓA×FÑF€KØ˜%ÔÐÐØ ×(Ñ(×/Ñ/°1¸bÐ/ÓA×FÑF€KØ˜(Ô"Ð"Ò"r   c               ó$   € V ^8„  d   QhRRRRRR/# rˆ   r   )r   s   "r   r   r      s#   € ÷ ,ñ ,°Fð ,ÐI[ð ,Ð`dñ ,r   c                ó   € RR R llpVP                  V P                  RV4       V P                  P                  R^
/R7       V P                  P                  R^
/R7       V P                  P                  RR7       R# )	zcVerify internal routing edge cases like missing filters, kwargs extraction, and payload conversion.Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r^   r_   r`   Úparamszdict[str, Any] | Nonera   r   r   rb   r   )r   s   "r   r   Ú5test_client_coverage_edge_cases.<locals>.__annotate__#  s2   € ÷ ñ ˜Sð  sð Ð4Ið Ð\_ð Ðduñ r   c                ó\   € VR ^
/8X  g   Ve   Q h\         P                  ! 4       p^ÈVn        V# )Úlimitrf   )r^   r`   rë   ra   rk   s   &&&, r   rl   Ú5test_client_coverage_edge_cases.<locals>.mock_request#  s3   € Ø˜' 2˜Ô&¨&ª.Ð8Ð8Ü× Ò Ó"ˆØˆÔØˆr   rr   rî   )Úfilter)ÚfiltersrÞ   ©r“   r+   rs   rt   r—   s   && r   Útest_client_coverage_edge_casesró      sn   € ÷ð ×Ñ˜×.Ñ.°	¸<ÔHà×Ñ×Ñ w° mÐÔ4Ø×Ñ×Ñ¨° }ÐÔ5Ø×Ñ×Ñ dÐÖ+r   c               ó$   € V ^8„  d   QhRRRRRR/# rˆ   r   )r   s   "r   r   r   0  s#   € ÷ -ñ -À6ð -ÐXjð -Ðosñ -r   c                ó¼   € RR R llpVP                  V P                  RV4       RRRRR	R
/RRRR	R/.RRRRRRR//./pV P                  P                  VR7       R# )zVVerify complex nested payloads (like v3.1 templates) are serialized as JSON correctly.Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r^   r_   r`   Údatar   ra   r   rb   r   )r   s   "r   r   ÚDtest_send_api_v3_1_template_language_variables.<locals>.__annotate__3  s0   € ÷ ñ ˜Sð  sð °#ð Èð ÐPañ r   c                ó’   € \        V\        4      '       g   Q hR V9   g   Q hRV9   g   Q h\        P                  ! 4       p^ÈVn        V# )ÚTemplateLanguageÚ	Variables)Ú
isinstancer_   rg   rh   ri   )r^   r`   r÷   ra   rk   s   &&&, r   rl   ÚDtest_send_api_v3_1_template_language_variables.<locals>.mock_request3  sL   € Ü˜$¤×$Ò$Ð$Ð$Ø! TÔ)Ð)Ð)Ø˜dÔ"Ð"Ð"Ü× Ò Ó"ˆØˆÔØˆr   rr   ÚMessagesÚFromÚEmailzpilot@mailjet.comÚNamezMailjet PilotÚTozpassenger1@mailjet.comzpassenger 1Ú
TemplateIDi‡Ö rú   Trû   ÚdayÚTuesday)r÷   rÞ   )r“   r+   r´   rà   )r#   r‰   rl   Úpayloads   &&  r   Ú.test_send_api_v3_1_template_language_variablesr  0  s…   € ÷ð ×Ñ˜×.Ñ.°	¸<ÔHð 	à˜Ð"5°v¸ÐOØ˜Ð!9¸6À=ÐQÐRØ˜gØ" DØ˜e YÐ/ðð
ð
€Gð ×Ñ×Ñ GÐÖ,r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r#   r   r‰   rŠ   Úcaplogr   r   r&   r   )r   s   "r   r   r   K  s,   € ÷ '*ñ '*Øð'*Ø);ð'*ØEVð'*à	ñ'*r   c                óL  € VP                  \        P                  RR7       R R lpVP                  V P                  RV4       \
        P                  ! \        RR7      ;_uu_ 4        V P                  P                  4        RRR4       R	VP                  9   g   Q hR
 R lpVP                  V P                  RV4       \
        P                  ! \        RR7      ;_uu_ 4        V P                  P                  4        RRR4       RVP                  9   g   Q hR R lpVP                  V P                  RV4       \
        P                  ! \        RR7      ;_uu_ 4        V P                  P                  4        RRR4       RVP                  9   g   Q hR R lpVP                  V P                  RV4       V P                  P                  4        RVP                  9   g   Q hR#   + '       g   i     ELp; i  + '       g   i     EL; i  + '       g   i     L�; i)z_Verify that raw requests exceptions are caught, logged, and wrapped in SDK-specific exceptions.zmailjet_rest.client)Úloggerc               ó$   € V ^8„  d   QhRRRRRR/# r�   r   )r   s   "r   r   Ú:test_api_call_exceptions_and_logging.<locals>.__annotate__Q  s"   € ÷ 0ñ 0˜Cð 0¨3ð 0Ð3Dñ 0r   c                 ó   € \        R 4      h)zRead timed out)ÚRequestsTimeout©rŽ   ra   s   *,r   Úmock_timeoutÚ:test_api_call_exceptions_and_logging.<locals>.mock_timeoutQ  s   € ÜÐ.Ó/Ð/r   rr   z Request to Mailjet API timed outr9   NzTimeout Error: GETc               ó$   € V ^8„  d   QhRRRRRR/# r�   r   )r   s   "r   r   r  Y  s'   € ÷ Nñ N Sð N°Cð NÐ<Mñ Nr   c                 ó   € \        R 4      h)z$Failed to establish a new connection)ÚRequestsConnectionErrorr  s   *,r   Úmock_connection_errorÚCtest_api_call_exceptions_and_logging.<locals>.mock_connection_errorY  s   € Ü%Ð&LÓMÐMr   z Connection to Mailjet API failedz%Connection Error: Failed to establishc               ó$   € V ^8„  d   QhRRRRRR/# r�   r   )r   s   "r   r   r  a  s"   € ÷ :ñ : cð :°Sð :Ð=Nñ :r   c                 ó   € \        R 4      h)zGeneric network failurer   r  s   *,r   Úmock_general_exceptionÚDtest_api_call_exceptions_and_logging.<locals>.mock_general_exceptiona  s   € ÜÐ8Ó9Ð9r   z'An unexpected Mailjet API network errorz*Request Exception: Generic network failurec               ó$   € V ^8„  d   QhRRRRRR/# r�   r   )r   s   "r   r   r  i  s"   € ÷ ñ ˜ð  sð Ð/@ñ r   c                 óL   € \         P                  ! 4       pR Vn        RVn        V# )i�  s   Bad Request)rg   rh   ri   rØ   r‘   s   *, r   Úmock_400Ú6test_api_call_exceptions_and_logging.<locals>.mock_400i  s$   € Ü× Ò Ó"ˆØˆÔØ&ˆŒØˆr   zAPI Error 400)Ú	set_levelÚloggingÚDEBUGr“   r+   r>   r?   r   rs   rt   rß   r   r   )r#   r‰   r	  r  r  r  r  s   &&&    r   Ú$test_api_call_exceptions_and_loggingr#  K  s˜  € ð ×Ñ”W—]‘]Ð+@ÐÔAõ0ð ×Ñ˜×.Ñ.°	¸<ÔHÜ	�Š”|Ð+M×	NÖ	NØ×Ñ×"Ñ"Ô$÷ 
Oà 6§;¡;Ô.Ð.Ð.õNð ×Ñ˜×.Ñ.°	Ð;PÔQÜ	�ŠÔ'Ð/Q×	RÖ	RØ×Ñ×"Ñ"Ô$÷ 
Sà2°f·k±kÔAÐAÐAõ:ð ×Ñ˜×.Ñ.°	Ð;QÔRÜ	�Š”xÐ'P×	QÖ	QØ×Ñ×"Ñ"Ô$÷ 
Rà7¸6¿;¹;ÔFÐFÐFõð ×Ñ˜×.Ñ.°	¸8ÔDØ×Ñ×ÑÔ à˜fŸk™kÔ)Ð)Ò)÷; 
O×	NÐ	Nú÷ 
S×	RÐ	Rú÷ 
R×	Qús$   Á)G+Ã&G?Å#HÇ+G<	Ç?H	ÈH#	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   u  s   € ÷ +ñ + Dñ +r   c                 óZ   € \        RRR7      p V P                  P                  R8X  g   Q hR# )zLVerify the SDK allows developers to explicitly request an older API version.úv3.1r   Nro   )r   r�   r    r5   s    r   Útest_client_custom_versionr'  u  s&   € ä˜¨VÔ4€FØ�=‰=× Ñ  FÔ*Ð*Ò*r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   {  s   € ÷ Dñ D˜ñ Dr   c                 ó¨   € \        RR7      p \        V P                  P                  R,          4      p\        P
                  ! RV4      '       g   Q hR# )zBVerify the SDK transmits its version correctly to Mailjet servers.r)   z
User-Agentz#mailjet-apiv3-python/v\d+\.\d+\.\d+Nro   )r   r_   r+   r,   Úrer:   )r.   Úua_vals     r   Útest_user_agentr,  {  s=   € ä˜Ô$€Fä�—‘×'Ñ'¨Õ5Ó6€FÜ�8Š8Ð:¸F×CÒCÐCÒCr   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   ƒ  s   € ÷ <ñ <¨$ñ <r   c                 óú   € \        4       p V R,          w  rVR8X  g   Q hVR,          R8X  g   Q hV R,          w  rVR8X  g   Q hVR,          R8X  g   Q hV R,          w  rVR	8X  g   Q hV R
,          w  rVR8X  g   Q hR# )z1Verify the dictionary-style access routing logic.r´   rÃ   úContent-Typeúapplication/jsonr¹   r¸   ú
text/plainr»   z,https://api.mailjet.com/v3/data/contactslistrs   ú'https://api.mailjet.com/v3/REST/contactNrX   )r�   r`   r,   s      r   Ú test_config_getitem_all_branchesr3  ƒ  s�   € ä‹X€Fà˜&•>�L€CØÐ3Ô3Ð3Ð3Ø�>Õ"Ð&8Ô8Ð8Ð8àÐ0Õ1�L€CØÐ@Ô@Ð@Ð@Ø�>Õ" lÔ2Ð2Ð2àÐ-Õ.�L€CØÐ@Ô@Ð@Ð@à˜)Õ$�L€CØÐ;Ô;Ð;Ò;r   c               ó$   € V ^8„  d   QhRRRRRR/# rˆ   r   )r   s   "r   r   r   –  s#   € ÷ .ñ .°6ð .ÐHZð .Ð_cñ .r   c                ó„   € R R lpVP                  V P                  RV4       V P                  P                  ^{R7       R# )z`Verify that if 'id' is omitted but 'action_id' is passed, it shifts to the primary ID correctly.c               ó(   € V ^8„  d   QhRRRRRRRR/# r]   r   )r   s   "r   r   Ú4test_legacy_action_id_fallback.<locals>.__annotate__™  s)   € ÷ ñ ˜Sð  sð °cð Ð>Oñ r   c                óP   € R V9   g   Q h\         P                  ! 4       p^ÈVn        V# )z/REST/contact/123rf   rj   s   &&, r   rl   Ú4test_legacy_action_id_fallback.<locals>.mock_request™  s+   € Ø" cÔ)Ð)Ð)Ü× Ò Ó"ˆØˆÔØˆr   rr   )r®   Nrò   r—   s   && r   Útest_legacy_action_id_fallbackr:  –  s:   € õð ×Ñ˜×.Ñ.°	¸<ÔHð ×Ñ×Ñ¨ÐÖ-r   c               ó    € V ^8„  d   QhRRRR/# ©r   r‰   rŠ   r   r&   r   )r   s   "r   r   r   ©  s   € ÷ Qñ QÐ,>ð QÀ4ñ Qr   c                óª   a€ \        R	R7      pRoR V3R llpV P                  VP                  RV4       VP                  4        SRJ g   Q R4       hR# )
zAVerify the explicit close method correctly calls session.close().r)   Fc               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   Ú0test_client_explicit_close.<locals>.__annotate__®  ó   € ÷ ñ ˜ñ r   c                 ó   <€ R o R# ©TNr   ©Úclose_calleds   €r   Ú
mock_closeÚ.test_client_explicit_close.<locals>.mock_close®  ó   ø€ àŠr   ÚcloseTz-Expected client.session.close() to be called.Nr2   )r   r“   r+   rH  )r‰   r.   rE  rD  s   &  @r   Útest_client_explicit_closerI  ©  sR   ø€ äÐ.Ô/€Fà€L÷ð ð ×Ñ˜Ÿ™¨°Ô<à
‡L�L„NØ˜4ÓÐPÐ!PÓPÒr   c               ó    € V ^8„  d   QhRRRR/# r<  r   )r   s   "r   r   r   ¸  s   € ÷ Tñ TÐ7Ið TÈdñ Tr   c                óö   a€ \        R	R7      pRoR V3R llpV P                  VP                  RV4       T;_uu_ 4       pW1J g   Q hSRJ g   Q h RRR4       SRJ g   Q R4       hR#   + '       g   i     L; i)
zDVerify that the 'with' statement safely cleans up resources on exit.r)   Fc               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   Ú;test_client_context_manager_lifecycle.<locals>.__annotate__½  r@  r   c                 ó   <€ R o R# rB  r   rC  s   €r   rE  Ú9test_client_context_manager_lifecycle.<locals>.mock_close½  rG  r   rH  NTz0Context manager __exit__ failed to call close().r2   )r   r“   r+   )r‰   r.   rE  Úactive_clientrD  s   &   @r   Ú%test_client_context_manager_lifecyclerQ  ¸  s{   ø€ äÐ.Ô/€Fà€L÷ð ð ×Ñ˜Ÿ™¨°Ô<÷ 
‰�=àÓ&Ð&Ð&à˜uÓ$Ð$Ñ$÷	 
ð ˜4ÓÐSÐ!SÓSÒ÷ 
�ús   Á A(Á(A8	c               ó    € V ^8„  d   QhRRRR/# r<  r   )r   s   "r   r   r   Î  s    € ÷ Vñ VÐ>Pð VÐUYñ Vr   c                ó  a€ \        RR7      pRoR V3R llpV P                  VP                  RV4        ! R R\        4      p T;_uu_ 4        V! R4      h  + '       g   i     M; i  T d     Mi ; iSR
J g   Q R4       hR	# )zZVerify that resources are still cleaned up if an exception occurs inside the 'with' block.r)   Fc               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   ÚBtest_client_context_manager_exception_safety.<locals>.__annotate__Ó  r@  r   c                 ó   <€ R o R# rB  r   rC  s   €r   rE  Ú@test_client_context_manager_exception_safety.<locals>.mock_closeÓ  rG  r   rH  c                  ó   € ] tR tRtRtR# )ÚDtest_client_context_manager_exception_safety.<locals>.SimulatedErroriÙ  r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r   ÚSimulatedErrorrY  Ù  s   † Ûr   r_  z'Something went wrong during an API callNTz2Exception inside context manager bypassed cleanup!r2   )r   r“   r+   Ú	Exception)r‰   r.   rE  r_  rD  s   &   @r   Ú,test_client_context_manager_exception_safetyra  Î  s†   ø€ äÐ.Ô/€Fà€L÷ð ð ×Ñ˜Ÿ™¨°Ô<ôœô ðßŠVÙ Ð!JÓKÐK÷ �Vûàô Ùðúð ˜4ÓÐUÐ!UÓUÒs*   Á
A, Á	AÁA)	Á$A, Á)A, Á,A6Á5A6c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   ë  s   € ÷ +ñ +°vð +À$ñ +r   c                óH  € \         P                  ! \        4      ;_uu_ 4        RV P                  n        RRR4       V P
                  p\         P                  ! \        4      ;_uu_ 4        RVn        RRR4       R#   + '       g   i     LP; i  + '       g   i     R# ; i)zÉVerify that __slots__ are strictly enforced for memory optimization.

This ensures that ephemeral objects do not allocate expensive __dict__
structures, preserving our 20% CPU/Memory performance gain.
ÚtestN)r>   r?   ÚAttributeErrorr�   Únew_dynamic_attrrs   ©r#   r    s   & r   Ú"test_endpoint_and_config_use_slotsrh  ë  sg   € ô 
�Š”~×	&Õ	&Ø17ˆ×ÑÔ.÷ 
'ð ×%Ñ%€HÜ	�Š”~×	&Õ	&Ø$*ˆÔ!÷ 
'Ñ	&÷ 
'×	&ú÷
 
'×	&Ð	&ús   £A=Á+BÁ=B	ÂB!	c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   û  s   € ÷ =ñ =¸fð =Èñ =r   c                ó”   € \        V R4      p\        VR4      R8X  g   Q h\        VR4      RR.8X  g   Q h\        VR4      R8X  g   Q hR# )	zEVerify that Endpoint pre-computes routing strings to save CPU cycles.ÚContact_DataÚ_name_lowerÚcontact_dataÚ_action_partsrs   r÷   Ú_resource_lowerN)rž   rg  s   & r   Ú)test_endpoint_precomputes_routing_stringsrp  û  sU   € ô �~ ~Ó6€Hä�8˜]Ó+¨~Ô=Ð=Ð=Ü�8˜_Ó-°)¸VÐ1DÔDÐDÐDÜ�8Ð.Ó/°9Ô<Ð<Ò<r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r     s   € ÷ .ñ .¨dñ .r   c                 óè   € \        RR7      p \        RR7      pV P                  \         P                  J g   Q hV P                  VP                  J g   Q hV P                  P                  ^8X  g   Q hR# )zHVerify that Retry strategy is a ClassVar, saving instantiation overhead.r)   Nro   )ÚcÚd)r   Ú_RETRY_STRATEGYr„   )Úclient1Úclient2s     r   Ú$test_client_retry_strategy_is_sharedrx    sf   € ä˜*Ô%€GÜ˜*Ô%€Gð ×"Ñ"¤f×&<Ñ&<Ó<Ð<Ð<Ø×"Ñ" g×&=Ñ&=Ó=Ð=Ð=Ø×"Ñ"×(Ñ(¨AÔ-Ð-Ò-r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r     s   € ÷ Dñ D°tñ Dr   c                 óF  € \         P                  ! \        RR7      ;_uu_ 4        \        P                  ! RR/4       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        P                  ! RR/4       RRR4       \         P                  ! \        RR7      ;_uu_ 4        \        P                  ! RR/4       RRR4       \        P                  ! RR/4       R#   + '       g   i     L´; i  + '       g   i     L‚; i  + '       g   i     LP; i)	zFVerify that the pre-compiled regex efficiently blocks CRLF injections.z,CRLF Injection detected in header 'X-Custom'r9   zX-Customzvalue
injectedNzvalue
zvaluez
safe-value)r>   r?   r@   r   Úvalidate_crlf_headersr   r   r   Ú-test_security_guard_crlf_rejection_fast_regexr|    s½   € ô 
�Š”zÐ)W×	XÖ	XÜ×+Ò+¨ZÐ9LÐ,MÔN÷ 
Yô 
�Š”zÐ)W×	XÖ	XÜ×+Ò+¨Z¸Ð,CÔD÷ 
Yô 
�Š”zÐ)W×	XÖ	XÜ×+Ò+¨Z¸Ð,CÔD÷ 
Yô ×'Ò'¨°\Ð(BÖC÷ 
Y×	Xú÷ 
Y×	Xú÷ 
Y×	Xús#   ¥C*Á*C=Â/DÃ*C:	Ã=D	ÄD 	c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   %  s   € ÷ ^ñ ^¸vð ^È$ñ ^r   c                óŽ   € \        V 4      pRV9   g   Q hRV9   g   Q hRV9   g   Q h. ROpV F  pW19   d   K  Q RV R24       h	  R# )zEVerify that __dir__ exposes dynamic endpoints for IDE autocompletion.r+   r�   Úapi_callzExpected endpoint 'z' missing from __dir__N)r´   rs   ÚlistrecipientÚcampaigndraft_sendÚgeostatisticsÚsender_validate)Údir)r#   Ú
client_dirÚexpected_dynamic_endpointsr    s   &   r   Ú*test_client_dir_includes_dynamic_endpointsr‡  %  sh   € ä�^Ó$€Jð ˜
Ô"Ð"Ð"Ø�zÔ!Ð!Ð!Ø˜Ô#Ð#Ð#ò"Ðó /ˆØÖ%Ð]Ð)<¸X¸JÐF\Ð']Ó]Ð%ó /r   c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   ;  s   € ÷ 1ñ 1¨Dñ 1r   c                 ó$  € \         P                  ! \        4      ;_uu_ 4        R\        R&   RRR4       \         P                  ! \        4      ;_uu_ 4        R\        R&   RRR4       R#   + '       g   i     LF; i  + '       g   i     R# ; i)zDVerify that base headers are MappingProxyType and cannot be mutated.Úhackedr/  N)r>   r?   rA   r   r   r   r   r   Ú"test_header_constants_immutabilityr‹  ;  sX   € ä	�Š”y×	!Õ	!Ø(0Œ�nÑ%÷ 
"ô 
�Š”y×	!Õ	!Ø(0Œ�nÑ%÷ 
"Ñ	!÷ 
"×	!ú÷ 
"×	!Ð	!ús   £
A+Á
A>Á+A;	Á>B	c               ó    € V ^8„  d   QhRRRR/# r£   r   )r   s   "r   r   r   D  s   € ÷ 7ñ 7°vð 7À$ñ 7r   c                óö   € V P                   pVP                  RR/4      pVR,          R8X  g   Q hVR,          R8X  g   Q hR\        9  g   Q h\        V R4      pVP                  4       pVR,          R8X  g   Q hR# )zVVerify that endpoint header building unpacks safely without mutating the base proxies.zX-Custom-HeaderÚ	SafeValuer/  r0  r¹   r1  N)rs   Ú_build_headersr   rž   )r#   r    Úmerged_headersÚcsv_endpointÚcsv_headerss   &    r   Ú"test_endpoint_headers_merge_safelyr“  D  s�   € à×%Ñ%€HØ×,Ñ,Ð.?ÀÐ-MÓN€Nð ˜.Õ)Ð-?Ô?Ð?Ð?ØÐ+Õ,°Ô;Ð;Ð;ð ¤MÔ1Ð1Ð1ô ˜>Ð+AÓB€LØ×-Ñ-Ó/€KØ�~Õ&¨,Ô6Ð6Ò6r   z	sys.auditc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Ú
mock_auditr   r#   r   r‰   rŠ   r   r&   r   )r   s   "r   r   r   [  s0   € ÷ fñ f°	ð fÈ6ð fÐ`rð fÐw{ñ fr   c                óx  € VP                  VP                  RR 4       VP                  P                  4        V P	                  RRR4       \
        P                  ! \        RR7      ;_uu_ 4        VP                  P                  RR	7       R
R
R
4       V P	                  RR4       R
#   + '       g   i     L$; i)zKVerify that network egress and security bypasses emit PEP 578 audit events.rr   c                 ó,   € \         P                  ! 4       # rÞ   ©rg   rh   )ra   s   ,r   Ú<lambda>Ú1test_pep578_audit_hooks_emitted.<locals>.<lambda>^  s   € ÌH×L]ÒL]ÔL_r   zmailjet.api.requestrÚ   r2  zTLS verification is disabledr9   F)ÚverifyNzmailjet.api.tls_disabled)r“   r+   rs   rt   Úassert_any_callr>   r”   ÚRuntimeWarning)r•  r#   r‰   s   &&&r   Útest_pep578_audit_hooks_emittedrž  Z  s”   € ð ×Ñ˜×.Ñ.°	Ñ;_Ô`ð ×Ñ×ÑÔ Ø×ÑÐ4°eÐ=fÔgô 
�Š”nÐ,J×	KÖ	KØ×Ñ×"Ñ"¨%Ð"Ô0÷ 
Lð ×ÑÐ9Ð;dÖe÷ 
L×	Kús   Á0B)Â)B9	c               ó    € V ^8„  d   QhRRRR/# r<  r   )r   s   "r   r   r   k  s   € ÷ 2ñ 2Ð;Mð 2ÐRVñ 2r   c                óT  a€ \        R
RR7      p/ oR V3R llpV P                  VP                  RV4       \        P                  ! \
        RR7      ;_uu_ 4        VP                  P                  RR7       RRR4       SP                  R	4      e   Q hR#   + '       g   i     L'; i)zfVerify CWE-400 mitigation: passing timeout=None issues a warning but preserves backward compatibility.N)r   rP   c               ó    € V ^8„  d   QhRRRR/# )r   ra   r   r   rb   r   )r   s   "r   r   Ú?test_infinite_timeout_deprecation_warning.<locals>.__annotate__r  s   € ÷ #ñ #˜sð #Ð'8ñ #r   c                 ó2   <€ V o\         P                  ! 4       # rÞ   r˜  )ra   Úcaptured_kwargss   ,€r   rl   Ú?test_infinite_timeout_deprecation_warning.<locals>.mock_requestr  s   ø€ à ˆÜ× Ò Ó"Ð"r   rr   zallows infinite socket blockingr9   rO   rP   )rd  rd  )r   r“   r+   r>   r”   r•   rs   rt   )r‰   Ú
client_infrl   r¤  s   &  @r   Ú)test_infinite_timeout_deprecation_warningr§  k  s�   ø€ ô Ð-°tÔ<€JØ€O÷#ð #ð
 ×Ñ˜
×*Ñ*¨I°|ÔDô 
�ŠÔ(Ð0Q×	RÖ	RØ×Ñ×Ñ tÐÔ,÷ 
Sð ×Ñ˜yÓ)Ò1Ð1Ò1÷	 
S×	Rús   ÁBÂB'	c               ó   € V ^8„  d   QhRR/# r%   r   )r   s   "r   r   r   �  s   € ÷ Gñ G¨dñ Gr   c                 ó†   € \         P                  p V P                  RJ g   Q h\        V P                  4      0 Rm8X  g   Q hR# )zQVerify the Retry adapter is configured to respect server 429 Retry-After headers.TN>   é­  rQ   éö  é÷  éø  )r   ru  Úrespect_retry_after_headerÚsetÚstatus_forcelist)Ústrategys    r   Ú$test_retry_strategy_respects_headersr²  �  s;   € ä×%Ñ%€HØ×.Ñ.°$Ó6Ð6Ð6äˆx×(Ñ(Ó)Ò-FÔFÐFÒFr   )r    rš   r›   ))r¥   r–   zv1/REST/templates)r   rs   zv3/REST/contact)r&  Úmessagezv3.1/REST/message)Ú
v99_futureÚnewresourcezv99_future/REST/newresource)r¥   r   r&  r´  )LÚ__doc__Ú
__future__r   r!  r*  Útypingr   r   Úunittest.mockr   r   r>   rg   Úrequests.exceptionsr   r  r	   r
   r  Úmailjet_rest.clientr   r   r   r   r   Úmailjet_rest.utils.guardrailsr   r   r   Ú_pytest.loggingr   Úfixturer#   r/   r6   rB   rH   rL   rS   rY   ru   r~   r†   r˜   ÚmarkÚparametrizer¡   rª   r°   rµ   rÀ   rÄ   rÈ   rÌ   rÐ   rç   ró   r  r#  r'  r,  r3  r:  rI  rQ  ra  rh  rp  rx  r|  r‡  r‹  r“  rž  r§  r²  r   r   r   Ú<module>rÁ     s”  ðÙ Rå "ã Û 	ß %ß *ã Û Ý JÝ 0Ý :÷õ õ 8ß <çå1ð ‡�ôNó ðNõHõ8õ/õ(2õ$õ	õõ'õ"*õ*õ'ð2 ‡�×ÑØ,òóô=óð=õKõSð ‡�×ÑØÚ&óô<ó	ð<õFõ"4õVõAõKõ#õ.,õ -õ6'*õT+õDõ<õ&.õ&QõTõ,Võ:+õ =õ.õDõ*^õ,1õ7ñ, €{Óôfó ðfõ 2÷,Gr   