
    %iC                        S r SSKJ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  SSKJr   " S S	5      r " S
 S5      r " S S5      rg)z1Tests for the TipSharks background job scheduler.    )annotationsN)	MagicMockpatch)
TestClient)appget_db	scheduler)TipSharksSchedulerc                     \ rS rSrSr\R                  " SS9S 5       r\R                  R                  S 5       r
\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S	 5       r\R                  R                  S
 5       r\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S 5       r\R                  R                  S 5       rSrg)TestTipSharksScheduler   z'Tests for the TipSharksScheduler class.Tautousec              #  j   #    [        5       nUv   UR                  (       a  UR                  SS9  gg7f)z'Create a fresh scheduler for each test.FwaitN)r
   runningshutdown)selfscheds     9/root/tipsharks/tipsharks-elo-api/tests/test_scheduler.pysetup_scheduler&TestTipSharksScheduler.setup_scheduler   s.      #$==NNN& s   13c                   #    UnUR                   o3(       + oD(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS[        R
                  " U5      S.-  n[        [        R                  " U5      5      eS=p4UR                  5         UR                   o3(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS[        R
                  " U5      S.-  n[        [        R                  " U5      5      eSnUR                  SS9  UR                   o3(       + oD(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS[        R
                  " U5      S.-  n[        [        R                  " U5      5      eS=p4g7f)z"Test scheduler start and shutdown./assert not %(py2)s
{%(py2)s = %(py0)s.running
}r   py0py2N+assert %(py2)s
{%(py2)s = %(py0)s.running
}Fr   )
r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationstartr   )r   r   r   @py_assert1@py_assert3@py_format4@py_format3s          r   test_start_stop&TestTipSharksScheduler.test_start_stop   s      ==          5    5   =      }}}uu}E"==          5    5   =      s   G<G>c                  #    UnUR                  5         UR                  5         UR                  o3(       d  SS[        R                  " 5       ;   d  [        R
                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eSnUR                  SS9  g7f)z(Test that starting twice does not error.r   r   r   NFr   )
r'   r   r    r!   r"   r#   r$   r%   r&   r   )r   r   r   r(   r+   s        r   test_double_start_is_idempotent6TestTipSharksScheduler.test_double_start_is_idempotent)   sw       }}}uu}E"s   CCc                  #    UnUR                  5         UR                  SS9  UR                  SS9  UR                  o3(       + oD(       d  SS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S.-  n[        [
        R                  " U5      5      eS=p4g7f)z-Test that shutting down twice does not error.Fr   r   r   r   N)
r'   r   r   r    r!   r"   r#   r$   r%   r&   )r   r   r   r(   r)   r*   s         r   "test_double_shutdown_is_idempotent9TestTipSharksScheduler.test_double_shutdown_is_idempotent2   s       E"E"==          5    5   =      s   CCc           	     p  #    UnUR                  5         UR                  SSSSSSS9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      S.-  nSSU0-  n[        [        R                  " U5      5      eS=pTUR                  5       n[        U5      nSoU	:H  o(       Gd  [        R                  " SU
4SXI4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   S   n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=pNSoS   S   oU;   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=pNUR                  S S!9  g7f)"zTest adding an ingest job.
2024-01-01
2024-01-31Htab	0 6 * * *test_ingest)	date_fromdate_tocategorysource	cron_exprjob_id==z%(py0)s == %(py3)sr@   r   py3assert %(py5)spy5N   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenjobsr   py1rE   py6assert %(py8)spy8r   idz%(py1)s == %(py4)srM   py4assert %(py6)srN   Ingestnameinz%(py1)s in %(py4)sFr   )r'   add_ingest_jobr"   _call_reprcomparer    r!   r#   r$   r%   r&   	list_jobsrJ   r   r   r   r   r@   @py_assert2r(   r*   @py_format6rK   @py_assert5@py_assert4@py_format7@py_format9@py_assert0r)   @py_format5s                   r   test_add_ingest_job*TestTipSharksScheduler.test_add_ingest_job;   s      %%" !  & 
 '&&&&&&v&&&&&&v&&&&v&&&&&&&&&& 4yAA~yss44yAAwt}-------}---}----------*76?*?*****x***x***?*******E"s   L4L6c                n  #    UnUR                  5         UR                  SSSSSS9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      S
.-  nSSU0-  n[        [        R                  " U5      5      eS=pTUR                  5       n[        U5      nSoU	:H  o(       Gd  [        R                  " SU
4SXI4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   S   n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=pNSoS   S   oU;   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=pNUR                  SS 9  g7f)!zTest adding a recompute job.r5   
2024-12-31T	0 2 * * 0test_recompute)r;   r<   clearr?   r@   rA   rC   r@   rD   rF   rG   NrH   rI   rJ   rK   rL   rO   rP   r   rQ   rR   rS   rU   rN   	RecomputerW   rX   rZ   Fr   )r'   add_recompute_jobr"   r\   r    r!   r#   r$   r%   r&   r]   rJ   r   r^   s                   r   test_add_recompute_job-TestTipSharksScheduler.test_add_recompute_jobR   s      ((" !# ) 
 *)))))))v))))))v))))v))))))))))) 4yAA~yss44yAAwt}0 00 000000}000}000 00000000-1gfo-o-----{---{---o-------E"s   L3L5c                b  #    UnUR                  5         UR                  S/S/SSS9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      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS=pTUR                  5       n[        U5      nSoU	:H  o(       Gd  [        R                  " SU
4SXI4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   S   n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=pNUR                  SS9  g7f)zTest adding a scrape job.z010101rs.htm01	0 4 * * 0test_scrape)urls
club_codesr?   r@   rA   rC   r@   rD   rF   rG   NrH   rI   rJ   rK   rL   rO   rP   r   rQ   rR   rS   rU   rN   Fr   )r'   add_scrape_jobr"   r\   r    r!   r#   r$   r%   r&   r]   rJ   r   r^   s                   r   test_add_scrape_job*TestTipSharksScheduler.test_add_scrape_jobh   s      %% !v! 	 & 
 '&&&&&&v&&&&&&v&&&&v&&&&&&&&&& 4yAA~yss44yAAwt}-------}---}----------E"s   J-J/c                  #    UnUR                  5         U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=pTUR                  SS	9  g7f)
z-Test listing jobs when no jobs are scheduled.rA   rC   rK   rD   rF   rG   NFr   )r'   r]   r"   r\   r    r!   r#   r$   r%   r&   r   )r   r   r   rK   r_   r(   r*   r`   s           r   test_list_jobs_empty+TestTipSharksScheduler.test_list_jobs_empty|   s        rztttrE"   C'C)c           	       #    UnUR                  5         UR                  SSS9  UR                  o3" 5       n[        U5      nSoeU:H  ow(       Gd7  [        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      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n	[        [        R                  " U	5      5      eS=n=n=n=pvUR                  S5      n
So:U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                  o3" 5       n[        U5      nSoeU:H  ow(       Gd7  [        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      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n	[        [        R                  " U	5      5      eS=n=n=n=pvUR                  SS9  g7f)zTest removing a scheduled job.r9   test_remover?   r@   rH   rA   )zg%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.list_jobs
}()
})
} == %(py10)srJ   r   )r   rM   rE   rG   py7py10zassert %(py12)spy12NTisz%(py0)s is %(py3)sresultrD   rF   rG   r   Fr   )r'   r[   r]   rJ   r"   r\   r    r!   r#   r$   r%   r&   
remove_jobr   )r   r   r   r_   rb   @py_assert6@py_assert9@py_assert8@py_format11@py_format13r   r(   r*   r`   s                 r   test_remove_job&TestTipSharksScheduler.test_remove_job   s"      !  	 	

 ??*?$*s$%*******%******s****s******5****5***?***$***%**********!!-0~vvv??*?$*s$%*******%******s****s******5****5***?***$***%**********E"s   OOc                  #    UnUR                  5         UR                  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                  SS
9  g	7f)z(Test removing a job that does not exist.nonexistentFr   r   r   rD   rF   rG   Nr   )r'   r   r"   r\   r    r!   r#   r$   r%   r&   r   )r   r   r   r   r_   r(   r*   r`   s           r   test_remove_nonexistent_job2TestTipSharksScheduler.test_remove_nonexistent_job   s       !!-0vvvE"r~   c                  #    UnUR                  5         UR                  SSS9  UR                  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S   n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=pIUR                  nSo" U	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      [        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=pUR                  SS9  g7f)z Test getting a single job by ID.r9   test_getr   Nis notz%(py0)s is not %(py3)sjobrD   rF   rG   rQ   rA   rR   rS   rU   rN   r   r   zM%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_job
}(%(py4)s)
} is %(py9)sr   r   r   rT   rN   py9assert %(py11)spy11Fr   )r'   r[   get_jobr"   r\   r    r!   r#   r$   r%   r&   r   )r   r   r   r   r_   r(   r*   r`   re   r)   rf   rc   ra   r   @py_assert7@py_format10@py_format12s                    r   test_get_job#TestTipSharksScheduler.test_get_job   s      ! 	 	

 mmJ'$sss$4y&J&J&&&&&y&&&y&&&J&&&&&&&}}3]3}]+3t3t33333+333333u3333u333}333]333+333t3333333E"s   J	Jc                  #    UnUR                  5         UR                  5       n[        U5      nSoTU:  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=peS
oU;   oD(       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	=pSoU;   oD(       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	=pUR                  5       n[        U5      nSoTU:  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R                  SS9  g	7f)z(Test loading default jobs from settings.   >=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srJ   job_idsrL   rO   rP   Ningest_dailyrX   z%(py1)s in %(py3)srM   rE   rF   rG   recompute_weeklyrK   Fr   )r'   load_default_jobsrJ   r"   r\   r    r!   r#   r$   r%   r&   r]   r   )r   r   r   r   r_   ra   rb   rc   rd   re   r*   r`   rK   s                r   test_load_default_jobs-TestTipSharksScheduler.test_load_default_jobs   s      ))+7| q q     |      s    s      7    7   |   q       ((((((~(((~(((((((((((((((((!,W,,,,,!,,,!,,,,,,W,,,,W,,,,,,, 4yAA~yss44yAE"s   O?Pc                  #    UnUR                  5         UR                  SSS9  UR                  SSS9  U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R                  SS9  g7f)z>Test that adding a job with same ID replaces the existing one.r9   replace_testr   z
0 12 * * *rH   rA   rI   rJ   rK   rL   rO   rP   NFr   )r'   r[   r]   rJ   r"   r\   r    r!   r#   r$   r%   r&   r   )	r   r   r   rK   r_   ra   rb   rc   rd   s	            r   test_replace_existing_job0TestTipSharksScheduler.test_replace_existing_job   s       !! 	 	
 	"! 	 	

  4yAA~yss44yAE"s   E=E? N)__name__
__module____qualname____firstlineno____doc__pytestfixturer   markasyncior,   r/   r2   rg   rp   ry   r|   r   r   r   r   r   __static_attributes__r       r   r   r      s   1^^D!' "' [[	! 	! [[# # [[! ! [[# #, [[# #* [[# #& [[# # [[# #$ [[# # [[# #$ [[# # [[# #r   r   c                      \ rS rSrSr\R                  " SS9S 5       r\R                  S 5       r\R                  S 5       r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rSrg)TestSchedulerAdminEndpoints   z,Tests for the scheduler admin API endpoints.Tr   c              #     #    [         R                  (       a  [         R                  " SS9  Sv   [         R                  (       a  [         R                  " SS9  gg7f)z-Ensure scheduler is stopped before each test.Fr   N)r	   r   r   r   s    r   setup_scheduler_in_app2TestSchedulerAdminEndpoints.setup_scheduler_in_app   s=      E*E* s   AAc              #     ^#    U4S jnU[         R                  [        '   [        [         5       nUv   SSS5        [         R                  R	                  5         g! , (       d  f       N-= f7f)z(Create test client with mock DB session.c               3     >#    T v   g 7f)Nr   )mock_db_sessions   r   override_get_db;TestSchedulerAdminEndpoints.client.<locals>.override_get_db   s     !!s   	N)r   dependency_overridesr   r   rm   )r   r   r   test_clients    `  r   client"TestSchedulerAdminEndpoints.client   sJ     	" ,;  (_   &&( _s   -A-A'A-
A*&A-c                    [        5       $ )zCreate mock database session.)r   r   s    r   r   +TestSchedulerAdminEndpoints.mock_db_session   s     {r   c                
    SS0$ )zReturn admin auth header.AuthorizationzBearer change_me_in_productionr   r   s    r   _auth_header(TestSchedulerAdminEndpoints._auth_header   s    !ABBr   c                   UR                  S5      nUR                  nSoCU:H  oU(       d  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=pTg	)
z,Test that listing jobs requires admin token./v1/admin/jobs  rA   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponser   r   rG   assert %(py7)sr   N
getstatus_coder"   r\   r    r!   r#   r$   r%   r&   r   r   r   r(   rb   r)   r`   @py_format8s           r   test_list_jobs_requires_auth8TestSchedulerAdminEndpoints.test_list_jobs_requires_auth  s    ::./##*s*s*****#******x****x***#***s*******r   c                   [         R                  " 5         [         R                  " SSS9  UR                  SU R	                  5       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                  5       nSoU;   o(       d  [        R                  " SU
4SX45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=pUS   n	SoYU:  o(       do  [        R                  " SU
4SX45      [        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n	=pUS    Vs/ s H  oS   PM	     nnSoU;   o(       d  [        R                  " SU
4SX45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=p[         R                  " S5        [         R                   " SS9  gs  snf ) z)Test listing jobs with valid admin token.r9   api_test_ingestr   r   headers   rA   r   r   r   r   r   NrK   rX   r   datar   rF   rG   totalrH   r   )z%(py1)s >= %(py4)srS   rU   rN   rQ   r   Fr   )r	   r'   r[   r   r   r   r"   r\   r    r!   r#   r$   r%   r&   jsonr   r   )r   r   r   r(   rb   r)   r`   r   r   re   r_   r*   rf   rc   jr   s                   r   test_list_jobs_with_auth4TestSchedulerAdminEndpoints.test_list_jobs_with_auth  s     ;?PQ::.8I8I8K:L##*s*s*****#******x****x***#***s*******}}~vvG}!!!!!!!}!!!}!!!!!!!!!!$(L1LqT7L1 +G+++++ +++ ++++++G++++G+++++++./&	 2s   0Mc                   UR                  SSS0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)z6Test that listing jobs with invalid token returns 401.r   r   zBearer bad_tokenr   i  rA   r   r   r   r   r   Nr   r   s           r   test_list_jobs_with_bad_token9TestSchedulerAdminEndpoints.test_list_jobs_with_bad_token  s    ::$&89  
 ##*s*s*****#******x****x***#***s*******r   c           
     6   [         R                  " 5         UR                  SU R                  5       S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                  5       nUS   n	SoYU:H  o(       do  [
        R                  " S
U
4SX45      [
        R                  " U	5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=n	=p[         R                  " S5      nSoU
Lo3(       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=p:[         R                  " S5        [         R                   " SS9  g)z"Test adding an ingest job via API.r   ingestr9   api_test_add_ingestr7   r8   )job_typer?   r@   r=   r>   r   r      rA   r   r   r   r   r   Nr@   rR   rS   rU   rN   r   r   r   rD   rF   rG   Fr   r	   r'   postr   r   r"   r\   r    r!   r#   r$   r%   r&   r   r   r   r   r   r   r   r(   rb   r)   r`   r   r   re   r_   rf   rc   r   r*   s                  r   test_add_ingest_job_endpoint8TestSchedulerAdminEndpoints.test_add_ingest_job_endpoint   s   ;;%%'$(/  

 ##*s*s*****#******x****x***#***s*******}}H~6!66!666666~666~666!66666666  56$sss$23&r   c           	     4   [         R                  " 5         UR                  SU R                  5       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                  5       nUS   n	SoYU:H  o(       do  [
        R                  " S	U
4SX45      [
        R                  " U	5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=n	=p[         R                  " S5      nSoU
Lo3(       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=p:[         R                  " S5        [         R                   " SS9  g)z$Test adding a recompute job via API.r   	recomputerk   api_test_add_recomputeT)r   r?   r@   rm   r   r   rA   r   r   r   r   r   Nr@   rR   rS   rU   rN   r   r   r   rD   rF   rG   Fr   r   r   s                  r   test_add_recompute_job_endpoint;TestSchedulerAdminEndpoints.test_add_recompute_job_endpoint:  s   ;;%%''(2	  	
 ##*s*s*****#******x****x***#***s*******}}H~9!99!999999~999~999!99999999 89$sss$56&r   c           	     8   [         R                  " 5         UR                  SU R                  5       S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                  5       nUS   n	SoYU:H  o(       do  [
        R                  " S
U
4SX45      [
        R                  " U	5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS=n	=p[         R                  " S5      nSoU
Lo3(       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=p:[         R                  " S5        [         R                   " SS9  g)z!Test adding a scrape job via API.r   scrapert   api_test_add_scrapers   02)r   r?   r@   rw   r   r   rA   r   r   r   r   r   Nr@   rR   rS   rU   rN   r   r   r   rD   rF   rG   Fr   r   r   s                  r   test_add_scrape_job_endpoint8TestSchedulerAdminEndpoints.test_add_scrape_job_endpointR  s   ;;%%'$(/#Tl	  	
 ##*s*s*****#******x****x***#***s*******}}H~6!66!666666~666~666!66666666 56$sss$23&r   c                   UR                  SU R                  5       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=pTg)z0Test adding a job with unknown type returns 400.r   unknown_typer9   r   r?   r   i  rA   r   r   r   r   r   N)r   r   r   r"   r\   r    r!   r#   r$   r%   r&   r   s           r   test_add_job_unknown_type5TestSchedulerAdminEndpoints.test_add_job_unknown_typej  s    ;;%%'*(  
 ##*s*s*****#******x****x***#***s*******r   c                   UR                  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=pTg)z,Test that adding a job requires admin token.r   r   r9   r  )r   r   rA   r   r   r   r   r   N)
r   r   r"   r\   r    r!   r#   r$   r%   r&   r   s           r   test_add_job_requires_auth6TestSchedulerAdminEndpoints.test_add_job_requires_authv  s    ;;&[A  
 ##*s*s*****#******x****x***#***s*******r   c                   [         R                  " 5         [         R                  " SSS9  UR                  SU R	                  5       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                  5       nUS   n	SoYUL 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	=p[         R                  nSoS" U5      nSoUL o(       d  [        R                  " SU4SX45      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=p[         R                   " SS9  g)zTest removing a job via API.r9   api_test_remover   z/v1/admin/jobs/api_test_remover   r   rA   r   r   r   r   r   NremovedTr   )z%(py1)s is %(py4)srS   rU   rN   r   r	   r   r   r   Fr   )r	   r'   r[   deleter   r   r"   r\   r    r!   r#   r$   r%   r&   r   r   r   )r   r   r   r(   rb   r)   r`   r   r   re   r_   rf   rc   ra   r   r   r   r   s                     r   test_remove_job_endpoint4TestSchedulerAdminEndpoints.test_remove_job_endpoint  s     ;?PQ==,%%' ! 
 ##*s*s*****#******x****x***#***s*******}}I&$&$&&&&&&&&&&&$&&&&&&&   ;!2; !23;t;t;;;;;3;;;;;;y;;;;y;;; ;;;!2;;;3;;;t;;;;;;;&r   c                   UR                  SU R                  5       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,Test removing a nonexistent job returns 404.z/v1/admin/jobs/nonexistent_jobr   i  rA   r   r   r   r   r   N)r  r   r   r"   r\   r    r!   r#   r$   r%   r&   r   s           r   $test_remove_nonexistent_job_endpoint@TestSchedulerAdminEndpoints.test_remove_nonexistent_job_endpoint  s    ==,%%' ! 
 ##*s*s*****#******x****x***#***s*******r   c                   UR                  S5      nUR                  nSoCU:H  oU(       d  [        R                  " SU4SX445      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=pTg	)
z.Test that removing a job requires admin token.z/v1/admin/jobs/some_jobr   rA   r   r   r   r   r   N)
r  r   r"   r\   r    r!   r#   r$   r%   r&   r   s           r   test_remove_job_requires_auth9TestSchedulerAdminEndpoints.test_remove_job_requires_auth  s    ==!:;##*s*s*****#******x****x***#***s*******r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r   r   r   r   r      s    6^^D!+ "+ ^^	) 	) ^^ C+
' +'4'0'0
++'$++r   r   c                      \ rS rSrSr\" S5      \" S5      S 5       5       r\" S5      \" S5      S 5       5       r\" S5      S 5       r\" S5      S	 5       r	S
r
g)TestBackgroundJobFunctionsi  z.Tests for the background job runner functions.z*packages.core.common.scheduler.get_sessionz0packages.core.storage.ingestion.IngestionServicec                .   SSK Jn  [        5       nXBR                  R                  l        [        5       nSS0Ul        XQl        [        SSS9   U" SS	S
SS9nSSS5        WS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS=n=pUS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS=n=pUS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS=n=pUS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS=n=pUR                  5         g! , (       d  f       GN4= f)z7Test that _run_ingest calls IngestionService correctly.r   _run_ingesterrorsr   *packages.core.common.scheduler.asyncio.run)
   2   r   )return_valuer5   r6   r7   r8   )r;   r<   r=   r>   Nmeetingsr%  rA   rR   rS   rU   rN   racesr&  startersr   )packages.core.common.schedulerr"  r   r'  	__enter__statsr   r"   r\   r$   r%   r&   assert_called_once)r   mock_ingestion_servicemock_get_sessionr"  mock_sessionmock_servicer   re   r)   r_   rf   rc   s               r   test_run_ingest*TestBackgroundJobFunctions.test_run_ingest  s    	? !{?K%%//< !{&].:+ 8&
 !&$	F	
 j!'R'R'''''!'''!'''R'''''''g$"$"$$$$$$$$$$$"$$$$$$$j!(S(S(((((!(((!(((S(((((((h$1$1$$$$$$$$$$$1$$$$$$$++-
 
s   
J
Jz1packages.core.ratings.recompute.recompute_ratingsc                   SSK Jn  [        5       nXBR                  R                  l        SUl        U" SSSS9nUS   nSovU:H  o(       do  [
        R                  " S	U4S
Xg45      [
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  n
[        [
        R                  " U
5      5      eS=n=pUR                  5         UR                  5         g)z;Test that _run_recompute calls recompute_ratings correctly.r   _run_recomputei  r5   rj   T)r;   r<   rm   snapshots_createdrA   rR   rS   rU   rN   N)r+  r7  r   r'  r,  r"   r\   r$   r%   r&   r.  )r   mock_recomputer0  r7  r1  r   re   r)   r_   rf   rc   s              r   test_run_recompute-TestBackgroundJobFunctions.test_run_recompute  s     	B {?K%%//<&)#" 
 )*1c1c11111*111*111c1111111))+++-r   c                H   SSK Jn  [        S5      Ul        U" SSS9nUS   nSoTU:H  of(       do  [        R
                  " SU4S	XE45      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS=n=peg)z7Test that _run_recompute handles exceptions gracefully.r   r6  zDB errorr5   rj   r;   r<   r8  rA   rR   rS   rU   rN   N)	r+  r7  
ValueErrorside_effectr"   r\   r$   r%   r&   )	r   r9  r7  r   re   r)   r_   rf   rc   s	            r   $test_run_recompute_handles_exception?TestBackgroundJobFunctions.test_run_recompute_handles_exception  sx     	B%/
%;"" 

 )*/a/a/////*///*///a///////r   c                   SSK Jn  [        5       nX1l        [	        S[        S5      S9   U" SSS9nS	S	S	5        WS
   nSoeU:H  ow(       do  [        R                  " SU4SXV45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS	=n=pvg	! , (       d  f       N= f)z4Test that _run_ingest handles exceptions gracefully.r   r!  r$  z	API error)r?  r5   r6   r=  Nr#  rH   rA   rR   rS   rU   rN   )r+  r"  r   r'  r   r>  r"   r\   r$   r%   r&   )
r   r/  r"  r2  r   re   r)   r_   rf   rc   s
             r   !test_run_ingest_handles_exception<TestBackgroundJobFunctions.test_run_ingest_handles_exception  s     	? {.:+8";/
 !&$F	
 h$1$1$$$$$$$$$$$1$$$$$$$
 
s   C  
Cr   N)r   r   r   r   r   r   r3  r:  r@  rC  r   r   r   r   r  r    s    8
78
=>. ? 9.> 78
>?. @ 9.$ >?0 @0 =>% ?%r   r  )r   
__future__r   builtinsr    _pytest.assertion.rewrite	assertionrewriter"   unittest.mockr   r   r   fastapi.testclientr   apps.backend.api.mainr   r   r	   r+  r
   r   r   r  r   r   r   <module>rM     sH    7 "    *  ) 8 8 =D# D#X+ +NW% W%r   