
    ,Qj                         d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
d Zd Zd Z G d d      Z G d d	      Zd
 Zd Z G d d      Zd Zd Zd Zy)u   Routine scheduler: cron parsing, reload → jobs, and fire_routine dispatch to
a connected session (or the no-session log path). APScheduler's real CronTrigger
is used (offline), but the scheduler backend is a FakeSched so no loop/timers.    Nc                     t        j                  ddd      } ddd d}| |k(  }|st        j                  d|fd| |f      d	t	        j
                         v st        j                  |       rt        j                  |       nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}}y )Ntime07:00typeat   r   )hourminuteday_of_week==z%(py0)s == %(py3)scpy0py3assert %(py5)spy5
	scheduler
parse_cron
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)r   @py_assert2@py_assert1@py_format4@py_format6s        J/Users/ahmed/devFolder/Ultron/claude-voice/gateway/tests/test_scheduler.pytest_parse_cron_dailyr&      sz    fG<=Aa==1=====1=======1===1===========    c                     t        j                  ddddgdd      } g }| d   }d}||k(  }|}|r| d	   }d
}||k(  }|}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
|j                  |
       |r_t        j                  dfdf      t        j                  |      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}x}x}}| d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y )Nbothz18:30Mon	wednesdayoffice)r   r   daysplacer
      r      r   )z%(py3)s == %(py6)s)r   py6z%(py8)spy8)z%(py11)s == %(py14)s)py11py14z%(py16)spy16r   zassert %(py19)spy19r   zmon,wedz%(py1)s == %(py4)spy1py4assert %(py6)sr1   )	r   r   r   r   r   append_format_boolopr   r    )r   r"   r!   @py_assert5@py_assert4@py_assert0@py_assert10@py_assert13@py_assert12@py_format7@py_format9@py_format15@py_format17@py_format18@py_format20@py_assert3@py_format5s                    r%   test_parse_cron_specific_daysrL      s$   fG',k&:XO 	PA01V9009?0q{0b0{b0000900090000000000{b000{000b00000000000000](y(y((((y((((((y(((((((r'   c                  ^   t         j                  } ddd} | |      }d }||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x} x}x}x}}t         j                  } d
dd} | |      }d }||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x} x}x}x}}t         j                  } d
dd} | |      }d }||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x} x}x}x}}t         j                  } i } | |      }d }||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x} x}x}x}}y )Nr.   gymr   r.   )is)zP%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.parse_cron
}(%(py4)s)
} is %(py9)sr   )r   py2r:   r1   py9zassert %(py11)sr3   r   noper   z25:00r   )r"   rJ   r>   @py_assert8@py_assert7@py_format10@py_format12s          r%   /test_parse_cron_rejects_place_only_and_bad_timerX      s~   J5 AJ ABJdJBdJJJJBdJJJJJJ9JJJ9JJJJJJ AJJJBJJJdJJJJJJJGv >G >?G4G?4GGGG?4GGGGGG9GGG9GGGGGG >GGG?GGG4GGGGGGGHw ?H ?@HDH@DHHHH@DHHHHHH9HHH9HHHHHH ?HHH@HHHDHHHHHHH++#+t+#t++++#t++++++9+++9+++++++++#+++t++++++++r'   c                       e Zd Zd Zd Zy)FakeJobc                      || _         || _        y N)id_store)selfstorejids      r%   __init__zFakeJob.__init__    s    r'   c                 f    | j                   D cg c]	  }|| us| c}| j                   d d  y c c}w r\   )r^   )r_   js     r%   removezFakeJob.remove$   s+    %)[[B[ATM![BABs   	..N)__name__
__module____qualname__rb   re    r'   r%   rZ   rZ      s    Cr'   rZ   c                   .    e Zd Zd Zd Zd ZddZddZy)		FakeSchedc                      g | _         d| _        y NF)jobsrunningr_   s    r%   rb   zFakeSched.__init__)   s    	r'   c                     d| _         y )NTro   rp   s    r%   startzFakeSched.start-   s	    r'   c                 ,    t        | j                        S r\   )listrn   rp   s    r%   get_jobszFakeSched.get_jobs0   s    DIIr'   Nc                 h    t        | j                  |      }| j                  j                  |       |S r\   )rZ   rn   r<   )r_   functriggerargsr]   kwjobs          r%   add_jobzFakeSched.add_job3   s)    dii$		
r'   c                     d| _         y rm   rr   )r_   waits     r%   shutdownzFakeSched.shutdown8   s	    r'   )NNN)F)rf   rg   rh   rb   rs   rv   r}   r   ri   r'   r%   rk   rk   (   s    
r'   rk   c                    K   ddddddddd	d
dddddddddddddddgfd} t               }t        j                  d | |      }|j                          d {   }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}|j                  }t        |      }d}	||	k(  }
|
s
t	        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                  |      t	        j                  |	      d!z  }d"d#|iz  }t        t	        j                  |            d x}x}x}
}	|j                          d {   }d}||k(  }|slt	        j
                  d|fd$||f      t	        j                  |      t	        j                  |      d%z  }d&d'|iz  }t        t	        j                  |            d x}x}}|j                  }t        |      }d}	||	k(  }
|
s
t	        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                  |      t	        j                  |	      d!z  }d"d#|iz  }t        t	        j                  |            d x}x}x}
}	y 7 7 w)(Nbriefr   r   r   speak_brieftasksr   r   namery   actioneveningr)   z20:00home)r   r   r.   say_texthir   textatworkr.   r,   rO   c                     K    S wr\   ri   )routiness   r%   list_routinesz?test_reload_schedules_only_time_routines.<locals>.list_routinesG   s     s   dispatchr   sched   r   r   nr   r   r   )zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.jobs
})
} == %(py8)slenfake)r   r9   r   r   r2   zassert %(py10)spy10r7   r8   r;   r1   )rk   r   RoutineSchedulerrs   r   r   r   r   r   r   r   r    rn   r   reload)r   r   r   r   r!   r"   r#   r$   r?   rU   @py_assert6rE   @py_format11r@   rJ   rK   rD   r   s                    @r%   (test_reload_schedules_only_time_routinesr   <   sp    fG%D)G<	>g17(9&5	7 w&J)G<	>H ;D&&5B$PEkkmAM16MMM1MMMMMM1MMM1MMMMMMMMMMyy3y>Q>Q>Q33tty>Q$1$1$$$$1$$$$$$1$$$$$$$yy3y>Q>Q>Q33tty>Q 	  s&   AP"P#G0PP
F4P
Pc                    K   d } t               }t        j                  d | |      }|j                          d {   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|j                  }g }	||	k(  }|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 7 Iw)Nc                      K   t        d      w)Nzmemory down)RuntimeErrorri   r'   r%   boomz0test_reload_survives_storage_error.<locals>.boomV   s     =))s   r   r   r   r7   r8   r;   r1   )z,%(py2)s
{%(py2)s = %(py0)s.jobs
} == %(py5)sr   )r   rQ   r   zassert %(py7)spy7)rk   r   r   rs   r   r   r   r   r    rn   r   r   r   )r   r   r   r@   rJ   r!   rK   rD   r"   r?   r$   @py_format8s               r%   "test_reload_survives_storage_errorr   U   s     *;D&&D-13E#!#!####!######!#######999?9449 s   9FFE	Fc                       e Zd Zd Zd Zy)FakeSessionc                      || _         g | _        y r\   )user	delivered)r_   r   s     r%   rb   zFakeSession.__init__a   s    	r'   c                 B   K   | j                   j                  |       y wr\   )r   r<   )r_   injecteds     r%   _deliver_proactivezFakeSession._deliver_proactivee   s     h's   N)rf   rg   rh   rb   r   ri   r'   r%   r   r   `   s    (r'   r   c                   K   d }| j                  t        j                  d|       t        j                         }t	        |      }t        j
                  |       	 t        j                  ddddddd	d
       d {    t        j                  |       |j                  }|st        j                  d      dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                   |            d }d}|j                  d   }||v }|slt        j"                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            d x}x}}d}|j                  d   }||v }|slt        j"                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            d x}x}}y 7 # t        j                  |       w xY ww)Nc                    K   yw)Nz- Call the supplierri   )_argss    r%   
fake_taskszAtest_fire_routine_speaks_to_connected_session.<locals>.fake_tasksj   s	     $s   _tasks_listzmorning briefr   r   r   r   r   r   r   z*a connected session must receive the briefz/
>assert %(py2)s
{%(py2)s = %(py0)s.delivered
}sess)r   rQ   zCall the supplierr   )in)z%(py1)s in %(py4)sr8   r;   r1   )setattrmaintools_groupr   register_sessionfire_routineunregister_sessionr   r   _format_assertmsgr   r   r   r   r   r    r   )monkeypatchr   r   r   r"   @py_format3r@   rJ   r!   rK   rD   s              r%   -test_fire_routine_speaks_to_connected_sessionr   i   s    %

M:><<>DtD$&# &g6,w?!A B 	B 	B
 	%>>G>GGGGGGGGG4GGG4GGG>GGGGGG3$.."33"33333"3333333"33333333/dnnQ//?/////?////?///////////	B
 	%s1   AI'"I >I
?I GI'
I I$$I'c                 ^   K   t        j                  dddddddd       d {    y 7 w)	Norphanr   r   r   r   hellor   r   )r   r   )caplogs    r%   &test_fire_routine_no_session_just_logsr   }   s5     


fG%D%w79 : : :s   #-+-c                 d  	
K   g 	d }t               }t        j                  d ||      }|j                          d {    |t        _        |j                  
	
fd}||_        t	        j                          d {    dg}	|k(  }|st        j                  d|fd	|f      dt        j                         v st        j                  	      rt        j                  	      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}}y 7 7 w)Nc                     K   g S wr\   ri   ri   r'   r%   r   z3test_reschedule_hook_reloads.<locals>.list_routines   s     	s   r   c                  P   K    j                  d                d {   S 7 w)N   )r<   )calledorigs   r%   spyz)test_reschedule_hook_reloads.<locals>.spy   s     aV||s   &$&r   r   r   r   r   r   r   )rk   r   r   rs   r   _SCHEDr   _rescheduler   r   r   r   r   r   r   r    )r   r   r   r   r   r!   r"   r#   r$   r   r   s            @@r%   test_reschedule_hook_reloadsr      s     F;D&&5B$PE
++-DK<<D EL



S6S=6S66S  s#   ;D0D, ?D0?D. B-D0.D0)__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   phone_storer   r   r&   rL   rX   rZ   rk   r   r   r   r   r   r   ri   r'   r%   <module>r      se   R     >
),C C (2( (0(:r'   