
    δhPM                         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  SSKJrJr  SS	KJrJrJr  SS
KJrJr  \" 5       r  " S S\5      r! " S S\5      r"g)z&
Unit tests for jingles app services.
    N)patch	MagicMock	mock_open)TestCase)get_user_model)timezone)	timedelta)ChannelStreamSession)JingleTemplateJingleDetectionAdBreak)JingleDetectorAdBreakAnalyzerc                      \ rS rSrSrS rS r\" S5      \" S5      \" S5      S 5       5       5       r\" S5      S	 5       r	\" S
5      S 5       r
\" S
5      S 5       r\R                  " \S5      \R                  " \S5      S 5       5       r\R                  " \S5      \R                  " \S5      S 5       5       r\R                  " \S5      S 5       r\R                  " \S5      S 5       rS rSrg)JingleDetectorTest   z&Test cases for JingleDetector service.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                  U R                  S	[        R                  " 5       S
9U l        [        R                  R                  SSSSU R                  S9U l        [!        5       U l        g )Ntestusertest@example.comtestpass123usernameemailpasswordTest Channeltest-channelhttps://example.com/stream.m3u8nameslughls_urloutput_directory
created_byactivechannelstatus
started_atTest Jingletest-jingle/tmp/test_jingle.jpg皙?)r    r!   
image_pathsimilarity_thresholdr$   )Userobjectscreate_userusertempfilemkdtemptemp_dirr
   creater'   r   r   nowsessionr   templater   detectorselfs    LC:\Users\brahi\OneDrive\Desktop\Code\src\apps\jingles\tests\test_services.pysetUpJingleDetectorTest.setUp   s    LL,,$" - 
	
 !((*--5!]]yy . 
 %,,33LL||~ 4 
 '..55-!$yy 6 
 '(    c                 B    [         R                  " U R                  SS9  g )NT)ignore_errors)shutilrmtreer6   r<   s    r>   tearDownJingleDetectorTest.tearDown8   s    dmm48rA   z
cv2.imreadzcv2.matchTemplatezcv2.minMaxLocc                 
   [        5       Ul        [        5       Ul        SUl        U R                  R                  SS5      nU R	                  US5        UR                  5         UR                  5         UR                  5         g)z!Test image comparison with match.)333333?gffffff?)r   r   )d   rJ   z/tmp/template.jpg/tmp/frame.jpgrI   N)r   return_valuer;   compare_imagesassertEqualassert_calledassert_called_once)r=   mock_minmaxlocmock_matchtemplatemock_imread
similaritys        r>   test_compare_images_match,JingleDetectorTest.test_compare_images_match;   sm     $-; *3+'&F#]]112EGWX
T*!!#--/))+rA   c                 n    SUl         U R                  R                  SS5      nU R                  US5        g)z(Test image comparison with missing file.Nz/tmp/nonexistent.jpgrK   g      ?)rL   r;   rM   rN   )r=   rS   rT   s      r>   "test_compare_images_file_not_found5JingleDetectorTest.test_compare_images_file_not_foundL   s4     $( ]]112HJZ[
S)rA   zsubprocess.runc                    [        SS9Ul        Sn[        S5         [        SSS/S9   [        S	S
 S9   U R                  R	                  SU5      nU R                  [        U5      S5        U R                  SUS   5        U R                  SUS   5        SSS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g= f)z Test I-frame extraction success.r   
returncode/tmp/iframeszos.makedirsz
os.listdirziframe_001.jpgziframe_002.jpgrL   zos.path.joinc                  $    SR                  U 5      $ )N/)join)argss    r>   <lambda>AJingleDetectorTest.test_extract_iframes_success.<locals>.<lambda>^   s    SXXd^rA   )side_effect/tmp/segment.ts      N)r   rL   r   r;   extract_iframesrN   lenassertIn)r=   mock_subprocess
iframe_diriframess       r>   test_extract_iframes_success/JingleDetectorTest.test_extract_iframes_successU   s     (1A'>$ $
=!</?AQ.RS>/KLmm334EzRGS\1-MM*GAJ7MM*GAJ7 M T "!LL TS "!s:   CCA"B0CC0
B>:C
C	C
C c                 |    [        SS9Ul        U R                  R                  SS5      nU R	                  U/ 5        g)z Test I-frame extraction failure.rh   r[   rf   r]   N)r   rL   r;   ri   rN   )r=   rl   rn   s      r>   test_extract_iframes_failure/JingleDetectorTest.test_extract_iframes_failuref   s8     (1A'>$--//0A>R"%rA   ri   rM   c                 R   SS/Ul         SS/Ul        U R                  R                  5         U R                  R	                  SU R
                  5      nU R                  U5        Uu  pEpgU R                  US5        U R                  US5        U R                  XpR                  5        g)z*Test jingle detection when match is found./tmp/iframe_001.jpgz/tmp/iframe_002.jpgffffff??rf   r*   N)	rL   re   r;   load_jingle_templatesdetect_jingler9   assertIsNotNonerN   r:   )r=   mock_comparemock_extractresultjingle_nameiframe_pathrT   r:   s           r>   test_detect_jingle_found+JingleDetectorTest.test_detect_jingle_foundo   s    
 &;<Q$R! %(:  	++-,,->MV$9?6*m4S)==1rA   c                     S/Ul         SUl         U R                  R                  5         U R                  R                  SU R                  5      nU R                  U5        g)z-Test jingle detection when no match is found.ru   rw   rf   N)rL   r;   rx   ry   r9   assertIsNone)r=   r{   r|   r}   s       r>   test_detect_jingle_not_found/JingleDetectorTest.test_detect_jingle_not_found   sT    
 &;$;! %(! 	++-,,->M&!rA   ry   c                 X   SSSU R                   4Ul        U R                  R                  S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        g)z0Test detection processing with successful match.r*   ru   g      ?rf   z
segment.tsN)
r:   rL   r;   process_detectionr9   rz   rN   jingle_templateconfidence_scoresegment_filenamer=   mock_detect	detections      r>   test_process_detection_success1JingleDetectorTest.test_process_detection_success   s    
 !MM	$
  MM334Et||T	Y'22DMMB33T:33\BrA   c                     SUl         U R                  R                  SU R                  5      nU R	                  U5        g)z(Test detection processing with no match.Nrf   )rL   r;   r   r9   r   r   s      r>   test_process_detection_no_match2JingleDetectorTest.test_process_detection_no_match   s5     $( MM334Et||T	)$rA   c                    [         R                  R                  SSSSU R                  S9  [         R                  R                  SSSS	U R                  S9  U R                  R                  5         U R                  [        U R                  R                  5      S
5        U R                  R                   Vs/ s H  oS   PM	     nnU R                  SU5        U R                  SU5        U R                  SU5        gs  snf )zTest loading jingle templates.zAnother Jinglezanother-jinglez/tmp/another_jingle.jpgT)r    r!   r.   	is_activer$   zInactive Jinglezinactive-jinglez/tmp/inactive_jingle.jpgFrg   r   r*   N)r   r1   r7   r3   r;   rx   rN   rj   jingle_templatesrk   assertNotIn)r=   r:   template_namess      r>   test_load_jingle_templates-JingleDetectorTest.test_load_jingle_templates   s     	%%!!0yy 	& 	
 	%%""1yy 	& 	
 	++- 	T]];;<a@ 7;mm6T6TU6T(1+6TUm^4&7*N; Vs   8C?)r'   r;   r9   r6   r:   r3   N)__name__
__module____qualname____firstlineno____doc__r?   rF   r   rU   rX   ro   rr   objectr   r   r   r   r   r   __static_attributes__ rA   r>   r   r      s>   0)@9 <

?,    , <* * 8 8  & & \\."34
\\."232 4 52& \\."34
\\."23" 4 5" \\./2C 3C" \\./2% 3%<rA   r   c                   j    \ rS 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 rS rSrg)AdBreakAnalyzerTest   z'Test cases for AdBreakAnalyzer service.c                    [         R                  R                  SSSS9U l        [        R                  R                  SSSSU R                  S	9U l        [        R                  R                  U R                  S
[        R                  " 5       S9U l
        [        R                  R                  SSSU R                  S9U l        [        5       U l        g )Nr   r   r   r   r   r   r   z	/tmp/testr   r%   r&   r*   r+   r,   )r    r!   r.   r$   )r0   r1   r2   r3   r
   r7   r'   r   r   r8   r9   r   r:   r   analyzerr<   s    r>   r?   AdBreakAnalyzerTest.setUp   s    LL,,$" - 
	 --5(yy . 
 %,,33LL||~ 4 
 '..55-yy	 6 
 ()rA   c           	         [         R                  R                  U R                  U R                  S[
        R                  " 5       SSS9nU R                  R                  U5      nU R                  U5        U R                  UR                  U R                  5        U R                  UR                  U5        U R                  UR                  S5        U R                  UR                  5        g)zTest starting an ad break.segment_001.ts333333?/tmp/frame_001.jpgr9   r   r   detection_timer   
frame_pathr%   N)r   r1   r7   r9   r:   r   r8   r   start_ad_breakrz   rN   start_detectionr(   
start_time)r=   r   ad_breaks      r>   test_start_ad_break'AdBreakAnalyzerTest.test_start_ad_break   s    #++22LL MM-#<<>!+ 3 
	 ==//	:X&))4<<8119=(3X001rA   c           
         [         R                  R                  U R                  U R                  S[
        R                  " 5       SSS9n[        R                  R                  U R                  U[
        R                  " 5       SS9n[         R                  R                  U R                  U R                  S[
        R                  " 5       [        SS	9-   S
SS9nU R                  R                  X#5      nU R                  U5        UR                  5         U R                  UR                  S5        U R                  UR                  U5        U R!                  UR"                  5        g)zTest ending an ad break.r   r   r   r   r%   r9   r   r   r(   segment_010.ts   minutesrw   /tmp/frame_010.jpg	completedN)r   r1   r7   r9   r:   r   r8   r   r	   r   end_ad_break
assertTruerefresh_from_dbrN   r(   end_detectionrz   end_timer=   r   r   r   r}   s        r>   test_end_ad_break%AdBreakAnalyzerTest.test_end_ad_break  s#    *1188LL MM-#<<>!+ 9 
 ??))LL+||~	 * 
 (//66LL MM-#<<>Ia,@@!+ 7 
 ++HD  "+6//?X../rA   c           	      \   [         R                  R                  U R                  U R                  S[
        R                  " 5       SSS9nU R                  R                  U5      nU R                  US   S5        U R                  US   5        U R                  US   R                  U5        g)	z0Test detection analysis that starts an ad break.r   r   r   r   actionr   r   N)r   r1   r7   r9   r:   r   r8   r   analyze_detectionrN   rz   r   )r=   r   r}   s      r>   %test_analyze_detection_start_ad_break9AdBreakAnalyzerTest.test_analyze_detection_start_ad_break)  s    #++22LL MM-#<<>!+ 3 
	 00;)+;<VJ/0
+;;YGrA   c           
      T   [         R                  R                  U R                  U R                  S[
        R                  " 5       [        SS9-
  SSS9n[        R                  R                  U R                  U[
        R                  " 5       [        SS9-
  SS9n[         R                  R                  U R                  U R                  S	[
        R                  " 5       S
SS9nU R                  R                  U5      nU R                  US   S5        U R                  US   U5        g)z.Test detection analysis that ends an ad break.r   r   r   r   r   r   r%   r   r   rw   r   r   r   r   N)r   r1   r7   r9   r:   r   r8   r	   r   r   r   rN   r   s        r>   #test_analyze_detection_end_ad_break7AdBreakAnalyzerTest.test_analyze_detection_end_ad_break:  s    *1188LL MM-#<<>Ia,@@!+ 9 
 ??))LL+||~	!(<<	 * 
 (//66LL MM-#<<>!+ 7 
 00?)>:
+X6rA   c           	         [         R                  " 5       [        SS9-
  n[        R                  R                  U R                  U R                  SUSSS9n[        R                  R                  U R                  UUSS9n[         R                  " 5       [        S	S9-
  n[        R                  R                  U R                  U R                  S
USSS9n[        R                  R                  U R                  UUSS9nU R                  R                  U R                  SS9nU R                  US5        UR                  5         U R                  UR                  S5        UR                  5         U R                  UR                  S5        g)z Test cleanup of stale ad breaks.
   r   r   r   r   r   r%   r   rg   zsegment_020.tsz/tmp/frame_020.jpg   )timeout_minutesrh   	timed_outN)r   r8   r	   r   r1   r7   r9   r:   r   r   cleanup_stale_ad_breaksrN   r   r(   )r=   old_timer   stale_ad_breakrecent_timerecent_detectionrecent_ad_breakcleaned_counts           r>   test_cleanup_stale_ad_breaks0AdBreakAnalyzerTest.test_cleanup_stale_ad_breaks\  si    <<>Ib$99)1188LL MM-#!+ 9 
 !//LL+	 0 
 llny';;*2299LL MM-&!+ : 
 "//00LL,"	 1 
 ==dll\]=^* 	&&(..< 	'')//:rA   c           	         U R                   R                  U R                  5      nU R                  U5        [        R
                  R                  U R                  U R                  S[        R                  " 5       SSS9n[        R
                  R                  U R                  U[        R                  " 5       SS9nU R                   R                  U R                  5      nU R                  X5        g)z,Test retrieving active ad break for session.r   r   r   r   r%   r   N)r   get_active_ad_breakr9   r   r   r1   r7   r:   r   r8   r   rN   )r=   active_breakr   r   s       r>   test_get_active_ad_break,AdBreakAnalyzerTest.test_get_active_ad_break  s     }}88F,' *1188LL MM-#<<>!+ 9 
 ??))LL+||~	 * 
 }}88F0rA   zshutil.rmtreec           
         [         R                  R                  U R                  U R                  S[
        R                  " 5       [        SS9-
  SSS9n[         R                  R                  U R                  U R                  S[
        R                  " 5       [        SS9-
  SS	S9n[         R                  R                  U R                  U R                  S
[
        R                  " 5       SSS9n[        SSS9   [        S5       nU R                  R                  SS9nU R                  US5        U R                  UR                  S5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z&Test cleanup of detection frame files.r      daysr   z/tmp/frames/frame_001.jpgr   zsegment_002.tsrw   z/tmp/frames/frame_002.jpgzsegment_003.tsg)\(?z/tmp/frames/frame_003.jpgzos.path.existsTr^   z	os.remove   )days_oldrg   N)r   r1   r7   r9   r:   r   r8   r	   r   r   cleanup_detection_filesrN   
call_count)r=   mock_rmtree
detection1
detection2r   mock_remover   s          r>   test_cleanup_detection_files0AdBreakAnalyzerTest.test_cleanup_detection_files  sA    %,,33LL MM-#<<>I1,==!2 4 

 %,,33LL MM-#<<>I1,==!2 4 

 +2299LL MM-#<<>!2 : 
 #$7;; MMAA1AMM ]A.[33Q7   87 87s%   :E0AEE0
E-	)E00
E>c                 0   [         R                  " 5       R                  5       n[        S5       HW  n[        R
                  R                  U R                  U R                  SUS S3[         R                  " 5       SSUS S3SS	9  MY     [        R
                  R                  U R                  U R                  S
[         R                  " 5       SSSS9  [        R
                  R                  U R                  U R                  S[         R                  " 5       SSS9  U R                  R                  U R                  U5      nU R                  US   S5        U R                  US   S5        U R                  US   S5        U R                  US   S5        g)z&Test detection statistics calculation.r   segment_03d.tsr   /tmp/frame_.jpgT)r9   r   r   r   r   r   is_confirmedzsegment_004.tsrv   z/tmp/frame_004.jpg)r9   r   r   r   r   r   is_false_positivezsegment_005.tsr-   z/tmp/frame_005.jpgr   total_detectionsr   confirmed_detectionsfalse_positivesrh   average_confidenceg(\?N)r   r8   dateranger   r1   r7   r9   r:   r   calculate_detection_statisticsrN   )r=   todayistatss       r>   #test_calculate_detection_statistics7AdBreakAnalyzerTest.test_calculate_detection_statistics  sg    ##% qA##** $#+Ac7#!6'||~!%(3t4! +   	&&LL MM-#<<>!+" 	' 	
 	&&LL MM-#<<>!+ 	' 	
 <<T]]ER12A656:011534d;rA   c                    [         R                  " 5       n[        S5       HO  nU[        US9-
  n[        R
                  R                  U R                  U R                  SUS S3USSUS S3S	9  MQ     U R                  R                  U R                  SS9nU R                  [        U5      S5        U R                  S
US   5        U R                  SUS   5        U R                  SUS   5        g)zTest detection trend analysis.r   r   r   r   r   r   r   r   r   r   r   
detectionsavg_confidenceN)r   r8   r   r	   r   r1   r7   r9   r:   r   get_detection_trendsrN   rj   rk   )r=   	base_time
day_offsetr   trendss        r>   test_get_detection_trends-AdBreakAnalyzerTest.test_get_detection_trends  s     LLN	(J&
)CCN##** $#+Js+;3!?-!%(C(8= +  # 33DMM3JVa(ffQi(lF1I.&q	2rA   )r   r'   r9   r:   r3   N)r   r   r   r   r   r?   r   r   r   r   r   r   r   r   r   r	  r   r   rA   r>   r   r      sQ    1*<2&#0JH" 7D1;f14 ?&8 &8P+<Z3rA   r   )#r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr4   rD   osunittest.mockr   r   r   django.testr   django.contrib.authr   django.utilsr   datetimer	   apps.streams.modelsr
   r   apps.jingles.modelsr   r   r   apps.jingles.servicesr   r   r0   r   r   r   rA   r>   <module>r     s\       	 5 5   . !  6 H H Ax< x<vE3( E3rA   