
    	]j2>                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ dd	lmZ  G d
 de      Z G d de      Zy)z
Integration tests for the FSM system.
Tests the complete FSM functionality including models, state management,
and API endpoints.
    )datetime)patch)TestCase)get_state_manager)AnnotationStateProjectState	TaskState)ProjectFactory)AnnotationFactoryTaskFactory)UserFactoryc                   (    e Zd ZdZd Zd Zd Zd Zy)TestFSMModelszTest FSM model functionalityc                     t        d      | _        t        | j                        | _        t	        | j                  ddi      | _        ddlm} |j                          y )	Ntest@example.comemail
created_bytexttestprojectdatar   cache)	r   userr
   r   r   taskdjango.core.cacher   clear)selfr   s     U/root/env/lib/python3.12/site-packages/label_studio/fsm/tests/test_fsm_integration.pysetUpzTestFSMModels.setUp   sD    &89	%;FF;KL	 	,    c                    t         j                  j                  | j                  | j                  j                  d| j
                  d      }|j                  dk(  sJ |j                  | j                  k(  sJ |j                  | j
                  k(  sJ |j                  j                  dk(  sJ t        |j                  t              sJ t        |      }d|v sJ d|v sJ y)z/Test TaskState creation and basic functionalityCREATEDzTask created for testing)r   
project_idstatetriggered_byreason   TaskN)r	   objectscreater   r'   r   r(   r)   idversion
isinstancetimestamp_from_uuidr   str)r!   
task_statestr_reprs      r"   test_task_state_creationz&TestFSMModels.test_task_state_creation   s    &&--yy++- . 

 9,,,$))+++&&$))333 }}$$)))*88(CCC z?!!!H$$$r$   c           	      r   t        | j                  | j                  g       }t        j                  j                  ||j                  j                  |j                  j                  |j                  r|j                  j                  ndd| j                  d      }|j                  dk(  sJ |j                  |k(  sJ t        j                  j                  ||j                  j                  |j                  j                  |j                  r|j                  j                  ndd| j                         y)z5Test AnnotationState creation and basic functionality)r   completed_byresultNDRAFTzAnnotation draft created)
annotationtask_idr'   completed_by_idr(   r)   r*   	COMPLETED)r;   r<   r'   r=   r(   r)   )r   r   r   r   r-   r.   r/   r'   r8   r(   r;   )r!   r;   annotation_states      r"   test_annotation_state_creationz,TestFSMModels.test_annotation_state_creation7   s    &DIIDIIVXY
*2299!OO&&!11:D:Q:QJ3366W[- : 
  %%000**j888 	&&!OO&&!11:D:Q:QJ3366W[ 	' 	
r$   c                 6   t         j                  j                  | j                  d| j                  d      }|j
                  dk(  sJ |j                  | j                  k(  sJ t         j                  j                  | j                  d| j                         y)z2Test ProjectState creation and basic functionalityr&   zProject created for testing)r   r(   r)   r*   r>   )r   r(   r)   N)r   r-   r.   r   r   r(   )r!   project_states     r"   test_project_state_creationz)TestFSMModels.test_project_state_creationS   s    $,,33LL			Ro 4 

 ""i///$$444##DLLZ^ZcZc#dr$   N)__name__
__module____qualname____doc__r#   r6   r@   rC    r$   r"   r   r      s    &%0
8
er$   r   c                   V   e Zd ZdZd Zd Zd Z ed      d        Z ed      d        Z	 ed      d        Z
 ed      d	        Z ed      d
        Z ed      d        Z ed      d        Z ed      d        Z ed      d        Z ed      d        Z ed      d        Zy)TestStateManagerz?Test StateManager functionality with mocked transaction supportc                 :   ddl m} t        d      | _        |j	                  | j                         t        | j                        | _        t        | j                  d      rE| j                  j                  r/|j                  | j                  j                  j                         t        | j                  ddi	      | _        t               | _        dd
lm} |j#                          ddlm} ddlm} |j-                  d      s|j/                  d|       y y )Nr   CurrentContextr   r   r   organizationr   r   r   r   )state_model_registryr	   r   )core.current_requestrM   r   r   set_userr
   r   hasattrrN   set_organization_idr/   r   r   r   StateManagerr   r   r    fsm.registryrO   fsm.state_modelsr	   	get_modelregister_model)r!   rM   r   rO   r	   s        r"   r#   zTestStateManager.setUpc   s    7&89	 			*%;4<<0T\\5N5N..t||/H/H/K/KLFF;KL	-/ 	, 	6.#--f5 //	B 6r$   c                 0    ddl m} |j                          y )Nr   rL   )rQ   rM   r    )r!   rM   s     r"   tearDownzTestStateManager.tearDown~   s    7r$   c                 \    | j                   j                  | j                        }|dk(  sJ y)z/Test getting current state when task is createdr&   N)rU   get_current_state_valuer   )r!   current_states     r"   test_get_current_state_emptyz-TestStateManager.test_get_current_state_empty   s,     ))AA$))L	)))r$   zfsm.state_manager.flag_setc                    ddl m} |j                          d|_        | j                  j                  | j                  d| j                  dd      }|sJ | j                  j                  | j                        }|dk(  sJ | j                  j                  | j                  d| j                  d	d
di      }|sJ | j                  j                  | j                        }|dk(  sJ y)z@Test state transition functionality with immediate cache updatesr   r   Tr&   create_taskInitial task creationentity	new_stater   transition_namer*   IN_PROGRESS
start_work
started_byr   )rd   re   r   rf   contextN	r   r   r    return_valuerU   transition_stater   r   r]   r!   mock_flag_setr   successr^   s        r"   test_transition_statez&TestStateManager.test_transition_state   s     	, &*" ##4499)* 5 
 w ))AA$))L	))) ##4499#(!6* 5 
 w))AA$))L---r$   c                    ddl m} |j                          d|_        | j                  j                  | j                  d| j                         | j                  j                  | j                  d| j                  ddi	       | j                  j                  | j                        }|J |j                  dk(  sJ |j                  dk(  sJ |j                  | j                  k(  sJ |j                  ddik(  sJ y
)z3Test getting current state object with full detailsr   r   Tr&   rd   re   r   rg   r   r   )rd   re   r   rj   N)r   r   r    rl   rU   rm   r   r   get_current_state_objectr(   previous_stater)   context_data)r!   ro   r   current_state_objs       r"   test_get_current_state_objectz.TestStateManager.test_get_current_state_object   s     	, &*" 	**$))yW[W`W`*a**99DIIPVX^O_ 	+ 	
 !--FFtyyQ ,,, &&-777 //9<<< --::: --&&1AAAAr$   c                    ddl m} |j                          d|_        g d}|D ]8  \  }}| j                  j                  | j                  || j                  |       : | j                  j                  | j                        }t        |      dk(  sJ |D cg c]  }|j                   }}|g dk(  sJ |d   j                  J |d
   j                  dk(  sJ |d   j                  dk(  sJ y	c c}w )zTest state history retrievalr   r   T))r&   ra   )rg   rh   )r>   finish_workrd   re   r   rf      )r>   rg   r&      N   r&   rg   )r   r   r    rl   rU   rm   r   r   get_state_historylenr(   ru   )	r!   ro   r   transitionsr(   
transitionhistoryhstatess	            r"   test_get_state_historyz'TestStateManager.test_get_state_history   s    	, &*"o!, 	E:..yyE		S] / 	
 ##55dii@ 7|q    $++a!''++@@@@ qz((000qz((I555qz((M999 ,s   C0c                 p   ddl m} |j                          d|_        | j                  j                  | j                  d| j                         | j                  j                  | j                  d| j                         | j                  j                  | j                        }t        |      dk\  sJ y)	z0Test time-based state queries using StateManagerr   r   Tr&   rs   rg   r}   N)
r   r   r    rl   rU   rm   r   r   r   r   )r!   ro   r   r   s       r"   test_get_states_in_time_rangez.TestStateManager.test_get_states_in_time_range   s     	, &*" 	**$))yW[W`W`*a**$))}[_[d[d*e ""44TYY? 6{ar$   c                    ddl m} |j                          d|_        | j                  j                  | j                  d| j                  dd      }|sJ | j                  j                  | j                        }|dk(  sJ | j                  j                  | j                  d| j                  d	
      }|sJ | j                  j                  | j                        }|dk(  sJ y)z@Test that cache is updated immediately on successful transitionsr   r   Tr&   ra   rb   rc   rg   rh   r{   Nrk   rn   s        r"   (test_immediate_cache_update_success_casez9TestStateManager.test_immediate_cache_update_success_case   s     	, &*" ##4499)* 5 
 w))AA$))L	))) ##4499#(	 5 
 w))AA$))L---r$   c                     ddl m} |j                          d|_        | j                  j                  | j                  d| j                  d      }|sJ | j                  j                  | j                        dk(  sJ y)z!Test successful state transitionsr   r   Tr&   ra   r{   Nrk   )r!   ro   r   rp   s       r"   'test_transaction_on_commit_success_casez8TestStateManager.test_transaction_on_commit_success_case  sw     	, &*" ##4499)	 5 
 w  88CyPPPr$   c                     ddl m} |j                          d|_        | j                  j                  | j                  d| j                  d       | j                  j                  | j                        }|dk(  sJ y)z%Test state transitions work correctlyr   r   Tr&   ra   r{   Nrk   )r!   ro   r   r^   s       r"   0test_transaction_on_commit_database_failure_casezATestStateManager.test_transaction_on_commit_database_failure_case5  ss     	, &*" 	**99)	 	+ 	
 ))AA$))L	)))r$   c                 |   ddl m} |j                          d|_        | j                  j                  | j                  d| j                        }|sJ | j                  j                  | j                        }|j                  |      }|dk(  sJ | j                  j                  | j                        }|dk(  sJ y)z8Test that cache is immediately updated during transitionr   r   Tr&   rs   N)r   r   r    rl   rU   rm   r   r   get_cache_keygetr]   )r!   ro   r   rp   	cache_keycached_stater^   s          r"   #test_immediate_cache_update_contentz4TestStateManager.test_immediate_cache_update_contentK  s     	, &*" ##4499 5 
 w %%33DII>	yy+y((( ))AA$))L	)))r$   c                     ddl m} |j                          d|_        | j                  j                  | j                  d| j                  dd       | j                  j                  | j                        }|j                  |      }|dk(  sJ y)	z*Test cache behavior with state transitionsr   r   Tr&   ra   zTest transitionrc   N)
r   r   r    rl   rU   rm   r   r   r   r   )r!   ro   r   r   r   s        r"   *test_cache_cleanup_on_transaction_rollbackz;TestStateManager.test_cache_cleanup_on_transaction_rollbackg  s     	, &*" 	**99)$ 	+ 	
 %%33DII>	yy+y(((r$   c                    ddl m} |j                          d|_        | j                  j                  | j                  d| j                        }|sJ | j                  j                  | j                        }|dk(  sJ ddl	m
} |j                  j                  | j                        j                         }|dk(  sJ | j                  j                  | j                  d| j                  d	
      }|sJ |j                  j                  | j                        j                         }||k(  sJ | j                  j                  | j                        }|dk(  sJ y)z.Test that same-state transitions are preventedr   r   Tr&   rs   rP   )r   r~   zThis should be skipped)rd   re   r   r*   N)r   r   r    rl   rU   rm   r   r   r]   rW   r	   r-   filtercount)r!   ro   r   rp   r^   r	   initial_countfinal_counts           r"   %test_same_state_transition_preventionz6TestStateManager.test_same_state_transition_prevention  sN    	, &*" ##4499 5 

 w ))AA$))L	))) 	/!))00dii0@FFH!!! ##4499+	 5 
 w  ''..DII.>DDFm+++ ))AA$))L	)))r$   c                 :   ddl m} ddlm} |j	                          d|_         |       }| j                  j                  | j                  d|d      }|sJ | j                  j                  | j                        }|j                  dk(  sJ |j                  J y)	zXTest that transitioning state with AnonymousUser succeeds and sets triggered_by to None.r   )AnonymousUserr   Trg   start_task_anonr{   N)django.contrib.auth.modelsr   r   r   r    rl   rU   rm   r   rt   r(   r)   )r!   ro   r   r   	anon_userrp   rw   s          r"   #test_transition_with_anonymous_userz4TestStateManager.test_transition_with_anonymous_user  s     	=+%)"!O	##4499#-	 5 
 w --FFtyyQ &&-777 --555r$   N)rD   rE   rF   rG   r#   r[   r_   r   rq   rx   r   r   r   r   r   r   r   r   r   rH   r$   r"   rJ   rJ   `   s:   IC6
* '($. )$.L '(B )B. '(: ):< '(  ) & '(!. )!.F '(Q )Q* '(* )** '(* )*6 '() )). '(** )**X '(6 )6r$   rJ   N)rG   r   unittest.mockr   django.testr   fsm.state_managerr   rW   r   r   r	   projects.tests.factoriesr
   tasks.tests.factoriesr   r   users.tests.factoriesr   r   rJ   rH   r$   r"   <module>r      sF        / E E 3 @ -KeH Ke\a6x a6r$   