
    	]j                         d Z ddlZddlmZmZ ddlmZmZmZmZ ddl	m
Z
 ddlZddlmZ ddlmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZ  G d de      Zy)a$  
API usage examples and documentation tests for the declarative transition system.

These tests serve as both validation and comprehensive documentation,
showing how to integrate the transition system with APIs, handle
JSON serialization, generate schemas, and implement real-world patterns.
    N)datetime	timedelta)AnyDictListOptional)Mock)TestCase)register_state_transitiontransition_registry)get_transition_schema)BaseTransitionTransitionContextTransitionValidationError)Field	validatorc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)APIIntegrationExampleTestsz
    API integration examples demonstrating real-world usage patterns.

    These tests show how to integrate the transition system with
    REST APIs, handle JSON data, validate requests, and format responses.
    c                 |   ddl m} t               | _        d| j                  _        d| j                  j
                  _        d| j                  _        t               | _        d| j                  _	        d| j                  _
         |t        j                        | _        t        j                  j                          y )Nr   )deepcopy   taskd   *   api_user)copyr   r	   mock_entitypk_meta
model_nameorganization_id	mock_useridusernamer   _transitions_original_transitionsclear)selfr   s     Q/root/env/lib/python3.12/site-packages/label_studio/fsm/tests/test_api_example.pysetUpz APIIntegrationExampleTests.setUp$   s    !6,2)+.(", &..A.N.N%O"((..0    c                 .    | j                   t        _        y N)r&   r   r%   )r(   s    r)   tearDownz#APIIntegrationExampleTests.tearDown4   s    +/+E+E(r+   c                    t        dd       G d dt                     }ddt        j                         t	        d      z   j                         d	d
d}	  |d"i |}t        | j                  | j                  d|j                         |      }|j                  |      sJ |j                  |      }d
d| j                  j                  |j                         |dt        j                         j                         d}|d   sJ |d   d   dk(  sJ |d   d   d   dk(  sJ |d   d   d   dk(  sJ 	 ddd d!}t#        j$                  t              5   |d"i | ddd       y# t        $ r:}ddt        |      t        j                         j                         d}Y d}~od}~wt        $ rE}ddt        |      |j                   t        j                         j                         d}Y d}~d}~ww xY w# 1 sw Y   yxY w)#z
        API EXAMPLE: REST endpoint for task assignment

        Shows how to implement a REST API endpoint that uses
        declarative transitions with proper validation and error handling.
        r   api_assign_taskc                   (   e Zd ZU dZ edd      Zeed<    edd      Ze	ed<    ed	d
      Z
ee   ed<    edd      Ze	ed<    edd      Zeed<    ed      d        Z ed      d        Zddee   de	fdZdedefdZdedee	ef   fdZy	)eAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransitionz5Task assignment via API with comprehensive validation.zID of user to assign task todescriptionassignee_idnormalzTask priority levelpriorityNzAssignment deadlinedeadline zNotes about the assignmentassignment_notesTzWhether to notify the assigneenotify_assigneec                 2    g d}||vrt        d|       |S )N)lowr6   highurgentzPriority must be one of: )
ValueError)clsvvalid_prioritiess      r)   validate_priorityzwAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransition.validate_priorityJ   s+    #F ,,$'@AQ@R%STTr+   c                 N    |r"|t        j                         k  rt        d      |S )NzDeadline must be in the future)r   nowr@   )rA   rB   s     r)   validate_deadlinezwAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransition.validate_deadlineQ   s#    hlln,$%EFFr+   contextreturnc                      y)NASSIGNED r(   rH   s     r)   get_target_statezvAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransition.get_target_stateW   s    !r+   c                     |j                   dvrt        d|j                    dddgi      | j                  dk  rt        dd| j                  i      y	)
N)CREATED
UNASSIGNEDzCannot assign task in state: valid_statesrP   rQ   r   zInvalid assignee IDr5   T)current_stater   r5   rM   s     r)   validate_transitionzyAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransition.validate_transitionZ   si    ((0II378M8M7NO')\)BC  ##q(34IM[_[k[kKlmmr+   c           	      (   | j                   | j                  | j                  r| j                  j                         nd | j                  | j
                  |j                  r|j                  j                  nd |j                  j                         ddS )Nv1)r5   r7   r8   r:   r;   assigned_by_idassigned_atapi_version)	r5   r7   r8   	isoformatr:   r;   current_userr#   	timestamprM   s     r)   
transitionzpAPIIntegrationExampleTests.test_rest_api_task_assignment_example.<locals>.APITaskAssignmentTransition.transitionh   sv    #'#3#3 $=A]] 7 7 9PT(,(=(='+';';AHAUAUg&:&:&=&=[_#*#4#4#>#>#@#'	 	r+   r-   )__name__
__module____qualname____doc__r   r5   int__annotations__r7   strr8   r   r   r:   r;   boolr   rD   rG   r   rN   rT   r   r   r]   rL   r+   r)   APITaskAssignmentTransitionr2   @   s    G$S6TUKU!(8MNHcN+0CX+YHhx(Y$)":V$WcW$)$<\$]OT]z" # z" #
"9J0K "WZ "3D  
*; 
S#X 
r+   rf   {   r>      )daysz+Critical task requiring immediate attentionT)r5   r7   r8   r:   r;   rP   )entityr[   rS   target_staterequest_datazTask assigned successfully)task_id	new_stateassignment_details)successmessagedatar\   rp   rr   rn   rK   ro   r5   r7   FzValidation Error)rp   errorrq   r\   NzBusiness Rule Violation)rp   rs   rq   rH   r\   invalid_priorityz2020-01-01T00:00:00)r5   r7   r8   rL   )r   r   r   rF   r   rZ   r   r   r"   rN   rT   r]   r   r@   rd   r   rH   pytestraises)	r(   rf   api_request_datar]   rH   result_dataapi_responseeinvalid_requests	            r)   %test_rest_api_task_assignment_examplez@APIIntegrationExampleTests.test_rest_api_task_assignment_example8   s%    
#6+<	=1	. 1	 
>1	j !)*;;FFH M#
6	4H7GHJ (''!^^''88:-G 11'::: %//8K  7#//22!+!<!<!>*5
 &\\^557	L  	***'4
BBB'(<=mLPSSSS'(<=jIVSSS. *-
 ]]:& 	;':/:	; 	;5  	 !+q6%\\^557	L ) 	 !2q699%\\^557L	"	; 	;s1   CE& 	G8&	G5/0F$$G50;G00G58Hc           	         t        dd       G d dt                     }t        |      }d|v sJ d|v sJ |d   }|d   }|d   d	k(  sJ |d
   dk(  sJ |d   dk(  sJ d|d   v sJ |d   }|d   dk(  sJ d|v sJ |d   }|d   dk(  sJ |d
   dk(  sJ |d   }|d   dk(  sJ |d   d   dk(  sJ |d   }|d   dk(  sJ |d   }	d|	v sJ d|	v sJ d|	vsJ dddddd d!gd"d#d$d%}
 |d)i |
}|j                  dk(  sJ t	        |j
                        d&k(  sJ t        j                  |d&'      }t        |t              sJ d|v sJ y()*z
        API DOCUMENTATION: JSON Schema generation

        Shows how to generate OpenAPI/JSON schemas for API documentation
        from Pydantic transition models.
        
annotationapi_submit_annotationc                   .   e Zd ZU dZ edddd      Zeed<    edd	d
      Ze	ed<    eddd      Z
eed<    edd      Ze	ed<    edd      Zeed<    eed      Zee	   ed<    eed      Zee	ef   ed<   d"dee   de	fd Zdedee	ef   fd!Zy)#nAPIIntegrationExampleTests.test_json_schema_generation_for_api_docs.<locals>.APIAnnotationSubmissionTransitionz,Submit annotation via API with rich metadata.              ?z2Annotator's confidence in the annotation (0.0-1.0)geler4   confidence_scoregoodzSubjective quality assessmentz^(excellent|good|fair|poor)$)r4   patternannotation_qualityr   z#Time spent on annotation in secondsr   r4   time_spent_secondsmediumz+Perceived difficulty of the annotation taskr3   difficulty_levelFz,Whether the annotator requests manual reviewreview_requestedz Optional tags for categorizationdefault_factoryr4   tagsz0Additional metadata about the annotation processmetadataNrH   rI   c                      y)NrP   rL   rM   s     r)   rN   zAPIIntegrationExampleTests.test_json_schema_generation_for_api_docs.<locals>.APIAnnotationSubmissionTransition.get_target_state   s     r+   c           	          | j                   | j                  | j                  | j                  | j                  | j
                  | j                  |j                  j                         dS )N)r   r   r   r   r   r   r   submitted_at)	r   r   r   r   r   r   r   r\   rZ   rM   s     r)   r]   zyAPIIntegrationExampleTests.test_json_schema_generation_for_api_docs.<locals>.APIAnnotationSubmissionTransition.transition   sY    (,(=(=*.*A*A*.*A*A(,(=(=(,(=(= II $$+$5$5$?$?$A	 	r+   r-   )r^   r_   r`   ra   r   r   floatrc   r   rd   r   rb   r   r   re   listr   r   dictr   r   r   r   r   rN   r]   rL   r+   r)   !APIAnnotationSubmissionTransitionr      s    >&+1e'e  ',$CMk'  ',CACh&ii$)(@m$ncn%*5>l%mdm#DFhiD$s)i', $2d(Hd38n !9J0K !WZ !
*; 
S#X 
r+   r   
propertiesrequiredr   typenumberminimumr   maximumr   zAnnotator's confidencer4   r   stringr   r   integerr   r   arrayitemsr   objectg333333?r   x   hardT	importantcomplexz1.2.3chrome)tool_versionbrowser)r   r   r   r   r   r   r      )indentNrL   )
r   r   r   r   lenr   jsondumps
isinstancerd   )r(   r   schemar   confidence_schemaquality_schematime_schematags_schemametadata_schemarequired_fields
valid_datar]   schema_jsons                r)   (test_json_schema_generation_for_api_docszCAPIIntegrationExampleTests.test_json_schema_generation_for_api_docs   s8    
#<1H	I	 	 
J	B ''HI v%%%V### L)
 ''9: (H444 +s222 +s222'+<]+KKKK $$89f%111N*** !!566"i///9%*** !(6"g---7#F+x777 %Z0v&(222 !,!_444#666_,,, !%"("% & $ ),)0XF

 7DD
**d222:??#q((( jj2+s+++![000r+   c                 ^   t        dd       G d dt                     }g ddddd	d
d}g }g }|d   D ]  }t               }||_        d|j                  _        	  |d i |d   }g d}||dz
     }	t        || j                  |	|j                               }
|j                  |
      r&|j                  |
      }|j                  |d|d        |d   d   t        |d         t        |      t        |      ||t!        j"                         j%                         d}|d   dk(  sJ |d   dkD  sJ |d   |d   z   }|dk(  sJ |D ]#  }|d   sJ |d   d   dk(  sJ |d   d   dk(  r#J  y# t        $ r5}|j                  |d	t        |      t        |di       d       Y d}~sd}~ww xY w)!z
        API EXAMPLE: Bulk operations with transitions

        Shows how to handle bulk operations where multiple entities
        need to be transitioned with the same or different parameters.
        r   bulk_status_updatec                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd      Z	eed	<    ed
d      Z
eed<   ddee   defdZdedefdZdedeeef   fdZy)_APIIntegrationExampleTests.test_bulk_operations_api_pattern.<locals>.BulkStatusUpdateTransitionz%Bulk status update for multiple tasks.zNew status for all tasksr3   
new_statuszReason for bulk updateupdate_reasonz Unique identifier for this batchbatch_idFz#Force update even if invalid statesforce_updateNrH   rI   c                     | j                   S r-   )r   rM   s     r)   rN   zpAPIIntegrationExampleTests.test_bulk_operations_api_pattern.<locals>.BulkStatusUpdateTransition.get_target_state8  s    &r+   c                     g d}| j                   |vrt        d| j                          | j                  s$|j                  | j                   k(  rt        d      y)N)rP   IN_PROGRESS	COMPLETED	CANCELLEDzInvalid status: zCannot update to same statusT)r   r   r   rS   )r(   rH   valid_statusess      r)   rT   zsAPIIntegrationExampleTests.test_bulk_operations_api_pattern.<locals>.BulkStatusUpdateTransition.validate_transition;  sW    !U??.836FtFW4XYY ((,,?78VWWr+   c                     | j                   | j                  | j                  | j                  |j                  j                         |j                  j                  dS )N)r   r   r   r   
updated_at	entity_id)r   r   r   r   r\   rZ   rj   r   rM   s     r)   r]   zjAPIIntegrationExampleTests.test_bulk_operations_api_pattern.<locals>.BulkStatusUpdateTransition.transitionG  sK    "&//%)%7%7 $$($5$5")"3"3"="="?!(!2!2 r+   r-   )r^   r_   r`   ra   r   r   rd   rc   r   r   r   re   r   r   rN   rT   r   r   r]   rL   r+   r)   BulkStatusUpdateTransitionr   /  s    7#C5OPJP!&s8P!QM3Q!#3UVHcV!&u:_!`L$`'9J0K 'WZ '
3D 
 
*; S#X r+   r   )r   r            r   zProject phase changebatch_2024_001F)r   r   r   r   )task_idstransition_datar   r   )rP   rP   r   rP   r   r   rj   r[   rS   rk   T)rm   rp   resultrH   )rm   rp   rs   rH   Nr   )r   total_requestedsuccessful_updatesfailed_updatesresultsfailuresr\   r   r   r   r   r   rp   r   r   rL   )r   r   r	   r   r   r    r   r"   rN   rT   r]   appendr   rd   getattrr   r   rF   rZ   )r(   r   bulk_requestbatch_resultsr   rm   	mock_taskr]   current_statesrS   rH   r   r{   rz   total_processeds                  r)    test_bulk_operations_api_patternz;APIIntegrationExampleTests.test_bulk_operations_api_pattern'  s7    
#6+?	@	 	 
A	F (+!7, %	 
 #J/ 	GI"IL)/IOO&7Z,GX:YZ
 "_ .w{ ;+$!%"/!+!<!<!>	 11':'227;F!((WY_)`a1	B %%67
C"<
#;<"%m"4!.1$&!113
 -.!33301A555 '';<|L\?]]!### $ 	DF)$$$(#L1]BBB(#J/3CCCC	D3 - %% 'ECFW^_`bkmoWpq s   A5E..	F,7*F''F,c           	      d   t        dd       G d dt                     } |ddddgd	d
dd      }t        | j                  | j                  d|j                               }|j                  |      sJ |j                  |       t               }d|_	        |j                  ||       t        |j                        dk(  sJ |j                  D ]_  }d|v sJ d|v sJ |d   dk(  sJ |d   }|d   dk(  sJ |d   | j                  j                  k(  sJ |d   d   dk(  sJ |d   d   d	k(  r_J  y)z
        API EXAMPLE: Webhook integration with transitions

        Shows how to integrate transitions with webhook systems
        for external notifications and integrations.
        r   webhook_completionc                      e Zd ZU dZ eddd      Zeed<    edd	      Ze	ed
<    ee
d      Zee	   ed<    eed      Zee	ef   ed<    ee
d      Zeee	ef      ed<   ddee   de	fdZdedefdZdedee	ef   fdZdeddfdZy)dAPIIntegrationExampleTests.test_webhook_integration_pattern.<locals>.WebhookTaskCompletionTransitionz*Task completion with webhook notifications.r   r   )r   r   completion_qualityr9   zCompletion notesr3   completion_noteszWebhook URLs to notifyr   webhook_urlszData to send in webhooksnotification_datazWebhook response trackingwebhook_responsesNrH   rI   c                      y)Nr   rL   rM   s     r)   rN   zuAPIIntegrationExampleTests.test_webhook_integration_pattern.<locals>.WebhookTaskCompletionTransition.get_target_state  s    "r+   c                 8    |j                   dk7  rt        d      y)Nr   z#Can only complete in-progress tasksT)rS   r   rM   s     r)   rT   zxAPIIntegrationExampleTests.test_webhook_integration_pattern.<locals>.WebhookTaskCompletionTransition.validate_transition  s    ((M934YZZr+   c                     | j                   | j                  | j                  | j                  |j                  j                         |j                  r|j                  j                  dS d dS )N)r   r   r   r   completed_atcompleted_by_id)r   r   r   r   r\   rZ   r[   r#   rM   s     r)   r]   zoAPIIntegrationExampleTests.test_webhook_integration_pattern.<locals>.WebhookTaskCompletionTransition.transition  sj    *.*A*A(,(=(=$($5$5)-)?)?$+$5$5$?$?$ABIBVBVw';';'>'>  ]a r+   c                    | j                   rd|j                  j                  t        |dd      | j                  | j
                  |j                  r|j                  j                  nd|j                  j                         d| j                  t        j                         j                         d}| j                   D ]D  }||dt        j                         j                         d}| j                  j                  |       F yy)	z6Send webhook notifications after successful transitiontask.completedr#   zmock-idN)qualitynotescompleted_byr   )eventrm   state_record_idcompletion_datacustom_datar\   sent)urlpayloadstatusr\   )r   rj   r   r   r   r   r[   r#   r\   rZ   r   r   rF   r   r   )r(   rH   state_recordwebhook_payloadr   webhook_responses         r)   post_transition_hookzyAPIIntegrationExampleTests.test_webhook_integration_pattern.<locals>.WebhookTaskCompletionTransition.post_transition_hook  s    $$!1#*>>#4#4+2<y+Q'+'>'>%)%:%:GNG[G[G,@,@,C,Cae,3,=,=,G,G,I	, (,'='=%-\\^%=%=%?'O  $00 H#&'6&,)1)A)A)C	,( ..556FGH! %r+   r-   )r^   r_   r`   ra   r   r   r   rc   r   rd   r   r   r   r   r   r   r   r   r   r   rN   re   rT   r]   r  rL   r+   r)   WebhookTaskCompletionTransitionr     s    <(-ccc(BB$)":L$McM&+DNf&gL$s)g05dXr0stCH~s6; $2M7tDcN3 #9J0K #WZ #3D  
*; S#X H4E HX\ Hr+   r  gffffff?z%Task completed with excellent qualityz/https://api.example.com/webhooks/task-completedz-https://notifications.example.com/task-eventsrg   r>   
client_456)
project_idr7   	client_id)r   r   r   r   r   r   zstate-uuid-123r   r   r   r   r   r   r   rm   r   r   r   r  N)r   r   r   r   r"   rN   rT   r]   r	   r#   r  r   r   r   )r(   r  r]   rH   mock_state_recordresponser   s          r)    test_webhook_integration_patternz;APIIntegrationExampleTests.test_webhook_integration_pattern  s    
#6+?	@6	Hn 6	H 
A6	Hr 5#DA? .1fS_`

 $##'#446	
 --g666g& !F/ 	''1BC ://0A555"44 
	?HH$$$(((H%/// y)G7#'77779%)9)9)<)<<<<,-i8D@@@=),73>>>
	?r+   c                     t        dd       G d dt                     ddddd	}d  fd
	} ||      }|d   dk(  sJ |d   sJ d|d   v sJ dddd} ||      }|d   dk(  sJ |d   rJ |d   dk(  sJ ddddd	} ||      }|d   dk(  sJ |d   rJ |d   dk(  sJ d|v sJ t        |d         dkD  sJ  ||d      }|d   dk(  sJ |j                  dg       }t	        d |D              sJ y)!z
        API EXAMPLE: Comprehensive error handling patterns

        Shows how to implement robust error handling for API endpoints
        using the transition system with proper HTTP status codes and messages.
        r   api_critical_updatec                       e Zd ZU dZ edd      Zeed<    edddd	      Ze	ed
<    edd      Z
eed<    edd      Zeed<   ddee   defdZdedefdZdedeeef   fdZy)`APIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.APICriticalUpdateTransitionz)Critical update with extensive validation.zType of critical updater3   update_typer   r   zSeverity level 1-5r   severity_levelz(Authorization token for critical updatesauthorization_tokenTz(Whether backup is required before updatebackup_requiredNrH   rI   c                      y)NCRITICALLY_UPDATEDrL   rM   s     r)   rN   zqAPIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.APICriticalUpdateTransition.get_target_state  s    +r+   c                 4   g }t        | j                        dk  r|j                  d       | j                  dk\  r|j                  s|j                  d       g d}| j
                  |vr|j                  d|        |j                  dv r-|j                  d|j                  j                          d	       | j                  r$| j                  d
k\  rd}|s|j                  d       |r.t        d|t        |      | j                  | j
                  d      y)N
   zInvalid authorization tokenr   z0High severity updates require authenticated user)security_patchcritical_fixemergency_updatez%Invalid update type. Must be one of: )r   ARCHIVEDz#Cannot perform critical updates on z tasksr   Tz!Backup required but not availablez!Critical update validation failed)validation_errorserror_countr  r  )
r   r  r   r  r[   r  rS   lowerr  r   )r(   rH   errorsvalid_typesbackup_existss        r)   rT   ztAPIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.APICriticalUpdateTransition.validate_transition  s    t//025MM"?@ &&!+G4H4HMM"TU U##;6MM$I+"WX ((,EEMM$GH]H]HcHcHeGffl"mn ''D,?,?1,D$(M(&IJ3;17+.v;.2.A.A+/+;+;	  r+   c           
         | j                   | j                  | j                  |j                  r|j                  j                  nd |j
                  j                         dt        |j
                  j                                dS )Ncrit_)r  r  r  authorized_byr   critical_update_id)r  r  r  r[   r#   r\   rZ   rb   rM   s     r)   r]   zkAPIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.APICriticalUpdateTransition.transitionA  sr    #'#3#3&*&9&9'+';';@G@T@TW%9%9%<%<Z^")"3"3"="="?,1#g6G6G6Q6Q6S2T1U*V r+   r-   )r^   r_   r`   ra   r   r  rd   rc   r  rb   r  r  re   r   r   rN   rT   r   r   r]   rL   r+   r)   APICriticalUpdateTransitionr    s    ;$S6OPKP"'aEY"ZNCZ',S>h'ii$)$<f$gOTg,9J0K ,WZ ,&3D & &P*; S#X r+   r%  r  r   valid_token_12345T)r  r  r  r  c           	      X   	  di | }t        j                  j                  ||j                               }|j	                  |       |j                  |      }ddj                  j                  |j                         |ddS # t        $ r}dddd	t        |      d
cY d}~S d}~wt        $ r@}dddt        |      |j                  j                  dg       |j                  dcY d}~S d}~wt        $ r-}ddddt        |t              st        |      ndd
cY d}~S d}~ww xY w)z0Simulate API endpoint with proper error handlingr      T)rm   rn   update_details)status_coderp   rr     FBad RequestzInvalid request data)r*  rp   rs   rq   detailsN  Validation Failedr  )r*  rp   rs   rq   r  rH   i  zInternal Server ErrorzAn unexpected error occurredzServer errorrL   )r   r   r"   rN   rT   r]   r   r@   rd   r   rH   get	Exceptionr   )rl   rS   r]   rH   r   r{   r%  r(   s         r)   simulate_api_endpointzZAPIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.simulate_api_endpointU  s>   98H<H
 ,++!%"/!+!<!<!>	 ..w7 $..w7 $'##'#3#3#6#6%/%@%@%B*0    $'$*5"1v  - 	 $'$0"1v)*7JB)O yy    $'$4=-79-Es1v> sB   BB
 
	D)B)#D))D)55C0*D)0D)<"D$D)$D)r*  r(  rp   r)  rr   r  )r  r  r  r+  rs   r,  invalid_typer   shortr.  r/  r  r   r   )rS   c              3   $   K   | ]  }d |v  
 yw)zcompleted tasksNrL   ).0rs   s     r)   	<genexpr>zNAPIIntegrationExampleTests.test_api_error_handling_patterns.<locals>.<genexpr>  s     M%$-Ms   N)r   )r   r   r   r0  any)r(   valid_requestr2  r	  r|   business_logic_error_requestr  r%  s   `      @r)    test_api_error_handling_patternsz;APIIntegrationExampleTests.test_api_error_handling_patterns  s    
#6+@	A;	. ;	 
B;	B ,#6#	
;	| )7&#---	"""8F#3333 , #6
 )9&#---I&&& M111 *#*#	(
$ ))EF&#---I&&& $7777"h...8/01A555 )kR&#---$LL)<bAM;LMMMMr+   c                    t        dd       G d dt                     }t        dd       G d d|             }dd	d
} |d#i |}t        | j                  d|j	                               }|j                  |      }|d   dk(  sJ |d   dk(  sJ d|vsJ dddddgddddd} |d#i |}|j                  |      }	|	d   dk(  sJ |	d   dk(  sJ |	d   dk(  sJ t        |	d         dk(  sJ |	d   dk(  sJ d|	d   v sJ d d!d
}
 |d#i |
}|j                  |      }|d   dk(  sJ |d   d k(  sJ |d   J |d   g k(  sJ |d   J |d   i k(  sJ y")$z
        API EXAMPLE: API versioning with backward compatibility

        Shows how to handle API versioning using transition inheritance
        and maintain backward compatibility.
        r   update_task_v1c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<   dd
e	e
   defdZd
e
deeef   fdZy	)iAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility.<locals>.UpdateTaskV1TransitionzVersion 1 task update API.zNew task statusr3   r   r9   zUpdate notesr   NrH   rI   c                     | j                   S r-   )r   rM   s     r)   rN   zzAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility.<locals>.UpdateTaskV1Transition.get_target_state  s    {{"r+   c                 h    | j                   | j                  d|j                  j                         dS )NrV   )r   r   rY   r   )r   r   r\   rZ   rM   s     r)   r]   ztAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility.<locals>.UpdateTaskV1Transition.transition  s/    "kk!ZZ#'")"3"3"="="?	 r+   r-   )r^   r_   r`   ra   r   r   rd   rc   r   r   r   rN   r   r   r]   rL   r+   r)   UpdateTaskV1Transitionr?    s^    +1BCFCCr~>E3>#9J0K #WZ #*; S#X r+   rB  update_task_v2c                        e Zd ZU dZ edd      Zee   ed<    ee	d      Z
ee   ed<    edd	d
      Zee   ed<    eed      Zeeef   ed<   dedeeef   f fdZ xZS )iAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility.<locals>.UpdateTaskV2Transitionz0Version 2 task update API with enhanced featuresNzTask priorityr3   r7   z	Task tagsr   r   r   zEstimated hoursr   estimated_hourszAdditional metadatar   rH   rI   c                     t         |   |      }| j                  | j                  | j                  | j
                  dd}i ||S )Nv2)r7   r   rF  r   rY   )superr]   r7   r   rF  r   )r(   rH   	base_datav2_data	__class__s       r)   r]   ztAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility.<locals>.UpdateTaskV2Transition.transition  sN    !G.w7	 !% II'+';'; $#' 0)/w//r+   )r^   r_   r`   ra   r   r7   r   rd   rc   r   r   r   rF  r   r   r   r   r   r   r]   __classcell__)rL  s   @r)   UpdateTaskV2TransitionrE    s    B&+Do&NHhsmN#DkRD$s)R/4TaM^/_OXe__',TOd'eHd38ne0*; 0S#X 0 0r+   rN  r   zStarted working on task)r   r   rP   )rj   rS   rk   rY   rV   r   r7   z.Started working on task with enhanced trackingr>   r?   zclient-facingg      @rg   development)r  project_phase)r   r   r7   r   rF  r   rH  r   r   rF  r  r   r   zTask finishedNrL   )r   r   r   r   rN   r]   r   )r(   rB  rN  
v1_requestv1_transitionrH   	v1_result
v2_requestv2_transition	v2_resultv2_minimal_requestv2_minimal_transitionv2_minimal_results                r)   .test_api_versioning_and_backward_compatibilityzIAPIIntegrationExampleTests.test_api_versioning_and_backward_compatibility  s!    
#6+;	<	^ 	 
=	$ 
#6+;	<	0%; 	0 
=	00 !.8QR
.<<###9=KiKiKk
 ",,W5	'4///"m333*** $E/"&)MJ

 /<<!,,W5	'4///"m333$...9V$%****+s222i
3333 )4oN 6 L9K L1<<WE /4777 *k999 ,444 (B... !23;;; ,222r+   N)r^   r_   r`   ra   r*   r.   r}   r   r   r
  r;  rZ  rL   r+   r)   r   r      s=    1 FF;Pe1NoDbk?ZsNj`3r+   r   )ra   r   r   r   typingr   r   r   r   unittest.mockr	   rv   django.testr
   fsm.registryr   r   fsm.transition_utilsr   fsm.transitionsr   r   r   pydanticr   r   r   rL   r+   r)   <module>rb     sF     ( , ,     G 
 &~3 ~3r+   