
    	]j2                     ^   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ  ej.                  e      Zej4                  j7                  dg d	g      ej4                  j8                  d
               Zej4                  j8                  d        Zej4                  j8                  d        Zej4                  j8                  d        Z ej4                  j8                  d        Z!ej4                  j8                  d        Z" G d de      Z#y)zThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)parse_configparse_config_to_jsonvalidate_label_config)TestCase)Project)ValidationError)make_annotationmake_prediction	make_task
project_idz1tasks_count, annotations_count, predictions_count)   r   r   c                 ~   ddi}|j                  d| t        j                  |      d      }|j                  dk(  sJ t        j
                  j                  |      }t        d|       D ]  }t        d	d
ddiddiddigii|      j                  }	t        d|	z         t        d|      D ].  }t        d       t        dddddddddgdddddddd	gi|	       0 t        d|      D ]  }t        dg i|	         dd i}|j                  d| d!t        j                  |      d      }|j                  dk(  sJ dd"i}|j                  d| d!t        j                  |      d      }|j                  dk(  sJ dd#i}|j                  d| d!t        j                  |      d      }|j                  d$k(  sJ y )%Nlabel_configl  <View> <Repeater on="$images" indexFlag="{{idx}}"> <Image name="page_{{idx}}" value="$images" maxWidth="100%"/>     <Header value="Utterance Review"/>     <RectangleLabels name="labels_{{idx}}" toName="page_{{idx}}">       <Label value="Header" hotkey="1"/> <Label value="Body" hotkey="2"/> <Label value="Footer" hotkey="3"/> </RectangleLabels> </Repeater> </View>/api/projects/application/jsondatacontent_type   )pkr   r   imagesurlzShttps://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0001.jpgzShttps://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0002.jpgzShttps://htx-pub.s3.amazonaws.com/demo/images/demo_stock_purchase_agreement/0003.jpgzTASK_ID: %s
COMPLETIONresult
_565WKjviNrectanglelabelsg{s5@g+Q@gZ崠]K@g]ڕ@Header)xywidthheightrotationr   manualpage_0labels_0i   i  )	idtypevalueoriginto_name	from_nameimage_rotationoriginal_widthoriginal_heightaf  <View> <Repeater on="$images" indexFlag="{{idx}}"> <Image name="page_{{idx}}" value="$images" maxWidth="100%"/>     <Header value="Utterance Review"/>     <RectangleLabels name="labels_{{idx}}" toName="page_{{idx}}"> <Label value="Header" hotkey="1"/> <Label value="Body" hotkey="2"/> <Label value="Footer" hotkey="3"/> </RectangleLabels> </Repeater> </View>	/validateaC  <View> <Repeater on="$images" indexFlag="{{idx}}"> <Image name="page_{{idx}}" value="$images" maxWidth="100%"/>     <Header value="Utterance Review"/>     <RectangleLabels name="labels_{{idx}}" toName="page_{{idx}}"> <Label value="Header" hotkey="1"/> <Label value="Body" hotkey="2"/> </RectangleLabels> </Repeater> </View>aC  <View> <Repeater on="$images" indexFlag="{{idx}}"> <Image name="page_{{idx}}" value="$images" maxWidth="100%"/>     <Header value="Utterance Review"/>     <RectangleLabels name="labels_{{idx}}" toName="page_{{idx}}"> <Label value="Body" hotkey="2"/> <Label value="Footer" hotkey="3"/> </RectangleLabels> </Repeater> </View>  )patchjsondumpsstatus_coder   objectsgetranger   r'   printr	   r
   post)
tasks_countannotations_countpredictions_countbusiness_clientr   payloadresponseproject_task_ids
             S/root/env/lib/python3.12/site-packages/label_studio/tests/test_config_validation.py!test_change_label_config_repeaterrE      s    	  GG $$
%ZZ ' % H
 3&&&oo!!Z!0G1k" +5 uv uv uv 
 " 	 	mg%&q+, 	A,".$5%7%6):*;,-4<:& '/'/)3./.1/3!, /	8 q+, 	5AXrNG4	5U+5^ 	  AG ##
I.ZZ ' $ H
 3&&& 	  ^G ##
I.ZZ ' $ H
 3&&& 	  ^G ##
I.ZZ ' $ H
 3&&&    c            
         d} t        j                  |       D cg c]?  }t        j                  t         j                  j	                  |d   d            D ]  }| A }}}|D ][  }t        d|        t        |d      5 }|j                         }t        |      sJ t        |      sJ t        |       d d d        ] y c c}}w # 1 sw Y   nxY w)Nz#./label_studio/annotation_templatesr   z*.xmlzParsing config: r)mode)oswalkglobpathjoinr9   openreadr   r   r   )folder_wildcardr   r    r   filefconfigs          rD   test_parse_all_configsrU   x   s    ;O1bA499RWW\\RSTURVX_E`;abaababFb * '($S! 	*QVVXF''''///!&)		* 	** c	* 	*s   AC6C		C	c                     ddi}| j                  d| t        j                  |      d      }|j                  dk(  sJ ddi}| j                  d| t        j                  |      d      }|j                  dk(  sJ y)	zT
    Validate Choices tag for 1 choice with workaround
    Example bug DEV-3635
    r   z<View><Text value="$text" name="artist" /><View><Choices name="choices_1" toName="artist"><Choice name="choice_1" value="1"/></Choices></View><View><Choices name="choices_2" toName="artist"><Choice name="choice_2" value="2"/></Choices></View></View>r   r   r   r   z<View><Text value="$text" name="artist" /><View><Choices name="choices_1" toName="artist"><Choice name="choice_1" value="1"/></Choices><Choices name="choices_2" toName="artist"><Choice name="choice_2" value="2"/></Choices></View></View>Nr2   r3   r4   r5   r>   r   r?   r@   s       rD   -test_config_validation_for_choices_workaroundrY      s     	 G $$
%ZZ ' % H
 3&&& 	 FG
 $$
%ZZ ' % H
 3&&&rF   c                     ddi}| j                  d| t        j                  |      d      }|j                  dk(  sJ |j                         }d|d   d   d	   v sJ y
)zG
    Validate Number tag with missing to_name fails (see LEAP-245)
    r   z<View><Text name="question" value="$question" granularity="word"/><Number name="number" to="question" required="true" /></View>r   r   r   r1   z'toName' is a required propertyvalidation_errorsr   NrW   )r>   r   r?   r@   response_datas        rD   >test_config_validation_for_missing_to_name_in_number_tag_failsr]      s     	G $$
%ZZ ' % H
 3&&&MMOM,>Q0RSa0bcd0eeeerF   c                    ddi}| j                  d| t        j                  |      d      }|j                  dk(  sJ ddi}| j	                  d| dt        j                  |      d      }|j                  d	k(  sJ y )
Nr   r   r   r   r   r   aD  1<View> <Repeater on="$images" indexFlag="{{idx}}"> <Image name="page_{{idx}}" value="$images" maxWidth="100%"/>     <Header value="Utterance Review"/>     <RectangleLabels name="labels_{{idx}}" toName="page_{{idx}}"> <Label value="Body" hotkey="2"/> <Label value="Footer" hotkey="3"/> </RectangleLabels> </Repeater> </View>r0   r1   )r2   r3   r4   r5   r:   rX   s       rD   test_parse_wrong_xmlr_      s     	  GG $$
%ZZ ' % H
 3&&& 	  _G ##
I.ZZ ' $ H
 3&&&rF   c                    t        j                  t        j                  j	                  t        j                  j                  t              d            5 }t        j                  |      }d d d        j                         D ]c  \  }}d|d   i}| j                  d| dt        j                  |      d      }t        j                  d|        |j                  |d   k(  rcJ  y # 1 sw Y   xY w)	Nz/test_data/data_for_test_label_config_matrix.ymlr   r   r0   r   r   zTest: r5   )iorO   rJ   rM   rN   dirname__file__yaml	safe_loaditemsr:   r3   r4   loggerwarningr5   )r>   r   rS   test_suites	test_nametest_contentr?   r@   s           rD   test_label_config_versionsrl      s    	bggooh79jk	l (pqnnQ'(#.#4#4#6 C	<!<#?@"''ZL	2G$+ ( 

 		{+,##|M'BBBBC( (s   C**C3c                   8    e Zd ZdZdZdZdZdZd Zd Z	d Z
d	 Zy
)-TestValidateLabelConfigTagAttributeValidationa/  
    validate_label_config() invokes the SDK's _tag_attribute_validation (per-tag
    attribute checks). These tests ensure that integration: when all tags pass
    validation we succeed; when any tag's validate_config() returns errors we
    get ValidationError with the error messages propagated.
    z
<View>
  <Video name="video" value="$video" framerate="25" defaultPlaybackSpeed="2" minPlaybackSpeed="0.5"/>
  <VideoRectangle name="box" toName="video" />
</View>
zf
<View>
  <Video name="video" value="$video"/>
  <VideoRectangle name="box" toName="video" />
</View>
z
<View>
  <Video name="video" value="$video" defaultPlaybackSpeed="15"/>
  <VideoRectangle name="box" toName="video" />
</View>
z
<View>
  <Video name="video" value="$video" defaultPlaybackSpeed="5" minPlaybackSpeed="10"/>
  <VideoRectangle name="box" toName="video" />
</View>
c                 .    t        | j                         y)z
        When every object tag's validate_config() returns no errors,
        validate_label_config completes without raising.
        N)r   CONFIG_VALID_TAG_ATTRSselfs    rD   8test_tag_attribute_validation_passes_when_all_tags_validzfTestValidateLabelConfigTagAttributeValidation.test_tag_attribute_validation_passes_when_all_tags_valid  s    
 	d99:rF   c                 .    t        | j                         y)z
        When config has object tags that do not define attribute validation
        (or have no attributes to validate), validate_label_config completes without raising.
        N)r   CONFIG_NO_TAG_SPECIFIC_ATTRSrq   s    rD   Htest_tag_attribute_validation_passes_when_tags_have_no_attrs_to_validatezvTestValidateLabelConfigTagAttributeValidation.test_tag_attribute_validation_passes_when_tags_have_no_attrs_to_validate  s    
 	d??@rF   c                     | j                  t              5 }t        | j                         ddd       t	        j
                        }d|j                         v sJ d|v sJ y# 1 sw Y   9xY w)a&  
        When a tag's validate_config() returns errors, validate_label_config
        raises ValidationError and the exception message includes the tag identifier
        and the validation failure detail (so _tag_attribute_validation is invoked and
        its errors are propagated).
        Nvideo15)assertRaisesr   r   "CONFIG_TAG_ATTR_VALIDATION_FAILS_1str	exceptionlowerrr   ctxmsgs      rD   Etest_tag_attribute_validation_failure_raises_with_descriptive_messagezsTestValidateLabelConfigTagAttributeValidation.test_tag_attribute_validation_failure_raises_with_descriptive_message  si     / 	K3!$"I"IJ	K#-- #))+%%%s{{		K 	Ks   A$$A-c                     | j                  t              5 }t        | j                         ddd       t	        j
                        }d|j                         v sJ d|v sd|v sJ yy# 1 sw Y   >xY w)z
        When a tag's validate_config() returns errors (e.g. cross-attribute constraint),
        validate_label_config raises ValidationError and the message describes the constraint.
        Nrx   zmust not exceedexceed)rz   r   r   "CONFIG_TAG_ATTR_VALIDATION_FAILS_2r|   r}   r~   r   s      rD   Dtest_tag_attribute_validation_failure_raises_with_cross_attr_messagezrTestValidateLabelConfigTagAttributeValidation.test_tag_attribute_validation_failure_raises_with_cross_attr_message'  sv    
 / 	K3!$"I"IJ	K#-- #))+%%% C'8s?::?'		K 	Ks   A))A2N)__name__
__module____qualname____doc__rp   ru   r{   r   rs   rv   r   r    rF   rD   rn   rn      s<    $ *&*&;A	;rF   rn   )$r   rL   ra   r3   loggingrJ   pytestrd   core.label_configr   r   r   django.testr   projects.modelsr   rest_framework.exceptionsr   label_studio.tests.utilsr	   r
   r   r   	getLoggerr   rg   markparametrize	django_dbrE   rU   rY   r]   r_   rl   rn   r   rF   rD   <module>r      s3    	   	   W W   # 5 \ \			8	$ 7 Y' Y'x 	* 	* ' '> f f, ' '. C C$I;H I;rF   