
    δhB"                         S r SSKrSSKJs  Jr  SSKrSSKrSSK	r	SSK
JrJrJr  SSKJr  SSKJr  SSKJr  SSKJrJrJrJr  SSKJr  \" 5       r " S	 S
\5      rg)z&
Unit tests for streams app services.
    N)patch	MagicMockcall)TestCase)get_user_model)timezone)ChannelStreamSessionVideoConfigurationAudioConfiguration)StreamCaptureServicec                   t   \ rS rSrSrS rS rS rS rS r	\
" S5      S	 5       r\
" S5      S
 5       r\
" S5      \
" S5      S 5       5       rS r\
" S5      S 5       r\
" S5      \
" S5      S 5       5       r\
" S5      \
" S5      S 5       5       r\
" S5      \
" S5      \
" S5      S 5       5       5       rS rSrg)StreamCaptureServiceTest   z$Test cases for StreamCaptureService.c           
         [         R                  R                  SSSS9U l        [        R
                  " 5       U l        [        R                  R                  SSSU R                  U R                  S9U l	        [        R                  R                  S	S
SSSSU R                  S9U l        [        R                  R                  SSSSSU R                  S9U l        [        5       U l        g )Ntestuserztest@example.comtestpass123)usernameemailpasswordzTest Channelztest-channelzhttps://example.com/stream.m3u8)nameslughls_urloutput_directory
created_byz
Test Videoh264i@B i   i  g      9@)r   codecbitratewidthheight	framerater   z
Test Audioaaci  iD     )r   r   r   sample_ratechannelsr   )Userobjectscreate_userusertempfilemkdtemptemp_dirr	   createchannelr   video_configr   audio_configr   serviceselfs    LC:\Users\brahi\OneDrive\Desktop\Code\src\apps\streams\tests\test_services.pysetUpStreamCaptureServiceTest.setUp   s    LL,,$" - 
	
 !((*--5!]]yy . 
 /66==yy > 
 /66==yy > 
 ,-    c                 B    [         R                  " U R                  SS9  g )NT)ignore_errors)shutilrmtreer,   r2   s    r4   tearDown!StreamCaptureServiceTest.tearDown;   s    dmm48r7   c                    U R                   R                  U R                  5      nU R                  SUS   5        U R                  SU5        U R                  U R                  R                  U5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  [        U R                  R                  5      U5        g)z#Test basic FFmpeg command building.ffmpegr   z-iz-fhlsz	-hls_timeN)r1   build_ffmpeg_commandr.   assertInr   strsegment_durationr3   cmds     r4   test_build_ffmpeg_command_basic8StreamCaptureServiceTest.test_build_ffmpeg_command_basic>   s    ll//=hA'dC dll**C0dC eS!k3'c$,,778#>r7   c                 *   U R                   R                  U R                  U R                  U R                  5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  S	U5        U R                  S
U5        U R                  SU5        U R                  SU5        g)z6Test FFmpeg command building with video/audio configs.z-c:vlibx264z-b:v1000000z-c:ar"   z-b:a128000z-s1280x720z-r25N)r1   rA   r.   r/   r0   rB   rE   s     r4   &test_build_ffmpeg_command_with_configs?StreamCaptureServiceTest.test_build_ffmpeg_command_with_configsJ   s    ll//LL
 	fc"i%fc"i% 	fc"eS!fc"h$ 	dC j#& 	dC dC r7   c                    [         R                  R                  U R                  S5      nU R	                  [         R                  R                  U5      5        U R                  R                  U5        U R                  [         R                  R                  U5      5        U R                  [         R                  R                  U5      5        g)zTest output directory creation.new_directoryN)
ospathjoinr,   assertFalseexistsr1   ensure_output_directory
assertTrueisdir)r3   test_dirs     r4   test_ensure_output_directory5StreamCaptureServiceTest.test_ensure_output_directoryf   sy    77<<?12,,X6x01h/0r7   zsubprocess.Popenc                    [        5       nSUl        SUR                  l        X!l        U R                  R                  U R                  5      nU R                  U5        U R                  UR                  U R                  5        U R                  UR                  S5        U R                  UR                  S5        UR                  5         g)z%Test successful stream capture start.90  Nactive)r   pidpollreturn_valuer1   start_capturer.   assertIsNotNoneassertEqualstatus
process_idassert_called_oncer3   
mock_popenmock_processsessions       r4   test_start_capture_success3StreamCaptureServiceTest.test_start_capture_successp   s     !{ )-&".,,,,T\\:W%$,,72++U3 	%%'r7   c                     [        S5      Ul        U R                  R                  U R                  5      nU R                  U5        g)z"Test stream capture start failure.zFFmpeg not foundN)	Exceptionside_effectr1   rd   r.   assertIsNone)r3   rk   rm   s      r4   test_start_capture_failure3StreamCaptureServiceTest.test_start_capture_failure   s8     "++=!>
,,,,T\\:'"r7   zos.killc                    [         R                  R                  U R                  SS[        R
                  " 5       S9nU R                  R                  U5      nU R                  U5        UR                  5         U R                  UR                  S5        U R                  UR                  5        UR                  SS5        g)z$Test successful stream capture stop.r`   r_   )r.   rg   rh   
started_at	completed   N)r
   r'   r-   r.   r   nowr1   stop_capturerY   refresh_from_dbrf   rg   re   ended_atassert_called_once_with)r3   	mock_killrk   rm   results        r4   test_stop_capture_success2StreamCaptureServiceTest.test_stop_capture_success   s    
  ''..LL||~	 / 
 **73!5W--. 	))%4r7   c                 ,   [         R                  R                  U R                  S[        R
                  " 5       S9nU R                  R                  U5      nU R                  U5        UR                  5         U R                  UR                  S5        g)z)Test stopping capture with no process ID.r`   )r.   rg   rw   rx   N)r
   r'   r-   r.   r   rz   r1   r{   rY   r|   rf   rg   )r3   rm   r   s      r4   test_stop_capture_no_process5StreamCaptureServiceTest.test_stop_capture_no_process   sr    ''..LL||~ / 
 **73!5r7   c                     [        5       nSUl        SUR                  l        X!l        U R                  R                  U R                  5      nU R                  U5        U R                  UR                  S5        g)z-Test capture with retry logic - success case.r_   N   )
r   ra   rb   rc   r1   capture_with_retryr.   re   rf   
call_countrj   s       r4   test_capture_with_retry_success8StreamCaptureServiceTest.test_capture_with_retry_success   sc     !{ )-&".,,11$,,?W%..2r7   z
time.sleepc                 2   [        5       nSUl        SUR                  l        [	        S5      U/Ul        U R                  R                  U R                  5      nU R                  U5        U R                  UR                  S5        UR                  S5        g)z5Test capture with retry logic - failure then success.r_   NzNetwork errorr#   
   )r   ra   rb   rc   rq   rr   r1   r   r.   re   rf   r   r~   )r3   
mock_sleeprk   rl   rm   s        r4   ,test_capture_with_retry_failure_then_successEStreamCaptureServiceTest.test_capture_with_retry_failure_then_success   s}    
 !{ )-&"+O"<l!K
,,11$,,?W%..2**2.r7   c                 V   [        S5      Ul        U R                  R                  U R                  5      nU R                  U5        U R                  UR                  U R                  R                  5        U R                  UR                  U R                  R                  S-
  5        g)z2Test capture with retry logic - all attempts fail.zPersistent errorr   N)	rq   rr   r1   r   r.   rs   rf   r   retry_attempts)r3   r   rk   rm   s       r4   $test_capture_with_retry_all_failures=StreamCaptureServiceTest.test_capture_with_retry_all_failures   s}     "++=!>
,,11$,,?'"..0K0KL..0K0Ka0OPr7   z
os.listdirzos.path.getmtimez	os.removec                 2   / SQUl         [        R                  " 5       R                  5       S-
  nXBl         U R                  R                  5       nU R                  R                  USS9nU R                  US5        U R                  UR                  S5        g)zTest cleanup of old segments.)zsegment_001.tszsegment_002.tszsegment_003.tsi  g      ?)max_age_hours   N)
rc   r   rz   	timestampr.   get_output_pathr1   cleanup_old_segmentsrf   r   )r3   mock_removemock_getmtimemock_listdirold_timeoutput_pathcleaned_counts          r4   test_cleanup_old_segments2StreamCaptureServiceTest.test_cleanup_old_segments   s     %[! <<>++-4%-"ll22499+UX9Y*//3r7   c                    U R                   R                  U R                  U R                  U R                  5      nU R                  U[        5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  US   U R                  R                  5        U R                  US   S5        U R                  US   S5        g)z*Test capture command arguments generation.	input_urlr   video_codecaudio_codecrJ   r"   N)
r1   get_capture_command_argsr.   r/   r0   assertIsInstancedictrB   rf   r   )r3   argss     r4   test_get_capture_command_args6StreamCaptureServiceTest.test_get_capture_command_args   s    ||44LL
 	dD)k4(mT*mT*mT*k*DLL,@,@Am,i8m,e4r7   )r0   r.   r1   r,   r)   r/   N)__name__
__module____qualname____firstlineno____doc__r5   r<   rG   rO   r\   r   rn   rt   r   r   r   r   r   r   r   __static_attributes__ r7   r4   r   r      s"   .#.J9
?!81 ( ($ # # 
95  5(6 
3 
3 
</  / 
<Q  Q <

;4   45r7   r   )r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr*   r:   rS   unittest.mockr   r   r   django.testr   django.contrib.authr   django.utilsr   apps.streams.modelsr	   r
   r   r   apps.streams.servicesr   r&   r   r   r7   r4   <module>r      sG       	 0 0   . ! ^ ^ 6i5x i5r7   