
    %i              	           S r SSKrSSKJs  Jr  SSKrSSKJ	r	  SSK
JrJrJrJr  \R                  R                   r   SS\S\S\S\4S	 jjr " S
 S5      r " S S5      rg)a  Performance regression tests using pytest-benchmark.

These tests verify that key database queries and data transformations
complete within acceptable time bounds. They use ``pytest-benchmark``
for timing and store baselines for regression detection.

Run with::

    pytest tests/test_performance_regression.py --benchmark-only

To update baselines (after intentional performance changes)::

    pytest tests/test_performance_regression.py --benchmark-save=data
    N)
EntityType)HorseRepositoryMeetingRepositoryRaceRepositoryRatingSnapshotRepositorycount
meeting_idmeeting_datereturnc                    [         R                  " U UUSSS.5      n[        R                  " U UR                  SSU S3S.5      n[	        U5       Hm  nSU-   n[
        R                  " XS	U 35        [        R                  " U [        R                  UUR                  S
US-  -   US:  a  SUS-  -
  OSSUS-   0S9  Mo     UR                  $ )zeCreate ``count`` rating snapshots for benchmarking.

Returns the ``race.id`` used for all snapshots.
zBenchmark TrackH)meetingdatenamecategory   i  zT14:30:00+13:00)race_numberdistanceadvertised_start_string順 zBench Horse g     p@g      ?i  g      Y@g?g      I@
race_count)entity_type	entity_idas_of_race_idratingrdmeta)	r   upsertr   idranger   r   r   HORSE)
db_sessionr   r	   r
   r   raceihorse_ids           F/root/tipsharks/tipsharks-elo-api/tests/test_performance_regression.py_setup_snapshotsr'       s      &&! %		
G   

*6'G	
D 5\Q;z|A35GH ''"((''AG#"#c'uq3wtA&	
  77N    c                   P    \ rS rSrSr\R                  R                  S 5       rSr	g)TestGetTopRatingsBenchmarkQ   z<Benchmarks for ``RatingSnapshotRepository.get_top_ratings``.c                 D  ^ [        TSS9  U4S jnU" U5      nUR                  S   nSoeU:  ow(       d  [        R                  " SU4SXV45      [        R                  " U5      [        R                  " U5      S.-  n[        R
                  " S	UR                  S   S
 S35      S-   SU0-  n	[        [        R                  " U	5      5      eS=n=pv[        U5      nSoU
:*  o(       Gd  [        R                  " SU4SXz45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS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=p[        U5      S:  Ga  U Vs/ s H  oR                  PM     nnSn[        XS9oU:H  nU(       GdX  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS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=pggs  snf )!z9get_top_ratings should complete in <1s for 100 snapshots.d   r   c                  L   > [         R                  " T [        R                  SS9$ )N
   limit)r   get_top_ratingsr   r!   )r"   s   r&   _queryMTestGetTopRatingsBenchmark.test_get_top_ratings_100_snapshots.<locals>._queryY   s#    +;;J,,B r(   mean      ?<z%(py1)s < %(py4)spy1py4zget_top_ratings took .3fs (expected <1.0s for 100 rows)
>assert %(py6)spy6Nr0   )<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)slenresultpy0r<   py3rA   assert %(py8)spy8r   Treverse==zA%(py0)s == %(py7)s
{%(py7)s = %(py2)s(%(py3)s, reverse=%(py5)s)
}ratingssortedrF   py2rG   py5py7assert %(py9)spy9)r'   stats
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationrC   @py_builtinslocals_should_repr_global_namer   rP   )selfr"   	benchmarkr4   rD   @py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert5@py_assert4@py_format9srO   @py_assert6@py_assert1@py_format8@py_format10s    `                 r&   "test_get_top_ratings_100_snapshots=TestGetTopRatingsBenchmark.test_get_top_ratings_100_snapshotsT   sF    	3/	
 6" v& 	
 	
, 	
 	
 	
& 	
 	
 
		
& 	
 	
 
		
 	
 	
 	
#IOOF$;C#@ A, -	
 	
 	
 	
 	
 6{ b b     {      s    s      6    6   {   b       v;?)/0AxxG06:;fW;;;;;;;;7;;;;;;7;;;;7;;;;;;f;;;;f;;;;;;W;;;;W;;;d;;;;;;;;;;; 0s   N N)
__name__
__module____qualname____firstlineno____doc__pytestmarkrb   rp   __static_attributes__rr   r(   r&   r*   r*   Q   s!    F[[< <r(   r*   c                   P    \ rS rSrSr\R                  R                  S 5       rSr	g)TestRatingsApiBenchmarkq   zDBenchmarks simulating the ``GET /v1/ratings/horses`` endpoint logic.c                   ^ [        TSS9  U4S jnU" U5      nUR                  S   nSoeU:  ow(       d  [        R                  " SU4SXV45      [        R                  " U5      [        R                  " U5      S.-  n[        R
                  " S	UR                  S   S
 S35      S-   SU0-  n	[        [        R                  " U	5      5      eS=n=pv[        U5      nSoU
:H  o(       Gd  [        R                  " SU4SXz45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS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 Vs/ s H  oS   PM	     nnSn[        XS9oU:H  nU(       GdX  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS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=pgs  snf )zSimulate repository call + serialization for the horses ratings endpoint.

Benchmarks the same logic path as ``GET /v1/ratings/horses`` without
going through the HTTP layer (no FastAPI, no Pydantic validation).
r-   r.   c                    > [         R                  " T[        R                  SS9n SSKJn  / nU  H  nTR                  U5      R                  UR                  UR                  :H  5      R                  5       nUR                  SUR                  U(       a  UR                  OS UR                  UR                  UR                  (       a  UR                  R!                  S5      OS UR"                  S.5        M     U$ )Nr   r1   r   )Horsehorser   )r   r   entity_namer   r   r   r   )r   r3   r   r!   packages.core.storage.modelsr   queryfilterr   r   firstappendr   r   r   r   getr   )	snapshotsr   resultssnapshotr   r"   s        r&   _simulate_endpointXTestRatingsApiBenchmark.test_get_horse_ratings_serialization.<locals>._simulate_endpoint}   s    0@@J,,GI
 ;G%$$U+VEHH(:(::;UW 
 '.%-%7%75:uzz"*//&kk?G}}HMM--l;RV)1)?)?
 &( Nr(   r6   r7   r8   r:   r;   zRatings API serialization took r>   r?   r@   rA   NrL   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srC   rD   rE   rH   rI   r   TrJ   rN   rO   rP   rQ   rU   rV   )r'   rW   rX   rY   rZ   r[   r\   r]   rC   r^   r_   r`   rP   )ra   r"   rb   r   rD   rc   rd   re   rf   rg   rh   ri   rj   rrO   rl   rm   rn   ro   s    `                 r&   $test_get_horse_ratings_serialization<TestRatingsApiBenchmark.test_get_horse_ratings_serializationt   s:    	3/	@ -. v& 	
 	
, 	
 	
 	
& 	
 	
 
		
& 	
 	
 
		
 	
 	
 	
-ioof.Ec-J K, -	
 	
 	
 	
 	
 6{!c!c!!!!!{!!!!!!s!!!!s!!!!!!6!!!!6!!!{!!!c!!!!!!!(./1X;/267&77777777w777777w7777w777777&7777&7777777777777$77777777777 0s    Nrr   N)
rs   rt   ru   rv   rw   rx   ry   rb   r   rz   rr   r(   r&   r|   r|   q   s!    N[[48 48r(   r|   )r-   bench_meetingz
2026-01-15)rw   builtinsr^   _pytest.assertion.rewrite	assertionrewriterX   rx   r   r   "packages.core.storage.repositoriesr   r   r   r   ry   rb   
pytestmarkintstrr'   r*   r|   rr   r(   r&   <module>r      s}      3  [[""
 %$	++ + 	+
 	+b< <@88 88r(   