
    ʹh2                        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  SSKJr  SSK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 " S S\5      r  " S S\5      r! " S S\5      r"g)z&
API tests for streams app endpoints.
    N)patch	MagicMock)TestCase)get_user_model)reverse)	APIClient)status)ChannelStreamSessionVideoConfigurationAudioConfiguration)StreamCaptureServicec                       \ rS 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 rS rS rSrg)ChannelAPITest   z%Test cases for Channel API endpoints.c                 X   [        5       U l        [        R                  R	                  SSSS9U l        U R                  R                  U R
                  S9  [        R                  " 5       U l	        [        R                  R                  SSSU R                  U R
                  S	9U l        g )
Ntestusertest@example.comtestpass123usernameemailpassworduserTest Channeltest-channelhttps://example.com/stream.m3u8nameslughls_urloutput_directory
created_by)r   clientUserobjectscreate_userr   force_authenticatetempfilemkdtemptemp_dirr
   createchannelselfs    GC:\Users\brahi\OneDrive\Desktop\Code\src\apps\streams\tests\test_api.pysetUpChannelAPITest.setUp   s    kLL,,$" - 
	
 	&&DII&6 ((*--5!]]yy . 
    c                 B    [         R                  " U R                  SS9  g )NT)ignore_errors)shutilrmtreer,   r/   s    r1   tearDownChannelAPITest.tearDown*   s    dmm48r4   c                 >   [        S5      nU R                  R                  U5      nU R                  UR                  [
        R                  5        U R                  [        UR                  S   5      S5        U R                  UR                  S   S   S   S5        g)zTest listing channels.channel-listresults   r   r    r   N)	r   r%   getassertEqualstatus_coder	   HTTP_200_OKlendatar0   urlresponses      r1   test_list_channels!ChannelAPITest.test_list_channels-   s{    n%;;??3'--v/A/ABX]]956:y1!4V<nMr4   c                 Z   [        S5      nSSSSSSS.nU R                  R                  X5      nU R                  UR                  [
        R                  5        U R                  UR                  S	   S5        U R                  UR                  S
   U R                  R                  5        g)zTest creating a new channel.r<   zNew Channelznew-channelz#https://example.com/new-stream.m3u8z/tmp/new-channel      )r    r!   r"   r#   segment_durationmax_segmentsr    r$   N
r   r%   postr@   rA   r	   HTTP_201_CREATEDrD   r   idr0   rF   rD   rG   s       r1   test_create_channel"ChannelAPITest.test_create_channel6   s    n%!!< 2 !
 ;;##C.--v/F/FGv.>|4diillCr4   c                 T   [        SSU R                  R                  0S9nSSS.nU R                  R	                  X5      nU R                  UR                  [        R                  5        U R                  UR                  S   S5        U R                  UR                  S   S5        g	)
zTest updating a channel.channel-detailpkkwargszUpdated Channel
   )r    rM   r    rM   N)
r   r.   rX   r%   r   r@   rA   r	   rB   rD   rS   s       r1   test_update_channel"ChannelAPITest.test_update_channelH   s    &dlloo/FG% "

 ;;$$S/--v/A/ABv.0AB'9:B?r4   c                 j   [        SSU R                  R                  0S9nU R                  R	                  U5      nU R                  UR                  [        R                  5        U R                  [        R                  R                  U R                  R                  S9R                  5       5        g)zTest deleting a channel.rW   rX   rY   )rX   N)r   r.   rX   r%   deleter@   rA   r	   HTTP_204_NO_CONTENTassertFalser
   r'   filterexistsrE   s      r1   test_delete_channel"ChannelAPITest.test_delete_channelV   s}    &dlloo/FG;;%%c*--v/I/IJ//4<<??/CJJLMr4   -apps.streams.tasks.start_stream_capture.delayc                 B   [        SS9Ul        [        SSU R                  R                  0S9nU R
                  R                  U5      nU R                  UR                  [        R                  5        U R                  SUR                  5        UR                  5         g)zTest starting a stream via API.test-task-idrR   channel-start-streamrX   rY   task_idN)r   return_valuer   r.   rX   r%   rP   r@   rA   r	   rB   assertInrD   assert_called_oncer0   	mock_taskrF   rG   s       r1   test_start_stream_action'ChannelAPITest.test_start_stream_action^   sy     "+n!=	,dDLLOO5LM;;##C(--v/A/ABi/$$&r4   z,apps.streams.tasks.stop_stream_capture.delayc                    [         R                  R                  U R                  S[        R                  5       S9n[        SS9Ul        [        SSU R                  R                  0S9nU R                  R                  U5      nU R                  UR                  [        R                  5        U R!                  SUR"                  5        UR%                  5         g	)
zTest stopping a stream via API.activer.   r	   
started_atrh   ri   channel-stop-streamrX   rY   rk   N)r   r'   r-   r.   timezonenowr   rl   r   rX   r%   rP   r@   rA   r	   rB   rm   rD   rn   )r0   rp   sessionrF   rG   s        r1   test_stop_stream_action&ChannelAPITest.test_stop_stream_actionj   s      ''..LL||~ / 
 "+n!=	+T4<<??4KL;;##C(--v/A/ABi/$$&r4   c                    [         R                  R                  U R                  S[        R                  5       S9  [        SSU R                  R                  0S9nU R                  R                  U5      nU R                  UR                  [        R                  5        U R                  SUR                  S   R!                  5       5        g)	z+Test starting a stream when already active.rt   ru   rj   rX   rY   zalready activeerrorN)r   r'   r-   r.   rx   ry   r   rX   r%   rP   r@   rA   r	   HTTP_400_BAD_REQUESTrm   rD   lowerrE   s      r1    test_start_stream_already_active/ChannelAPITest.test_start_stream_already_active}   s     	$$LL||~ 	% 	
 ,dDLLOO5LM;;##C(--v/J/JK&g(>(D(D(FGr4   c                 (   [        SSU R                  R                  0S9nU R                  R	                  U5      nU R                  UR                  [        R                  5        U R                  SUR                  S   R                  5       5        g)z'Test stopping a stream when not active.rw   rX   rY   z
not activer~   N)r   r.   rX   r%   rP   r@   rA   r	   r   rm   rD   r   rE   s      r1   test_stop_stream_not_active*ChannelAPITest.test_stop_stream_not_active   sl    +T4<<??4KL;;##C(--v/J/JKlHMM'$:$@$@$BCr4   c           
      :   [         R                  R                  U R                  S[        R                  5       [        SS9-
  [        R                  5       [        SS9-
  S9n[        SSU R                  R                  0S9nU R                  R                  U5      nU R                  UR                  [        R                  5        U R                  S	UR                   5        U R                  S
UR                   5        U R                  SUR                   5        g)z!Test channel statistics endpoint.	completed   hoursr>   r.   r	   rv   ended_atzchannel-statisticsrX   rY   total_sessionsactive_sessionstotal_segmentsN)r   r'   r-   r.   rx   ry   	timedeltar   rX   r%   r?   r@   rA   r	   rB   rm   rD   )r0   rz   rF   rG   s       r1   test_channel_statistics&ChannelAPITest.test_channel_statistics   s      ''..LL||~	(::\\^ia&88	 / 
 *D$,,//3JK;;??3'--v/A/AB&6'7&6r4   )r.   r%   r,   r   N)__name__
__module____qualname____firstlineno____doc__r2   r9   rH   rT   r\   rd   r   rq   r{   r   r   r   __static_attributes__ r4   r1   r   r      sl    /
$9ND$@N :;	' <	' 9:' ;'$HD7r4   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
StreamSessionAPITest   z+Test cases for StreamSession API endpoints.c                    [        5       U l        [        R                  R	                  SSSS9U l        U R                  R                  U R
                  S9  [        R                  R                  SSSS	U R
                  S
9U l	        [        R                  R                  U R                  S[        R                  5       S9U l        g )Nr   r   r   r   r   r   r   r   	/tmp/testr   rt   ru   )r   r%   r&   r'   r(   r   r)   r
   r-   r.   r   rx   ry   rz   r/   s    r1   r2   StreamSessionAPITest.setUp   s    kLL,,$" - 
	
 	&&DII&6--5(yy . 
 %,,33LL||~ 4 
r4   c                 f   [        S5      nU R                  R                  U5      nU R                  UR                  [
        R                  5        U R                  [        UR                  S   5      S5        U R                  UR                  S   S   S   U R                  R                  5        g)zTest listing stream sessions.streamsession-listr=   r>   r   r.   N)r   r%   r?   r@   rA   r	   rB   rC   rD   r.   rR   rE   s      r1   test_list_sessions'StreamSessionAPITest.test_list_sessions   s    *+;;??3'--v/A/ABX]]956:y1!4Y?Qr4   c                    [        SSU R                  R                  0S9nU R                  R	                  U5      nU R                  UR                  [        R                  5        U R                  UR                  S   [        U R                  R                  5      5        U R                  UR                  S   S5        g)z Test retrieving session details.zstreamsession-detailrX   rY   rR   r	   rt   N)r   rz   rX   r%   r?   r@   rA   r	   rB   rD   strrR   rE   s      r1   test_session_detail(StreamSessionAPITest.test_session_detail   s    ,dDLLOO5LM;;??3'--v/A/ABt,c$,,//.BCx0(;r4   c           
         [         R                  R                  U R                  S[        R                  5       [        SS9-
  [        R                  5       [        SS9-
  S9  [        S5      nU R                  R                  USS05      nU R                  UR                  [        R                  5        U R                  [        UR                  S	   5      S5        U R                  UR                  S	   S
   S   S5        g)z"Test filtering sessions by status.r   r   r   r>   r   r   r	   rt   r=   r   N)r   r'   r-   r.   rx   ry   r   r   r%   r?   r@   rA   r	   rB   rC   rD   rE   s      r1   test_filter_sessions_by_status3StreamSessionAPITest.test_filter_sessions_by_status   s     	$$LL||~	(::\\^ia&88	 	% 	
 *+;;??38(<=--v/A/ABX]]956:y1!4X>Ir4   c                 L   [         R                  R                  SSSSU R                  S9n[        R                  R                  US[
        R                  5       S9  [        S5      nU R                  R                  US	U R                  R                  05      nU R                  UR                  [        R                  5        U R                  [!        UR"                  S
   5      S5        U R                  UR"                  S
   S   S	   U R                  R                  5        g)z#Test filtering sessions by channel.zOther Channelzother-channelz%https://example.com/other-stream.m3u8z
/tmp/otherr   rt   ru   r   r.   r=   r>   r   N)r
   r'   r-   r   r   rx   ry   r   r%   r?   r.   rR   r@   rA   r	   rB   rC   rD   )r0   other_channelrF   rG   s       r1   test_filter_sessions_by_channel4StreamSessionAPITest.test_filter_sessions_by_channel   s      ..  ;)yy / 
 	$$!||~ 	% 	
 *+;;??3DLLOO(DE--v/A/ABX]]956:y1!4Y?Qr4   )r.   r%   rz   r   N)r   r   r   r   r   r2   r   r   r   r   r   r   r4   r1   r   r      s!    5
.R<J"Rr4   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	ConfigurationAPITest   z;Test cases for Video and Audio Configuration API endpoints.c                     [        5       U l        [        R                  R	                  SSSS9U l        U R                  R                  U R
                  S9  g )Nr   r   r   r   r   )r   r%   r&   r'   r(   r   r)   r/   s    r1   r2   ConfigurationAPITest.setUp   sJ    kLL,,$" - 
	
 	&&DII&6r4   c                 Z   [        S5      nSSSSSSS.nU R                  R                  X5      nU R                  UR                  [
        R                  5        U R                  UR                  S	   S5        U R                  UR                  S
   U R                  R                  5        g)z*Test creating video configuration via API.zvideoconfiguration-listzTest Video Configh264i` i   i  g      9@)r    codecbitratewidthheight	framerater    r$   NrO   rS   s       r1   test_create_video_configuration4ConfigurationAPITest.test_create_video_configuration	  s    /0'
 ;;##C.--v/F/FGv.0CD|4diillCr4   c                 X   [        S5      nSSSSSS.nU R                  R                  X5      nU R                  UR                  [
        R                  5        U R                  UR                  S   S5        U R                  UR                  S	   U R                  R                  5        g
)z*Test creating audio configuration via API.zaudioconfiguration-listzTest Audio Configaaci w iD  r   )r    r   r   sample_ratechannelsr    r$   NrO   rS   s       r1   test_create_audio_configuration4ConfigurationAPITest.test_create_audio_configuration  s    /0' 
 ;;##C.--v/F/FGv.0CD|4diillCr4   c                     U R                   R                  SS9  [        S5      nU R                   R                  U5      nU R	                  UR
                  [        R                  5        g)z'Test API access without authentication.Nr   r<   )r%   r)   r   r?   r@   rA   r	   HTTP_401_UNAUTHORIZEDrE   s      r1   test_unauthorized_access-ConfigurationAPITest.test_unauthorized_access,  sO    &&D&1n%;;??3'--v/K/KLr4   )r%   r   N)
r   r   r   r   r   r2   r   r   r   r   r   r4   r1   r   r      s    E7D$D"Mr4   r   c                   @    \ rS rSrSrS r\" S5      S 5       rS rSr	g)	ThrottlingTesti6  z!Test cases for API rate limiting.c                    [        5       U l        [        R                  R	                  SSSS9U l        U R                  R                  U R
                  S9  [        R                  R                  SSSS	U R
                  S
9U l	        g )Nr   r   r   r   r   r   r   r   r   r   )
r   r%   r&   r'   r(   r   r)   r
   r-   r.   r/   s    r1   r2   ThrottlingTest.setUp9  sx    kLL,,$" - 
	
 	&&DII&6--5(yy . 
r4   rf   c                     [        SS9Ul        [        SSU R                  R                  0S9nU R
                  R                  U5      nU R                  UR                  [        R                  5        g)z-Test rate limiting on stream control actions.rh   ri   rj   rX   rY   N)r   rl   r   r.   rX   r%   rP   r@   rA   r	   rB   ro   s       r1   test_stream_control_throttling-ThrottlingTest.test_stream_control_throttlingJ  s]     "+n!=	,dDLLOO5LM ;;##C(--v/A/ABr4   c                     [        S5      nU R                  R                  U5      nU R                  UR                  [
        R                  5        g)z)Test that throttling headers are present.r<   N)r   r%   r?   r@   rA   r	   rB   rE   s      r1   test_api_throttling_headers*ThrottlingTest.test_api_throttling_headersY  s<    n%;;??3' 	--v/A/ABr4   )r.   r%   r   N)
r   r   r   r   r   r2   r   r   r   r   r   r4   r1   r   r   6  s,    +
" :;C <CCr4   r   )#r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arjsonr*   r7   unittest.mockr   r   django.testr   django.contrib.authr   django.urlsr   rest_framework.testr   rest_frameworkr	   apps.streams.modelsr
   r   r   r   apps.streams.servicesr   r&   r   r   r   r   r   r4   r1   <module>r      sy        *   .  ) ! ^ ^ 6O7X O7dSR8 SRl6M8 6Mr)CX )Cr4   