
    #iX                         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
Jr  SSKrSr " S S5      rSS jrS rS	 rS
 rS rS rS rS rS rS rS rS rS rS r\S:X  a  \	R<                  " \" 5       5        gg)zb
Backend API Testing Script for Horse Racing Tips App
Tests all API endpoints with realistic data
    N)datetime	timedeltaz1https://raceadvisor.preview.emergentagent.com/apic                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
Colors   z[92mz[91mz[93mz[94mz[0mz[1m N)__name__
__module____qualname____firstlineno__GREENREDYELLOWBLUEENDCBOLD__static_attributes__r       0/root/tipsharks/tipsharks-client/backend_test.pyr   r      s     E
CFDDDr   r   c                     US:X  a  [         R                  O%US:X  a  [         R                  O[         R                  n[	        U U [         R
                   SU  35        U(       a  [	        SU 35        gg)zLog test results with colorsPASSFAILz - z  N)r   r   r   r   printr   )	test_namestatusdetailscolors       r   log_testr      se     V 	!V+VZZ 

 
UGF8FKK=I;
787)n r   c            	      |    [         R                  " [         S35      n U R                  S:X  aD  U R	                  5       nSU;   a   SU;   a  [        SSSUS    SUS    35        g	[        SS
S5        g[        SS
SU R                   35        g! [         a#  n[        SS
S[        U5       35         SnAgSnAff = f)zTest GET /api/ - API info/   messageversionzAPI Root Endpointr   z	Message: z, Version: Tr   #Missing required fields in responseFStatus: Exception: NrequestsgetBACKEND_URLstatus_codejsonr   	Exceptionstrresponsedataes      r   test_api_rootr3   &   s    <<;-q 123&==?DD Y$%6'Y0DO;LM
 '1V (&HX=Q=Q<R2ST $fCF8.DEs$   A"B %B 3B 
B;B66B;c            	      |    [         R                  " [         S35      n U R                  S:X  aD  U R	                  5       nUR                  S5      S:X  a  [        SSS5        g[        SS	S
U 35        g[        SS	SU R                   35        g! [         a#  n[        SS	S[        U5       35         SnAgSnAff = f)z#Test GET /api/health - Health checkz/healthr!   r   healthyzHealth Checkr   zService is healthyTr   zUnexpected status: Fr%   r&   Nr'   r/   s      r   test_health_checkr6   @   s    <<;-w 783&==?Dxx!Y.1EF3Ftf1MN^Vx8L8L7M-NO ;s1vh)?@s$   AB "B 3B 
B;B66B;c            	      v  ^  [         R                  " [         S35      n U R                  S:X  a  U R	                  5       n[        U[        5      (       a  [        U5      S:  ay  US   m/ SQn[        U4S jU 5       5      (       a,  [        SSS[        U5       S	35        [        US   S
   5        gU Vs/ s H  o3T;  d  M
  UPM     nn[        SSSU 35        g[        SSS5        g[        SSSU R                   35        gs  snf ! [         a#  n[        SSS[        U5       35         SnAgSnAff = f)z0Test GET /api/races - Get list of upcoming racesz/racesr!   r   )idtrackrace_number
start_timedistance
race_class
conditionshorse_countc              3   ,   >#    U  H	  oT;   v   M     g 7fNr   .0fieldraces     r   	<genexpr>!test_get_races.<locals>.<genexpr>g   s     B/}/   zGet Races - Basicr   
Retrieved z racesr8   Tr   Missing fields: Fz#No races returned or invalid formatr%   r&   N)r(   r)   r*   r+   r,   
isinstancelistlenallr   test_filtersr-   r.   )r0   racesrequired_fieldsfmissingr2   rE   s         @r   test_get_racesrT   T   s7   '<<;-v 673&MMOE%&&3u:>Qx	# B/BBB+Vz#e*V5T
 !q$0*9K/Qd]q/GK0&<LWI:VW '1V (&HX=Q=Q<R2ST L  $fCF8.DEsB   B/D 3D 7	DD
D D +D D 
D8D33D8c           	          [         R                  " [         S35      nUR                  S:X  a  [	        SSS5        O[	        SSSUR                   35        [         R                  " [         S35      nUR                  S:X  a  [	        S	SS
5        g[	        S	SSUR                   35        g! [
         a#  n[	        SSS[        U5       35         SnAgSnAff = f)zTest race filtersz/races?date=todayr!   zGet Races - Date Filterr   zToday filter worksr   r%   z/races?track=FlemingtonzGet Races - Track FilterzTrack filter workszGet Races - Filtersr&   N)r(   r)   r*   r+   r   r-   r.   )sample_race_idr0   r2   s      r   rO   rO      s    H<<;-/@ AB3&.:LN)6Xh>R>R=S3T
 <<;-/F GH3&/;MO*Fhx?S?S>T4U  H&+c!fX0FGGH   BB- B- -
C7CCc                  *  ^^  [         R                  " [         S35      n U R                  S:X  Ga  U R	                  5       m/ SQn[        U4S jU 5       5      (       a  [        TS   [        5      (       a  [        TS   5      S:  a~  TS   S   m/ SQn[        U4S jU 5       5      (       a.  [        S	S
STS    STS    S[        TS   5       S35        TS   $ U Vs/ s H  o3T;  d  M
  UPM     nn[        S	SSU 35        g[        S	SS5        gU Vs/ s H  o3T;  d  M
  UPM     nn[        S	SSU 35        g[        S	SSU R                   35        gs  snf s  snf ! [         a#  n[        S	SS[        U5       35         SnAgSnAff = f)z:Test GET /api/races/next/upcoming - Get next upcoming racez/races/next/upcomingr!   )r8   r9   r:   r;   horsesc              3   ,   >#    U  H	  oT;   v   M     g 7frA   r   rB   s     r   rF   *test_next_upcoming_race.<locals>.<genexpr>   s     >oUD=orH   rY   r   r8   numbernamejockeytrainerwin_probabilityplace_probabilityc              3   ,   >#    U  H	  oT;   v   M     g 7frA   r   )rC   rD   horses     r   rF   r[      s     D|eE>|rH   zNext Upcoming Racer   zRace: r9   z Rr:   z, z horsesr8   r   zHorse missing fields: NzNo horses in racerJ   r%   r&   )r(   r)   r*   r+   r,   rN   rK   rL   rM   r   r-   r.   )r0   rQ   horse_fieldsrR   rS   r2   rd   rE   s         @@r   test_next_upcoming_racerf      s   ,<<;-/C DE3&==?DTO>o>>>d8nd33DN8Ka8O N1-E$L D|DDD 0"$T']O2d=6I5J"SQUV^Q_M`Laahi
  $Dz).:"Mlun1l"M 0"4WI>
  $16;NO&5Go$1oG-v9I'7ST)6Xh>R>R=S3TU! #N H  %vSVH/EFsZ   CE% E% "	E/E5E% E% E% 	E 'E -E%  E% 
E% %
F/FFc                 .  ^	  / SQnU GHS  nU =(       d    SUS.n[         R                  " [         S3US9nUR                  S:X  a  UR	                  5       m	/ SQn[        U	4S jU 5       5      (       a  [        T	S	   [        5      (       ap  [        T	S	   5      S
:  a^  [        T	S   [        5      (       a4  [        T	S   5      S
:  a"  [        SU 3SST	S    ST	S   SS  S35        M  [        SU 3SS5        M  [        SU 3SS5        GM  U Vs/ s H  ofT	;  d  M
  UPM     nn[        SU 3SSU 35        GM6  [        SU 3SSUR                   35        GMV     gs  snf ! [         a#  n[        SSS[        U5       35         SnAgSnAff = f)z-Test POST /api/tips/generate - Generate a tip)best_betwinplacequinellaexactatrifectatest_race_123)race_idbet_typez/tips/generater,   r!   r8   ro   rp   recommended_bet
confidencerY   reasons
created_atc              3   ,   >#    U  H	  oT;   v   M     g 7frA   r   )rC   rD   tips     r   rF   $test_generate_tip.<locals>.<genexpr>   s     A|rH   rY   r   ru   zGenerate Tip - r   zConfidence: rt   z, Bet: rs   N2   z...r   zNo reasons providedzNo horses in tiprJ   r%   TzGenerate Tipr&   F)r(   postr*   r+   r,   rN   rK   rL   rM   r   r-   r.   )
ro   	bet_typesrp   payloadr0   rQ   rR   rS   r2   rx   s
            @r   test_generate_tipr~      s   7R	!H")"<_(SG}}}N%C'RH##s*mmo	# AAAA!#h-663s8};MPQ;Q%c)nd;;C	N@SVW@W$"1( < &".s</@.AM^I_`cacIdHeeh i %"1( < & 5 !-hZ8&BT +:J/Qc\q/GJ)(4*7)4 %hZ0x3345U "`  K  ;s1vh)?@s0   DE' 	E"!E"':E' "E' '
F1FFc                      [        [        R                  " 5       5      SSSS[        [        R                  " 5       5      SSSSS	S
S./SSS.SSS./[        R                  " 5       R                  5       S.n [        R                  " [         S3U S9nUR                  S:X  a  UR                  5       nSU;   a  SU;   a  [        SSSUS    35        [        R                  " [         S35      nUR                  S:X  aN  UR                  5       n[        U[        5      (       a  [        SSS[        U5       S35        g[        SSS5        g [        SSS!UR                   35        g [        SSS"5        g [        SSS!UR                   35        g ! [          a#  n[        S#SS$[        U5       35         S%nAg S%nAff = f)&z0Test POST /api/tips/save and GET /api/tips/savedmelbourne_cup_2024ri   zWIN on #7 Thunder Bolthigh   zThunder BoltzJ. McDonaldz	C. Wallerg     <@gLP@r\   zStrong recent formpositive)texttypezTop jockey in the saddlerr   z
/tips/saverq   r!   r8   saved_atzSave Tipr   zTip saved with ID: z/tips/savedzGet Saved TipsrI   z saved tipsTr   Invalid response formatFr%   r$   zSave/Get Tipsr&   N)r.   uuiduuid4r   utcnow	isoformatr(   r{   r*   r+   r,   r   r)   rK   rL   rM   r-   )
sample_tipr0   	saved_tip
saved_tipsr2   s        r   test_save_and_get_tipsr     s   < djjl#+7  djjl+*+*'+)-
 .zB3ZH #//+557+

2 ==K=
!;*M3& Iy Z9%<V/B9T?BS-TU $<<;-{(CD''3.!)J!*d33 ,"(Z(9E
  $ !16;TU$(&HX=Q=Q<R2S !V-RSZ8H4H4H3I)JK &KAx*@As0   D<F ?F F (F 6F 
F>F99F>c            	        ^	  SSSS/S.n [         R                  " [         S3U S9nUR                  S:X  Ga  UR	                  5       m	/ S	Qn[        U	4S
 jU 5       5      (       Ga&  T	S   n[        SSSU 35        [         R                  " [         S35      nUR                  S:X  a  UR	                  5       n[        U[        5      (       a  [        SSS[        U5       S35        [         R                  " [         SU 35      nUR                  S:X  a2  UR	                  5       nSU;   a  [        SSS5        g[        SSS5        g[        SSSUR                   35        g[        SSS5        g[        SSSUR                   35        gU Vs/ s H  ofT	;  d  M
  UPM     nn[        SSSU 35        g[        SSSUR                   35        gs  snf ! [         a#  n[        SSS[        U5       35         SnAgSnAff = f) zHTest POST /api/schedules, GET /api/schedules, DELETE /api/schedules/{id}flemington_race_456ri      push)ro   rp   minutes_beforechannelsz
/schedulesrq   r!   )r8   ro   rp   r   r   r   scheduled_timec              3   ,   >#    U  H	  oT;   v   M     g 7frA   r   )rC   rD   schedules     r   rF   &test_schedules_crud.<locals>.<genexpr>^  s     B/H$/rH   r8   zCreate Scheduler   zSchedule created with ID: zGet SchedulesrI   z
 schedulesz/schedules/r"   zDelete SchedulezSchedule cancelled successfullyTr   zNo confirmation messageFr%   r   rJ   zSchedules CRUDr&   N)r(   r{   r*   r+   r,   rN   r   r)   rK   rL   rM   deleter-   r.   )
schedule_datar0   rQ   schedule_id	schedulesresultrR   rS   r2   r   s
            @r   test_schedules_crudr   G  s(   P - 	
 ==K=
!;-P3&}}HO B/BBB&tn%0> $<<;-z(BC''3. (I!)T22 +"(Y(8
C $,??*m;{mD$ $//36%-]]_F(F2 ($5$*$E!"
 (, ($5v?X!" (-$ 1 &"*8+?+?*@ A
 $) &:ST$_fAUAU@V6WX &5Ko(9J1oK*F6Fwi4PQ&(8;O;O:P0QR L  !6[Q+ABsT   D7G ;G 	G $G 2G G 	GG$G 7G G 
H!G??Hc            	        ^  [         R                  " [         S35      n U R                  S:X  a  U R	                  5       m/ SQn[        U4S jU 5       5      (       a  [        SSSTS    35        S	S
SS/S.n[         R                  " [         S3US9n U R                  S:X  aA  U R	                  5       nUR                  S5      S	:X  a  [        SSS5        g[        SSS5        g[        SSSU R                   35        gU Vs/ s H  oDT;  d  M
  UPM     nn[        SSSU 35        g[        SSSU R                   35        gs  snf ! [         a#  n[        SSS[        U5       35         SnAgSnAff = f)z<Test GET /api/user/preferences and PUT /api/user/preferencesz/user/preferencesr!   )r8   default_bet_typedefault_lead_timefavorite_tracksnotification_channelsc              3   ,   >#    U  H	  oT;   v   M     g 7frA   r   )rC   rD   prefss     r   rF   (test_user_preferences.<locals>.<genexpr>  s     ?eE>rH   zGet User Preferencesr   zDefault bet type: r   rj      
FlemingtonRandwick)r   r   r   rq   zUpdate User Preferencesz Preferences updated successfullyTr   zUpdates not reflectedFr%   rJ   zUser Preferencesr&   N)
r(   r)   r*   r+   r,   rN   r   putr-   r.   )r0   rQ   updatesupdated_prefsrR   rS   r2   r   s          @r   test_user_preferencesr     s   9<<;-/@ AB3&MMOEO ????*(/A)B(CD )0)+(4j'A $<<;-7H(IPWX''3.$,MMOM$(();<G 5">
  $ 5v?V  %1"8#7#7"89
 !&5Ho%1oH/;KG99UV+Vx@T@T?U5VW I  #V{3q6(-CDsH   CE E &E E 	EEE +E E 
E8E33E8c            	          [         R                  " [         S35      n U R                  S:X  al  U R	                  5       nSU;   aH  [        US   [        5      (       a0  [        US   5      S:  a  [        SSS[        US   5       S35        g	[        SS
S5        g[        SS
SU R                   35        g! [         a#  n[        SS
S[        U5       35         SnAgSnAff = f)z+Test GET /api/tracks - Get available tracksz/tracksr!   tracksr   z
Get Tracksr   rI   z tracksTr   z$No tracks returned or invalid formatFr%   r&   Nr(   r)   r*   r+   r,   rK   rL   rM   r   r-   r.   r/   s      r   test_tracksr     s    <<;-w 783&==?DD tH~t44X'!+ &Js4>7J6K7*S v/UV\6Xh6J6J5K+LM vSVH'=>s$   B
B6 B6 B6 6
C# CC#c                  N    [         R                  " [         S35      n U R                  S:X  a  U R	                  5       nSU;   a  SU;   a  US   nUS   n[        U[        5      (       aV  [        U[        5      (       aA  [        U5      [        U5      -   n[        SSSU S[        U5       S	[        U5       S
35        g[        SSS5        g[        SSS5        g[        SSSU R                   35        g! [         a#  n[        SSS[        U5       35         SnAgSnAff = f)z.Test GET /api/bet-types - Get bet type optionsz
/bet-typesr!   simpleadvancedzGet Bet Typesr   rI   z bet types (z	 simple, z
 advanced)Tr   zInvalid bet types formatFz"Missing simple/advanced categoriesr%   r&   Nr   )r0   r1   simple_betsadvanced_bets
total_betsr2   s         r   test_bet_typesr     s%   <<;-z :;3&==?D4J$$6"8n $Z 0k400Zt5T5T!$[!1C4F!FJ'$ZLS=M<NiX[\iXjWkkuv
  _f6PQ &2VW_f9M9M8N.OP &KAx*@As*   B=C7  C7 C7 C7 7
D$DD$c            	          [         R                  " [         S35      n U R                  S:X  a  [	        SSS5        O[	        SSSU R                   35        [         R
                  " [         S35      n U R                  S:X  a  [	        S	SS
5        g[	        S	SSU R                   35        g! [         a#  n[	        SSS[        U5       35         SnAgSnAff = f)z(Test error handling for invalid requestsz/races/invalid_race_idi  zError Handling - Invalid Racer   z404 returned for invalid racer   zExpected 404, got z/schedules/invalid_schedule_idz!Error Handling - Invalid Schedulez!404 returned for invalid scheduleTzError Handlingr&   NF)r(   r)   r*   r+   r   r   r-   r.   )r0   r2   s     r   test_error_handlingr     s     <<;-/E FG3&/9X /$X%9%9$:; ??k]2P#QR3&33  3$X%9%9$:;  !6[Q+ABrW   c            	         [        [        R                   [        R                   S[        R                   35        [        S[
         35        [        5         / n U R                  [        5       5        U R                  [        5       5        U R                  [        5       5        [        5       nU R                  USL5        U R                  [        U5      5        U R                  [        5       5        U R                  [        5       5        U R                  [        5       5        U R                  [        5       5        U R                  [!        5       5        U R                  [#        5       5        [%        U 5      n['        U 5      n[        5         [        [        R                   S[        R                   35        X#:X  a0  [        [        R(                   SU S[        R                   35        gX2-
  n[        [        R*                   SU S	U S
[        R                   35        [        [        R(                   SU S[        R                   35        g)zRun all backend API testsz+=== Horse Racing Tips API Backend Tests ===zTesting backend at: Nz=== Test Summary ===u   ✅ All z tests passed!r   u   ❌ z out of z tests failedu   ✅ z tests passed   )r   r   r   r   r   r*   appendr3   r6   rT   rf   r~   r   r   r   r   r   r   sumrM   r   r   )test_resultsro   passedtotalfaileds        r   mainr   8  s   	;;-}$OPVP[P[}] 
 
./	GL ()+, ()%'Gt+, )'23.01 +-. -/0 &() +-. FE	G	V[[M-fkk]
;<hug^FKK=IJD}V[[MRSd6(-}EFr   __main__) )__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr(   r,   sysr   r   r   r*   r   r   r3   r6   rT   rO   rf   r~   r   r   r   r   r   r   r   r	   exitr   r   r   <module>r      s   
    
 (  B 	4()XH2.b9x>BRj;|4>"J1h zHHTV r   