
    %irm                        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JrJrJrJrJrJrJrJrJrJr  \
R4                  R6                  r    S!S\S\S\S	\S
\4
S jjrS"S\ S\ S
\4S jjr! " S S5      r" " S S5      r# " S S5      r$ " S S5      r% " S S5      r& " S S5      r' " S S5      r( " S S5      r) " S S 5      r*g)#a  Integration tests for ALL repository classes with real PostgreSQL.

These tests use the ``db_session`` fixture from ``conftest.py`` which
connects to a real PostgreSQL instance and rolls back after each test.

Covers every public method in every repository class:
    MeetingRepository, RaceRepository, HorseRepository, DriverRepository,
    TrainerRepository, StarterRepository, RatingSnapshotRepository,
    BarrierAdjustmentRepository, HandicapAdjustmentRepository
    N)date	timedelta)
EntityType)BarrierAdjustmentRepositoryDriverRepositoryHandicapAdjustmentRepositoryHorseRepositoryMeetingRepositoryRaceRepositoryRatingSnapshotRepositoryStarterRepositoryTrainerRepositorygenerate_driver_idgenerate_trainer_idnormalize_entity_id
meeting_idmeeting_datevenuecategoryreturnc                     U UUUS.$ )N)meetingr   namer    )r   r   r   r   s       H/root/tipsharks/tipsharks-elo-api/tests/test_repositories_integration.pymake_meeting_datar   &   s     	     race_numberdistancec                 0    XS.nUR                  U5        U$ )Nr   r   )update)r   r   kwargsdatas       r   make_race_datar%   4   s    &=DKKKr   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestMeetingRepository=   z(Integration tests for MeetingRepository.c                    [         R                  " U[        5       5      nSo2UL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      S.-  nSSU0-  n[        [        R                  " U5      5      eS=pCUR                  nSotU:H  o(       d  [        R                  " S	U4S
XG4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R                  nSotU:H  o(       d  [        R                  " S	U4SXG4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R                  nSotU:H  o(       d  [        R                  " S	U4SXG4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=pg)z?A meeting can be upserted and returns a valid Meeting instance.Nis notz%(py0)s is not %(py3)sr   py0py3assert %(py5)spy5int_meeting_1==z*%(py2)s
{%(py2)s = %(py0)s.id
} == %(py5)sr.   py2r1   assert %(py7)spy7Integration Trackz-%(py2)s
{%(py2)s = %(py0)s.venue
} == %(py5)sH)z0%(py2)s
{%(py2)s = %(py0)s.category
} == %(py5)s)r
   upsertr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationidr   r   )
self
db_sessionr   @py_assert2@py_assert1@py_format4@py_format6@py_assert4@py_assert3@py_format8s
             r   test_upsert_creates_meeting1TestMeetingRepository.test_upsert_creates_meeting@   s   #**:7H7JK""d"""""w""""""w""""w"""d"""""""zz,_,_,,,,,z,,,,,,w,,,,w,,,z,,,_,,,,,,,}}3 33 333333}333333w3333w333}333 33333333&3&3&&&&&&&&&&&w&&&&w&&&&&&3&&&&&&&r   c                    [         R                  " U[        SSS95        [         R                  " U[        SSS95      nUR                  5         [         R                  " US5      nSoCUL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      S	.-  nS
SU0-  n[        [
        R                  " U5      5      eS=pTU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=pg)z6Upserting the same meeting ID updates fields in-place.idem_meetingOriginal)r   r   UpdatedNr*   r,   	refetchedr-   r0   r1   r3   r;   r6   r8   r9   )r
   r=   r   
expire_all	get_by_idr>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   updatedrV   rI   rJ   rK   rL   rM   rN   rO   s              r   test_upsert_idempotent,TestMeetingRepository.test_upsert_idempotentH   s&     )^:V	
 $**)^9U
 	%//
NK	 $$$$$$$y$$$$$$y$$$$y$$$$$$$$$$+)+)+++++++++++y++++y++++++)+++++++r   c           	         [         R                  nSo2" X5      nSoTUL of(       Gd7  [        R                  " SU4SXE45      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS=n=n=n=peg)
z2get_by_id returns None for a non-existent meeting.nonexistentNis)zY%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.get_by_id
}(%(py3)s, %(py5)s)
} is %(py10)sr
   rH   )r.   r7   r/   r1   r9   py10zassert %(py12)spy12)
r
   rX   r>   r?   r@   rA   rB   rC   rD   rE   )	rG   rH   rJ   rM   @py_assert6@py_assert9@py_assert8@py_format11@py_format13s	            r   &test_get_by_id_returns_none_if_missing<TestMeetingRepository.test_get_by_id_returns_none_if_missingW   s     **M}M*:EMMMMMMMEMMMMMM MMMM MMM*MMMMMM:MMMM:MMM}MMMEMMMMMMMMMMMr   c           	      .   [         R                  " U[        SSS95        [         R                  " U[        SSS95        [         R                  " U[        SSS95        [         R                  " U[	        SS	S	5      [	        SS	S
5      5      nU Vs1 s H  o3R
                  iM     nnSS1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      S.-  nSSU0-  n[        [        R                  " U5      5      eS=peSoU;  oU(       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s  snf )z?get_by_date_range returns only meetings within the date window.m1
2026-01-01r   r   m2
2026-01-15m3z
2026-02-01        r3   z%(py0)s == %(py3)sidsr-   r0   r1   N)not in)z%(py1)s not in %(py3)s)py1r/   )r
   r=   r   get_by_date_ranger   rF   r>   r?   r@   rA   rB   rC   rD   rE   )
rG   rH   resultsmrt   rI   rJ   rK   rL   @py_assert0s
             r   test_get_by_date_range,TestMeetingRepository.test_get_by_date_range[   sX     )TU	
 	  )TU	
 	  )TU	
 $55T1a($tQ*;
 %%WttW%Tl"l"""""s""""""s""""s"""l"""""""3tt33 &s   Hc           	         [         R                  " U[        SSS95        [         R                  " U[	        SSS5      [	        SSS5      5      n/ 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      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=pCg)z:get_by_date_range returns empty list when nothing matches.	m_outside
2026-06-01rl     rq      rr   r3   rs   rx   r-   r0   r1   N)r
   r=   r   rw   r   r>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   rx   rI   rJ   rK   rL   s          r   $test_get_by_date_range_returns_empty:TestMeetingRepository.test_get_by_date_range_returns_emptyn   s      <P	
 $55T1a($tR*<
 "}www"r   r   N)__name__
__module____qualname____firstlineno____doc__rP   rZ   rg   r{   r   __static_attributes__r   r   r   r'   r'   =   s    2',N&	r   r'   c                   <    \ rS rSrSrS rS rS rS rS r	S r
S	rg
)TestRaceRepository}   z%Integration tests for RaceRepository.c                    [         R                  " U[        5       5      n[        R                  " XR                  [        5       5      nSoCUL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      S.-  nSSU0-  n[        [        R                  " U5      5      eS=pTU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R                  oRR                  oU:H  o(       G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      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pU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=pg)z'A race can be upserted under a meeting.Nr*   r,   racer-   r0   r1   rq   r3   )z3%(py2)s
{%(py2)s = %(py0)s.race_number
} == %(py5)sr6   r8   r9   )zJ%(py2)s
{%(py2)s = %(py0)s.meeting_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}r   r.   r7   py4py6assert %(py8)spy8  )z2%(py2)s
{%(py2)s = %(py0)s.distance_m
} == %(py5)s)r
   r=   r   r   rF   r%   r>   r?   r@   rA   rB   rC   rD   rE   r   r   
distance_m)rG   rH   r   r   rI   rJ   rK   rL   rM   rN   rO   @py_assert5@py_format7@py_format9s                 r   test_upsert_creates_race+TestRaceRepository.test_upsert_creates_race   s   #**:7H7JK$$Z^=MN4ttt4$1$1$$$$$$$$$$$t$$$$t$$$$$$1$$$$$$$,**,*,,,,,,,,,,,t,,,,t,,,,,,,,,',,,,',,,*,,,,,,,&$&$&&&&&&&&&&&t&&&&t&&&&&&$&&&&&&&r   c           	      
   [         R                  " U[        SS95      n[        R                  " XR                  [        SSS95        [        R                  " XR                  [        SSS95        [        R                  " XR                  5      n[        U5      nSoTU:H  of(       Gd  [        R                  " SU4S	XE4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=peU V	s/ s H  oR                   PM     n
n	SS/oU:H  oD(       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
=pKUS   oR"                  nSoTU:H  of(       d  [        R                  " SU4SXE45      [        R                  " U
5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n
=n=pegs  sn	f )z6Races for a meeting are returned in race_number order.race_order_meetingr      i  r!   rq   i@  r3   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenracesr.   rv   r/   r   r   r   Nz%(py1)s == %(py4)srv   r   assert %(py6)sr   r   )z2%(py3)s
{%(py3)s = %(py1)s.distance_m
} == %(py6)srv   r/   r   )r
   r=   r   r   rF   r%   get_by_meetingr   r>   r?   r@   rA   rB   rC   rD   rE   r   r   )rG   rH   r   r   rI   r   rM   r   r   rrz   rN   @py_format5s                r   #test_get_by_meeting_returns_ordered6TestRaceRepository.test_get_by_meeting_returns_ordered   s   #**)5IJ
 	

Nq4$P	
 	

Nq4$P	
 --j**E5zQQzss55zQ',-u!u7-!Q777777-777-7777777777Qx*""*d*d*****"***x***"***d******* .s   ?L c           
         [         R                  " U[        SS95      n[        R                  o2R
                  oC" X5      n/ oeU:H  ow(       Gd  [        R                  " SU4SXV45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n	[        [        R                  " U	5      5      eS=n=n=n=pvg)z.A meeting with no races returns an empty list.empty_meeting_racesr   r3   )zv%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get_by_meeting
}(%(py3)s, %(py6)s
{%(py6)s = %(py4)s.id
})
} == %(py11)sr   rH   r   r.   r7   r/   r   r   r   py11assert %(py13)spy13N)r
   r=   r   r   r   rF   r>   r?   r@   rA   rB   rC   rD   rE   )
rG   rH   r   rJ   r   @py_assert7@py_assert10rc   @py_format12@py_format14s
             r   test_get_by_meeting_empty,TestRaceRepository.test_get_by_meeting_empty   s   #**)5JK
 ,,JJ,ZDJJJJJJJDJJJJJJ~JJJJ~JJJ,JJJJJJZJJJJZJJJJJJJJJJJJJJJJDJJJJJJJJJJJr   c           	         [         R                  " U[        SS95      n[        R                  " UUR                  [        SSS95      nUR                  n[        R                  " UUR                  [        SSS95      nUR                  ofU:H  ow(       d  [        R                  " SU4SXd45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        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=pgUR                  nSoU
:H  ow(       d  [        R                  " SU4SXj4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=pzg)z?Upserting the same meeting_id + race_number updates the record.race_update_meetingr   rq   Good)r   track_conditionSoftr3   z*%(py2)s
{%(py2)s = %(py0)s.id
} == %(py4)srY   original_idr.   r7   r   r   r   N)z7%(py2)s
{%(py2)s = %(py0)s.track_condition
} == %(py5)sr6   r8   r9   )r
   r=   r   r   rF   r%   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r   r   r   rY   rJ   rN   r   r   rM   rL   rO   s                r   !test_upsert_updates_existing_race4TestRaceRepository.test_upsert_updates_existing_race   si   #**)5JK
 $$JJq&A

 gg ''JJq&A

 zz([(((((z((((((w((((w(((z(((((([(((([(((((((&&0&0&00000&000000w0000w000&000&0000000r   c           	         [         R                  " U[        SSS95      n[         R                  " U[        SSS95      n[        R                  " XR                  [        SS95        [        R                  " XR                  [        SS95        [        R                  " XR                  [        SS95        [        R                  " U[        S	SS5      [        S	SS5      5      n[        U5      nS
oeU:H  ow(       Gd  [        R                  " SU4SXV4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=pvU V
s/ s H  oR"                  U
R$                  4PM     nn
/ SQo[U:H  o(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS=pgs  sn
f )z;get_races_for_recompute returns races in date/number order.rm1z
2026-01-02rl   rm2rk   rq   )r   r   rp      r3   r   r   rx   r   r   r   N))r   rq   )r   r   )r   rq   rs   race_idsr-   r0   r1   )r
   r=   r   r   rF   r%   get_races_for_recomputer   r   r>   r?   r@   rA   rB   rC   rD   rE   r   r   )rG   rH   rj   rm   rx   rI   r   rM   r   r   r   r   rJ   rK   rL   s                  r   test_get_races_for_recompute/TestRaceRepository.test_get_races_for_recompute   s   %%)UV
 %%)UV
 	j%%A1NOj%%A1NOj%%A1NO 88T1a($tQ*:
 7| q q     |      s    s      7    7   |   q       ;BC7a\\1==17C????????x??????x????x??????????? Ds   !K-c           	      X   [         R                  " U[        SSS95      n[        R                  " XR                  [        5       5        [        R                  " U[        SSS5      [        SSS5      5      n/ 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      S.-  nSSU0-  n[        [        R                  " U5      5      eS=pTg)z@get_races_for_recompute returns empty list when nothing matches.
rm_outsider   rl   r   rq   r   rr   r3   rs   rx   r-   r0   r1   N)r
   r=   r   r   rF   r%   r   r   r>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   r   rx   rI   rJ   rK   rL   s           r   *test_get_races_for_recompute_outside_range=TestRaceRepository.test_get_races_for_recompute_outside_range   s    #**LQ
 	j**n6FG 88T1a($tR*<
 "}www"r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   }   s%    /'+ K1&@*
r   r   c                   *    \ rS rSrSrS rS rS rSrg)TestHorseRepository   z&Integration tests for HorseRepository.c                    [         R                  " USSS9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                  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=pTg
)zA horse can be upserted.i  zThunder Bolthorse_idr   r3   r5   horser6   r8   r9   Nz,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)s)r	   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   r   rG   rH   r   rJ   rM   rN   rL   rO   s           r   test_upsert_creates_horse-TestHorseRepository.test_upsert_creates_horse   s    &&zD~Vxx44xuux4zz+^+^+++++z++++++u++++u+++z+++^+++++++r   c                 V   [         R                  " USSS9  [         R                  " USSS9  UR                  5         [         R                  " USSS9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=pTg)z-Upserting the same horse_id updates the name.i  zOriginal Namer   zUpdated Namer3   r   r   r6   r8   r9   N)r	   r=   rW   r   r>   r?   r@   rA   rB   rC   rD   rE   r   s           r   rZ   *TestHorseRepository.test_upsert_idempotent   s    zDOzD~N&&zD~Vzz+^+^+++++z++++++u++++u+++z+++^+++++++r   c                 N   SSS.n[         R                  " USSUS9nUR                  oDU:H  oU(       d  [        R                  " SU4SXB45      S	[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        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=pEg)z.Upserting with raw_data stores it in raw_json.testbay)sourcecolori  z
Data Horse)r   r   raw_datar3   )z0%(py2)s
{%(py2)s = %(py0)s.raw_json
} == %(py4)sr   rawr   r   r   N)r	   r=   raw_jsonr>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   r   r   rJ   rN   r   r   s           r   test_upsert_with_raw_data-TestHorseRepository.test_upsert_with_raw_data   s    %0&&L3
 ~~$$$$$$~$$$$$$u$$$$u$$$~$$$$$$$$$$$$$$$$$r   r   N)	r   r   r   r   r   r   rZ   r   r   r   r   r   r   r      s    0,,%r   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestDriverRepository   z'Integration tests for DriverRepository.c                 z   [         R                  " US5      nUR                  nSn[        U5      oSU:H  of(       Gd"  [        R
                  " SU4SX545      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=n=pEUR                  nSoU	:H  of(       d  [        R
                  " SU4S
X94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=pig	)z-A driver can be upserted with a generated ID.John Driverr3   zH%(py2)s
{%(py2)s = %(py0)s.id
} == %(py8)s
{%(py8)s = %(py4)s(%(py6)s)
}driverr   r.   r7   r   r   r   assert %(py10)sr`   Nr   r6   r8   r9   )r   r=   rF   r   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r   rJ   r   r   rN   r   re   rM   rL   rO   s               r   test_upsert_creates_driver/TestDriverRepository.test_upsert_creates_driver   s.   !((]Cyy=}=.}========y======v====v===y======.====.===}==========={{+m+m+++++{++++++v++++v+++{+++m+++++++r   c                    [         R                  " USSS9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                  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=pTg
)z-A driver can be upserted with an explicit ID.zExplicit DriveriY> )	driver_idr3   r5   r   r6   r8   r9   Nr   )r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r   rJ   rM   rN   rL   rO   s           r   test_upsert_with_explicit_id1TestDriverRepository.test_upsert_with_explicit_id   s    !(()V
 yy"F"F"""""y""""""v""""v"""y"""F"""""""{{/////////{//////v////v///{///////////r   c                    [         R                  " US5      n[         R                  " US5      nUR                  oCR                  oTU:H  of(       Gd  [        R                  " SU4SXE45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        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-  n[        [        R                  " U5      5      eS	=n=peg	)
,Upserting the same name returns the same ID.zIdem Driverr3   zB%(py2)s
{%(py2)s = %(py0)s.id
} == %(py6)s
{%(py6)s = %(py4)s.id
}d1d2r   r   r   N)r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   )	rG   rH   r   r   rJ   r   rN   r   r   s	            r   rZ   +TestDriverRepository.test_upsert_idempotent  s    $$Z?$$Z?uu~urrur   c                     [         R                  " [        SS9   [        R                  " US5        SSS5        g! , (       d  f       g= f)z'An empty driver name raises ValueError.zDriver name is requiredmatch N)pytestraises
ValueErrorr   r=   rG   rH   s     r    test_upsert_raises_on_empty_name5TestDriverRepository.test_upsert_raises_on_empty_name  s.    ]]:-FG##J3 HGG	   ;
A	c                    [        SSS9n[        U[        5      o"(       Gd+  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S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      S.-  n[        [
        R                  " U5      5      eSnS	oAU:  oU(       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      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=pTg)zAnormalize_entity_id produces a deterministic integer from a name.r   )fallback_namez5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultint)r.   rv   r7   r   Nr   >)z%(py0)s > %(py3)sr-   r0   r1   )r   r  r	  r@   rA   r>   rB   rC   rD   rE   r?   )rG   r  rN   r   rI   rJ   rK   rL   s           r   'test_normalize_entity_id_on_driver_name<TestDriverRepository.test_normalize_entity_id_on_driver_name  s    $]-P&#&&&&&&&&&z&&&&z&&&&&&&&&&&&&&&&&&#&&&&#&&&&&&&&&&zvvvr   r   N)r   r   r   r   r   r   r   rZ   r  r  r   r   r   r   r   r      s    1,04
r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	TestTrainerRepositoryi  z(Integration tests for TrainerRepository.c                 z   [         R                  " US5      nUR                  nSn[        U5      oSU:H  of(       Gd"  [        R
                  " SU4SX545      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=n=pEUR                  nSoU	:H  of(       d  [        R
                  " SU4S
X94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=pig	)z.A trainer can be upserted with a generated ID.zJane Trainerr3   r   trainerr   r   r   r`   Nr   r6   r8   r9   )r   r=   rF   r   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r  rJ   r   r   rN   r   re   rM   rL   rO   s               r   test_upsert_creates_trainer1TestTrainerRepository.test_upsert_creates_trainer  s.   #**:~Fzz@@0@@@@@@@@z@@@@@@w@@@@w@@@z@@@@@@0@@@@0@@@@@@@@@@@@@@||-~-~-----|------w----w---|---~-------r   c                    [         R                  " USSS9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                  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=pTg
)z.A trainer can be upserted with an explicit ID.zExplicit Traineri )
trainer_idr3   r5   r  r6   r8   r9   Nr   )r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r  rJ   rM   rN   rL   rO   s           r   r   2TestTrainerRepository.test_upsert_with_explicit_id%  s    #***v
 zz#V#V#####z######w####w###z###V#######||111111111|111111w1111w111|11111111111r   c                    [         R                  " US5      n[         R                  " US5      nUR                  oCR                  oTU:H  of(       Gd  [        R                  " SU4SXE45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        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-  n[        [        R                  " U5      5      eS	=n=peg	)
r   zIdem Trainerr3   r   t1t2r   r   r   N)r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   )	rG   rH   r  r  rJ   r   rN   r   r   s	            r   rZ   ,TestTrainerRepository.test_upsert_idempotent-  s    %%j.A%%j.Auu~urrur   c                     [         R                  " [        SS9   [        R                  " US5        SSS5        g! , (       d  f       g= f)z(An empty trainer name raises ValueError.zTrainer name is requiredr   r   N)r   r   r   r   r=   r  s     r   r  6TestTrainerRepository.test_upsert_raises_on_empty_name3  s.    ]]:-GH$$Z4 IHHr  r   N)
r   r   r   r   r   r  r   rZ   r  r   r   r   r   r  r    s    2.25r   r  c                   `    \ rS rSrSr\R                  S 5       rS rS r	S r
S rS rS	 rS
rg)TestStarterRepositoryi<  z(Integration tests for StarterRepository.c                     [         R                  " U[        SS95      n[        R                  " XR                  [        5       5      nX#4$ )Nstarter_test_meetingr   r
   r=   r   r   rF   r%   rG   rH   r   r   s       r   meeting_and_race&TestStarterRepository.meeting_and_race?  sA    #**)5KL
 $$Z^=MN}r   c           
      x   Uu  p4[         R                  " UUR                  SSSSSS.SS9nS oeULow(       d  [        R                  " SU4SXV45      S	[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      S
.-  nSSU0-  n	[        [        R                  " U	5      5      eS =pvUR                  nSoU
:H  o(       d  [        R                  " SU4SXz4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R                  nSoU
:H  o(       d  [        R                  " SU4SXz4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R                  nSoU
:H  o(       d  [        R                  " SU4SXz4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R                  nSoU
:H  o(       d  [        R                  " SU4SXz4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=pg )Nz
Fast HorseiY  rq   r   )r   r   
horse_namerunner_numberbarrierplacingr*   r,   starterr-   r0   r1   r3   )z0%(py2)s
{%(py2)s = %(py0)s.horse_id
} == %(py5)sr6   r8   r9   )z5%(py2)s
{%(py2)s = %(py0)s.runner_number
} == %(py5)sz/%(py2)s
{%(py2)s = %(py0)s.barrier
} == %(py5)sz/%(py2)s
{%(py2)s = %(py0)s.placing
} == %(py5)s)r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   r   r'  r(  r*  )rG   rH   r#  _r   r+  rI   rJ   rK   rL   rM   rN   rO   s                r   test_upsert_creates_starter1TestStarterRepository.test_upsert_creates_starterG  s]   "#**GG$ *!" 
 #"d"""""w""""""w""""w"""d"""""""'4'4'''''''''''w''''w''''''4'''''''$$)))))))$))))))w))))w)))$))))))))))#!#!###########w####w######!########!#!###########w####w######!#######r   c           	      |   Uu  p4[         R                  " UUR                  SSSSS.SS9  [         R                  " UUR                  SSSSS.SS9  [         R                  " XR                  5      n[	        U5      nSovU:H  o(       Gd  [
        R                  " S	U4S
Xg4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1 s H  oR                  iM     nnSS1oU:H  of(       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=pmg s  snf )NAib  rq   r   r   r&  r'  r)  Bic  r   r3   r   r   startersr   r   r   r   r   r   r   )r   r=   rF   get_by_racer   r>   r?   r@   rA   rB   rC   rD   rE   r   )rG   rH   r#  r.  r   r5  rI   r   rM   r   r   srz   rN   r   s                  r   !test_get_by_race_returns_starters7TestStarterRepository.test_get_by_race_returns_starters[  se   "  GGd#PQR		
 	  GGd#PQR		
 %00WWE8}!!!!!!!}!!!!!!s!!!!s!!!!!!8!!!!8!!!}!!!!!!!!!!$,-Hq

H=-$======-===-==========-s   H9c           	         Uu  p4[         R                  " UUR                  SSSSS.5      nS oeUL ow(       d  [        R                  " SU4SXV45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  n	[        [        R                  " U	5      5      eS =pvg )N	Scratchedi  T)r   r   r&  is_scratchedr^   )z%(py0)s is %(py3)sr  r-   r0   r1   )r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   )
rG   rH   r#  r.  r   r  rI   rJ   rK   rL   s
             r   test_scratched_returns_none1TestStarterRepository.test_scratched_returns_nonem  s    ""))GG# ) $		
 ~vvvr   c           	      |   Uu  p4[         R                  " UUR                  SSSSS.SS9nUR                  n[         R                  " UUR                  SSSSS.SS9nUR                  oU:H  o(       d  [        R                  " SU	4S	X45      S
[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        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 =pUR                  nSoU:H  o(       d  [        R                  " SU	4SX4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=pg )N	Updatableil     r3  r   r)  rq   r3   r   rY   r   r   r   r   r-  r6   r8   r9   )r   r=   rF   r>   r?   r@   rA   rB   rC   rD   rE   r*  )rG   rH   r#  r.  r   r+  r   rY   rJ   rN   r   r   rM   rL   rO   s                  r   $test_upsert_updates_existing_starter:TestStarterRepository.test_upsert_updates_existing_starter{  sf   "#**GG# )!"	 

 jj#**GG# )!"	 

 zz([(((((z((((((w((((w(((z(((((([(((([(((((((#!#!###########w####w######!#######r   c                    SSK JnJn  Uu  pV[        R                  " UUR
                  SSSSSSSS.5      nUR                  nS	oU	Lo(       d  [        R                  " S
U
4SX4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R                  nS	oU	Lo(       d  [        R                  " S
U
4SX4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R!                  U5      R#                  UR
                  UR                  :H  5      R%                  5       nS	oULo(       d  [        R                  " S
U4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=pUR&                  nSoU	:H  o(       d  [        R                  " SU
4SX4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R!                  U5      R#                  UR
                  UR                  :H  5      R%                  5       nS	nUULo(       d  [        R                  " S
U4SUU45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=pUR&                  nSoU	:H  o(       d  [        R                  " SU
4SX4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=pg	)zBWhen starter data includes driver/trainer names, they are created.r   )DriverTrainerzLinked Horseiv     zAuto DriverzAuto Trainer)r   r   r&  r'  jockeydriver_nametrainer_nameNr*   )z5%(py2)s
{%(py2)s = %(py0)s.driver_id
} is not %(py5)sr+  r6   r8   r9   )z6%(py2)s
{%(py2)s = %(py0)s.trainer_id
} is not %(py5)sr,   r   r-   r0   r1   r3   r   r  )packages.core.storage.modelsrE  rF  r   r=   rF   r   r>   r?   r@   rA   rB   rC   rD   rE   r  queryfilterfirstr   )rG   rH   r#  rE  rF  r.  r   r+  rJ   rM   rN   rL   rO   r   rI   rK   r  s                    r   $test_driver_and_trainer_auto_created:TestStarterRepository.test_driver_and_trainer_auto_created  s+   @"#**GG& ,!"', .
   ,,,,,,, ,,,,,,w,,,,w,,, ,,,,,,,,,,!!-------!------w----w---!----------!!&)00g>O>O1OPVVX!!T!!!!!v!!!!!!v!!!!v!!!T!!!!!!!{{+m+m+++++{++++++v++++v+++{+++m+++++++W%,,WZZ7;M;M-MNTTV 	 #"wd"""""wd""""""w""""w"""d"""""""||-~-~-----|------w----w---|---~-------r   c           
         Uu  p4[         R                  oTR                  oe" X5      n/ oU:H  o(       Gd  [        R                  " SU	4SXx45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=n=n=pg )	Nr3   )zs%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get_by_race
}(%(py3)s, %(py6)s
{%(py6)s = %(py4)s.id
})
} == %(py11)sr   rH   r   r   r   r   )r   r6  rF   r>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   r#  r.  r   rJ   r   r   r   rc   r   r   s               r   test_get_by_race_empty,TestStarterRepository.test_get_by_race_empty  s    " ,,GG,ZAGRGRGGGGGAGGGGGG GGGG GGG,GGGGGGZGGGGZGGGGGGGGGGGGGGGGAGGGRGGGGGGGGr   r   N)r   r   r   r   r   r   fixturer#  r/  r8  r=  rB  rO  rR  r   r   r   r   r  r  <  s:    2^^ $(>$$8.<Hr   r  c                   f    \ rS rSrSr\R                  S 5       rS rS r	S r
S rS rS	 rS
 rSrg)TestRatingSnapshotRepositoryi  z/Integration tests for RatingSnapshotRepository.c           	          [         R                  " U[        SSS95      n[        R                  " UUR                  [        SSS95      nX#4$ )Nrating_testrn   rl   rq   z2026-01-15T14:30:00+13:00r   advertised_start_stringr!  r"  s       r   r#  -TestRatingSnapshotRepository.meeting_and_race  sS    #**\R
 $$JJ7R
 }r   c           
      	   Uu  p4[         R                  " U[        R                  SUR                  SSSS0S9nUR
                  n[        R                  ovU:H  o(       Gd  [        R                  " SU4SXg45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
[        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS =n=pUR                  nSoU:H  o(       d  [        R                  " SU4SXk4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R                  nSoU:H  o(       d  [        R                  " SU4SXk4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R                   nSoU:H  o(       d  [        R                  " SU4SXk4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R"                  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 )NiA       p@      Y@
race_countrA  entity_type	entity_idas_of_race_idratingrdmetar3   )zN%(py2)s
{%(py2)s = %(py0)s.entity_type
} == %(py6)s
{%(py6)s = %(py4)s.HORSE
}snapr   r   r   r   )z1%(py2)s
{%(py2)s = %(py0)s.entity_id
} == %(py5)sr6   r8   r9   z.%(py2)s
{%(py2)s = %(py0)s.rating
} == %(py5)sz*%(py2)s
{%(py2)s = %(py0)s.rd
} == %(py5)sr   r   r   r   )r   r=   r   HORSErF   ra  r>   r?   r@   rA   rB   rC   rD   rE   rb  rd  re  rf  )rG   rH   r#  r.  r   rg  rJ   r   rN   r   r   rM   rL   rO   rz   rI   r   s                    r   test_upsert_creates_snapshot9TestRatingSnapshotRepository.test_upsert_creates_snapshot  s}   "'.."((''"
 3:#3#33#333333333333t3333t333333333:3333:333#33333333~~%%%%%%%~%%%%%%t%%%%t%%%~%%%%%%%%%%{{$f$f$$$$${$$$$$$t$$$$t$$${$$$f$$$$$$$ww%%wttw%yy&+!+!+++++&+++&+++!+++++++r   c           
      v   Uu  p4[         R                  " U[        R                  SUR                  SSSS0S9  UR                  5         [         R                  " U[        R                  SUR                  SSSS	0S9nUR                  nSovU:H  o(       d  [        R                  " S
U4SXg4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R                  nSovU:H  o(       d  [        R                  " S
U4SXg4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R                   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 )NiB  r]  r^  countrq   r`  g     @g      T@r   r3   rh  rY   r6   r8   r9   ri  r   r   r   r   )r   r=   r   rj  rF   rW   rd  r>   r?   r@   rA   rB   rC   rD   rE   re  rf  )rG   rH   r#  r.  r   rY   rJ   rM   rN   rL   rO   rz   rI   r   r   s                  r   test_upsert_on_conflict_updates<TestRatingSnapshotRepository.test_upsert_on_conflict_updates  s   " ''"((''1	
 	*11"((''1
 ~~'''''''~''''''w''''w'''~''''''''''zz!T!T!!!!!z!!!!!!w!!!!w!!!z!!!T!!!!!!!||G$)))))))$)))$))))))))))r   c           	         Uu  p4[         R                  [         R                  4 GH/  n[        R                  " UUSUR
                  SS9nUR                  owU:H  o(       d  [        R                  " SU4SXu45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        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=pxGM2     g)z7Snapshots work for Driver and Trainer entity types too.(#  g      @)ra  rb  rc  rd  r3   )z3%(py2)s
{%(py2)s = %(py0)s.entity_type
} == %(py4)srg  ra  r   r   r   N)r   DRIVERTRAINERr   r=   rF   ra  r>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   r#  r.  r   ra  rg  rJ   rN   r   r   s              r   "test_upsert_for_driver_and_trainer?TestRatingSnapshotRepository.test_upsert_for_driver_and_trainer  s    "&--z/A/ABK+22'"ggD ##2{22222#222222422224222#222222{2222{2222222 Cr   c           	         Uu  p4[         R                  " UUR                  [        SSS95      n[        R                  " U[
        R                  SUR                  S5        [        R                  " U[
        R                  SUR                  S5        [        R                  " U[
        R                  S5      nS ovULo(       d  [        R                  " SU4SXg45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      S
.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS =pUR                   nSoU:H  o(       d  [        R                  " SU4SX4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R"                  oR                  oU:H  o(       Gd  [        R                  " SU4SX45      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        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-  n[        [        R                  " U5      5      eS =n=pg )Nr   z2026-01-15T14:35:00+13:00rY  iC  r]  g     З@r*   r,   latestr-   r0   r1   r3   rh  r6   r8   r9   )zM%(py2)s
{%(py2)s = %(py0)s.as_of_race_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}race2r   r   r   )r   r=   rF   r%   r   r   rj  get_latest_ratingr>   r?   r@   rA   rB   rC   rD   rE   rd  rc  )rG   rH   r#  r   race1ry  rx  rI   rJ   rK   rL   rM   rN   rO   r   r   r   s                    r   test_get_latest_rating3TestRatingSnapshotRepository.test_get_latest_rating  s   )%%JJ(C
 	!''
(($&	
 	!''
(($&	
 *;;
(($
 "!T!!!!!v!!!!!!v!!!!v!!!T!!!!!!!}}&&&&&&&}&&&&&&v&&&&v&&&}&&&&&&&&&&##/xx/x/////#//////v////v///#//////u////u///x///////r   c                    [         R                  n[        R                  nSnU" XU5      nS nUUL ow(       Gd  [        R
                  " SU4SUU45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U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[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n	[        [        R                  " U	5      5      eS =n=n=n=n=pvg )
Ni r^   )z%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.get_latest_rating
}(%(py3)s, %(py6)s
{%(py6)s = %(py4)s.HORSE
}, %(py8)s)
} is %(py13)sr   rH   r   )r.   r7   r/   r   r   r   r`   r   zassert %(py15)spy15)r   rz  r   rj  r>   r?   r@   rA   rB   rC   rD   rE   )
rG   rH   rJ   r   r   rc   @py_assert12@py_assert11r   @py_format16s
             r   'test_get_latest_rating_none_for_unknownDTestRatingSnapshotRepository.test_get_latest_rating_none_for_unknown  s   $66	
&,,	
.3	
6e	
 		
 	
 	

 	
 		
 	

 
6	
 	

 	
$	
 	

 
		
$	
 	

 
		
6	
 	

 
6	
 	

 	
	
 	

 
		
	
 	

 
6	
 	

 	
&	
 	

 
		
&	
 	

 
		
,	
 	

 
		
.3	
 	

 
		
	
 	

 
		
 		
 	
 	
 	

 	
 	
 	
r   c           
         Uu  p4[        S5       H>  n[        R                  " U[        R                  SU-   UR
                  SUS-  -   5        M@     [        R                  " U[        R                  SS9n[        U5      nSoU:H  o(       Gd  [        R                  " SU	4SXx4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S   oR                   ovS   oR                   oU:  o(       d  [        R                  " SU	4SX}45      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n	=pg )N   rr  r]  
   r   )limitr3   r   r   topr   r   r   r   rq   r
  )zI%(py3)s
{%(py3)s = %(py1)s.rating
} > %(py8)s
{%(py8)s = %(py6)s.rating
})rv   r/   r   r   r   r`   )ranger   r=   r   rj  rF   get_top_ratingsr   r>   r?   r@   rA   rB   rC   rD   rE   rd  )rG   rH   r#  r   r   ir  rI   r   rM   r   r   rz   r   re   s                  r   test_get_top_ratings1TestRatingSnapshotRepository.test_get_top_ratings%  sm   (qA$++J,,dQh!b&  '66
((
 3x11}xss33x11v,}},1v,}},},,,,,},,,v,,,},,,v,,,},,,,,,,,r   c           
         [         R                  n[        R                  nU" X5      n/ nXE:H  of(       Gd  [        R
                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U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[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=peg )	Nr3   )zz%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.get_top_ratings
}(%(py3)s, %(py6)s
{%(py6)s = %(py4)s.HORSE
})
} == %(py11)sr   rH   r   r   r   r   )r   r  r   rj  r>   r?   r@   rA   rB   rC   rD   rE   )	rG   rH   rJ   r   r   r   rc   r   r   s	            r   test_get_top_ratings_empty7TestRatingSnapshotRepository.test_get_top_ratings_empty3  s   $44	
AKAQAQ	
4ZR	
VX	
RX	
 	
 	
R	
 	
	6	
 	
 	
$	
 	
 			
$	
 	
 			
4	
 	
	6	
 	
 	
5?	
 	
 			
5?	
 	
	6	
 	
 	
AK	
 	
 			
AK	
 	
 			
AQ	
 	
 			
R	
 	
 			
VX	
 	
 	
 	
 	
 	
 	
r   r   N)r   r   r   r   r   r   rT  r#  rk  ro  ru  r|  r  r  r  r   r   r   r   rV  rV    s>    9^^ ,"*230.
-
r   rV  c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)TestBarrierAdjustmentRepositoryi<  z2Integration tests for BarrierAdjustmentRepository.c           	         [         R                  " USSSSSS9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                  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                  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                  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                  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=pTg )N
Test Trackmobile	1700-2000rq         ?r   
start_typedistance_bucketr(  
adjustmentr3   r;   bar6   r8   r9   )z2%(py2)s
{%(py2)s = %(py0)s.start_type
} == %(py5)sr,  z2%(py2)s
{%(py2)s = %(py0)s.adjustment
} == %(py5)sz4%(py2)s
{%(py2)s = %(py0)s.sample_count
} == %(py5)s)r   r=   r   r>   r?   r@   rA   rB   rC   rD   rE   r  r(  r  sample_countrG   rH   r  rJ   rM   rN   rL   rO   s           r   test_upsert_creates_adjustment>TestBarrierAdjustmentRepository.test_upsert_creates_adjustment?  sP   (//'
 xx'<'<'''''x''''''r''''r'''x'''<'''''''}}(((((((}((((((r((((r(((}((((((((((zzQQzrrzQ}}#######}######r####r###}###########!#!###########r####r######!#######r   c           	         [         R                  " USSSSSS9nUR                  nSoCUL 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                  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=pTg)z6Global barrier adjustments (NULL venue) are supported.N<1700r   皙?r  r^   z-%(py2)s
{%(py2)s = %(py0)s.venue
} is %(py5)sr  r6   r8   r9   r3   r  )r   r=   r   r>   r?   r@   rA   rB   rC   rD   rE   r  r  s           r   test_upsert_with_null_venue;TestBarrierAdjustmentRepository.test_upsert_with_null_venueN  s   (//#
 xx44xrrx4}}#######}######r####r###}##########r   c                 ^   [         R                  " USSSSS5        [         R                  " USSSSS5        UR                  5         [         R                  " U5      n[	        U5      nSoCU:H  oU(       Gd  [
        R                  " SU4SX44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=pTUS   oR                  nSoCU:H  oU(       d  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pTg )NVenuer  r  rq   r  g?r3   r   r   	all_itemsr   r   r   r   z2%(py3)s
{%(py3)s = %(py1)s.adjustment
} == %(py6)sr   )r   r=   rW   get_allr   r>   r?   r@   rA   rB   rC   rD   rE   r  	rG   rH   r  rI   r   rM   r   r   rz   s	            r   rZ   6TestBarrierAdjustmentRepository.test_upsert_idempotent[  sL   #**;3	
 	$**;3	
 	/77
C	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|-&&-#-#-----&---|---&---#-------r   c                    [         R                  " US S SSS5        [         R                  " US S SSS5        [         R                  " U5      n[        U5      nSoCU:H  oU(       Gd  [        R
                  " SU4SX44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=pTg )Nr  rq   皙?r   r  r3   r   r   r  r   r   r   )r   r=   r  r   r>   r?   r@   rA   rB   rC   rD   rE   rG   rH   r  rI   r   rM   r   r   s           r   test_get_all,TestBarrierAdjustmentRepository.test_get_allg  s    #**:tT7AsS#**:tT7AsS/77
C	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""r   c                    [         R                  o"" U5      n/ oCU:H  oU(       Gd"  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U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=n=pTg )Nr3   zM%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_all
}(%(py3)s)
} == %(py8)sr   rH   r.   r7   r/   r1   r   r   r`   )
r   r  r>   r?   r@   rA   rB   rC   rD   rE   rG   rH   rJ   rM   r   rb   r   re   s           r   test_get_all_empty2TestBarrierAdjustmentRepository.test_get_all_emptym  s    *22D2:>D"D"DDDDD>DDDDDD*DDDD*DDD2DDDDDD:DDDD:DDD>DDD"DDDDDDDr   c           
         [         R                  " USSSSSSS9  [         R                  " U5      n[        U5      nSoCU:H  oU(       Gd  [        R
                  " S	U4S
X44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=pTUS   oR                  n[        R                  n	So" U
5      oU:H  oU(       Gd  [        R
                  " S	U4SX;45      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U	5      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=n=n=n	=pUS   oR                  nSoCU:H  oU(       d  [        R
                  " S	U4SX445      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=n=pTg)z5increment_sample creates a new record if none exists.	New TrackNr  rA        ?r  deltalearning_raterq   r3   r   r   r  r   r   r   r   zn%(py3)s
{%(py3)s = %(py1)s.adjustment
} == %(py11)s
{%(py11)s = %(py7)s
{%(py7)s = %(py5)s.approx
}(%(py9)s)
}r   rv   r/   r1   r9   py9r   r   r   z4%(py3)s
{%(py3)s = %(py1)s.sample_count
} == %(py6)sr   )r   increment_sampler  r   r>   r?   r@   rA   rB   rC   rD   rE   r  r   approxr  rG   rH   r  rI   r   rM   r   r   rz   rb   rd   r   r   r   s                 r   !test_increment_sample_creates_newATestBarrierAdjustmentRepository.test_increment_sample_creates_newp  s   #44T;TW	
 077
C	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|<&&<&--<<-*<<*<<<<<<&<<<|<<<&<<<<<<&<<<<&<<<-<<<<<<*<<<<<<<<<|-((-A-A-----(---|---(---A-------r   c           
         [         R                  " USSSSSSS9  [         R                  " USSSSSSS	9  [         R                  " U5      n[	        U5      nS
oCU:H  oU(       Gd  [
        R                  " SU4SX44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=pTUS   oR                  n[        R                  n	So" U
5      oU:H  oU(       Gd  [
        R                  " SU4SX;45      [
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U	5      [
        R                  " U
5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=n=n=n=n	=pUS   oR                   nSoCU:H  oU(       d  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=n=n=pTg)z,increment_sample updates an existing record.	Inc Trackr  r  r   r  rA  r  r  r  rq   r3   r   r   r  r   r   r   Nr   g333333?r  r   r  r   r      r  r   )r   r=   r  r  r   r>   r?   r@   rA   rB   rC   rD   rE   r  r   r  r  r  s                 r   &test_increment_sample_updates_existingFTestBarrierAdjustmentRepository.test_increment_sample_updates_existing{  s   #**X{AsQR	
 	$44	
 077
C	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|<&&<&--<<-*<<*<<<<<<&<<<|<<<&<<<<<<&<<<<&<<<-<<<<<<*<<<<<<<<<|-((-A-A-----(---|---(---A-------r   r   Nr   r   r   r   r   r  r  rZ   r  r  r  r  r   r   r   r   r  r  <  s)    <$$
.#E	..r   r  c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg) TestHandicapAdjustmentRepositoryi  z3Integration tests for HandicapAdjustmentRepository.c           	         [         R                  " USSSSSS9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                  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                  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                  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=pTg )Nr  r  r  r  333333?r   r  r  
handicap_mr  r3   r;   har6   r8   r9   )z2%(py2)s
{%(py2)s = %(py0)s.handicap_m
} == %(py5)sr  rq   r  )r   r=   r   r>   r?   r@   rA   rB   rC   rD   rE   r  r  r  rG   rH   r  rJ   rM   rN   rL   rO   s           r   r  ?TestHandicapAdjustmentRepository.test_upsert_creates_adjustment  s   )00'
 xx'<'<'''''x''''''r''''r'''x'''<'''''''}}"""""""}""""""r""""r"""}""""""""""}}#######}######r####r###}###########!#!###########r####r######!#######r   c           	         [         R                  " US S SSSS9nUR                  nS oCUL 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                  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=pTg )Nr  r   g        r  r^   r  r  r6   r8   r9   r3   r  )r   r=   r   r>   r?   r@   rA   rB   rC   rD   rE   r  r  s           r   r  <TestHandicapAdjustmentRepository.test_upsert_with_null_venue  s   )00#
 xx44xrrx4}}#######}######r####r###}##########r   c                 ^   [         R                  " USSSSS5        [         R                  " USSSSS5        UR                  5         [         R                  " U5      n[	        U5      nSoCU:H  oU(       Gd  [
        R                  " SU4S	X44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=pTUS   oR                  nSoCU:H  oU(       d  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pTg )Nr  r  r  r  r  r  rq   r3   r   r   r  r   r   r   r   r  r   )r   r=   rW   r  r   r>   r?   r@   rA   rB   rC   rD   rE   r  r  s	            r   rZ   7TestHandicapAdjustmentRepository.test_upsert_idempotent  sL   $++;C	
 	%++;C	
 	088D	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|-&&-#-#-----&---|---&---#-------r   c                    [         R                  " US S SSS5        [         R                  " US S SSS5        [         R                  " U5      n[        U5      nSoCU:H  oU(       Gd  [        R
                  " SU4SX44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=pTg )Nr  r   r  r  r  r   r3   r   r   r  r   r   r   )r   r=   r  r   r>   r?   r@   rA   rB   rC   rD   rE   r  s           r   r  -TestHandicapAdjustmentRepository.test_get_all  s    $++JdGQPST$++JdGRQTU088D	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""r   c                    [         R                  o"" U5      n/ oCU:H  oU(       Gd"  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U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=n=pTg )Nr3   r  r   rH   r  r   r`   )
r   r  r>   r?   r@   rA   rB   rC   rD   rE   r  s           r   r  3TestHandicapAdjustmentRepository.test_get_all_empty  s    +33E3J?E2E2EEEEE?EEEEEE+EEEE+EEE3EEEEEEJEEEEJEEE?EEE2EEEEEEEr   c           
         [         R                  " USS SSSSS9  [         R                  " U5      n[        U5      nSoCU:H  oU(       Gd  [        R
                  " SU4S	X44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=pTUS   oR                  n[        R                  n	So" U
5      oU:H  oU(       Gd  [        R
                  " SU4SX;45      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U	5      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n	=pUS   oR                  nSoCU:H  oU(       d  [        R
                  " SU4SX445      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pTg )Nr  r  r  g       @r  r  rq   r3   r   r   r  r   r   r   r   r  r  r   r  r   r   r  r   )r   r  r  r   r>   r?   r@   rA   rB   rC   rD   rE   r  r   r  r  r  s                 r   r  BTestHandicapAdjustmentRepository.test_increment_sample_creates_new  s   $55T;#UX	
 188D	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|<&&<&--<<-*<<*<<<<<<&<<<|<<<&<<<<<<&<<<<&<<<-<<<<<<*<<<<<<<<<|-((-A-A-----(---|---(---A-------r   c           
         [         R                  " USSSSSSS9  [         R                  " USSSSSS	S
9  [         R                  " U5      n[	        U5      nSoCU:H  oU(       Gd  [
        R                  " SU4SX44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=pTUS   oR                  n[        R                  n	So" U
5      oU:H  oU(       Gd  [
        R                  " SU4SX;45      [
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U	5      [
        R                  " U
5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=n=n	=pUS   oR                   nSoCU:H  oU(       d  [
        R                  " SU4SX445      [
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pTg )Nr  r  r  r  r  r   r  r  r  r  rq   r3   r   r   r  r   r   r   r   gffffff?r  r   r  r   r   r  r  r   )r   r=   r  r  r   r>   r?   r@   rA   rB   rC   rD   rE   r  r   r  r  r  s                 r   r  GTestHandicapAdjustmentRepository.test_increment_sample_updates_existing  s   $++X{BRS	
 	%55	
 188D	9~"""""""~""""""s""""s""""""9""""9"""~""""""""""|<&&<&--<<-*<<*<<<<<<&<<<|<<<&<<<<<<&<<<<&<<<-<<<<<<*<<<<<<<<<|-((-A-A-----(---|---(---A-------r   r   Nr  r   r   r   r  r    s)    =$
$
.#F..r   r  )r2   rn   r:   r<   )rq   r   )+r   builtinsr@   _pytest.assertion.rewrite	assertionrewriter>   datetimer   r   r   rK  r   "packages.core.storage.repositoriesr   r   r   r	   r
   r   r   r   r   r   r   r   markintegration
pytestmarkstrdictr   r	  r%   r'   r   r   r   r  r  rV  r  r  r   r   r   <module>r     s  	   $  3    [[$$
 &$$	  	
 
 3 D : :@U Uv% %<   L5 5@{H {HBy
 y
~Q. Q.nL. L.r   