
    %i1                     
   S r SSKrSSKJs  Jr  SSKrSSKJ	r	  SSK
JrJrJrJr  \R                  R                   r    SS\S\S\S\S	\4
S
 jjr    SS\S\S\S\S	\4
S jjr " S S5      r " S S5      r " S S5      rg)aN  Integration tests for repositories 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.

Requires:
  - PostgreSQL 16 running (``docker compose up -d db``)
  - Test database ``tipsharks_test`` (or ``TEST_DATABASE_URL`` env var)
    N)
EntityType)MeetingRepositoryRaceRepositoryRatingSnapshotRepositoryStarterRepository
meeting_idmeeting_datevenuecategoryreturnc                     U UUUS.$ )N)meetingdatenamer    )r   r	   r
   r   s       </root/tipsharks/tipsharks-elo-api/tests/test_repositories.pymake_meeting_datar      s     	     race_numberdistance
start_typegaitc                 6    U UUUS.nUR                  U5        U$ )N)r   r   r   r   )update)r   r   r   r   kwargsdatas         r   make_race_datar   )   s*     # 	D 	KKKr   c                   0    \ 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=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)z9A race can be upserted and returns a valid Race instance.Nis notz%(py0)s is not %(py3)sracepy0py3assert %(py5)spy5   ==)z3%(py2)s
{%(py2)s = %(py0)s.race_number
} == %(py5)sr'   py2r*   assert %(py7)spy7)zJ%(py2)s
{%(py2)s = %(py0)s.meeting_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}r   r'   r/   py4py6assert %(py8)spy8  z2%(py2)s
{%(py2)s = %(py0)s.distance_m
} == %(py5)smobile)z2%(py2)s
{%(py2)s = %(py0)s.start_type
} == %(py5)s)r   upsertr   r   idr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   
distance_mr   )self
db_sessionr   r%   @py_assert2@py_assert1@py_format4@py_format6@py_assert4@py_assert3@py_format8@py_assert5@py_format7@py_format9s                 r   test_upsert_creates_race+TestRaceRepository.test_upsert_creates_race@   sp   #**:7H7JK$$Z^=MN4ttt4$1$1$$$$$$$$$$$t$$$$t$$$$$$1$$$$$$$,**,*,,,,,,,,,,,t,,,,t,,,,,,,,,',,,,',,,*,,,,,,,&$&$&&&&&&&&&&&t&&&&t&&&&&&$&&&&&&&*(*(***********t****t******(*******r   c           	         [         R                  " U[        5       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.   i  )r   r   r+   @  r,   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenracesr'   py1r(   r4   r5   r6   Nz%(py1)s == %(py4)srZ   r3   assert %(py6)sr4   r   )z2%(py3)s
{%(py3)s = %(py1)s.distance_m
} == %(py6)s)rZ   r(   r4   )r   r:   r   r   r;   r   get_by_meetingrW   r<   r=   r>   r?   r@   rA   rB   rC   r   rD   )rE   rF   r   rX   rG   rN   rK   rO   rP   r@py_assert0rL   @py_format5s                r   )test_get_by_meeting_returns_ordered_races<TestRaceRepository.test_get_by_meeting_returns_ordered_racesK   s   #**:7H7JK

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[        5       5      n[        R                  " XR
                  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.A meeting with no races returns an empty list.r,   z%(py0)s == %(py3)srX   r&   r)   r*   N)r   r:   r   r   r^   r;   r<   r=   r>   r?   r@   rA   rB   rC   )rE   rF   r   rX   rG   rH   rI   rJ   s           r   'test_get_by_meeting_empty_when_no_races:TestRaceRepository.test_get_by_meeting_empty_when_no_races]   s    #**:7H7JK--j**E{uuur   c           
      r   [         R                  " U[        SS95      n[        R                  " UUR                  [        SSSS95      nUR                  n[        R                  " UUR                  [        S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=pzU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 in-place.int_meeting_updater   r+   rU   Good)r   r   track_conditioni  Softr,   z*%(py2)s
{%(py2)s = %(py0)s.id
} == %(py4)supdatedoriginal_idr'   r/   r3   r]   r4   Nr8   r.   r0   r1   )z7%(py2)s
{%(py2)s = %(py0)s.track_condition
} == %(py5)s)r   r:   r   r   r;   r   r<   r=   r>   r?   r@   rA   rB   rC   rD   rl   )rE   rF   r   r%   rp   ro   rH   rL   ra   rO   rK   rJ   rM   s                r   !test_upsert_updates_existing_race4TestRaceRepository.test_upsert_updates_existing_racec   s   #**)5IJ

 $$JJq4P

 gg !''JJq4P
 zz([(((((z((((((w((((w(((z(((((([(((([(((((((!!)T)T)))))!))))))w))))w)))!)))T)))))))&&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   r   N)
__name__
__module____qualname____firstlineno____doc__rQ   rb   rf   rr   __static_attributes__r   r   r   r   r   =   s    /	++$1r   r   c                   T    \ rS rSrSr\R                  S 5       rS rS r	S r
S rSrg	)
TestStarterRepository   z(Integration tests for StarterRepository.c                     [         R                  " U[        SS95      n[        R                  " XR                  [        5       5      nX#4$ )z/Create a meeting + race pair for starter tests.int_meeting_starterrj   r   r:   r   r   r;   r   rE   rF   r   r%   s       r   meeting_and_race&TestStarterRepository.meeting_and_race   sC     $**)5JK
 $$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)z?A starter can be upserted and returns a valid Starter instance.zFast Galloperi)#  r+      r   horse_id
horse_namerunner_numberbarrierplacingNr"   r$   starterr&   r)   r*   r,   )z0%(py2)s
{%(py2)s = %(py0)s.horse_id
} == %(py5)sr.   r0   r1   )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:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   r   r   )rE   rF   r   _r%   r   rG   rH   rI   rJ   rK   rL   rM   s                r   test_upsert_creates_starter1TestStarterRepository.test_upsert_creates_starter   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olU: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+Starters for a race are returned correctly.zHorse Ai2#  r+   )r   r   r   r   r   zHorse Bi3#  rT   r,   rV   rW   startersrY   r5   r6   Nre   	horse_idsr&   r)   r*   )r   r:   r;   get_by_racerW   r<   r=   r>   r?   r@   rA   rB   rC   r   )rE   rF   r   r   r%   r   rG   rN   rK   rO   rP   sr   rH   rI   rJ   s                   r   !test_get_by_race_returns_starters7TestStarterRepository.test_get_by_race_returns_starters   s   "  GG! '!"	 
	
 	  GG! '!"	 
	
 %00WWE8}!!!!!!!}!!!!!!s!!!!s!!!!!!8!!!!8!!!}!!!!!!!!!!)12AZZ	2!4L(L(((((y((((((y((((y(((L((((((( 3s   I-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)z/A scratched runner is skipped and returns None.zScratched Horsei#  T)r   r   r   is_scratchedNisz%(py0)s is %(py3)sresultr&   r)   r*   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   )
rE   rF   r   r   r%   r   rG   rH   rI   rJ   s
             r   "test_scratched_runner_returns_none8TestStarterRepository.test_scratched_runner_returns_none   s    ""))GG) / $		
 ~vvvr   c           
         Uu  p4[         R                  " UUR                  SSSSSS.SS9nUR                  n[         R                  " UUR                  S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)z=Upserting the same horse in the same race updates the record.zUpdatable Horsei<#     rT   r   r   r   r+   r,   rn   ro   rp   rq   r]   r4   Nr   r.   r0   r1   )r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   )rE   rF   r   r   r%   r   rp   ro   rH   rL   ra   rO   rK   rJ   rM   s                  r   $test_upsert_updates_existing_starter:TestStarterRepository.test_upsert_updates_existing_starter   sp   " $**GG) /!" 
 jj $**GG) /!" 
 zz([(((((z((((((w((((w(((z(((((([(((([(((((((#!#!###########w####w######!#######r   r   N)rt   ru   rv   rw   rx   pytestfixturer   r   r   r   r   ry   r   r   r   r{   r{      s0    2^^ $.)@""$r   r{   c                   T    \ rS rSrSr\R                  S 5       rS rS r	S r
S rSrg	)
TestRatingSnapshotRepository   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$ )z<Create a meeting + race with race_datetime for rating tests.int_meeting_rating
2025-05-06)r   r	   r+   z2025-05-06T14:30:00+12:00r   advertised_start_stringr   r   s       r   r   -TestRatingSnapshotRepository.meeting_and_race   sX     $**/l
 $$JJ7R
 }r   c           
         Uu  p4[         R                  " U[        R                  SUR                  SSSS0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[        R                  oU
:H  o(       Gd  [
        R                  " SU4SXz4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X~45      S
[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS
[
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n[        [
        R                  " U5      5      eS=n=pUR                  otR                  oU
:H  o(       Gd  [
        R                  " SU4SXz4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X~45      S
[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS
[
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n[        [
        R                  " U5      5      eS=n=pUR"                  nSoU:H  o(       d  [
        R                  " SU4SX~45      S
[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS
[
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n[        [
        R                  " U5      5      eS=n=pg)z/A rating snapshot can be upserted and returned.iA       p@      Y@
race_countr+   entity_type	entity_idas_of_race_idratingrdmetaNr"   r$   snapshotr&   r)   r*   r,   )zN%(py2)s
{%(py2)s = %(py0)s.entity_type
} == %(py6)s
{%(py6)s = %(py4)s.HORSE
}r   r2   r5   r6   )z1%(py2)s
{%(py2)s = %(py0)s.entity_id
} == %(py5)sr.   r0   r1   zM%(py2)s
{%(py2)s = %(py0)s.as_of_race_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}r%   z.%(py2)s
{%(py2)s = %(py0)s.rating
} == %(py5)sz*%(py2)s
{%(py2)s = %(py0)s.rd
} == %(py5)s)r   r:   r   HORSEr;   r<   r=   r>   r?   r@   rA   rB   rC   r   r   r   r   r   )rE   rF   r   r   r%   r   rG   rH   rI   rJ   rN   rL   rO   rP   rK   rM   s                   r   test_upsert_creates_snapshot9TestRatingSnapshotRepository.test_upsert_creates_snapshot  s   "+22"((''"
  $#t#####x######x####x###t#########7z'7'77'777777#777777x7777x777#777777z7777z777'77777777!!)T)T)))))!))))))x))))x)))!)))T)))))))%%0000000%000000x0000x000%00000000000000000000(&(&(((((((((((x((((x((((((&((((((({{#e#e#####{######x####x###{###e#######r   c           	         Uu  p4[         R                  " UUR                  [        SSS95      n[        R                  " U[
        R                  SUR                  SS9  [        R                  " U[
        R                  SUR                  SS9  [        R                  " U[
        R                  SS9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	)zAget_latest_rating returns the most recent snapshot for an entity.rT   z2025-05-06T14:35:00+12:00r   iB  r   )r   r   r   r   g     З@r   r   Nr"   r$   latestr&   r)   r*   r,   r   r.   r0   r1   r   race2r2   r5   r6   )r   r:   r;   r   r   r   r   get_latest_ratingr<   r=   r>   r?   r@   rA   rB   rC   r   r   )rE   rF   r   r   race1r   r   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   s                    r   %test_get_latest_rating_returns_latestBTestRatingSnapshotRepository.test_get_latest_rating_returns_latest&  s	   ) %%JJ(C
 	!''"((((	
 	!''"((((	
 *;;"((
 "!T!!!!!v!!!!!!v!!!!v!!!T!!!!!!!}}&&&&&&&}&&&&&&v&&&&v&&&}&&&&&&&&&&##/xx/x/////#//////v////v///#//////u////u///x///////r   c                    [         R                  " U[        R                  SS9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=pCg)
z?get_latest_rating returns None for an entity with no snapshots.i r   Nr   r   r   r&   r)   r*   )r   r   r   r   r<   r=   r>   r?   r@   rA   rB   rC   )rE   rF   r   rG   rH   rI   rJ   s          r   'test_get_latest_rating_none_for_unknownDTestRatingSnapshotRepository.test_get_latest_rating_none_for_unknownP  s}    );;"((

 ~vvvr   c           
         Uu  p4[         R                  " U[        R                  SUR                  SSSS0S9nUR                  nUR                  5         [         R                  " U[        R                  SUR                  SSSS	0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=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                   S   nS	oU	:H  nU(       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=nn	g)u   ON CONFLICT DO UPDATE: upserting same (type, id, race) updates rating.

This verifies the PostgreSQL ``INSERT … ON CONFLICT DO UPDATE``
behaviour in RatingSnapshotRepository.
iC  r   r   countr+   r   g     @g      T@rT   r,   rn   ro   rp   rq   r]   r4   Nr   r.   r0   r1   r   r[   r\   )r   r:   r   r   r;   
expire_allr<   r=   r>   r?   r@   rA   rB   rC   r   r   r   )rE   rF   r   r   r%   r   rp   ro   rH   rL   ra   rO   rK   rJ   rM   r`   rG   s                    r   &test_upsert_on_conflict_updates_ratingCTestRatingSnapshotRepository.test_upsert_on_conflict_updates_ratingY  sC    # ,22"((''1
 kk
 	 +11"((''1
 zz([(((((z((((((w((((w(((z(((((([(((([(((((((~~'''''''~''''''w''''w'''~''''''''''zz!T!T!!!!!z!!!!!!w!!!!w!!!z!!!T!!!!!!!||G$)))))))$)))$))))))))))r   r   N)rt   ru   rv   rw   rx   r   r   r   r   r   r   r   ry   r   r   r   r   r      s0    9^^ "$*(0T'*r   r   )int_meeting_1r   zIntegration TrackH)r+   r7   r9   pace)rx   builtinsr>   _pytest.assertion.rewrite	assertionrewriter<   r   packages.core.storage.modelsr   "packages.core.storage.repositoriesr   r   r   r   markintegration
pytestmarkstrdictr   intr   r   r{   r   r   r   r   <module>r      s      3  [[$$
 &$$	  	
 
 	  	 
(=1 =1Fv$ v$xD* D*r   