ó
    4Éjh$  ã                   óÈ  • S r SSKrSSKJs  Jr  SSKrSSKrSSK	r	SSK
Jr  \" \	R                  " SS95      rS\R                  S'   \" \S-  5      \R                  S	'   \" \S
-  5      \R                  S'   \" \S-  5      \R                  S'   \" \S-  5      \R                  S'   \" \S-  5      \R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S\R                  S'   S \R                  S!'   SSKrSSKrSS"KJrJr  SS#KJr  SSKrSS$KJr  SS%KJr  SS&KJr  SS'KJ r   \R                  S   r!S(r"S)r#S*r$S+r%S,r&S-r'S.r(S/r)S0r*\*4S1\S2\S3\S4\4S5 jjr+SWS6\S7\S4\4S8 jjr,SXS2\S1\S7\S9\-S
\.\   S:\-4S; jjr/S< r0\0" 5         S= r1\Rd                  " S>S?9S@ 5       r3\Rd                  " SASB9SC 5       r4\Rd                  S4\4SD j5       r5\Rd                  SE 5       r6\Rd                  S4\4SF j5       r7\Rd                  S4\84SG j5       r9\Rd                  S4\84SH j5       r:\Rd                  S4\84SI j5       r;  SYSJ\S2\S1\SK\.\8   S4S4
SL jjr<SZS4\84SM jjr=S[SN\SO\>SP\>SQ\?4SR jjr@S\SS\>4ST jjrASU\S4\4SV jrBg)]u´  
conftest.py â€” configuration pytest partagÃ©e.

CRITIQUE : redirige DB_PATH / PHOTOS_DIR / THUMBS_DIR / INCOMING_DIR / LOG_DIR
vers un dossier temporaire AVANT le premier `import main` â€” sinon les tests
tourneraient sur la vraie base de donnÃ©es et les vraies photos des familles
(le genre d'accident Ã  l'origine de l'incident du 2026-09-03).

Ces variables d'environnement doivent Ãªtre dÃ©finies au chargement du module
(pas dans une fixture) car `core.config` les lit Ã  l'import.

Jeu de donnÃ©es de test (crÃ©Ã© une fois par session, sans aucune donnÃ©e de dÃ©mo) :
  Ã©cole Â« ecole-test Â»  : famille TST-1001 (consentement donnÃ©, 2 photos) et
                          famille CON-3003 (SANS consentement, 1 photo), photos/ecole-test/cam1/CODE/
                          famille OLD-7007 (consentement donnÃ©, 1 photo) dans l'ANCIEN layout photos/OLD-7007/
  Ã©cole Â« autre-ecole Â» : famille OTH-2002 (consentement donnÃ©, 1 photo)
é    N)ÚPathÚmeeconic_test_)ÚprefixÚtestÚAPP_ENVztest.dbÚDB_PATHÚphotosÚ
PHOTOS_DIRÚthumbsÚ
THUMBS_DIRÚincomingÚINCOMING_DIRÚlogsÚLOG_DIRÚfalseÚORGANIZER_ENABLEDÚBACKGROUND_TASKS_ENABLEDÚEMAIL_ENABLEDÚ ÚSTRIPE_SECRET_KEYÚSTRIPE_WEBHOOK_SECRETÚSTORYFACE_API_KEYÚ
SENTRY_DSNÚALERT_EMAILztest-admin-pwÚADMIN_PASSWORDz'test-jwt-secret-not-for-prod-0123456789ÚADMIN_JWT_SECRETÚ60ÚPHOTO_RETENTION_DAYS)ÚAsyncClientÚASGITransport)ÚImage)Úconfig)Úget_db)Ú
utcnow_iso)Úschool_servicez
ecole-testzautre-ecolezdirector-pw-testzother-director-pwzTST-1001zCON-3003zOTH-2002zOLD-7007Úcam1ÚschoolÚcodeÚphotographerÚreturnc                 ó4   • [         R                  U -  U-  U-  $ )uS   Dossier d'une famille dans le layout actuel : photos/{Ã©cole}/{photographe}/{CODE}/)r"   r
   )r'   r(   r)   s      ÚQD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\tests\conftest.pyÚ
family_dirr-   C   s   € ä×Ñ˜vÑ%¨Ñ4°tÑ;Ð;ó    ÚfolderÚnamec                 ó’   • X-  nUR                   R                  SSS9  [        R                  " SSU5      R	                  US5        U$ )NT©ÚparentsÚexist_okÚRGB)é°  i   ÚJPEG)ÚparentÚmkdirr!   ÚnewÚsave)r/   r0   ÚcolorÚpaths       r,   Ú_make_photor>   H   sB   € Ø‰=€DØ‡K�K×Ñ˜d¨TÐÑ2Ü	‡I‚Iˆe�[ %Ó(×-Ñ-¨d°FÔ;Ø€Kr.   ÚconsentÚlegacyc           
      ó\  • U R                  SXUR                  5        S3[        5       X$(       a
  [        5       OS U(       a  SOS 45        U R                  SU45        U R                  SUSUS45        U(       a  [        R                  U-  O
[        X!5      nU H  n[        Xx5        M     g )Nz€INSERT OR REPLACE INTO families (code, family_name, email, created_at, school_id, consent_at, consent_ip) VALUES (?,?,?,?,?,?,?)z@example.comz	127.0.0.1z(DELETE FROM students WHERE family_code=?zVINSERT INTO students (family_code, first_name, last_name, class_name) VALUES (?,?,?,?)ÚAlexzCE1 A)ÚexecuteÚlowerr$   r"   r
   r-   r>   )	Úconnr(   r'   r0   r?   r	   r@   r/   Úps	            r,   Ú_make_familyrG   O   sš   € Ø‡L�Lð	!à	˜Ÿ
™
›�~ \Ð2´J³LÀ&ÕZaÌ*Ì,ÐgkÞ‰ Tð	+ô,ð
 	‡L�LÐ;¸d¸WÔEØ‡L�LÐiØ˜  gÐ.ô0æ)/ŒV×Ñ Ò%´ZÀÓ5M€FÛˆÜ�FÖò r.   c                  óR  • [         R                  " 5         [        R                  " [        5      (       d  [        R
                  " S[        [        S9  [        R                  " [        5      (       d  [        R
                  " S[        [        S9  [        5        n [        U [        [        SSSS/5        [        U [        [        SS	S
/5        [        U [        [        SSS/5        [        U [        [        SSS/SS9  U R                  5         S S S 5        g ! , (       d  f       g = f)Nu   Ã‰cole Test)ÚslugÚdirector_passwordu   Autre Ã‰coleÚTesteurTúportrait.jpgzfratrie.jpgÚConsentFzsolo.jpgÚAutruiz	autre.jpgÚAncienzvieille.jpg)r@   )Úmain_moduleÚinit_allr%   Ú
get_schoolÚSCHOOLÚcreate_schoolÚDIRECTOR_PASSWORDÚOTHER_SCHOOLÚOTHER_DIRECTOR_PASSWORDr#   rG   Ú	DEMO_CODEÚNOCONSENT_CODEÚ
OTHER_CODEÚLEGACY_CODEÚcommit)rE   s    r,   Ú
_bootstrapr]   ]   sÇ   € Ü×ÒÔÜ×$Ò$¤V×,Ñ,Ü×$Ò$ ]¼ÔSdÒeÜ×$Ò$¤\×2Ñ2Ü×$Ò$ ^¼,ÔZqÒrÜ	Œ�TÜ�Tœ9¤f¨i¸ÀÐP]Ð?^Ô_Ü�Tœ>¬6°9¸eÀjÀ\ÔRÜ�Tœ:¤|°X¸tÀkÀ]ÔSÜ�Tœ;¬°¸$ÀÀÐX\Ò]Ø�‰Œ÷ 
�Žús   ÂA5DÄ
D&c                 ó^   • SSK nUR                  5         [        R                  " [        SS9  g)u@   Nettoie le dossier temporaire une fois tous les tests terminÃ©s.r   NT)Úignore_errors)ÚloggingÚshutdownÚshutilÚrmtreeÚ_TMP_DIR)ÚsessionÚ
exitstatusr`   s      r,   Úpytest_sessionfinishrg   n   s   € ãØ×ÑÔÜ
‡M‚M”(¨$Ó/r.   T)Úautousec               #   ó<   #   • SSK Jn   U " 5         Sv •  U " 5         g7f)u~   Le rate limiter est persistant (SQLite) : on le vide entre les tests,
sinon un test qui dÃ©clenche un 429 pollue les suivants.r   ©Ú	reset_allN)Úcore.rate_limitrk   rj   s    r,   Ú_reset_rate_limitsrm   u   s   é € õ *Ù„KÛ	Ù…Kùs   ‚re   )Úscopec                  ó"   • [         R                  $ ©N)rP   Úapp© r.   r,   rq   rq      s   € ä�?‰?Ðr.   c                  ó   • [         $ rp   )rX   rr   r.   r,   Ú	demo_codert   „   s   € äÐr.   c                óª   #   • [        U S9n[        USS9 IS h  v•N nU7v •  S S S 5      IS h  v•N   g  N N! , IS h  v•N  (       d  f       g = f7f)N)rq   zhttp://test)Ú	transportÚbase_url)r    r   )rq   rv   Úcs      r,   Úclientry   ‰   s8   é € ä #Ñ&€IÜ Y¸×GÒGÈ1Ø‹÷ H×G×G×G×GÓGüs;   ‚Aš5›Až9¤A¯7°A·A¹A¿AÁ AÁAc              ƒ   ób  #   • U R                  SS[        0S9I S h  v•N nUR                  nSo2U:H  oD(       dÛ  [        R                  " SU4SX#45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  n[        R                  " UR                  5      S	-   S
U0-  n[        [        R                  " U5      5      eS =n=pCUR                  5       S   $  GN7f)Nú/api/admin/loginÚpassword©ÚjsonéÈ   ©ú==©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚr©Úpy0Úpy2Úpy5ú
>assert %(py7)sÚpy7Útoken)Úpostr   Ústatus_codeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚtextÚAssertionErrorÚ_format_explanationr~   ©ry   rƒ   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8s          r,   Úadmin_tokenr�   �   s¸   é € à�k‰kÐ,°JÄÐ3OˆkÐP×P€AØ�=‰=Ð'˜CÐ'˜CÑ×'×'×'Ò'ˆ=×'×'×'×'×'Õ'ˆ1×'×'×'Ñ'ˆ1×'×'Õ'ˆ=×'×'Ó'˜C×'×'×'Ð' §¡×'×'×'×'×'×'Ð'Ø�6‰6‹8�GÑÐò 	Qùs   ‚D/œD,�DD/c              ƒ   ó"   #   • SU  3[         S.$ 7f)u,   OpÃ©rateur travaillant sur l'Ã©cole de test.úBearer ©ÚAuthorizationzX-School)rS   ©r�   s    r,   Úadmin_headersr£   —   s   é € ð  ' { mÐ4Ä&ÑIÐIùó   ‚c              ƒ   ó"   #   • SU  3[         S.$ 7f)NrŸ   r    )rV   r¢   s    r,   Úother_admin_headersr¦   �   s   é € à& { mÐ4Ä,ÑOÐOùr¤   c              ƒ   óv  #   • U R                  S[        [        S.S9I S h  v•N nUR                  nSo2U:H  oD(       dÛ  [        R
                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  n[        R                  " UR                  5      S	-   S
U0-  n[        [        R                  " U5      5      eS =n=pCSSUR                  5       S    30$  GN7f)Nr{   )r|   r'   r}   r   r€   r‚   rƒ   r„   rˆ   r‰   r¡   rŸ   rŠ   )r‹   rU   rS   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r~   r—   s          r,   Údirector_headersr¨   ¢   sÇ   é € à�k‰kÐ,Ô@QÔ]cÑ3dˆkÐe×e€AØ�=‰=Ð'˜CÐ'˜CÑ×'×'×'Ò'ˆ=×'×'×'×'×'Õ'ˆ1×'×'×'Ñ'ˆ1×'×'Õ'ˆ=×'×'Ó'˜C×'×'×'Ð' §¡×'×'×'×'×'×'Ð'Ø˜w q§v¡v£x°Ñ'8Ð&9Ð:Ð;Ð;ò 	fùs   ‚D9¡D6¢DD9Úorder_idÚitemsc	                 ó  • SSK n	Ub  UO[        S U 5       5      n[        5        n
U
R                  SXSSX…U	R	                  U5      U=(       d
    [        5       XFU45        U
R                  5         SSS5        g! , (       d  f       g= f)uN   InsÃ¨re directement une commande (Ã©vite de passer par Stripe dans les tests).r   Nc              3   ó6   #   • U  H  oS    US   -  v •  M     g7f)Ú
unit_priceÚquantityNrr   )Ú.0Úis     r,   Ú	<genexpr>Úinsert_order.<locals>.<genexpr>­   s   é € Ð/_ÒY^ÐTU°,±À!ÀJÁ-Ö0OÒY^ùs   ‚zÜINSERT INTO orders (id, family_code, customer_name, customer_email, total, status, items_json,
               created_at, payment_status, stripe_payment_intent_id, school_id)
               VALUES (?,?,?,?,?,?,?,?,?,?,?)zClient Testzclient@example.com)r~   Úsumr#   rC   Údumpsr$   r\   )r©   r(   r'   rª   Úpayment_statusÚstatusÚpi_idÚ
created_atÚtotalr~   rE   s              r,   Úinsert_orderrº   ©   s|   € ó ØÑ&‰E¬CÑ/_ÑY^Ó/_Ó,_€EÜ	Œ�TØ�‰ð1ð ˜]Ð,@À%ÐQU×Q[ÑQ[Ð\aÓQbØ×'œ:›<¨ÀðHô		Ið 	�‰Œ÷ 
�Žús   ¦AA:Á:
Bc                 ó   • XXSX$US.$ )N)Úphoto_filenameÚ	format_idÚformat_labelr®   r­   Úis_magicÚ	job_labelrr   )ÚfmtÚphotoÚpriceÚqtyÚmagicÚlabelÚjobs          r,   ÚitemrÈ   ¸   s   € Ø#ÀuØÀñFð Fr.   r”   Úqr_pxÚblurÚcontrastc                 ó  • SSK nSSKnSSKnUR                  5       nUR	                  U SSS9R                  USSSS	9  [        R                  " UR                  UR                  5       5      5      R                  S
5      R                  X"4[        R                  5      n	UR                  R                  S5      n
U
R                  SSUS   US   S45      R                  SS5      R!                  S5      n[        R"                  " U5      nUR%                  X‘S   U-
  S-  US   U-
  S-  45        US:w  a&  SSKJn  UR+                  U5      R-                  U5      nU(       a&  SSKJn  UR1                  UR3                  U5      5      nU$ )uU   Foto sintÃ©tica (gris, con ruido suave) con un QR REAL de `text` pegado en el centro.r   NÚmF)ÚerrorÚmicroÚpngé   é   )ÚkindÚscaleÚborderr5   é   é–   é   é   éÿ   Úuint8é   ç      ð?)ÚImageEnhance)ÚImageFilter)ÚioÚnumpyÚsegnoÚBytesIOÚmaker;   r!   ÚopenÚgetvalueÚconvertÚresizeÚNEARESTÚrandomÚdefault_rngÚnormalÚclipÚastypeÚ	fromarrayÚpasteÚPILrÞ   ÚContrastÚenhancerß   ÚfilterÚGaussianBlur)r”   ÚsizerÉ   rÊ   rË   rà   Únprâ   ÚbufÚqrÚrngÚbaseÚimgrÞ   rß   s                  r,   Úqr_imagerý   ¿   sJ  € ãÛÛØ
�*‰*‹,€CØ	‡J�Jˆt˜3 e€JÐ,×1Ñ1°#¸EÈÐTUÐ1ÑVÜ	�Š�B—J‘J˜sŸ|™|›~Ó.Ó	/×	7Ñ	7¸Ó	>×	EÑ	EÀuÀnÔV[×VcÑVcÓ	d€BØ
�)‰)×
Ñ
 Ó
"€CØ�J‰J�s˜B  a¡¨$¨q©'°1Ð 5Ó6×<Ñ<¸QÀÓD×KÑKÈGÓT€DÜ
�/Š/˜$Ó
€CØ‡I�Iˆb˜‘G˜e‘O¨Ñ)¨D°©G°e©OÀÑ+AÐBÔCØ�3ƒÝ$Ø×#Ñ# CÓ(×0Ñ0°Ó:ˆÞÝ#Ø�j‰j˜×1Ñ1°$Ó7Ó8ˆØ€Jr.   Úseedc                 óâ   • SSK nUR                  R                  U5      nUR                  SSU S   U S   S45      R	                  SS5      R                  S5      n[        R                  " U5      $ )	z,Retrato sin QR (ruido de color + degradado).r   Nén   é(   rØ   rÙ   rÚ   rÛ   )rá   rê   rë   rì   rí   rî   r!   rï   )rö   rþ   r÷   rú   rû   s        r,   Úplain_imager  Ô   sa   € ãØ
�)‰)×
Ñ
 Ó
%€CØ�:‰:�c˜2  Q¡¨¨a©°!Ð4Ó5×:Ñ:¸1¸cÓB×IÑIÈ'ÓR€DÜ�?Š?˜4Ó Ð r.   r=   c                 ó\   • UR                   R                  SSS9  U R                  USSS9  U$ )NTr2   r7   é\   )Úquality)r8   r9   r;   )rü   r=   s     r,   Ú	save_jpegr  Ü   s0   € Ø‡K�K×Ñ˜d¨TÐÑ2Ø‡H�HˆT�6 2€HÑ&Ø€Kr.   ))éx   éP   r   )F)ÚpaidÚpendingNNN)zprint-10x15rL   g      "@rØ   FÚTirageN)©i@  r6   i¤  r   rÝ   )r  rÙ   )CÚ__doc__Úbuiltinsr�   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter�   Úosrb   ÚtempfileÚpathlibr   Úmkdtemprd   ÚenvironÚstrÚpytestÚpytest_asyncioÚhttpxr   r    rñ   r!   ÚmainrP   Úcorer"   Úcore.dbr#   Úcore.timeutilr$   Úservicesr%   r   rS   rV   rU   rW   rX   rY   rZ   r[   ÚPHOTOGRAPHERr-   r>   ÚboolÚlistrG   r]   rg   Úfixturerm   rq   rt   ry   r�   Údictr£   r¦   r¨   rº   rÈ   ÚintÚfloatrý   r  r  rr   r.   r,   Ú<module>r'     sÀ  ðñ÷" „ ƒ	Û Û Ý á�× Ò Ð(8Ñ9Ó:€à#€‡
�
ˆ9Ñ Ù  ¨IÑ!5Ó6€‡
�
ˆ9Ñ Ù  ¨HÑ!4Ó5€‡
�
ˆ<Ñ Ù  ¨HÑ!4Ó5€‡
�
ˆ<Ñ Ù  ¨JÑ!6Ó7€‡
�
ˆ>Ñ Ù  ¨FÑ!2Ó3€‡
�
ˆ9Ñ Ø#*€‡
�
ÐÑ Ø)0€‡
�
Ð%Ñ &Ø#*€‡
�
ˆ?Ñ Ø#%€‡
�
ÐÑ Ø&(€‡
�
Ð"Ñ #Ø#%€‡
�
ÐÑ Ø#%€‡
�
ˆ<Ñ Ø#%€‡
�
ˆ=Ñ Ø#2€‡
�
ÐÑ Ø#L€‡
�
ÐÑ Ø%)€‡
�
Ð!Ñ "ã Û ß ,Ý ã Ý Ý Ý $Ý #à—‘Ð,Ñ-€Ø	€Ø€Ø&Ð Ø-Ð à€	Ø€Ø€
Ø€Ø€ð <Hñ <�sð < #ð <°Sð <ÈDõ <ñ
˜ð  Cð À$õ ñ˜Sð ¨#ð °Sð À4ð ÐQUÐVYÑQZð Ðdhõ òñ „ò0ð ‡‚˜Ññó ðð ‡‚�iÑ ñó !ðð ‡�ð�3ó ó ðð ×Ññó ðð ×Ñð ó ó ðð ×ÑðJ¨ó Jó ðJð
 ×ÑðP¨dó Pó ðPð ×Ñð< dó <ó ð<ð [aØFJñ˜3ð  cð °3ð ¸tÀD¹zð ØOSõñFÐnrõ Fñ�3ð °#ð À3ð ÐV[õ ñ*!¨õ !ð˜ð  $õ r.   