
    	]jܺ                        d Z ddlmZmZ ddlmZmZmZ ddlmZm	Z	 ddl
Z
ddlmZ ddlm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  e       Z G d d      Z G d d      Z G d d      Z  G d d      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z%e
jL                  d        Z'e
jL                  d        Z(d Z)d  Z*d! Z+d" Z,d# Z-d$ Z.d% Z/d& Z0d' Z1y)(a  
Comprehensive tests for the declarative Pydantic-based transition system.

This test suite provides extensive coverage of the new transition system,
including usage examples, edge cases, validation scenarios, and integration
patterns to serve as both tests and documentation.
    )datetime	timedelta)AnyDictOptional)MockpatchN)get_user_model)TestCase)timezone)register_state_transitiontransition_registry)get_available_transitions)BaseTransitionTransitionContextTransitionValidationError)FieldValidationErrorc                       e Zd ZdZdZdZy)TestStateChoicesCREATEDIN_PROGRESS	COMPLETEDN)__name__
__module____qualname__r   r   r        Q/root/env/lib/python3.12/site-packages/label_studio/fsm/tests/test_transitions.pyr   r      s    GKIr   r   c                       e Zd ZdZddZy)
MockEntityzMock entity model for testingc                     || _         || _        d| _        t               | _        d| j                  _        d| j                  _        y )N   test_entityztest.testentitypkidorganization_idr   _meta
model_namelabel_lowerselfr&   s     r   __init__zMockEntity.__init__'   s9     V
 -

!2

r   Nr#   r   r   r   __doc__r.   r   r   r   r!   r!   $   s
    '3r   r!   c                       e Zd ZdZddZy)MockTaskzMock task model for testingc                     || _         || _        d| _        t               | _        d| j                  _        d| j                  _        y )Nr#   taskz
tasks.taskr%   r,   s     r   r.   zMockTask.__init__3   s9     V
 &

!-

r   Nr/   r0   r   r   r   r3   r3   0   s
    %.r   r3   c                       e Zd ZdZddZy)MockAnnotationz!Mock annotation model for testingc                     || _         || _        ddi| _        d| _        t	               | _        d| j
                  _        d| j
                  _        y )Ntestdatar#   
annotationztasks.annotation)r&   r'   resultr(   r   r)   r*   r+   r,   s     r   r.   zMockAnnotation.__init__?   sE    v& V
 ,

!3

r   Nr/   r0   r   r   r   r7   r7   <   s
    +4r   r7   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)CoreFrameworkTestsz!Test core framework functionalityc                 n    t         j                  j                  dd      | _        t	               | _        y)zSet up test datatest@example.comtest123emailpasswordNUserobjectscreate_useruserr!   mock_entityr-   s    r   setUpzCoreFrameworkTests.setUpL   s)    LL,,3EPY,Z	%<r   c                     t        dd       G d dt                     } |d      }|j                  dk(  sJ |j                         t        j
                  k(  sJ |j                  dk(  sJ y)z*Test BaseTransition abstract functionalityr$   test_transitionc                   ^    e Zd ZU  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)ECoreFrameworkTests.test_base_transition_class.<locals>.TestTransitiondefaultz
Test fielddescription
test_fieldNcontextreturnc                 "    t         j                  S Nr   r   r-   rU   s     r   get_target_statezVCoreFrameworkTests.test_base_transition_class.<locals>.TestTransition.get_target_stateX       '333r   c                     d| j                   iS NrT   rT   rZ   s     r   
transitionzPCoreFrameworkTests.test_base_transition_class.<locals>.TestTransition.transition[   s    $doo66r   rX   )r   r   r   r   rT   str__annotations__r   r   r[   r   r   r`   r   r   r   TestTransitionrP   T   sI    #I<HJH49J0K 4WZ 47*; 7S#X 7r   rc   
test_valuer_   N)r   r   rT   r[   r   r   transition_name)r-   rc   r`   s      r   test_base_transition_classz-CoreFrameworkTests.test_base_transition_classQ   sy     
#=2C	D	7^ 	7 
E	7 $|<
$$444**,0@0L0LLLL))->>>>r   c                    t        | j                  | j                  t        j                  t        j
                  d      }|j                  | j                  k(  sJ |j                  t        j                  k(  sJ |j                  t        j
                  k(  sJ |j                  | j                  k(  sJ |j                  sJ |j                  rJ y)z$Test TransitionContext functionalityr#   )entitycurrent_usercurrent_statetarget_stater(   N)r   rJ   rI   r   r   r   rh   rj   rk   ri   has_current_stateis_initial_transitionrZ   s     r   test_transition_contextz*CoreFrameworkTests.test_transition_contextd   s    ###*22)55
 ~~!1!1111$$(8(@(@@@@##'7'C'CCCC##tyy000((((00000r   c                 (   t        | j                  dt        j                        }|j                  sJ |j
                  rJ t        | j                  t        j                  t        j                        }|j                  rJ |j
                  sJ y)z*Test TransitionContext computed propertiesNrh   rj   rk   )r   rJ   r   r   rm   rl   r   )r-   rU   context_with_states      r   "test_transition_context_propertiesz5CoreFrameworkTests.test_transition_context_propertiesu   s     $4+;+;4^n^v^vw,,,,,,,, /##*22)55

 &;;;;!3333r   c                     t        dd       G d dt                     }t        j                  dd      }||k(  sJ t        j                  d      }d|v sJ |d   |k(  sJ y)z*Test transition registration and retrievalr$   rN   c                   >    e Zd Zddee   defdZdedeeef   fdZ	y)CCoreFrameworkTests.test_transition_registry.<locals>.TestTransitionNrU   rV   c                 "    t         j                  S rX   r   r   rZ   s     r   r[   zTCoreFrameworkTests.test_transition_registry.<locals>.TestTransition.get_target_state       '111r   c                     i S rX   r   rZ   s     r   r`   zNCoreFrameworkTests.test_transition_registry.<locals>.TestTransition.transition       	r   rX   
r   r   r   r   r   ra   r[   r   r   r`   r   r   r   rc   ru      8    29J0K 2WZ 2*; S#X r   rc   N)r   r   r   get_transitionget_transitions_for_entity)r-   rc   	retrievedentity_transitionss       r   test_transition_registryz+CoreFrameworkTests.test_transition_registry   s     
#=2C	D	^ 	 
E	 (66}FWX	N*** 1KKMZ $6666!"34FFFr   c                     t        dd       G d dt                     } |d      }|j                  dk(  sJ |j                  dk(  sJ t	        j
                  t              5   |        ddd       y# 1 sw Y   yxY w)	'Test Pydantic validation in transitionsr$   validated_transitionc                   |    e Zd ZU  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)HCoreFrameworkTests.test_pydantic_validation.<locals>.ValidatedTransition.Required fieldrR   required_field*   zOptional fieldoptional_fieldNrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zYCoreFrameworkTests.test_pydantic_validation.<locals>.ValidatedTransition.get_target_state   rx   r   c                 4    | j                   | j                  dS )Nr   r   r   rZ   s     r   r`   zSCoreFrameworkTests.test_pydantic_validation.<locals>.ValidatedTransition.transition   s    *.*=*=QUQdQdeer   rX   )r   r   r   r   r   ra   rb   r   intr   r   r[   r   r   r`   r   r   r   ValidatedTransitionr      s_    "'9I"JNCJ"'8H"INCI29J0K 2WZ 2f*; fS#X fr   r   r9   r   r   N)r   r   r   r   pytestraisesr   )r-   r   r`   s      r   test_pydantic_validationz+CoreFrameworkTests.test_pydantic_validation   s     
#=2H	I	f. 	f 
J	f )?
((F222((B... ]]?+ 	"!	" 	" 	"s   #A44A=c                    t        dd       G d dt                     } |d      }t        | j                  t        j
                  |j                         t        j                               }|j                  |      sJ |j                  |      }|d   dk(  sJ |d   | j                  j                  k(  sJ d	|v sJ y
)zTest transition execution logicr$   execution_testc                   n    e Zd ZU  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)MCoreFrameworkTests.test_transition_execution.<locals>.ExecutionTestTransitionr9   
Test valuerR   valueNrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   z^CoreFrameworkTests.test_transition_execution.<locals>.ExecutionTestTransition.get_target_state   rx   r   c                 <    |j                   t        j                  k(  S rX   rj   r   r   rZ   s     r   validate_transitionzaCoreFrameworkTests.test_transition_execution.<locals>.ExecutionTestTransition.validate_transition   s    ,,0@0L0LLLr   c                 z    | j                   |j                  j                  |j                  j	                         dS )N)r   	entity_id	timestamp)r   rh   r&   r   	isoformatrZ   s     r   r`   zXCoreFrameworkTests.test_transition_execution.<locals>.ExecutionTestTransition.transition   s2    !ZZ!(!2!2!(!2!2!<!<!> r   rX   )r   r   r   r   r   ra   rb   r   r   r[   boolr   r   r   r`   r   r   r   ExecutionTestTransitionr      s`    v<@E3@29J0K 2WZ 2M3D M M*; S#X r   r   r   )rh   rj   rk   r   r   r   r   N)r   r   r   rJ   r   r   r[   r   nowr   r`   r&   )r-   r   r`   rU   r<   s        r   test_transition_executionz,CoreFrameworkTests.test_transition_execution   s     
#=2B	C	n 	 
D	  -3CD
###*66#446lln	
 --g666 &&w/g"2222k"d&6&6&9&9999f$$$r   c                    t        dd       G d dt                     } |       }t        | j                  t        j
                  |j                               }|j                  |      sJ t        | j                  t        j                  |j                               }t        j                  t              5 }|j                  |       ddd       j                  }dt        |      v sJ d|j                  v sJ y# 1 sw Y   5xY w)	z)Test transition validation error handlingr$   validation_testc                   N    e Z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)SCoreFrameworkTests.test_validation_error_handling.<locals>.ValidationTestTransitionNrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zdCoreFrameworkTests.test_validation_error_handling.<locals>.ValidationTestTransition.get_target_state   rx   r   c                 n    |j                   t        j                  k7  rt        dd|j                   i      y)N(Can only complete from IN_PROGRESS staterj   T)rj   r   r   r   rZ   s     r   r   zgCoreFrameworkTests.test_validation_error_handling.<locals>.ValidationTestTransition.validate_transition   s:    ((,<,H,HH3B_V]VkVkDl  r   c                     i S rX   r   rZ   s     r   r`   z^CoreFrameworkTests.test_validation_error_handling.<locals>.ValidationTestTransition.transition   rz   r   rX   )r   r   r   r   r   ra   r[   r   r   r   r   r`   r   r   r   ValidationTestTransitionr      sL    29J0K 2WZ 23D  *; S#X r   r   rp   Nr   rj   )r   r   r   rJ   r   r   r[   r   r   r   r   r   r   ra   rU   )r-   r   r`   valid_contextinvalid_contextcmerrors          r   test_validation_error_handlingz1CoreFrameworkTests.test_validation_error_handling   s     
#=2C	D	~ 	 
E	 ./
 *##*66#446

 --m<<< ,##*22#446
 ]]45 	<**?;	< 9SZGGG%--///	< 	<s   :D  D	c                     t        dd       G d dt                     }ddlm}  |j                  dd      }|J  |d	      }|j
                  dk(  sJ |j                         t        j                  k(  sJ y)
z,Test StateManager-based transition executionr$   state_manager_testc                   ^    e Zd ZU  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)^CoreFrameworkTests.test_state_manager_transition_execution.<locals>.StateManagerTestTransitionrQ   r   rR   r   NrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zoCoreFrameworkTests.test_state_manager_transition_execution.<locals>.StateManagerTestTransition.get_target_state  rx   r   c                     d| j                   iS )Nr   r   rZ   s     r   r`   ziCoreFrameworkTests.test_state_manager_transition_execution.<locals>.StateManagerTestTransition.transition
  s    ,,r   rX   )r   r   r   r   r   ra   rb   r   r   r[   r   r   r`   r   r   r   StateManagerTestTransitionr     sI    ylCE3C29J0K 2WZ 2-*; -S#X -r   r   r   )r   Nstate_manager_test_valuer   )	r   r   fsm.registryr   r}   r   r[   r   r   )r-   r   r   transition_classr`   s        r   'test_state_manager_transition_executionz:CoreFrameworkTests.test_state_manager_transition_execution   s     
#=2F	G	- 	- 
H	- 	5 >.==mMab+++ &,FG
#====**,0@0J0JJJJr   c                 J   g t        dd       G fddt                     } |       }t        | j                  t        j
                  |j                               }|j                  |       |j                  |       |j                  |t                      g dk(  sJ y)zTest transition lifecycle hooksr$   	hook_testc                   l    e Zd Zddee   defdZdeddf fdZdedeee	f   f fdZ
deddf fdZy)	DCoreFrameworkTests.test_transition_hooks.<locals>.HookTestTransitionNrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zUCoreFrameworkTests.test_transition_hooks.<locals>.HookTestTransition.get_target_state!  rx   r   c                 (    j                  d       y )Npreappendr-   rU   
hook_callss     r   pre_transition_hookzXCoreFrameworkTests.test_transition_hooks.<locals>.HookTestTransition.pre_transition_hook$  s    !!%(r   c                 *    j                  d       i S )Nr`   r   r   s     r   r`   zOCoreFrameworkTests.test_transition_hooks.<locals>.HookTestTransition.transition'  s    !!,/	r   c                 (    j                  d       y )Npostr   )r-   rU   state_recordr   s      r   post_transition_hookzYCoreFrameworkTests.test_transition_hooks.<locals>.HookTestTransition.post_transition_hook+  s    !!&)r   rX   )r   r   r   r   r   ra   r[   r   r   r   r`   r   )r   s   r   HookTestTransitionr     sb    29J0K 2WZ 2)3D ) )*; S#X *4E *X\ *r   r   rp   )r   r`   r   N)r   r   r   rJ   r   r   r[   r   r`   r   r   )r-   r   r`   rU   r   s       @r   test_transition_hooksz(CoreFrameworkTests.test_transition_hooks  s     
	"=+	>	* 	* 
?	* ()
###*66#446
 	&&w/g&''8::::r   N)r   r   r   r1   rL   rf   rn   rr   r   r   r   r   r   r   r   r   r   r>   r>   I   s;    +(
?&1"4 G(".#%J)0VK4 ;r   r>   c                   (    e Zd ZdZd Zd Zd Zd Zy)TransitionUtilsTestsz+Test cases for transition utility functionsc                 n    t         j                  j                  dd      | _        t	               | _        y )Nr@   rA   rB   rE   rK   s    r   rL   zTransitionUtilsTests.setUp@  s)    LL,,3EPY,Z	%<r   c                     t        dd       G d dt                     }t        | j                        }d|v sJ |d   |k(  sJ t	               }d|j
                  _        t        |      }t        |      dk(  sJ y)z&Test get_available_transitions utilityr$   available_testc                   >    e Zd Zddee   defdZdedeeef   fdZ	y)TTransitionUtilsTests.test_get_available_transitions.<locals>.AvailableTestTransitionNrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zeTransitionUtilsTests.test_get_available_transitions.<locals>.AvailableTestTransition.get_target_stateI  rx   r   c                     i S rX   r   rZ   s     r   r`   z_TransitionUtilsTests.test_get_available_transitions.<locals>.AvailableTestTransition.transitionL  rz   r   rX   r{   r   r   r   AvailableTestTransitionr   G  r|   r   r   other_entityr   N)r   r   r   rJ   r!   r)   r*   len)r-   r   	available
mock_otherother_availables        r   test_get_available_transitionsz3TransitionUtilsTests.test_get_available_transitionsD  s     
#=2B	C	n 	 
D	 .d.>.>?	9,,,)*.EEEE  \
&4
#3J??#q(((r   c                    ddl m} t        dd       G d dt                     }t        dd       G d d	t                     }t	        | j
                  d
      }t        |      dk(  sJ d|v sJ d|v sJ t               }t        j                  |_
        t        j                  |d|      5  t	        | j
                  d      }t        |      dk(  sJ d|v sJ d|vsJ 	 ddd       t        j                  |_
        t        j                  |d|      5  t	        | j
                  d      }t        |      dk(  sJ d|v sJ d|vsJ 	 ddd       t        j                  |_
        t        j                  |d|      5  t	        | j
                  d      }t        |      dk(  sJ 	 ddd       y# 1 sw Y   xY w# 1 sw Y   txY w# 1 sw Y   yxY w)z9Test the validation behavior of get_available_transitionsr   StateManagerr$   validation_test_1c                   T    e Zd Zddee   defdZedefd       Z	dede
eef   fdZy)fTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition1NrU   rV   c                 "    t         j                  S rX   rY   rZ   s     r   r[   zwTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition1.get_target_state_  r\   r   c                 <    |j                   t        j                  k(  S rX   )rj   r   r   clsrU   s     r   can_transition_from_statezTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition1.can_transition_from_stateb  s     ,,0@0H0HHHr   c                     i S rX   r   rZ   s     r   r`   zqTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition1.transitiong  rz   r   rX   r   r   r   r   r   ra   r[   classmethodr   r   r   r   r`   r   r   r   ValidationTestTransition1r   ]  sV    49J0K 4WZ 4 I4 I I*; S#X r   r   validation_test_2c                   T    e Zd Zddee   defdZedefd       Z	dede
eef   fdZy)fTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition2NrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zwTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition2.get_target_statel  rx   r   c                 <    |j                   t        j                  k(  S rX   r   r   s     r   r   zTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition2.can_transition_from_stateo  s     ,,0@0L0LLLr   c                     i S rX   r   rZ   s     r   r`   zqTransitionUtilsTests.test_get_available_transitions_with_validation.<locals>.ValidationTestTransition2.transitiont  rz   r   rX   r   r   r   r   ValidationTestTransition2r   j  sV    29J0K 2WZ 2 M4 M M*; S#X r   r   Fvalidate   get_current_state_objectreturn_valueTr#   N)fsm.state_managerr   r   r   r   rJ   r   r   r   r   stater	   objectr   r   )r-   r   r   r   all_availablemock_state_objectvalid_transitionss          r   .test_get_available_transitions_with_validationzCTransitionUtilsTests.test_get_available_transitions_with_validationY  s   2	"=2E	F
	 
	 
G
	 
#=2E	F
	 
	 
G
	 2$2B2BUS=!Q&&&"m333"m333 !F"2":":\\,(BQbc 	@ 9$:J:JUY Z()Q...&*;;;;&.????	@ #3">">\\,(BQbc 	@ 9$:J:JUY Z()Q...&*;;;;&.????	@ #3"<"<\\,(BQbc 	/ 9$:J:JUY Z()Q...	/ 	/)	@ 	@	@ 	@	/ 	/s$   -4F34F?(G3F<?GGc                 Z   ddl m} t        dd       G d dt                     }t	        | j
                  d      }d|v sJ t               }t        j                  |_	        t        j                  |d	|
      5  t	        | j
                  d      }d|v sJ 	 ddd       y# 1 sw Y   yxY w)zRTest that transitions with required fields are handled correctly during validationr   r   r$   required_field_transitionc                   t    e Zd ZU  edd      Zeed<   ddee   defdZ	e
defd	       Zdedeeef   fd
Zy)iTransitionUtilsTests.test_get_available_transitions_with_required_fields.<locals>.RequiredFieldTransition.zThis field is requiredrR   r   NrU   rV   c                 "    t         j                  S rX   rY   rZ   s     r   r[   zzTransitionUtilsTests.test_get_available_transitions_with_required_fields.<locals>.RequiredFieldTransition.get_target_state  r\   r   c                      yNTr   r   s     r   r   zTransitionUtilsTests.test_get_available_transitions_with_required_fields.<locals>.RequiredFieldTransition.can_transition_from_state  s     r   c                     d| j                   iS )Nr   r   rZ   s     r   r`   ztTransitionUtilsTests.test_get_available_transitions_with_required_fields.<locals>.RequiredFieldTransition.transition  s    ($*=*=>>r   rX   )r   r   r   r   r   ra   rb   r   r   r[   r   r   r   r   r   r`   r   r   r   RequiredFieldTransitionr	    se    "'9Q"RNCR49J0K 4WZ 4 4  ?*; ?S#X ?r   r  Fr   r   r   TN)r   r   r   r   r   rJ   r   r   r   r   r	   r  )r-   r   r  r  r  r  s         r   3test_get_available_transitions_with_required_fieldszHTransitionUtilsTests.test_get_available_transitions_with_required_fields  s    2	"=2M	N	?n 	? 
O	? 2$2B2BUS*m;;; !F"2":":\\,(BQbc 		D !:$:J:JUY Z
 /2CCCC		D 		D 		Ds   9B!!B*N)r   r   r   r1   rL   r   r  r  r   r   r   r   r   =  s    5()*?/B$Dr   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)ComprehensiveUsageExampleTestsz
    Comprehensive test cases demonstrating various usage patterns.

    These tests serve as both validation and documentation for how to
    implement and use the declarative transition system.
    c                     t               | _        t               | _        d| j                  _        d| j                  _        y )N{   testuser)r3   r5   r   rI   r'   usernamerK   s    r   rL   z$ComprehensiveUsageExampleTests.setUp  s+    J	F			'		r   c                 ^    G d dt               } |d      }|j                  dk(  sJ |j                         dk(  sJ t        | j                  | j
                  d|j                               }|j                  |      sJ |j                  |      }|d   dk(  sJ |d	   d
k(  sJ d|v sJ y)z
        USAGE EXAMPLE: Basic transition implementation

        Shows how to implement a simple transition with validation.
        c                   r    e Zd ZU dZ 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)\ComprehensiveUsageExampleTests.test_basic_transition_implementation.<locals>.BasicTransitionz.Example: Simple transition with required field.zMessage for the transitionrR   messageNrU   rV   c                      yN	PROCESSEDr   rZ   s     r   r[   zmComprehensiveUsageExampleTests.test_basic_transition_implementation.<locals>.BasicTransition.get_target_state      "r   c                 8    |j                   dk(  rt        d      y)Nr   zCannot process completed itemsT)rj   r   rZ   s     r   r   zpComprehensiveUsageExampleTests.test_basic_transition_implementation.<locals>.BasicTransition.validate_transition  s    ((K734TUUr   c                     | j                   |j                  r|j                  j                  nd|j                  j	                         dS )Nsystem)r  processed_byprocessed_at)r  ri   r  r   r   rZ   s     r   r`   zgComprehensiveUsageExampleTests.test_basic_transition_implementation.<locals>.BasicTransition.transition  s?    #||ELEYEYG$8$8$A$A_g$+$5$5$?$?$A r   rX   )r   r   r   r1   r   r  ra   rb   r   r   r[   r   r   r   r   r`   r   r   r   BasicTransitionr    sa    @ 2NOGSO#9J0K #WZ #3D  *; S#X r   r#  zProcessing task)r  r  r   rh   ri   rj   rk   r  r!  r  r"  N)r   r  r[   r   r5   rI   r   r`   )r-   r#  r`   rU   r:   s        r   $test_basic_transition_implementationzCComprehensiveUsageExampleTests.test_basic_transition_implementation  s    	n 	, %->?
!!%6666**,;;; $99##446	
 --g666 $$W-I"3333N#z111%%%r   c                     G d dt               }t        j                         t        d      z   } |dd|      }t	        | j
                  | j                  d|j                         	      }|j                  |      sJ d
|_	        t        j                  t              5 }|j                  |       ddd       dt        j                        v sJ d
t        |j                        v sJ t        j                         t        d      z
  } |d|      }d|_	        t        j                  t              5 }|j                  |       ddd       dt        |j                        v sJ y# 1 sw Y   xY w# 1 sw Y   /xY w)z
        USAGE EXAMPLE: Complex validation with multiple conditions

        Shows how to implement sophisticated business logic validation.
        c                       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<   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	)`ComprehensiveUsageExampleTests.test_complex_validation_example.<locals>.TaskAssignmentTransitionz/Example: Complex validation for task assignment.zUser to assign task torR   assignee_idnormalzTask prioritypriorityNzTask deadlinedeadlinerU   rV   c                      y)NASSIGNEDr   rZ   s     r   r[   zqComprehensiveUsageExampleTests.test_complex_validation_example.<locals>.TaskAssignmentTransition.get_target_state  s    !r   c                    |j                   dvr:t        d|j                    |j                   |j                  j                  d      | j                  rG| j                  t        j                         k  r&t        dd| j                  j                         i      g d}| j                  |vrt        d| j                   d|i      y	)
N)r   
UNASSIGNEDzCannot assign task in state )rj   task_idDeadline must be in the futurer,  )lowr*  highurgentzInvalid priority: valid_prioritiesT)	rj   r   rh   r&   r,  r   r   r   r+  )r-   rU   r6  s      r   r   ztComprehensiveUsageExampleTests.test_complex_validation_example.<locals>.TaskAssignmentTransition.validate_transition  s    ((0II36w7L7L6MN*1*?*?GNNL]L]^  ==T]]hlln%D38:t}}G^G^G`:a 
 $G ==(883,T]]O<?QSc>d  r   c                     | j                   | j                  | j                  r| j                  j                         nd |j                  r|j                  j
                  nd d| j                    dS )NzTask assigned to user )r)  r+  r,  assigned_byassignment_reason)r)  r+  r,  r   ri   r'   rZ   s     r   r`   zkComprehensiveUsageExampleTests.test_complex_validation_example.<locals>.TaskAssignmentTransition.transition(  s`    #'#3#3 $=A]] 7 7 9PT>E>R>R7#7#7#:#:X\+A$BRBRAS)T r   rX   )r   r   r   r1   r   r)  r   rb   r+  ra   r,  r   r   r   r[   r   r   r   r   r`   r   r   r   TaskAssignmentTransitionr(    s    A$S6NOKO!(HHcH!&t!IHhI"9J0K "WZ "3D  .*; S#X r   r:     )days  r4  )r)  r+  r,  r   r$  r   NzCannot assign task in stater#   )r)  r,  r2  )r   r   r   r   r   r5   rI   r[   r   rj   r   r   r   ra   r   )r-   r:  future_deadliner`   rU   r   past_deadlineinvalid_transitions           r   test_complex_validation_examplez>ComprehensiveUsageExampleTests.test_complex_validation_example   sS   (	~ (	V #,,.9!+<<-#Yhi
#99##446	
 --g666 !,]]45 	4**73	4 -BHH===c"((m+++ !)::5#P]^ )]]45 	<227;	< 03rxx=@@@	4 	4	< 	<s    E+7E7+E47F c                 v   t        dd       G d dt                     }t        j                  dd      }||k(  sJ t        j                  d      }d|v sJ t               }d|_        d|j                  _        dt        j                         t        d      z   d	} |di |}|j                         d
k(  sJ y)z
        USAGE EXAMPLE: Using the registry and decorator system

        Shows how to register transitions and use the decorator syntax.
        documentpublishc                       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)cComprehensiveUsageExampleTests.test_registry_and_decorator_usage.<locals>.PublishDocumentTransitionz)Example: Using the registration decoratorTzPublish immediatelyrR   publish_immediatelyNzScheduled publish timescheduled_timerU   rV   c                 "    | j                   rdS dS )N	PUBLISHED	SCHEDULED)rG  rZ   s     r   r[   ztComprehensiveUsageExampleTests.test_registry_and_decorator_usage.<locals>.PublishDocumentTransition.get_target_state^  s    &*&>&>{OKOr   c                     | j                   | j                  r| j                  j                         nd |j                  r|j                  j                  dS d dS )N)rG  rH  published_by)rG  rH  r   ri   r'   rZ   s     r   r`   znComprehensiveUsageExampleTests.test_registry_and_decorator_usage.<locals>.PublishDocumentTransition.transitiona  sZ    +/+C+CIMI\I\d&9&9&C&C&Ebf?F?S?SG$8$8$;$;  Z^ r   rX   )r   r   r   r1   r   rG  r   rb   rH  r   r   r   ra   r[   r   r   r`   r   r   r   PublishDocumentTransitionrF  W  sc    ;(-d@U(VV',T?W'XNHXP9J0K PWZ P*; S#X r   rN  r#   Fr   )hours)rG  rH  rK  Nr   )r   r   r   r}   r~   r   r&   r)   r*   r   r   r   r[   )r-   rN  registered_classdocument_transitionsmock_documenttransition_datar`   s          r   !test_registry_and_decorator_usagez@ComprehensiveUsageExampleTests.test_registry_and_decorator_usageP  s     
#:y	9	 	 
:	" /==j)T#<<<<  3MMjY0000 )3& 388<<>\elm\nKno /AA
**,;;;r   N)r   r   r   r1   rL   r%  rA  rT  r   r   r   r  r    s    (/&bNA`*<r   r  c                   "    e Zd ZdZd Zd Zd Zy)ValidationAndErrorHandlingTestsz
    Tests focused on validation scenarios and error handling.

    These tests demonstrate proper error handling patterns and
    validation edge cases.
    c                 "    t               | _        y rX   )r3   r5   rK   s    r   rL   z%ValidationAndErrorHandlingTests.setUp  s    J	r   c                     G d dt               }t        j                  t              5   |dd       ddd       t        j                  t              5   |ddd	       ddd       t        j                  t              5   |ddd
	       ddd        |ddd	      }|j                  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)z%Test Pydantic field validation errorsc                       e Zd ZU  edd      Zeed<    eddd      Zeed<    edd	d
d      Ze	ed<   dde
e   defdZedefd       Zededefd       Zdedeeef   fdZy)cValidationAndErrorHandlingTests.test_pydantic_validation_errors.<locals>.StrictValidationTransition.r   rR   r   z^[\w\.-]+@[\w\.-]+\.\w+$zValid email)patternrS   email_fieldr#   d   zNumber between 1-100)gelerS   number_fieldNrU   rV   c                      yN	VALIDATEDr   rZ   s     r   r[   ztValidationAndErrorHandlingTests.test_pydantic_validation_errors.<locals>.StrictValidationTransition.get_target_state  r  r   c                      yrb  r   )r   s    r   r[   ztValidationAndErrorHandlingTests.test_pydantic_validation_errors.<locals>.StrictValidationTransition.get_target_state  s    "r   c                      yr  r   r   s     r   r   z}ValidationAndErrorHandlingTests.test_pydantic_validation_errors.<locals>.StrictValidationTransition.can_transition_from_state  s    r   c                 
    ddiS )N	validatedTr   rZ   s     r   r`   znValidationAndErrorHandlingTests.test_pydantic_validation_errors.<locals>.StrictValidationTransition.transition  s    #T**r   rX   )r   r   r   r   r   ra   rb   r\  r`  r   r   r   r[   r   r   r   r   r   r`   r   r   r   StrictValidationTransitionrZ    s    "'9I"JNCJ$S2M[hiKi %caCE[ \L#\#9J0K #WZ # # # # 8I d  +*; +S#X +r   rh  r@   2   )r\  r`  Nr9   zinvalid-email)r   r\  r`     zuser@example.comK   )r   r   r   r   r   )r-   rh  valid_transitions      r   test_pydantic_validation_errorsz?ValidationAndErrorHandlingTests.test_pydantic_validation_errors  s    	+ 	+( ]]?+ 	X&3ETVW	X ]]?+ 	l&f/hjk	l ]]?+ 	p&fJ\kno	p 6!/APR
  ..&888	X 	X	l 	l	p 	ps#   B3B?C3B<?CCc                     G d dt               }t        | j                  dd      } |d      }t        j                  t
              5 }|j                  |       ddd       j                  }d	t        |      v sJ d
|j                  v sJ  |d      }t        j                  t
              5 }|j                  |       ddd       dt        |j                        v sJ  |dd      }t        j                  t
              5 }|j                  |       ddd       dt        |j                        v sJ  |dd      }t        j                  t
              5 }|j                  |       ddd       t        |j                        }	d	|	v sJ d|	v sJ y# 1 sw Y   ?xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   PxY w)z:Test business logic validation with detailed error contextc                       e Zd ZU  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)eValidationAndErrorHandlingTests.test_business_logic_validation_errors.<locals>.BusinessRuleTransition.zTransaction amountrR   amountUSDzCurrency codecurrencyNrU   rV   c                      yr  r   rZ   s     r   r[   zvValidationAndErrorHandlingTests.test_business_logic_validation_errors.<locals>.BusinessRuleTransition.get_target_state  r  r   c                    g }| j                   dk  r|j                  d       | j                   dkD  r|j                  |j                  d       | j                  dvr|j                  d| j                          |j                  dk(  r|j                  d       |rAt        d	d
j                  |       || j                   | j                  |j                  d      y)Nr   Amount must be positivei'  (Large amounts require authenticated user)rr  EURGBPzUnsupported currency: 	CANCELLEDz%Cannot process cancelled transactionszValidation failed: z; )validation_errorsrq  rs  rj   T)rq  r   ri   rs  rj   r   join)r-   rU   errorss      r   r   zyValidationAndErrorHandlingTests.test_business_logic_validation_errors.<locals>.BusinessRuleTransition.validate_transition  s    ;;!#MM";<;;&7+?+?+GMM"LM==(==MM$:4==/"JK((K7MM"IJ3-dii.?-@A17&*kk(,-4-B-B	  r   c                 4    | j                   | j                  dS )Nrq  rs  r  rZ   s     r   r`   zpValidationAndErrorHandlingTests.test_business_logic_validation_errors.<locals>.BusinessRuleTransition.transition  s    "&++4==IIr   rX   )r   r   r   r   rq  floatrb   rs  ra   r   r   r[   r   r   r   r   r`   r   r   r   BusinessRuleTransitionrp    sr    !#3GHFEH!%_EHcE#9J0K #WZ #3D  :J*; JS#X Jr   r  PENDINGr  rp   i)rq  Nrv  r{  i:  rw  r]  XYZr  zUnsupported currencyi)
r   r   r5   r   r   r   r   r   ra   rU   )
r-   r  rU   negative_transitionr   r   large_transitioninvalid_currency_transitionmulti_error_transition	error_msgs
             r   %test_business_logic_validation_errorszEValidationAndErrorHandlingTests.test_business_logic_validation_errors  s   %	J^ %	JN $499I\gh 5DA]]45 	=33G<	= (CJ666"emm333 2?]]45 	:009	: :S]JJJ '=CRW&X#]]45 	E';;GD	E &RXX666 "8sU!S]]45 	@"66w?	@ M	(I555%2229	= 	=	: 	:	E 	E	@ 	@s0   
F1F&F2F>F#&F/2F;>GN)r   r   r   r1   rL   rm  r  r   r   r   rV  rV  }  s    &9PJ3r   rV  c                      t               S )zPytest fixture for mock task)r3   r   r   r   r5   r5     s     :r   c                  6    t               } d| _        d| _        | S )zPytest fixture for mock userr#   r  )r   r'   r  )rI   s    r   rI   rI     s     6DDGDMKr   c                     t        | |dd      }|j                  sJ |j                  rJ |j                  dk(  sJ |j                  dk(  sJ y)z.Test TransitionContext properties using pytestr   r   r$  N)r   rl   rm   rj   rk   )r5   rI   rU   s      r   rr   rr     sY    t$ifstG$$$$,,,,  I---=000r   c                       G d dt               }  | d      }|j                  dk(  sJ |j                  dk(  sJ t        j                  t
              5   |         ddd       y# 1 sw Y   yxY w)r   c                   N    e Zd ZU eed<   dZeed<   d	dee   defdZ	dede
fdZy)
2test_pydantic_validation.<locals>.SampleTransitionrT   r   r   NrU   rV   c                      y)N
TEST_STATEr   rZ   s     r   r[   zCtest_pydantic_validation.<locals>.SampleTransition.get_target_state  s    r   c                     d| j                   iS r^   r_   rZ   s     r   r`   z=test_pydantic_validation.<locals>.SampleTransition.transition!  s     $//22r   rX   )r   r   r   ra   rb   r   r   r   r   r[   dictr`   r   r   r   SampleTransitionr    s?      	 H5F,G 	 SV 	 	3&7 	3D 	3r   r  validr_   r   N)r   rT   r   r   r   r   )r  r`   s     r   r   r     sk    3> 3 "W5J  G+++$$*** 
	'   s   A%%A.c                      G d dt               }  | d      }|j                         J  t        dddt        d	dd
di      d             }t        |d      }|j                  J |j                  |      }|d   dk(  sJ y)z5Test side-effect only transitions (target_state=None)c                   Z    e Zd ZU dZeed<   d	dee   dee   fdZdede	fdZ
deddfdZy)
>test_side_effect_only_transition.<locals>.SideEffectTransitionnotification_sentaction_performedNrU   rV   c                      y rX   r   rZ   s     r   r[   zOtest_side_effect_only_transition.<locals>.SideEffectTransition.get_target_state4  s    r   c                     d| j                   iS )Nactionr  rZ   s     r   r`   zItest_side_effect_only_transition.<locals>.SideEffectTransition.transition8  s    d3344r   c                     |J y rX   r   )r-   rU   r   s      r   r   zStest_side_effect_only_transition.<locals>.SideEffectTransition.post_transition_hook<  s    '''r   rX   )r   r   r   r  ra   rb   r   r   r[   r  r`   r   r   r   r   SideEffectTransitionr  1  sV     3#3	H5F,G 	S[\_S` 		5&7 	5D 	5	(0A 	(TX 	(r   r  
email_sentr  Nr!   r   r#   Metar*   r9   )r&   r)   )rh   rk   r  )r   r[   typer   rk   r`   )r  r`   rJ   rU   r<   s        r    test_side_effect_only_transitionr  .  s    (~ (  &|DJ&&(000 g$|RDl\bMc<d)efhKG ''' ""7+F(|+++r   c                  .    G d dt               } t               } | d      }t        |t        j                  |j                         d      }t        j                  t              5 }|j                  |       ddd       j                  }dt        |      v sJ |j                  d	   t        j                  k(  sJ  | d
      }t        |t        j                  |j                         d      }|j                  |      }|d   d
k(  sJ |d   du sJ  | d      }	t        |t        j                  |	j                               }
|
j                  du sJ t        j                  t              5 }|	j                  |
       ddd       dt        |j                        v sJ  | d      }t        |t        j                  |j                         d      }|j                  |      }|d   dk(  sJ |d   du sJ y# 1 sw Y   xY w# 1 sw Y   xY w)a  
    Test the skip_validation flag in TransitionContext.

    This test validates step by step:
    - Creating a transition with validation logic that would normally fail
    - Verifying that validation runs and fails when skip_validation=False (default)
    - Verifying that validation is skipped when skip_validation=True
    - Confirming that prepare_and_validate respects the skip_validation flag
    - Ensuring the transition can execute successfully when validation is skipped

    Critical validation: The skip_validation flag provides a mechanism to bypass
    validation checks for special cases like system migrations, data imports, or
    administrative operations that need to override normal business rules.
    c                   r    e Zd ZU dZ 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)=test_skip_validation_flag.<locals>.StrictValidationTransitionz,Test transition with strict validation rules.zAction to performrR   r  NrU   rV   c                 "    t         j                  S rX   rw   rZ   s     r   r[   zNtest_skip_validation_flag.<locals>.StrictValidationTransition.get_target_statef  s    #---r   c                     |j                   t        j                  k7  r0t        d|j                    |j                   |j                  d      y)z=Validation that only allows transition from IN_PROGRESS statez.Can only complete from IN_PROGRESS state, not )rj   rk   T)rj   r   r   r   rk   rZ   s     r   r   zQtest_skip_validation_flag.<locals>.StrictValidationTransition.validate_transitioni  sN    $$(8(D(DD/DWEZEZD[\&-&;&;WMaMab  r   c                      | j                   ddS )NT)r  	completedr  rZ   s     r   r`   zHtest_skip_validation_flag.<locals>.StrictValidationTransition.transitionr  s    "kk==r   rX   )r   r   r   r1   r   r  ra   rb   r   r   r[   r   r   r   r   r`   r   r   r   rh  r  a  sa    :C-@AA	.H5F,G 	.SV 	.	/@ 	T 		>&7 	>DcN 	>r   rh  test_actionr  F)rh   rj   rk   skip_validationNr   rj   skip_validation_actionTr  r  default_actionrp   valid_action)r   r!   r   r   r   r[   r   r   r   prepare_and_validater   ra   rU   r  r   )rh  rJ   r`   context_with_validationr   r   transition_skipcontext_skip_validationr<   transition_defaultcontext_defaulttransition_validcontext_validresult_valids                 r   test_skip_validation_flagr  Q  s,    >^ >* ,K ,=AJ/&..002	 
0	1 AR''(?@A HHE5UCCC==)-=-E-EEEE 18PQO/&..$557	 112IJF (7777+$&&& 4;KL'&..'88:O **e333	0	1 AR//@A 6RXXFFF 2H%&22%668	M $88GL!^333$,,,kA AHA As   'G>2H>HHc                     t               } t        | t        j                  t        j                        }|j
                  J d}t        | t        j                  t        j                  |      }|j
                  |k(  sJ y)a  
    Test the reason field in TransitionContext.

    This test validates step by step:
    - Creating a TransitionContext with no reason (defaults to None)
    - Creating a TransitionContext with a custom reason
    - Verifying the reason is accessible on the context

    Critical validation: The reason field allows callers to provide context-specific
    reasons for transitions (e.g., "Bulk import completed") that override the
    transition's default get_reason() method.
    rp   Nz'Bulk import completed - 100 tasks addedrh   rj   rk   reason)r!   r   r   r   r   r  )rJ   r  custom_reasoncontext_with_reasons       r   $test_transition_context_reason_fieldr    s     ,K (&..%11O
 !!))) >M+&..%11	 %%666r   c                  f   t               } t        | t        j                  t        j                        }|j
                  i k(  sJ ddddddd}t        | t        j                  t        j                  |	      }|j
                  |k(  sJ |j
                  d
   dk(  sJ |j
                  d   du sJ y)a  
    Test the context_data field in TransitionContext.

    This test validates step by step:
    - Creating a TransitionContext with no context_data (defaults to empty dict)
    - Creating a TransitionContext with custom context_data
    - Verifying the context_data is accessible and correct

    Critical validation: The context_data field allows callers to add additional
    data to be stored in the state record's JSONB context_data field for
    historical tracking and auditing purposes.
    rp   cloud_storager  r]  apir=  F)import_source	import_id
task_counttriggered_bybatch_idis_automaticrh   rj   rk   context_datar  r  N)r!   r   r   r   r   r  )rJ   r  custom_context_datacontext_with_datas       r   *test_transition_context_context_data_fieldr    s     ,K (&..%11O
 ''2--- ) *&..%11(	 ))-@@@@))+6#===)).9UBBBr   c                      G d dt               } t               } |        }t        |t        j                  t        j
                        }|j                  |      }|dk(  sJ |j                  J |j                  r|j                  n|j                  |      }|dk(  sJ d}t        |t        j                  t        j
                  |      }|j                  r|j                  n|j                  |      }||k(  sJ y)a  
    Test that context.reason overrides transition.get_reason() in executor.

    This test validates step by step:
    - Creating a transition with a custom get_reason() implementation
    - Executing with no context.reason (should use transition's get_reason)
    - Executing with context.reason set (should override get_reason)

    Critical validation: The reason override mechanism allows for context-specific
    reasons without modifying transition classes.
    c                   R    e Zd Z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)	?test_transition_reason_override.<locals>.CustomReasonTransitionz!Transition with custom get_reasonNrU   rV   c                 "    t         j                  S rX   rY   rZ   s     r   r[   zPtest_transition_reason_override.<locals>.CustomReasonTransition.get_target_state      #///r   c                      y)NDefault transition reasonr   rZ   s     r   
get_reasonzJtest_transition_reason_override.<locals>.CustomReasonTransition.get_reason  s    .r   c                 
    ddiS )NexecutedTr   rZ   s     r   r`   zJtest_transition_reason_override.<locals>.CustomReasonTransition.transition  s    %%r   rX   )r   r   r   r1   r   r   ra   r[   r  r   r   r`   r   r   r   CustomReasonTransitionr    sO    /	0H5F,G 	0SV 	0	/&7 	/C 	/	&&7 	&DcN 	&r   r  rp   r  Nz$Bulk import completed with 500 tasksr  )r   r!   r   r   r   r   r  r  )r  rJ   r`   context_no_overridedefault_reasoneffective_reasonr  context_with_overrides           r   test_transition_reason_overrider    s   
& 
& ,K')J ,&..%11
  **+>?N8888 %%--- ':&@&@""jF[F[\oFp  :::: ;M-&..%11	 )>(D(D$$*J_J_`uJv  },,,r   c                  2    G d dt               } t               } | d      }ddd}t        |t        j                  t        j
                  |      }|j                  |      }i ||j                  }|d	   dk(  sJ d
|v sJ |d   dk(  sJ |d   dk(  sJ y)a  
    Test that context.context_data is merged with transition output.

    This test validates step by step:
    - Creating a transition that returns context data
    - Adding additional context_data via TransitionContext
    - Verifying both are merged correctly

    Critical validation: Additional context_data from TransitionContext should
    be merged with the data returned by transition.transition() method.
    c                   R    e Zd ZU dZ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)
Ctest_transition_context_data_merge.<locals>.DataProducingTransitionz%Transition that produces context datar  r  NrU   rV   c                 "    t         j                  S rX   rY   rZ   s     r   r[   zTtest_transition_context_data_merge.<locals>.DataProducingTransition.get_target_stateX  r  r   c                 P    | j                   |j                  j                         dS )N)r  r   )r  r   r   rZ   s     r   r`   zNtest_transition_context_data_merge.<locals>.DataProducingTransition.transition[  s%    ++$..88: r   rX   )r   r   r   r1   r  ra   rb   r   r   r[   r   r   r`   r   r   r   DataProducingTransitionr  S  sE    3##	0H5F,G 	0SV 	0	&7 	DcN 	r   r  bulk_importr  r  r=  )import_source_idr  r  r  r   r  r  Nr   r!   r   r   r   r   r`   r  )r  rJ   r`   additional_context_datarU   transition_outputmerged_datas          r   "test_transition_context_data_merger  F  s    .  ,K(>J    &..%11,	G #--g6 @&?'*>*>?K x M111+%%%)*c111|$+++r   c                      G d dt               } t               } |        }t        |t        j                  t        j
                  ddi      }|j                  |      }i ||j                  }|d   dk(  sJ |d   dk(  sJ y)	a  
    Test that context.context_data can override transition output keys.

    This test validates step by step:
    - Creating a transition that returns a key
    - Adding the same key in context_data with different value
    - Verifying context_data wins (as it's merged second)

    Critical validation: When the same key exists in both transition output
    and context_data, the context_data value should win since it represents
    caller-provided context that should take precedence.
    c                   B    e Zd ZdZddee   defdZdedeee	f   fdZ
y)Etest_transition_context_data_override.<locals>.OverrideTestTransitionz,Transition that produces a 'reason_code' keyNrU   rV   c                 "    t         j                  S rX   rY   rZ   s     r   r[   zVtest_transition_context_data_override.<locals>.OverrideTestTransition.get_target_state  r  r   c                     dddS )Nr  	preserved)reason_code
other_datar   rZ   s     r   r`   zPtest_transition_context_data_override.<locals>.OverrideTestTransition.transition  s    /) r   rX   )r   r   r   r1   r   r   ra   r[   r   r   r`   r   r   r   OverrideTestTransitionr    s;    :	0H5F,G 	0SV 	0	&7 	DcN 	r   r  r  r  r  r  r  Nr  )r  rJ   r`   rU   r  r  s         r   %test_transition_context_data_overrider  }  s    
 
 ,K')J  &..%11#_5	G #--g6 @&?'*>*>?K }%888|$333r   )2r1   r   r   typingr   r   r   unittest.mockr   r	   r   django.contrib.authr
   django.testr   django.utilsr   r   r   r   fsm.transition_utilsr   fsm.transitionsr   r   r   pydanticr   r   rF   r   r!   r3   r7   r>   r   r  rV  fixturer5   rI   rr   r   r  r  r  r  r  r  r  r   r   r   <module>r      s   ) & & %  .   ! G : 
 , 	3 	3	. 	.
4 
4q; q;hAD8 ADHy<X y<x}3h }3B  
  1. ,Fg-T7D(CV;-|4,n.4r   