
    	]jo                     f   d Z ddlZddlmZmZmZ ddl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mZmZmZ dd	lmZmZmZ dd
lmZmZmZmZmZmZ ddlm Z   G d de      Z! G d de      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' G d de      Z(y)zq
Tests for UUID7 utilities in the FSM system.

Tests the uuid-utils library integration and UUID7 functionality.
    N)datetime	timedeltatimezone)Optional)Mockpatch)TestCase)transition_registry)create_transition_from_dictget_available_transitionsget_entity_state_flowvalidate_transition_data)BaseTransitionTransitionContextTransitionValidationError)UUID7Generatorgenerate_uuid7timestamp_from_uuid7uuid7_from_timestampuuid7_time_rangevalidate_uuid7)Fieldc                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestUUID7UtilszTest UUID7 utility functionsc                     t               }t        |t        j                        sJ |j                  dk(  sJ t        |      sJ y)zTest UUID7 generation   N)r   
isinstanceuuidUUIDversionr   )selfuuid7_ids     K/root/env/lib/python3.12/site-packages/label_studio/fsm/tests/test_utils.pytest_generate_uuid7z"TestUUID7Utils.test_generate_uuid7%   sF    !# (DII... 1$$$ h'''    c                 b    t               }t               }|j                  |j                  k  sJ y)z+Test that UUID7s have natural time orderingN)r   int)r!   uuid1uuid2s      r#   test_uuid7_orderingz"TestUUID7Utils.test_uuid7_ordering2   s*       yy599$$$r%   c                 F   t        j                  t        j                        }t	               }t        j                  t        j                        }t        |      }t        ||z
  j                               }t        ||z
  j                               }|dk  sJ |dk  sJ y)z$Test timestamp extraction from UUID7      ?N)r   nowr   utcr   r   abstotal_seconds)r!   beforer"   afterextracted_timestamptime_diff_beforetime_diff_afters          r#   test_timestamp_extractionz(TestUUID7Utils.test_timestamp_extraction:   s    hll+!#X\\*28<  3f <KKMN2U:IIKL#%%%$$$r%   c           	          t        ddddddt        j                        }t        |      }t	        |      sJ t        |      }t        ||z
  j                               }|dk  sJ y)	z+Test creating UUID7 from specific timestamp           r   tzinfoMbP?N)r   r   r.   r   r   r   r/   r0   )r!   	test_timer"   	extracted	time_diffs        r#   test_uuid7_from_timestampz(TestUUID7Utils.test_uuid7_from_timestampJ   sh    T1b"a8<<H	'	2 h''' )2	Y.==?@	5   r%   c           	         t        ddddddt        j                        }t        ddddddt        j                        }t        ||      \  }}t	        |      sJ t	        |      sJ |j
                  |j
                  k  sJ t        |      }t        |      }t        ||z
  j                               dk  sJ t        ||z
  j                               dk  sJ y	)
z Test UUID7 time range generationr8   r9   r:   r;   r   r<      gMb`?N)	r   r   r.   r   r   r'   r   r/   r0   )r!   
start_timeend_time
start_uuidend_uuidstart_extractedend_extracteds          r#   test_uuid7_time_rangez$TestUUID7Utils.test_uuid7_time_rangeW   s    dAr2q!HLLI
D!RQ(,,G/
HE
H j)))h''' ~~,,, /z:,X6 Oj0??ABUJJJMH,;;=>FFFr%   c                    t        j                  t        j                        t	        d      z
  }t        j                  t        j                        }t        |      \  }}t        j                  t        j                        }t        |      }t        ||z
  j                               }t        ||z
  j                               }|dk  sJ |dk  sJ y)z1Test UUID7 time range with default end time (now)r9   )hoursr,   N)	r   r-   r   r.   r   r   r   r/   r0   )	r!   rE   before_callrG   rH   
after_callrJ   r4   r5   s	            r#   !test_uuid7_time_range_default_endz0TestUUID7Utils.test_uuid7_time_range_default_endm   s    \\(,,/)!2DD
ll8<<0/
;
H\\(,,/
 -X6 ;JJLM}z9HHJK#%%%$$$r%   c                 t    t        j                         }t        |      rJ t               }t        |      sJ y)z.Test UUID7 validation with other UUID versionsN)r   uuid4r   r   )r!   uuid4_idr"   s      r#   'test_validate_uuid7_with_other_versionsz6TestUUID7Utils.test_validate_uuid7_with_other_versions~   s5     ::<!(+++ "#h'''r%   N)__name__
__module____qualname____doc__r$   r*   r6   rB   rK   rP   rT    r%   r#   r   r   "   s)    &(%% !G,%"(r%   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestUUID7GeneratorzTest UUID7Generator classc                 R    t               }|j                         }t        |      sJ y)z(Test basic UUID7 generator functionalityN)r   generater   )r!   	generatorr"   s      r#   test_generator_basicz'TestUUID7Generator.test_generator_basic   s&    "$	%%'h'''r%   c           	          t        ddddddt        j                        }t        |      }|j	                         }t        |      }t        ||z
  j                               }|dk  sJ y	)
z)Test generator with custom base timestampr8   r9   r:   r;   r   r<   base_timestampr>   N)r   r   r.   r   r]   r   r/   r0   )r!   	base_timer^   r"   r@   rA   s         r#   "test_generator_with_base_timestampz5TestUUID7Generator.test_generator_with_base_timestamp   sf    T1b"a8<<H	")<	%%'(2	 Y.==?@	5   r%   c           	          t        ddddddt        j                        }t        |      }|j	                  d	      }t        |      }|t        d
      z   }t        ||z
  j                               }|dk  sJ y)z$Test generator with timestamp offsetr8   r9   r:   r;   r   r<   ra   i  	offset_ms)millisecondsr>   N)	r   r   r.   r   r]   r   r   r/   r0   )r!   rc   r^   r"   r@   expected_timerA   s          r#   test_generator_with_offsetz-TestUUID7Generator.test_generator_with_offset   sz    T1b"a8<<H	")<	 %%%5(2	!I4$@@]2AACD	5   r%   c           	      4   t        ddddddt        j                        }t        |      }|j	                  d	      }|j	                  d	      }|j	                  d	      }|j
                  |j
                  k  sJ |j
                  |j
                  k  sJ y
)z,Test that generator produces monotonic UUIDsr8   r9   r:   r;   r   r<   ra   d   rf   N)r   r   r.   r   r]   r'   )r!   rc   r^   r(   r)   uuid3s         r#   test_generator_monotonicz+TestUUID7Generator.test_generator_monotonic   s    T1b"a8<<H	")<	 ""S"1""S"1""S"1 yy599$$$yy599$$$r%   N)rU   rV   rW   rX   r_   rd   rj   rn   rY   r%   r#   r[   r[      s    #(
!!%r%   r[   c                       e Zd ZdZddZy)
MockEntityzMock entity for testingc                     || _         || _        t               | _        d| j                  _        d| j                  _        d| _        y )N
testentityztests.testentityr9   )pkidr   _meta
model_namelabel_lowerorganization_id)r!   rs   s     r#   __init__zMockEntity.__init__   s9    V
 ,

!3

 r%   N)r9   )rU   rV   rW   rX   ry   rY   r%   r#   rp   rp      s
    !!r%   rp   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TransitionUtilsTestsz?Tests for transition_utils module edge cases and error handlingc                 "    t               | _        y N)rp   entityr!   s    r#   setUpzTransitionUtilsTests.setUp   s     lr%   c                 @    G d dt               }t        j                  dd|       t        d      5 }t	        | j
                  d      }d|vsJ |j                  j                          d|j                  j                  d	   d	   v sJ 	 d
d
d
       y
# 1 sw Y   y
xY w)zOTest unexpected error during transition validation in get_available_transitionsc                   >    e Zd ZdZddee   defdZd Ze	d        Z
y)	`TransitionUtilsTests.test_transition_utils_unexpected_validation_error.<locals>.BrokenTransitionz'Transition that raises unexpected errorNcontextreturnc                      y)NBROKENrY   r!   r   s     r#   get_target_statezqTransitionUtilsTests.test_transition_utils_unexpected_validation_error.<locals>.BrokenTransition.get_target_state       r%   c                     i S r}   rY   r   s     r#   
transitionzkTransitionUtilsTests.test_transition_utils_unexpected_validation_error.<locals>.BrokenTransition.transition       	r%   c                     t        d      )NzUnexpected validation error)RuntimeErrorclsr   s     r#   can_transition_from_statezzTransitionUtilsTests.test_transition_utils_unexpected_validation_error.<locals>.BrokenTransition.can_transition_from_state   s     ##@AAr%   r}   rU   rV   rW   rX   r   r   strr   r   classmethodr   rY   r%   r#   BrokenTransitionr      s:    9 9J0K  WZ   B Br%   r   rr   broken_transitionzfsm.transition_utils.loggerTvalidatez&Unexpected error validating transitionr   N)	r   r
   registerr   r   r~   warningassert_called_once	call_args)r!   r   mock_loggerresults       r#   1test_transition_utils_unexpected_validation_errorzFTransitionUtilsTests.test_transition_utils_unexpected_validation_error   s    	B~ 	B 	$$\3FHXY 01 	c[.t{{TJF&f444224;{?R?R?\?\]^?_`a?bbbb	c 	c 	cs   ABBc                 4    G d dt               }t        j                  dd|       ddl}t	               }t        j                  |d|      5  t        | j                  d	
      }d|vsJ |j                  j                          ddd       y# 1 sw Y   yxY w)zDTest TransitionValidationError handling in get_available_transitionsc                   >    e Zd ZdZddee   defdZd Ze	d        Z
y)	bTransitionUtilsTests.test_transition_utils_validation_error_handling.<locals>.ValidatingTransitionz'Transition that raises validation errorNr   r   c                      yN	VALIDATEDrY   r   s     r#   r   zsTransitionUtilsTests.test_transition_utils_validation_error_handling.<locals>.ValidatingTransition.get_target_state       "r%   c                     i S r}   rY   r   s     r#   r   zmTransitionUtilsTests.test_transition_utils_validation_error_handling.<locals>.ValidatingTransition.transition   r   r%   c                     t        d      )NzNot allowed from this state)r   r   s     r#   r   z|TransitionUtilsTests.test_transition_utils_validation_error_handling.<locals>.ValidatingTransition.can_transition_from_state   s    /0MNNr%   r}   r   rY   r%   r#   ValidatingTransitionr      s:    9#9J0K #WZ # O Or%   r   rr   validating_transitionr   N	getLoggerreturn_valueTr   )r   r
   r   loggingr   r   objectr   r~   r   assert_not_called)r!   r   r   r   r   s        r#   /test_transition_utils_validation_error_handlingzDTransitionUtilsTests.test_transition_utils_validation_error_handling   s    	O> 	O 	$$\3JL`a 	f\\';[I 	4.t{{TJF*&888113		4 	4 	4s   8BBc                      G d dt               }t        j                  t              5 }t	        |i        ddd       dt        j                        v sJ y# 1 sw Y   #xY w)z/Test create_transition_from_dict error handlingc                   J    e Zd ZU dZ ed      Zeed<   d	dee	   defdZ
d Zy)
[TransitionUtilsTests.test_transition_utils_create_from_dict_error.<locals>.StrictTransitionz!Transition with strict validation.required_fieldNr   r   c                      y)NSTRICTrY   r   s     r#   r   zlTransitionUtilsTests.test_transition_utils_create_from_dict_error.<locals>.StrictTransition.get_target_state  r   r%   c                     d| j                   iS Nr   r   r   s     r#   r   zfTransitionUtilsTests.test_transition_utils_create_from_dict_error.<locals>.StrictTransition.transition      ($*=*=>>r%   r}   rU   rV   rW   rX   r   r   r   __annotations__r   r   r   r   rY   r%   r#   StrictTransitionr   	  s2    3"'*NC, 9J0K  WZ  ?r%   r   Nz!Failed to create StrictTransition)r   pytestraises
ValueErrorr   r   value)r!   r   exc_infos      r#   ,test_transition_utils_create_from_dict_errorzATransitionUtilsTests.test_transition_utils_create_from_dict_error  sW    		?~ 		? ]]:& 	>('(8"=	> 3c(..6IIII	> 	>s   AA!c                     G d dt               }t        |i       }d|v sJ t        d |d   D              sJ t        |ddd      }t        |      dkD  sJ t        |d	d
d      }d|v sJ t        |d	dd      }|i k(  sJ y)z6Test validate_transition_data with various error casesc                   h    e Zd ZU dZ ed      Zeed<    edd      Ze	ed<   dde
e   d	efd
Zd Zy)hTransitionUtilsTests.test_transition_utils_validate_transition_data_errors.<locals>.ValidationTransitionz#Transition with various field types.r   r   )defaultgenumber_fieldNr   r   c                      yr   rY   r   s     r#   r   zyTransitionUtilsTests.test_transition_utils_validate_transition_data_errors.<locals>.ValidationTransition.get_target_state#  r   r%   c                 4    | j                   | j                  dS )Nr   r   r   r   s     r#   r   zsTransitionUtilsTests.test_transition_utils_validate_transition_data_errors.<locals>.ValidationTransition.transition&  s    *.*=*=tO`O`aar%   r}   )rU   rV   rW   rX   r   r   r   r   r   r'   r   r   r   r   rY   r%   r#   ValidationTransitionr     sD    5"'*NC, %aA 6L#6#9J0K #WZ #br%   r   r   c              3   h   K   | ]*  }d |j                         v xs d|j                         v  , yw)requiredmissingN)lower).0msgs     r#   	<genexpr>z]TransitionUtilsTests.test_transition_utils_validate_transition_data_errors.<locals>.<genexpr>,  s.     mS:,H	SYY[0HHms   02{   not_a_numberr   r   testr      N)r   r   anylen)r!   r   errorss      r#   5test_transition_utils_validate_transition_data_errorszJTransitionUtilsTests.test_transition_utils_validate_transition_data_errors  s    
	b> 
	b **>C6)))mTZ[kTlmmmm * S."Y
 6{Q **>SYkm@no''' **>SYkl@mn||r%   c                 b     G d dt               }t        |ddi      }d|v sJ d|d   d   v sJ y)	z6Test validate_transition_data with non-Pydantic errorsc                   @     e Zd ZdZddee   defdZd Z fdZ	 xZ
S )jTransitionUtilsTests.test_transition_utils_validate_with_non_pydantic_error.<locals>.CustomErrorTransitionz/Transition that raises custom error in __init__r   r   c                      y)NERRORrY   r   s     r#   r   z{TransitionUtilsTests.test_transition_utils_validate_with_non_pydantic_error.<locals>.CustomErrorTransition.get_target_stateC  s    r%   c                     i S r}   rY   r   s     r#   r   zuTransitionUtilsTests.test_transition_utils_validate_with_non_pydantic_error.<locals>.CustomErrorTransition.transitionF  r   r%   c                 B    d|v rt        d      t        |   di | y )Ntrigger_errorCustom initialization errorrY   )r   superry   )r!   data	__class__s     r#   ry   zsTransitionUtilsTests.test_transition_utils_validate_with_non_pydantic_error.<locals>.CustomErrorTransition.__init__I  s'    "d*&'DEE (4(r%   r}   )rU   rV   rW   rX   r   r   r   r   r   ry   __classcell__)r   s   @r#   CustomErrorTransitionr   @  s/    A9J0K WZ ) )r%   r   r   T__root__r   r   N)r   r   )r!   r   r   s      r#   6test_transition_utils_validate_with_non_pydantic_errorzKTransitionUtilsTests.test_transition_utils_validate_with_non_pydantic_error=  sI    	)N 	) **?/SWAXYV###,z0B10EEEEr%   c                      G d dt               }t        j                  dd|       t        | j                        }t        d |D              rJ y)zFTest get_entity_state_flow with transitions that can't be instantiatedc                   J    e Zd ZU dZ ed      Zeed<   d	dee	   defdZ
d Zy)
dTransitionUtilsTests.test_transition_utils_entity_state_flow_errors.<locals>.RequiredFieldTransitionz*Transition requiring fields to instantiate.r   Nr   r   c                      y)NREQUIREDrY   r   s     r#   r   zuTransitionUtilsTests.test_transition_utils_entity_state_flow_errors.<locals>.RequiredFieldTransition.get_target_state[  s    !r%   c                     d| j                   iS r   r   r   s     r#   r   zoTransitionUtilsTests.test_transition_utils_entity_state_flow_errors.<locals>.RequiredFieldTransition.transition^  r   r%   r}   r   rY   r%   r#   RequiredFieldTransitionr   V  s2    <"'*NC,"9J0K "WZ "?r%   r   rr   required_transitionc              3   ,   K   | ]  }|d    dk(    yw)transition_namer   NrY   )r   fs     r#   r   zVTransitionUtilsTests.test_transition_utils_entity_state_flow_errors.<locals>.<genexpr>f  s     Tq*+/DDTs   N)r   r
   r   r   r~   r   )r!   r   flowss      r#   .test_transition_utils_entity_state_flow_errorszCTransitionUtilsTests.test_transition_utils_entity_state_flow_errorsS  sK    		?n 		? 	$$\3HJab &dkk2TeTTTTTr%   N)rU   rV   rW   rX   r   r   r   r   r   r   r   rY   r%   r#   r{   r{      s-    I#c:48J(!FF,Ur%   r{   c                   "    e Zd ZdZd Zd Zd Zy)TestUUID7FieldCoveragez,Test coverage for UUID7Field utility methodsc                     ddl m} t               }t               }||j                  j                  j
                  _        |j                  |      }|j                  j                  d       ||k(  sJ y)z2Test UUID7Field.get_latest_by_uuid7 utility methodr   
UUID7Fieldz-idN)	fsm.utilsr  r   order_byr   firstget_latest_by_uuid7assert_called_once_with)r!   r  
mock_firstmock_querysetr   s        r#   test_get_latest_by_uuid7z/TestUUID7FieldCoverage.test_get_latest_by_uuid7l  s_    (V
AK++11>//>66u=###r%   c                 2   ddl m} t        dddt        j                        }t        dddt        j                        }t               }t               }||j                  _        |j                  |||      }|j                  j                  sJ ||k(  sJ y)z3Test UUID7Field.filter_by_time_range utility methodr   r   r8   r9   r<      N)
r  r  r   r   r.   r   filterr   filter_by_time_rangecalled)r!   r  rE   rF   mock_filteredr  r   s          r#   test_filter_by_time_rangez0TestUUID7FieldCoverage.test_filter_by_time_rangey  s    (dAq>
D!Qx||<,9)00
HU##****&&&r%   c                     ddl m} t        dddt        j                        }t               }t               }||j                  _        |j                  ||      }|j                  j                  sJ ||k(  sJ y)z0Test UUID7Field.filter_since_time utility methodr   r   r8   r9   r<   N)
r  r  r   r   r.   r   r  r   filter_since_timer  )r!   r  
since_timer  r  r   s         r#   test_filter_since_timez-TestUUID7FieldCoverage.test_filter_since_time  sj    (dAq>
,9)--mZH##****&&&r%   N)rU   rV   rW   rX   r	  r  r  rY   r%   r#   r   r   i  s    6$' 'r%   r   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)!TestResolveOrganizationIdCoveragez4Test coverage for resolve_organization_id edge casesc                 0    ddl m} |j                          y Nr   CurrentContextcore.current_requestr  clearr!   r  s     r#   r   z'TestResolveOrganizationIdCoverage.setUp      7r%   c                 0    ddl m} |j                          y r  r  r  s     r#   tearDownz*TestResolveOrganizationIdCoverage.tearDown  r  r%   c                 ,    ddl m}  |dd      }|J y)z0Test resolve_organization_id when entity is Noner   resolve_organization_idNr~   user)r  r$  )r!   r$  r   s      r#   -test_resolve_organization_id_with_none_entityzOTestResolveOrganizationIdCoverage.test_resolve_organization_id_with_none_entity  s    5(4@~~r%   c                     ddl m} ddlm} |j	                  d       t               }d|_         ||      }|dk(  sJ y)z9Test resolve_organization_id returns cached context valuer   r  r#  i  r   r~   N)r  r  r  r$  set_organization_idr   rx   )r!   r  r$  mock_entityr   s        r#   )test_resolve_organization_id_from_contextzKTestResolveOrganizationIdCoverage.test_resolve_organization_id_from_context  s=    75**3/ f&)#(<}}r%   c                 R    ddl m} t               }d|_         ||      }|dk(  sJ y)z8Test resolve_organization_id from entity.organization_idr   r#    r)  N)r  r$  r   rx   )r!   r$  r+  r   s       r#   /test_resolve_organization_id_from_entity_directzQTestResolveOrganizationIdCoverage.test_resolve_organization_id_from_entity_direct  s*    5f&)#(<}}r%   c                     ddl m} t               }d|_        t               }d|_        ||_         ||      }|dk(  sJ y)z?Test resolve_organization_id via entity.project.organization_idr   r#  i  Nr)  )r  r$  r   rx   project)r!   r$  mock_projectr+  r   s        r#   6test_resolve_organization_id_from_project_relationshipzXTestResolveOrganizationIdCoverage.test_resolve_organization_id_from_project_relationship  sA    5v'*$f&*#*(<}}r%   c                     ddl m} t               }d|_        t               }||_        t               }d|_        d|_        ||_         ||      }|dk(  sJ y)zDTest resolve_organization_id via entity.task.project.organization_idr   r#  iA  Nr)  )r  r$  r   rx   r1  task)r!   r$  r2  	mock_taskr+  r   s         r#   ;test_resolve_organization_id_from_task_project_relationshipz]TestResolveOrganizationIdCoverage.test_resolve_organization_id_from_task_project_relationship  sX    5v'*$F	(	f&*#"$(<}}r%   c                     ddl m} t               }d|_        t               }||_        t               }d|_        d|_        d|_         |||      }|dk(  sJ y)z:Test resolve_organization_id from user.active_organizationr   r#  i  Nr%  )r  r$  r   rt   active_organizationrx   r1  r5  )r!   r$  mock_active_org	mock_userr+  r   s         r#   :test_resolve_organization_id_from_user_active_organizationz\TestResolveOrganizationIdCoverage.test_resolve_organization_id_from_user_active_organization  sZ    5& F	(7	%f&*#"()L}}r%   c                     ddl m} ddlm} t	               }d|_         ||      }|dk(  sJ |j                         }|dk(  sJ y)zETest that resolve_organization_id caches the result in CurrentContextr   r  r#  i  r)  N)r  r  r  r$  r   rx   get_organization_id)r!   r  r$  r+  r   cacheds         r#   *test_resolve_organization_id_caches_resultzLTestResolveOrganizationIdCoverage.test_resolve_organization_id_caches_result  sI    75f&)#(<}}  335}}r%   N)rU   rV   rW   rX   r   r!  r'  r,  r/  r3  r7  r<  r@  rY   r%   r#   r  r    s2    >

$$r%   r  c                       e Zd ZdZd Zy)TestGetCurrentStateSafeCoveragez7Test coverage for get_current_state_safe error handlingc                     ddl m} t               }d|_        t               |_        d|j                  _        t        dd      5   ||      }|J 	 ddd       y# 1 sw Y   yxY w)	z=Test get_current_state_safe returns None when FSM is disabledr   )get_current_state_safer9   ztest.entityfsm.utils.is_fsm_enabledFr   N)r  rD  r   rs   ru   rw   r   )r!   rD  r+  r   s       r#   -test_get_current_state_safe_when_fsm_disabledzMTestGetCurrentStateSafeCoverage.test_get_current_state_safe_when_fsm_disabled
  s_    4f F(5%-EB 	"+K8F>!>	" 	" 	"s   AA%N)rU   rV   rW   rX   rF  rY   r%   r#   rB  rB    s
    A"r%   rB  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)"TestGetOrInitializeStateParameterszTest coverage for get_or_initialize_state reason and context_data parameters.

    These tests validate that the reason and context_data parameters are correctly
    accepted and passed through to StateManager.execute_transition().
    c                 "    t               | _        y r}   )rp   r+  r   s    r#   r   z(TestGetOrInitializeStateParameters.setUp  s    %<r%   c                    ddl m} d}t        dd      5  t        d      5 }d|j                  _        t        d	      5 }t               }d
|j                  _        ||_        t        dd      5  t        dd      5   || j                  d
d|       |j                  j                          |j                  j                  d   }|j                  d      |k(  sJ 	 d
d
d
       d
d
d
       d
d
d
       d
d
d
       d
d
d
       y
# 1 sw Y   *xY w# 1 sw Y   .xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# 1 sw Y   y
xY w)a|  Test that get_or_initialize_state accepts reason parameter.

        This test validates step by step:
        - Calling get_or_initialize_state with a reason parameter
        - Verifying it's passed to StateManager.execute_transition

        Critical validation: The reason parameter allows callers to provide
        context-specific reasons for state initialization.
        r   get_or_initialize_statez*Bulk import completed - initializing staterE  Tr   fsm.utils.CurrentContextF#fsm.state_manager.get_state_managerN'fsm.state_inference._get_or_infer_stateIN_PROGRESS-fsm.utils._get_initialization_transition_nameinit_transition)r&  inferred_statereasonr9   rT  r  rL  r   is_fsm_disabledr   r   get_current_state_valuer+  execute_transitionr   r   get)r!   rL  custom_reasonmock_contextmock_get_smmock_smcall_kwargss          r#   5test_get_or_initialize_state_accepts_reason_parameterzXTestGetOrInitializeStateParameters.test_get_or_initialize_state_accepts_reason_parameter"  sR    	6D-DA 	N12 Nl<A,,9 @A N["fGCGG33@/6K, HWde N"#Rars N3 $ 0 0%)/<'4	 $66IIK*1*D*D*N*Nq*QK#.??8#<#MM#MNNN	N	N 	NN NN NN N	N N	N 	Nsj   D7D+0D/D	=A DD	&D.D+6D7DD	DDD($D++D4	0D77E c                    ddl m} dddd}t        dd	      5  t        d
      5 }d|j                  _        t        d      5 }t               }d|j                  _        ||_        t        dd	      5  t        dd	      5   || j                  dd|       |j                  j                          |j                  j                  d   }|j                  d      |k(  sJ 	 ddd       ddd       ddd       ddd       ddd       y# 1 sw Y   *xY w# 1 sw Y   .xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# 1 sw Y   yxY w)a  Test that get_or_initialize_state accepts context_data parameter.

        This test validates step by step:
        - Calling get_or_initialize_state with a context_data parameter
        - Verifying it's passed to StateManager.execute_transition

        Critical validation: The context_data parameter allows callers to add
        additional data to be stored in the state record's JSONB context_data.
        r   rK  r   r.  F)import_source_id
task_counttriggered_by_apirE  Tr   rM  rN  NrO  rP  rQ  rR  )r&  rS  context_datar9   rd  rU  )r!   rL  custom_context_datar[  r\  r]  r^  s          r#   ;test_get_or_initialize_state_accepts_context_data_parameterz^TestGetOrInitializeStateParameters.test_get_or_initialize_state_accepts_context_data_parameterJ  sc    	6 !$ %
 -DA 	Z12 Zl<A,,9 @A Z["fGCGG33@/6K, HWde Z"#Rars Z3 $ 0 0%)/<-@	 $66IIK*1*D*D*N*Nq*QK#.??>#BFY#YY#YZZZ	Z	Z 	ZZ ZZ ZZ Z	Z Z	Z 	Zsk   D;D/0D#3D	A D"D	*D#2D/:D;DD	D D##D,(D//D8	4D;;Ec                    ddl m} d}ddddd}t        d	d
      5  t        d      5 }d|j                  _        t        d      5 }t               }d|j                  _        ||_        t        dd      5  t        dd      5   || j                  dd||       |j                  j                          |j                  j                  d   }|j                  d      |k(  sJ |j                  d      |k(  sJ 	 ddd       ddd       ddd       ddd       ddd       y# 1 sw Y   *xY w# 1 sw Y   .xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# 1 sw Y   yxY w)aq  Test get_or_initialize_state with both reason and context_data.

        This test validates step by step:
        - Calling get_or_initialize_state with both reason and context_data
        - Verifying both are passed to StateManager.execute_transition

        Critical validation: Both parameters should be passed independently
        without interference.
        r   rK  z0Bulk import completed with configuration changesr   rl   r.  F)ra  previous_task_countnew_task_countrc  rE  Tr   rM  rN  NrO  rP  rQ  rR  )r&  rS  rT  rd  r9   rT  rd  rU  )r!   rL  rZ  re  r[  r\  r]  r^  s           r#   >test_get_or_initialize_state_with_both_reason_and_context_datazaTestGetOrInitializeStateParameters.test_get_or_initialize_state_with_both_reason_and_context_datav  s    	6J ##&! %	
 -DA 	Z12 Zl<A,,9 @A Z["fGCGG33@/6K, HWde Z"#Rars Z3 $ 0 0%)/<'4-@ $66IIK*1*D*D*N*Nq*QK#.??8#<#MM#M#.??>#BFY#YY#YZZZ	Z	Z 	ZZ ZZ ZZ Z	Z Z	Z 	Zsk   EE	0D=6D1	A7D%<D1	D=E	E%D.*D1	1D:6D==EE		E	EEc           
         ddl m} t        dd      5  t        d      5 }d|j                  _        t        d      5 }t               }d	|j                  _        ||_        t        d
d      5  t        dd      5   || j                  d	d       |j                  j                          |j                  j                  d   }|j                  d      i k(  sJ 	 d	d	d	       d	d	d	       d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   *xY w# 1 sw Y   .xY w# 1 sw Y   2xY w# 1 sw Y   6xY w# 1 sw Y   y	xY w)a  Test that get_or_initialize_state defaults context_data to empty dict.

        This test validates step by step:
        - Calling get_or_initialize_state without context_data
        - Verifying empty dict is passed to StateManager.execute_transition

        Critical validation: When context_data is not provided, it should
        default to an empty dict (not None) to ensure proper merging behavior.
        r   rK  rE  Tr   rM  FrN  NrO  rP  rQ  rR  )r&  rS  r9   rd  rU  )r!   rL  r[  r\  r]  r^  s         r#   @test_get_or_initialize_state_defaults_context_data_to_empty_dictzcTestGetOrInitializeStateParameters.test_get_or_initialize_state_defaults_context_data_to_empty_dict  sJ    	6-DA 	I12 Il<A,,9 @A I["fGCGG33@/6K, HWde I"#Rars I3 $ 0 0%)/< $66IIK*1*D*D*N*Nq*QK#.??>#Bb#HH#HIII	I	I 	II II II I	I I	I 	Isj   D4D(0D-D	;ADD	#D+D(3D4D	D	DDD%!D((D1	-D44D=N)	rU   rV   rW   rX   r   r_  rf  rj  rl  rY   r%   r#   rH  rH    s'    (&NP*ZX.Z`#Ir%   rH  ))rX   r   r   r   r   typingr   unittest.mockr   r   r   django.testr	   fsm.registryr
   fsm.transition_utilsr   r   r   r   fsm.transitionsr   r   r   r  r   r   r   r   r   r   pydanticr   r   r[   rp   r{   r   r  rB  rH  rY   r%   r#   <module>rt     s     2 2  %    ,  Y X  d(X d(N/% /%d	! 	!_U8 _UD-'X -'`k k\"h ""qI qIr%   