
    ri*.                     Z   d Z ddlZddlmc mZ ddlZddlZej                  j                  dej                  j                  ej                  j                  e      d             ddlmZmZmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ d	 Zd
 Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,e-dk(  rd e         e          e"         e#         e$         e%         e&         e'         e(         e)         e*         e+         e,         e.d       yy)z
Regression tests for league-specific edge cases.

These tests verify that the system handles real-world scenarios correctly:
- Recent trades
- Late scratches
- Duplicate names
- Goalie switches
- Soccer transfers
- NCAA availability
    Nz../../scripts)datetime	timedeltatimezone)determine_prop_eligibility)ValidationStateAvailabilityStatusLineupStatusnormalize_player_name)detect_identity_collisionsc                      | t        |       |dS N)player_namenormalized_nameteamr
   namer   s     N/var/www/html/rainmaker/backend/tests/publishing_integrity/test_regressions.pymake_rosterr          4I$4OY]^^    c                 T    | t        |       ||j                  j                         ddS )Ntest)r   r   availability_statusdetailed_statussource)r   valuelowerr   statuss     r   
make_availr!      s,    0Ed0K%&,,:L:L:NZ` r   c                 4    | t        |       |j                  dS )N)r   r   lineup_status)r   r   r   s     r   make_lineupr$   !   s    4I$4Obhbnbnoor   c                      | t        |       |dS r   r
   r   s     r   make_marketr&   $   r   r   c                     t        dd      g} t        dt        j                        g}t	        dd      g}t        ddddddt        j                         t        d	      z   d
| |g |      }g }|j                  }t        j                  }||k(  }|}|s|j                  }	|	}|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }
dd|
iz  }|j'                  |       |slddt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  	      dz  }|j'                  |       t        j(                  |d      i z  }dd|iz  }t+        t        j,                  |            dx}x}x}x}x}}	y)z<Star traded mid-season: prop on old team must be suppressed.Jimmy ButlerDALpointsznba-mia-bos-20260310nbaz
Miami HeatBoston Celtics   hoursregtest==)zf%(py4)s
{%(py4)s = %(py2)s.validation_state
} == %(py8)s
{%(py8)s = %(py6)s.SUPPRESSED_TEAM_MISMATCH
}eligr   )py2py4py6py8z%(py10)spy10z/%(py14)s
{%(py14)s = %(py12)s.publish_allowed
})py12py14   assert %(py17)spy17N)r   r!   r   	AVAILABLEr&   r   r   nowr   validation_stater   SUPPRESSED_TEAM_MISMATCHpublish_allowed
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanation)rosteravailmarketr3   @py_assert1@py_assert3@py_assert7@py_assert5@py_assert0@py_assert13@py_format9@py_format11@py_format15@py_format16@py_format18s                  r   $test_traded_star_blocked_on_old_teamr[   *   s
   .%01F(:(D(DEFE.%01F%"8%&++Yr6	D 4    O$L$L   $LL        $L            i     i !        %4    i %4    i %M             4   i4   i                 r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }t        j                  }||k7  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t              rt        j                   t              ndt        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}x}}|j&                  }d}||k7  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |      dz  }	dd|	iz  }
t#        t        j$                  |
            dx}x}}y)z.Player on correct new team should be verified.r(   r)   r*   znba-dal-bos-20260310r+   zDallas Mavericksr,   r-   r.   r0   !=zf%(py2)s
{%(py2)s = %(py0)s.validation_state
} != %(py6)s
{%(py6)s = %(py4)s.SUPPRESSED_TEAM_MISMATCH
}r3   r   py0r4   r5   r6   assert %(py8)sr7   NrA   z7%(py2)s
{%(py2)s = %(py0)s.suppress_reason
} != %(py5)sra   r4   py5assert %(py7)spy7)r   r!   r   r>   r   r   r?   r   r@   r   rA   rC   rD   rE   rF   rG   rH   rK   rL   suppress_reasonrM   rN   r3   rP   rS   rQ   @py_format7rV   @py_assert4@py_format6@py_format8s              r   &test_traded_player_correct_on_new_teamrn   ;   sq   .%01F(:(D(DEFE%"8%,++Yr2	D   LO$L$LL $LLLLL $LLLLLLL4LLL4LLL LLLLLLOLLLOLLL$LLLLLLLL=#==#=====#=======4===4======#========r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                  t        j                        t        d	      z   d
| |g g       }|j                  }t        j                  }||k7  }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}x}}|j*                  }d}||k7  }|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      t        j$                  |      dz  }	dd|	iz  }
t'        t        j(                  |
            d x}x}}y )NzBobby Witt Jr.KCRhitszmlb-kc-atl-20260329mlbzAtlanta BraveszKansas City Royalsr-   r.   r0   r]   r_   r3   r   r`   rb   r7   rA   rc   rd   rf   rg   )r   r!   r   r>   r   r   r?   r   utcr   r@   r   rA   rC   rD   rE   rF   rG   rH   rK   rL   rh   ri   s              r   "test_royals_alias_matches_kc_eventrt   J   sz   *E23F(*<*F*FGHE%&"7.X\\"YQ%77r2	D   LO$L$LL $LLLLL $LLLLLLL4LLL4LLL LLLLLLOLLLOLLL$LLLLLLLL=#==#=====#=======4===4======#========r   c                     t        dd      t        dd      g} t        | d      }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            dx}}y)z.Two players with same name on different teams.zMarcus WilliamsBOSCHAr+   r;   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slen	conflicts)ra   py1py3r6   rb   r7   Nc              3   :   K   | ]  }|j                   d k(    yw)IDENTITY_COLLISIONN)conflict_type).0cs     r   	<genexpr>z0test_duplicate_names_detected.<locals>.<genexpr>b   s     J1q"66Js   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)ra   r4   r5   )r   r   ry   rC   rD   rE   rF   rG   rH   rK   rL   r   )
rM   rz   @py_assert2rS   rk   rj   rV   rP   rQ   @py_format5s
             r   test_duplicate_names_detectedr   Z   s    	%u-%u-F +659Iy>Q>Q>Q33yy>QJ	JJ3JJJJJJJJJ3JJJ3JJJJJJJJJJJJJJr   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t              rt        j                   t              ndt        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}x}}|j&                  }| }|syddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }t#        t        j$                  |            dx}}y)z$Player scratched close to game time.zAnthony DavisLALr*   nba-lal-gsw-20260310r+   Los Angeles LakersGolden State Warriors   minutesr0   r1   )zd%(py2)s
{%(py2)s = %(py0)s.validation_state
} == %(py6)s
{%(py6)s = %(py4)s.SUPPRESSED_UNAVAILABLE
}r3   r   r`   rb   r7   N7assert not %(py2)s
{%(py2)s = %(py0)s.publish_allowed
}ra   r4   )r   r!   r   	SCRATCHEDr   r   r?   r   r@   r   SUPPRESSED_UNAVAILABLErC   rD   rE   rF   rG   rH   rK   rL   rB   )	rM   rN   r3   rP   rS   rQ   rj   rV   @py_format4s	            r   test_late_scratch_suppressesr   g   sM   /512F);)E)EFGE%#9552..	r2	D   JO$J$JJ $JJJJJ $JJJJJJJ4JJJ4JJJ JJJJJJOJJJOJJJ$JJJJJJJJ############t###t##########r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}y)z=Player returning from injury should be verified if AVAILABLE.zKawhi LeonardLACr*   znba-lac-den-20260310r+   zLA ClipperszDenver Nuggetsr-   r.   r0   3assert %(py2)s
{%(py2)s = %(py0)s.publish_allowed
}r3   r   Nr   r!   r   r>   r   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   rM   rN   r3   rP   @py_format3s        r   test_injury_return_verifiedr   x   s    /512F);)E)EFGE%#95'++Yr2	D 44r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }| }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d x}}y )NzPlayer XMILr*   znba-mil-chi-20260310r+   zMilwaukee BuckszChicago Bullsr-   r.   r0   r   r3   r   )r   r!   r   	SUSPENDEDr   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   rM   rN   r3   rP   rQ   r   s         r   test_suspended_player_blockedr      s    *e,-F
$6$@$@ABE%H4e?++Yr2	D ############t###t##########r   c                     t        dd      g} t        dt        j                        g}t	        dt
        j                        g}t        ddddddt        j                         t        d	      z   d
| ||g       }|j                  }| }|syddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }t#        t        j$                  |            dx}}y)z;MLB batter scratched from lineup 30 min before first pitch.z
Mike TroutLAArq   zmlb-laa-nyy-20260310rr   zLos Angeles AngelsNew York Yankeesr   r   r0   r   r3   r   N)r   r!   r   r>   r$   r	   CONFIRMED_OUT_OF_LINEUPr   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   rM   rN   lineupr3   rP   rQ   r   s          r   test_mlb_scratch_near_gamer      s    ,./F&8&B&BCDE,(L(LMNF%f4e02..	vr	D ############t###t##########r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }| }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}}y)z9MLB: no lineup data inside 60-min lock window = suppress.zAaron JudgeNYYrq   zmlb-nyy-bos-20260310rr   r   zBoston Red Soxr   r   r0   r   r3   r   Nr   r   s         r   test_mlb_unknown_lineup_in_lockr      s    -/0F'9'C'CDEE%v5u,2..	r2	D ############t###t##########r   c                     t        dd      g} t        dt        j                        g}t	        dt
        j                        g}t        ddddddt        j                         t        d	      z   d
| ||g       }|j                  }|syddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }t#        t        j$                  |            d}y)u5   Starting goalie confirmed — saves prop should pass.zIgor ShesterkinNYRsavesnhl-nyr-phi-20260310nhlNew York RangersPhiladelphia Flyersr   r   r0   r   r3   r   N)r   r!   r   r>   r$   r	   STARTING_GOALIEr   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   )rM   rN   r   r3   rP   r   s         r   test_nhl_goalie_confirmedr      s    +U34F)+=+G+GHIE+\-I-IJKF%7$:E12..	vr	D 44r   c                     t        dd      g} t        dt        j                        g}t	        dt
        j                        g}t        ddddddt        j                         t        d	      z   d
| ||g       }|j                  }| }|syddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }t#        t        j$                  |            dx}}y)u.   Backup goalie getting saves prop — suppress.zJonathan Quickr   r   r   r   r   r   r   r   r0   r   r3   r   N)r   r!   r   r>   r$   r	   BENCHr   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   r   s          r   test_nhl_goalie_not_startingr      s    *E23F(*<*F*FGHE*L,>,>?@F%'#9512..	vr	D ############t###t##########r   c                  p   t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }g }|j                  }|}|s#|j                  }t        j                  }||k(  }|}|sddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }	|j#                  |	       |st        j$                  dfdf      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t              rt        j                   t              ndt        j                   |      dz  }
dd|
iz  }|j#                  |       t        j&                  |d      i z  }dd|iz  }t)        t        j*                  |            dx}x}x}x}x}}y)z0Player transferred but still mapped to old club.zMohamed SalahBARshotszepl-liv-mci-20260310epl	LiverpoolzManchester City   r.   r0   z,%(py4)s
{%(py4)s = %(py2)s.publish_allowed
}r3   )r4   r5   r1   )zi%(py8)s
{%(py8)s = %(py6)s.validation_state
} == %(py12)s
{%(py12)s = %(py10)s.SUPPRESSED_TEAM_MISMATCH
}r   )r6   r7   r8   r9   z%(py14)sr:   r;   r<   r=   N)r   r!   r   r>   r   r   r?   r   rB   r@   r   rA   rE   rF   rC   rG   rH   rI   rD   rJ   rK   rL   )rM   rN   r3   rP   rQ   rT   rR   @py_assert11@py_assert9r   @py_format13rX   rY   rZ   s                 r   test_soccer_transfer_wrong_teamr      sa   /512F);)E)EFGE%"8%&++Yr2	D e4dd4#8#8dO<d<dd#8<d#ddddddd4ddd4dddddddddd#8<ddddddd4ddd4ddd#8ddddddOdddOddd<dddddddddddddddr   c                     t        dd      g} g }t        ddddddt        j                         t	        d	      z   d
| |g g       }|j
                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}y)z^NCAA: no availability data should not block (conservative but don't suppress on missing data).zPlayer ADUKEr*   zncaab-duke-unc-20260310ncaabzDuke Blue DevilszNorth Carolina Tar Heelsr-   r.   r0   r   r3   r   N)r   r   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   r   s        r   &test_ncaa_unknown_availability_allowedr      s    *f-.FE%H76++Yr2	D 44r   c                     t        dd      g} t        dt        j                        g}t	        ddddddt        j                         t        d	      z   d
| |g g       }|j                  }| }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}}y)zPlayer on inactive list.zG League Playerr   r*   r   r+   r   r   r-   r.   r0   r   r3   r   N)r   r!   r   INACTIVEr   r   r?   r   rB   rE   rF   rC   rG   rH   rK   rL   r   s         r   test_inactive_player_blockedr      s    +U34F)+=+F+FGHE%8%;U5++Yr2	D ############t###t##########r   __main__zAll regression tests passed!)/__doc__builtinsrE   _pytest.assertion.rewrite	assertionrewriterC   sysospathinsertjoindirname__file__r   r   r    publishing_integrity.eligibilityr   publishing_integrity.enumsr   r   r	   "publishing_integrity.normalizationr   #publishing_integrity.reconciliationr   r   r!   r$   r&   r[   rn   rt   r   r   r   r   r   r   r   r   r   r   r   __name__print r   r   <module>r      s  
  
 	 277<< 9?K L 2 2 G X X D J_p_ ">> K$"  
$$$  $"e( "$ z(**,!# "!!# #% "#%*, "	
() r   