
    %i                     ~    S r SSKrSSKJs  Jr  SSKJrJ	r	  SSK
r
SSKJr  SSKJrJr  SSKJrJrJr   " S S5      rg)	z$Integration tests for API endpoints.    N)Mockpatch)
TestClient)appget_db)DriverHorseTrainerc                       \ rS rSrSr\R                  S 5       r\R                  S 5       rS r	S r
S rS rS	 rS
 rSrg)TestAPIEndpoints   zTests for API endpoints.c              #      ^#    U4S jnU[         R                  [        '   [        [         5       nUv   SSS5        [         R                  R	                  5         g! , (       d  f       N-= f7f)zCreate test client.c               3      >#    T v   g 7fN )mock_db_sessions   =/root/tipsharks/tipsharks-elo-api/tests/test_api_endpoints.pyoverride_get_db0TestAPIEndpoints.client.<locals>.override_get_db   s     !!s   	N)r   dependency_overridesr   r   clear)selfr   r   test_clients    `  r   clientTestAPIEndpoints.client   sJ     	" ,;  (_   &&( _s   -A-A'A-
A*&A-c                     [        5       $ )zCreate mock database session.)r   )r   s    r   r    TestAPIEndpoints.mock_db_session   s     v    c                 f   UR                  S5      nUR                  nSoCU:H  oU(       d  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=pTUR                  5       nUS
   n	SoYU:H  o(       do  [        R                  " SU
4SX45      [        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n	=pSoU;   o(       d  [        R                  " SU
4SX45      [        R                  " U	5      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS	=pg	)zTest health check endpoint./health   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponsepy0py2py5assert %(py7)spy7Nstatushealthyz%(py1)s == %(py4)spy1py4assert %(py6)spy6versioninz%(py1)s in %(py3)sdatar0   py3assert %(py5)sr)   )getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationjson)r   r   r%   @py_assert1@py_assert4@py_assert3@py_format6@py_format8r8   @py_assert0@py_assert2@py_format5@py_format7@py_format4s                 r   test_health_endpoint%TestAPIEndpoints.test_health_endpoint    s6   ::i(##*s*s*****#******x****x***#***s*******}}H~*******~***~********** D     y   y      D    D       r   c                 T   [        [        S9nSUl        SUl        [        5       nSUl        SUl        SUl        [        5       nXUR                  l        XUR                  l        XUR                  l        X5R                  l        U/UR                  l        XRR                  l        UR                  S5      nUR                  nSoU:H  o(       d  [         R"                  " S	U	4S
Xx45      S[$        R&                  " 5       ;   d  [         R(                  " U5      (       a  [         R*                  " U5      OS[         R*                  " U5      [         R*                  " U5      S.-  n
SSU
0-  n[-        [         R.                  " U5      5      eS=n=pUR1                  5       nUS   nSoU	:H  o(       do  [         R"                  " S	U4SX45      [         R*                  " U5      [         R*                  " U	5      S.-  nSSU0-  n[-        [         R.                  " U5      5      eS=n=pUS   nSoU	:H  o(       do  [         R"                  " S	U4SX45      [         R*                  " U5      [         R*                  " U	5      S.-  nSSU0-  n[-        [         R.                  " U5      5      eS=n=pg)zTest driver detail endpoint.spec   Test Driverd   g     ș@g      ^@z/ratings/drivers/1r!   r"   r$   r%   r&   r*   r+   N	driver_idr.   r/   r2   r3   name)r   r   idrZ   as_of_race_idratingrdjoinreturn_valuefilterorder_byfirstallqueryr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   )r   r   r   mock_drivermock_snapshot
mock_queryr%   rG   rH   rI   rJ   rK   r8   rL   rM   rN   rO   s                    r   test_driver_detail_endpoint,TestAPIEndpoints.test_driver_detail_endpoint(   s    '( &)#% V
'1$)3&+5((3%'4o
#-7*::23##*s*s*****#******x****x***#***s*******}}K %A%A%%%%% %%% %%%A%%%%%%%F|,},},,,,,|,,,|,,,},,,,,,,r   c                 T   [        [        S9nSUl        SUl        [        5       nSUl        SUl        SUl        [        5       nXUR                  l        XUR                  l        XUR                  l        X5R                  l        U/UR                  l        XRR                  l        UR                  S5      nUR                  nSoU:H  o(       d  [         R"                  " S	U	4S
Xx45      S[$        R&                  " 5       ;   d  [         R(                  " U5      (       a  [         R*                  " U5      OS[         R*                  " U5      [         R*                  " U5      S.-  n
SSU
0-  n[-        [         R.                  " U5      5      eS=n=pUR1                  5       nUS   nSoU	:H  o(       do  [         R"                  " S	U4SX45      [         R*                  " U5      [         R*                  " U	5      S.-  nSSU0-  n[-        [         R.                  " U5      5      eS=n=pUS   nSoU	:H  o(       do  [         R"                  " S	U4SX45      [         R*                  " U5      [         R*                  " U	5      S.-  nSSU0-  n[-        [         R.                  " U5      5      eS=n=pg)zTest trainer detail endpoint.rT   rV   Test TrainerrX         @g      Y@z/ratings/trainers/1r!   r"   r$   r%   r&   r*   r+   N
trainer_idr.   r/   r2   r3   rZ   )r   r
   r[   rZ   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   )r   r   r   mock_trainerrg   rh   r%   rG   rH   rI   rJ   rK   r8   rL   rM   rN   rO   s                    r   test_trainer_detail_endpoint-TestAPIEndpoints.test_trainer_detail_endpointD   s    )* &)#% V
'1$)3&+5((4%'4o
#-7*::34##*s*s*****#******x****x***#***s*******}}L!&Q&Q&&&&&!&&&!&&&Q&&&&&&&F|-~-~-----|---|---~-------r   c                 J   [        S5       n/ Ul        UR                  S5      nUR                  nSoTU:H  of(       d  [        R
                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=n=peUR                  S   n	SoiU:H  o(       do  [        R
                  " SU
4SX45      [        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS
=n	=pS
S
S
5        g
! , (       d  f       g
= f)zTest CSV export functionality.z>apps.backend.api.main.RatingSnapshotRepository.get_top_ratingsz/ratings/horses?format=csvr!   r"   r$   r%   r&   r*   r+   Nzcontent-typeztext/csv; charset=utf-8r.   r/   r2   r3   )r   r`   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   headers)r   r   	mock_repor%   rG   rH   rI   rJ   rK   rL   rM   rN   rO   s                r   test_csv_export_format'TestAPIEndpoints.test_csv_export_format`   s    L
%'I"zz">?H''.3.3.....'......8....8...'...3.......##N3P7PP7PPPPPP3PPP3PPP7PPPPPPPP
 
 
s   E?F
F"c                    UR                  S5      n/ nSnUR                  nXE;   ofov(       d  UR                  nSS/n	UU	;   onU(       Gd  [        R                  " SU4SXE45      [        R
                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS[        R
                  " U5      S.-  nS	S
U0-  oR                  U5        U(       d  [        R                  " SW
4SWW	45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS[        R
                  " U5      [        R
                  " U	5      S.-  nSSU0-  oR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS=n=n=n=n=n=n=pg)zTest CORS headers are present.r    zaccess-control-allow-originr!   i  r5   )z/%(py3)s in %(py7)s
{%(py7)s = %(py5)s.headers
}r%   )r:   r)   r+   z%(py9)spy9)z7%(py13)s
{%(py13)s = %(py11)s.status_code
} in %(py16)s)py11py13py16z%(py18)spy18rV   zassert %(py21)spy21N)optionsrs   r=   r>   r?   rC   r@   rA   rB   append_format_booloprD   rE   )r   r   r%   rG   rM   @py_assert6rH   rL   @py_assert12@py_assert15@py_assert14rK   @py_format10@py_format17@py_format19@py_format20@py_format22s                    r   test_cors_headers"TestAPIEndpoints.test_cors_headersl   s   >>),	
)	
-5-=-=	
)=	
##	
 	
#	
 	
 	
)	
 	
 
		
)	
 	
 
6	
 	
 	
-5	
 	
 
		
-5	
 	
 
		
-=	
 	
 
6	
 
	
 	
 	
#	
 	
 
6	
 	
 	
	
 	
 
		
	
 	
 
		
#	
 	
 
		
	
 	
 
6	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
r   c                 n  ^^^^^ SSK J n  SSKJnJn  SSKJnJmJm  [        TS9mSTl	        STl
        STl        [        US9Tl        S	TR                  l        S
TR                  l        [        TS9mSTl	        STl        STl        STl        STl        STl        [        [(        S9mSTl	        STl        UUUUU4S jnXrR,                  l        U" SSS	STR                  R                  U" S?0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%_S&S'_S(S_6/UR1                  5       0 S)9n[3        S*5       n	[        5       n
XR4                  l        Xl        UR9                  S+5      nUR:                  nS,oU:H  o(       d  [<        R>                  " S-U4S.X45      S/[@        RB                  " 5       ;   d  [<        RD                  " U5      (       a  [<        RF                  " U5      OS/[<        RF                  " U5      [<        RF                  " U5      S0.-  nS1S2U0-  n[I        [<        RJ                  " U5      5      eS=n=pURM                  5       nUS3   nSnUU:H  nU(       dp  [<        R>                  " S-U4S4UU45      [<        RF                  " U5      [<        RF                  " U5      S5.-  nS6S7U0-  n[I        [<        RJ                  " U5      5      eS=n=nnS8nUU;   nU(       d  [<        R>                  " S9U4S:UU45      [<        RF                  " U5      S;[@        RB                  " 5       ;   d  [<        RD                  " U5      (       a  [<        RF                  " U5      OS;S<.-  nS=S>U0-  n[I        [<        RJ                  " U5      5      eS=nnSSS5        g! , (       d  f       g= f)@zTest race predictions endpoint.r   )datetime)PredictionResultRacePrediction)MeetingRaceStarterrT   rV      i  z
Test Venuez
2025-01-26rX   
      Nz
Test Horsec                   > [        5       nU T:X  a`  TUR                  R                  R                  l        TUR                  R                  R                  R                  R                  l        U$ U T:X  a(  T/UR                  R                  R
                  l        U$ U [        :X  a'  TUR                  R                  R                  l        U$ S UR                  R                  R                  l        U$ r   )r   ra   r`   rc   r~   rd   r	   )modelmock_qr   r   
mock_horse	mock_racemock_starters     r   query_side_effectJTestAPIEndpoints.test_race_predictions_endpoint.<locals>.query_side_effect   s    VF}@I**00= ++22??EER M '!?Kn**..;
 M	 %@J**00= M AE**00=Mr   
starter_idhorse_id
horse_namerY   driver_namerW   rn   trainer_namerl   barrier
handicap_meffective_ratingg     p@win_probabilityg      ?place_probabilityg?place_scoreg     @confidence_interval_lowg     @confidence_interval_highrm   predicted_placing)race_idrace_numbervenue
distance_m	race_datepredictionsprediction_timestampmetadataz2packages.core.ratings.predictions.PredictionEnginez/races/1/predictionsr!   r"   r$   r%   r&   r*   r+   r   r.   r/   r2   r3   r   r5   r7   r8   r9   r;   r)   r   )'r   !packages.core.ratings.predictionsr   r   packages.core.storage.modelsr   r   r   r   r[   r   r   meetingr   meeting_dater   rY   rn   r   placingr	   rZ   re   side_effectnowr   predict_racer`   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   )r   r   r   r   r   r   r   r   mock_predictionmock_engine_classmock_enginer%   rG   rH   rI   rJ   rK   r8   rL   rM   rN   rO   rP   r   r   r   r   r   s                          @@@@@r   test_race_predictions_endpoint/TestAPIEndpoints.test_race_predictions_endpointy   s   %VGG dO		 !	#	 g.	".	)5	& ) #!#"$ #u%

&
	 	 ->)(''44      , !	
 !.  " "0   $ &, %( '* !' -3 .4  '(!( "*7
< @
&K4C$$1-8*zz"89H''.3.3.....'......8....8...'...3.......==?D	?'a'?a'''''?a'''?'''a''''''' (=D(((((=D(((=((((((D((((D(((((((
 
 
s   IN&&
N4r   N)__name__
__module____qualname____firstlineno____doc__pytestfixturer   r   rQ   ri   rp   ru   r   r   __static_attributes__r   r   r   r   r      sS    "^^	) 	) ^^ !-8.8
Q
X)r   r   )r   builtinsr@   _pytest.assertion.rewrite	assertionrewriter>   unittest.mockr   r   r   fastapi.testclientr   apps.backend.api.mainr   r   r   r   r	   r
   r   r   r   r   <module>r      s+    *    %  ) - ? ?E) E)r   