
    	]jTP                        d dl Z d dlmZ d dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZ d dlmZmZmZ ej"                  d        Zej"                  d        Zej"                  d	        Zej*                  j,                  d
        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Zej*                  j,                  d        Z ej*                  j,                  d        Z!ej*                  j,                  d        Z"ej*                  j,                  d        Z#ej*                  j,                  d        Z$y)    N)TestCase)reverse)Project)WebhookWebhookAction)emit_webhooksemit_webhooks_for_instancerun_webhookc                 b    | j                   }d}t        j                  j                  |d |      S )Nz'http://127.0.0.1:8000/api/organization/organizationprojecturlr   r   objectscreateconfigured_projectr   uris      S/root/env/lib/python3.12/site-packages/label_studio/tests/webhooks/test_webhooks.pyorganization_webhookr      s7    %22L
3C??!!! "      c                 b    | j                   }d}t        j                  j                  || |      S )Nz"http://127.0.0.1:8000/api/project/r   r   r   s      r   project_webhookr      s7    %22L
.C??!!!" "  r   c                 b    | j                   }d}t        j                  j                  || |      S )Nzhttp://0.0.0.0:9090/webhookr   r   r   s      r   ml_start_training_webhookr   #   s7    %22L
'C??!!!" "  r   c                    |}t        j                  d      5 }|j                  d|j                         t	        |t
        j                  ddi       d d d        j                  }t        |      dk(  sJ |d   j                  dk(  sJ |d   j                  |j                  k(  sJ t               j                  |d   j                         t
        j                  dd       y # 1 sw Y   xY w	NT	real_httpPOSTdatatest   r   )actionr"   )requests_mockMockerregister_urir   r
   r   PROJECT_CREATEDrequest_historylenmethodr   assertDictEqualjsonsetup_project_dialogr   webhookmr*   s        r   test_run_webhookr3   .   s    "G				- [	vw{{+(-*G*G&RXIYZ[ ''O1$$$1$$...1!!%9%=%====Jq1668]EbEblr:st[ [s   :C&&C/c                    |}t        j                  d      5 }|j                  d|j                         t	        |j
                  |j                  t        j                  ddi       d d d        j                  }t        |      dk(  sJ |d   j                  dk(  sJ |d   j                  |j                  k(  sJ t               j                  |d   j                         t        j                  dd       y # 1 sw Y   xY wr   )r&   r'   r(   r   r   r   r   r   r)   r*   r+   r,   r   r-   r.   r/   s        r   test_emit_webhooksr5   <   s    "G				- n	vw{{+g**GOO]=Z=Z]cek\lmn ''O1$$$1$$...1!!W[[000Jq1668]EbEblr:stn ns   AC;;Dc                    |}d}t         j                  j                  |      }t        j                  d      5 }|j                  d|j                         t        |j                  |j                  t        j                  |       d d d        t        j                        dk(  sJ |j                  d   j                  dk(  sJ |j                  d   j                         }d	|v sJ d
|v sJ ||d
   d   k(  sJ y # 1 sw Y   xxY w)Nz
Projects 1)titleTr   r!   instancer$   r   r%   r   r7   )r   r   r   r&   r'   r(   r   r	   r   r   r   r)   r+   r*   r,   r.   )r0   r   r1   project_titler   r2   r"   s          r   test_emit_webhooks_for_instancer;   J   s   "G Moo$$=$9G				- 
	vw{{+"  '//=3P3P[b	


 q  !Q&&&Q&&&000Q$$&DtDOG4444
 
s   AD  D	c                    | }t        j                  d      5 }|j                  d|j                  t        j
                  j                         t        |t        j                        }d d d        J y # 1 sw Y   xY w)NTr   r!   )exc)
r&   r'   r(   r   requests
exceptionsConnectTimeoutr
   r   r)   )r   r1   r2   results       r   test_exception_catchrB   \   sp    "G				- E	vw{{0C0C0R0RSWm&C&CDE >>E Es   AA77B c                 p   t        j                  d      5 }|j                  dj                         |j	                  t        d            }d d d        j                  dk(  sJ t        t        t        fdj                                    dk(  sJ t        t        fd|j                              d	   }|j                         d
   t        j                  k(  sJ |j                         d   }t        j                  d      5 }|j                  dj                         |j                  t        dd|i      t        j                  ddi      d      }d d d        |j                  dk(  sJ t        t        t        fd|j                                    dk(  sJ t        t        fd|j                              d	   }|j                         d
   t        j                   k(  sJ |j                         d   d   dk(  sJ t        j                  d      5 }|j                  dj                         |j#                  t        dd|i            }d d d        |j                  dk(  sJ t        t        t        fd|j                                    dk(  sJ t        t        fd|j                              d	   }|j                         d
   t        j$                  k(  sJ |j                         d   d   |k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)NTr   r!   zprojects:api:project-list   c                 6    | j                   j                   k(  S Nr   xr1   s    r   <lambda>z,test_webhooks_for_projects.<locals>.<lambda>q       QUUgkk%9 r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z,test_webhooks_for_projects.<locals>.<lambda>s       aeew{{2 r   r   r%   idzprojects:api:project-detailpkkwargsr7   z
Test titleapplication/jsonr"   content_type   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z,test_webhooks_for_projects.<locals>.<lambda>   rK   r   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z,test_webhooks_for_projects.<locals>.<lambda>   rM   r   r      c                 6    | j                   j                   k(  S rF   rG   rI   r   s    r   rJ   z,test_webhooks_for_projects.<locals>.<lambda>   s    QUU.B.F.F%F r   c                 6    | j                   j                   k(  S rF   rG   rZ   s    r   rJ   z,test_webhooks_for_projects.<locals>.<lambda>   s    aee';'?'?? r   )r&   r'   r(   r   postr   status_coder+   listfilterr*   r.   r   r)   patchdumpsPROJECT_UPDATEDdeletePROJECT_DELETED)r   business_clientr   r2   responser
project_idr1   s     `    @r   test_webhooks_for_projectsri   f   s   "G 
			- N	vw{{+"''0K(LMN 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!>!>>>>&J				- 
	vw{{+"((14:LMWl34+ ) 

 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!>!>>>>668Iw'<777 
			- 
	vw{{+"))14:LM


 3&&&tFFHYHYZ[\`aaaaV?ARARSTUVWA668H!>!>>>>668It$
222MN N
 
 
 
s$   7LAL';L,LL),L5c           
         |t        j                  d      5 }|j                  dj                         |j	                  t        d      t        j                  | j                  dddd      d	
      }d d d        j                  dk(  sJ t        t        t        fdj                                    dk(  sJ t        t        fd|j                              d   }|j                         d   t        j                  k(  sJ d|j                         v sJ d|j                         v sJ |j                         d   }j                  }t        j                  d      5 }|j                  d|       |j!                  t        dd|i            }d d d        |j                  dk(  sJ t        t        t        fd|j                                    dk(  sJ t        t        fd|j                              d   }|j                         d   t        j"                  k(  sJ d|j                         v sJ d|j                         v sJ y # 1 sw Y   xY w# 1 sw Y   xY w)NTr   r!   ztasks:api:task-listzmeta info Aztext A)	meta_infotext)r   r"   rR   rS   rD   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z)test_webhooks_for_tasks.<locals>.<lambda>   rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z)test_webhooks_for_tasks.<locals>.<lambda>   rM   r   r   r%   tasksr   rN   ztasks:api:task-detailrO   rP   rX   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z)test_webhooks_for_tasks.<locals>.<lambda>   rK   r   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z)test_webhooks_for_tasks.<locals>.<lambda>   rM   r   )r&   r'   r(   r   r\   r   r.   ra   rN   r]   r+   r^   r_   r*   r   TASKS_CREATEDrc   TASKS_DELETED)	r   re   r   r2   rf   rg   task_idr   r1   s	           @r   test_webhooks_for_tasksru      s8   "G				- 
	vw{{+"'')*144*7J , ( 	

 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!<!<<<<affh    mmod#G
++C				- d	vs#"))'2ISWY`Ra*bcd 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!<!<<<<affh   C
 
.d ds   AI(1I#I #I,c                 v  
 ddl m} |
d}t        |d      5 } |d|j                         d      }d d d        t	        j
                  d	      5 }|j                  d

j                         |j                  d| j                   ddid      }d d d        j                  dk(  sJ |j                         d   dk(  sJ t        t        t        
fdj                                    dk(  sJ t        t        
fd|j                              d   }	|	j                         d   t         j"                  k(  sJ d|	j                         v sJ d|	j                         v sJ t        |	j                         d         |j                         d   cxk(  rdk(  sJ  J y # 1 sw Y   qxY w# 1 sw Y   xY w)Nr   )SimpleUploadedFilez$tests/test_suites/samples/test_5.csvrbz
test_5.csvzmultipart/form-datarT   Tr   r!   z/api/projects/z/importcsv_1	multipart)r"   formatrD   
task_count   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z0test_webhooks_for_tasks_import.<locals>.<lambda>   rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z0test_webhooks_for_tasks_import.<locals>.<lambda>   rM   r   r%   ro   r   )django.core.files.uploadedfilerw   openreadr&   r'   r(   r   r\   rN   r]   r.   r+   r^   r_   r*   r   rr   )r   re   r   rw   
IMPORT_CSVfile_r"   r2   rf   rg   r1   s             @r   test_webhooks_for_tasks_importr      s   A"G7J	j$	 b5!,

K`ab				- 
	vw{{+"''/2237;4 ( 

 3&&&==?<(A---tF91;L;LMNOSTTTTV2A4E4EFGJA668H!<!<<<<affh   qvvx !X]]_\%BGaGGGGG%b b
 
s   F!AF.!F+.F8c                    || j                   j                         j                         }t        j                  d      5 }|j                  dj                         |j                  d|j                   d| j                   t        j                  ddgidd	d
dddgdd d | j                  d      d      }d d d        j                  dk(  sJ t        t        t        fdj                                    dk(  sJ t        t        fd|j                              d   }|j                         d   t         j"                  k(  sJ |j                         d   }t        j                  d      5 }|j                  dj                         |j%                  d| d| j                   d|j                   t        j                  dg i      d      }|j                  dk(  sJ |j'                  d| d| j                   d|j                   t        j                  dddgidd	d
dddgi      d      }|j                  dk(  sJ 	 d d d        t        t        t        fd|j                                    dk(  sJ t        t        fd|j                              D ]d  }|j                         d   t         j(                  k(  sJ d |j                         v sJ d!|j                         v sJ d"|j                         v rdJ  t        j                  d      5 }|j                  dj                         |j+                  d| d#      }d d d        |j                  d$k(  sJ t        t        t        fd%|j                                    dk(  sJ t        t        fd&|j                              d   }|j                         d   t         j,                  k(  sJ d'|j                         v sJ ||j                         d'   d   d   k(  sJ y # 1 sw Y   gxY w# 1 sw Y   xY w# 1 sw Y   xY w)(NTr   r!   /api/tasks//annotations?project=choicesclass_A
nJS76J03pi
text_classrl   manual)valuerN   	from_nameto_nametypeoriginr   )rA   draft_idparent_predictionparent_annotationr   rR   rS   rD   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>   rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>   rM   r   r%   rN   z/api/annotations/z	?project=z&taskId=rA   rU   class_Bc                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>&  rK   r      c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>(  s    155GKK#7 r   task
annotationr   ry   rX   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>7  rK   r   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z.test_webhooks_for_annotation.<locals>.<lambda>9  rM   r   annotations)ro   allfirstr&   r'   r(   r   r\   rN   r.   ra   r]   r+   r^   r_   r*   r   ANNOTATION_CREATEDputr`   ANNOTATION_UPDATEDrc   ANNOTATIONS_DELETED)	r   re   r   r   r2   rf   rg   annotation_idr1   s	           @r   test_webhooks_for_annotationr      sO    #G##'')//1D				- 
	vw{{+"''$''"78J8M8M7NO '0)%=".)5'-$-&.	 !")-)-144$ ,) ( 

2 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!A!AAAAMMOD)M 
			- +	vw{{+"&&i8J8M8M7NhW[W^W^V_`b
 , ' 
 ##s***"((i8J8M8M7NhW[W^W^V_`&/)%=".)5'-$-&.	 ,! ) 
$ ##s***?+B tF91;L;LMNOSTTTT&79J9JKL %vvx!]%E%EEEE!!!qvvx'''AFFH$$$% 
			- 
	vw{{+"))/+ * 

 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!B!BBBBAFFH$$$AFFH]3A6t<<<<q
 
B+ +V
 
s&   A9P 8CP-&3P: P*-P7:Qc           
      :   || j                   j                         D ]\  }|j                  d|j                   d| j                   t	        j
                  ddddgiigi      d      }|j                  d	k(  r\J  t        j                  d
      5 }|j                  dj                         |j                  d| j                   t	        j
                  t        | j                        dd
id      d      }d d d        j                  dk(  sJ t        t        t        fdj                                    dk(  sJ t        t        fd|j                              d   }|j	                         d   t         j"                  k(  sJ y # 1 sw Y   xY w)Nr   r   rA   r   r   r   rR   rS   rD   Tr   r!   z4/api/dm/actions?id=delete_tasks_annotations&project=r   r   selectedItemsrU   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   zCtest_webhooks_for_action_delete_tasks_annotations.<locals>.<lambda>[  rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   zCtest_webhooks_for_action_delete_tasks_annotations.<locals>.<lambda>]  rM   r   r   r%   )ro   r   r\   rN   r.   ra   r]   r&   r'   r(   r   strr+   r^   r_   r*   r   r   )r   re   r   r   rf   r2   rg   r1   s          @r   1test_webhooks_for_action_delete_tasks_annotationsr   @  s   "G #((,,. +"''$''"78J8M8M7NOX9yk2J(K'LMN+ ( 

 ##s***+ 
			- 
	vw{{+"''BCUCXCXBYZ"#5#8#89&+T] , ( 	

 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!B!BBBB#
 
s   A)FFc           	      H   |t        j                  d      5 }|j                  dj                         |j	                  d| j
                   t        j                  t        | j
                        ddid      d      }d d d        j                  d	k(  sJ t        t        t        fd
j                                    dk(  sJ t        t        fd|j                              d   }|j                         d   t        j                  k(  sJ y # 1 sw Y   xY w)NTr   r!   z(/api/dm/actions?id=delete_tasks&project=r   r   rR   rS   rU   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z7test_webhooks_for_action_delete_tasks.<locals>.<lambda>r  rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z7test_webhooks_for_action_delete_tasks.<locals>.<lambda>t  rM   r   r   r%   )r&   r'   r(   r   r\   rN   r.   ra   r   r]   r+   r^   r_   r*   r   rs   )r   re   r   r2   rf   rg   r1   s         @r   %test_webhooks_for_action_delete_tasksr   b  s   "G				- 
	vw{{+"''67I7L7L6MN"#5#8#89&+T] , ( 	

 3&&&tF91;L;LMNOSTTTTV2A4E4EFGJA668H!<!<<<<!
 
s   A)DD!c                   
 |
t        j                  d      5 }|j                  d
j                         d}d| j                  dddd}|j                  |t        j                  |      d	
      }|j                         d   }d| d}|j                  |       d d d        t        t        t        
fdj                                    dk(  sJ t        t        
fd|j                              d   }	|	j                         d   t        j                  k(  sJ d|	j                         v sJ d|	j                         v sJ y # 1 sw Y   xY w)NTr   r!   z/api/storages/s3zpytest-s3-imagesz,Testing S3 storage (bucket from conftest.py)i  )bucketr   r7   use_blob_urlspresign_ttlrR   rS   rN   z/api/storages/s3/z/syncc                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z7test_webhooks_for_tasks_from_storages.<locals>.<lambda>  rK   r   r$   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z7test_webhooks_for_tasks_from_storages.<locals>.<lambda>  rM   r   r   r%   ro   r   )r&   r'   r(   r   rN   r\   r.   ra   r+   r^   r_   r*   r   rr   )r   re   r   r2   add_urlpayloadadd_response
storage_pksync_urlrg   r1   s             @r   %test_webhooks_for_tasks_from_storagesr   y  sA   "G				- '	vw{{+$(),,C!
 '++G$**W:M\n+o!&&(.
 'zl%8X&'" tF91;L;LMNOSTTTTV2A4E4EFGJA668H!<!<<<<affh   -' 's   BEEc                    ddl m} |}|j                  }|j                  j	                  |d      }t        j                  d      5 }|j                  d|j                         |j                  d|j                   d	t        j                  d
di      d      }ddd       j                  dk(  sJ j                  }	t        |	      dk(  sJ |	d   j                   dk(  sJ |	d   j                  |j                  k(  sJ d|	d   j                         v sJ |	d   j                         d
   dk(  sJ y# 1 sw Y   xY w)a  
    1. Setup: The test uses the project_webhook fixture, which assumes that a webhook
    is already configured for the project.
    2. Mocking the POST Request: The requests_mock.Mocker is used to mock
    the POST request to the webhook URL. This is where you expect the START_TRAINING action to be sent.
    3. Making the Request: The test makes a POST request to the /api/ml/{id}/train endpoint.

    Assertions:
        - The response status code is checked to ensure the request was successful.
        - It verifies that exactly one request was made to the webhook URL.
        - It checks that the request method was POST.
        - The request URL and the JSON payload are validated against expected values.
    r   )	MLBackendzhttp://0.0.0.0:9090)r   r   Tr   r!   z/api/ml/z/trainr%   START_TRAININGrR   rS   NrU   r$   r   )	ml.modelsr   r   r   r   r&   r'   r(   r   r\   rN   r.   ra   r]   r*   r+   r,   )
r0   r   re   r   r1   r   mlr2   rf   r*   s
             r   test_start_training_webhookr     sL    $'GooG				!	!'7L	!	MB 
			- 
	vw{{+"''ruugV$X'789+ ( 

 3&&&''O1$$$1$$...1!!W[[000*//11111""$X.2BBBB
 
s   AD66D?c                    ddl m} ddlm} ddlm} ddlm} || }g }t        d      D ]5  }|j                  j                  dd| i|	      }	|j                  |	       7  |d
      5 }
d|
_        t        j                  d      5 }|j                  dj                          t#        |dd      }d|_        	  |j&                  j(                  t*        j,                  |       t/        t1        fd|j2                              }t5        |      dk(  sJ |d   j7                         }d|v sJ t5        |d         dk(  sJ |d   j7                         }t5        |d         dk(  sJ |d   j7                         }t5        |d         dk(  sJ 	 ||_        	 ddd       ddd       y# ||_        w xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zDTest that webhooks are sent in batches when feature flag is enabled.r   r`   )settingsTaskemit_webhooks_for_instance_sync   rl   
Test task r"   r   webhooks.utils.flag_setTr   r!   WEBHOOK_BATCH_SIZEd   r8   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z9test_webhook_batching_with_feature_flag.<locals>.<lambda>  s    '++9M r   r~   ro   r$   r   2   N)unittest.mockr`   django.confr   tasks.modelsr   webhooks.utilsr   ranger   r   appendreturn_valuer&   r'   r(   r   getattrr   r   r   r   rr   r^   r_   r*   r+   r.   )r   r   r`   r   r   r   r   ro   ir   mock_flag_setr2   original_batch_sizewebhook_requestsfirst_batchsecond_batchthird_batchr1   s                    @r   'test_webhook_batching_with_feature_flagr     s    $$!>"G G E3Z ||"":aS1A(BG"TT
 
(	) !B]%)"!!D1 	BQNN67;;/ #*(4H#"N*-H'B/(('//=;V;Vaf
 $(/MqO`O`(a#b +,111 /q1668+---;w/0C777  02779<01S888 /q1668;w/0B666 /B+=	B!B !BB /B+=	B 	B!B !Bs=   +G	1F9;CF-F9G-	F66F99G	>GGc                    ddl m} ddlm} ddlm} || }g }t        d      D ]5  }|j                  j                  dd| i|      }|j                  |       7  |d	      5 }	d
|	_
        t        j                  d      5 }
|
j                  dj                          |j                  j                   t"        j$                  |       t'        t)        fd|
j*                              }t-        |      dk(  sJ |d   j/                         }d|v sJ t-        |d         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zLTest that webhooks are sent in single request when feature flag is disabled.r   r   r   r      rl   r   r   r   FTr   r!   r8   c                 6    | j                   j                   k(  S rF   rG   rH   s    r   rJ   z?test_webhook_no_batching_without_feature_flag.<locals>.<lambda>  s    QUUgkk5I r   r$   ro   N)r   r`   r   r   r   r   r   r   r   r   r   r&   r'   r(   r   r   r   r   rr   r^   r_   r*   r+   r.   )r   r   r`   r   r   r   ro   r   r   r   r2   r   request_datar1   s                @r   -test_webhook_no_batching_without_feature_flagr     sU    $!>"G G E3Z ||"":aS1A(BG"TT
 
(	) 5]%*"!!D1 	5QNN67;;/+$$goo}7R7R]b
  $F+I1K\K\$]^'(A--- ,A.335Ll***|G,-444	55 5	5 	55 5s%   %E
B)D>-E
>E	E

E)%r.   unittestr   pytestr>   r&   django.urlsr   projects.modelsr   webhooks.modelsr   r   r   r   r	   r
   fixturer   r   r   mark	django_dbr3   r5   r;   rB   ri   ru   r   r   r   r   r   r   r   r    r   r   <module>r      s#         # 2 Q Q       
u 
u 
u 
u 5 5"   +3 +3` $! $!P H H: ]= ]=B C CB = =, ! !8 #C #CL 3B 3Bl "5 "5r   