§
     ’j7  ã                  ó  — d dl mZ d dlZd dlmc 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mZmZ n# e$ r ddlmZmZmZmZ Y nw xY w G d„ d	e¦  «        Z G d
„ de¦  «        Zedk    r ej        ¦   «          dS dS )é    )ÚannotationsN)Úpatch)ÚWorkflowReviewStartRequest)ÚWorkflowPersistenceService)ÚFailingOperationalStateServiceÚFakePostgresClientÚ"WorkflowPersistenceServiceTestBaseÚassert_review_code_patterné   c                  ó&   — e Zd Zdd„Zdd„Zdd„ZdS )Ú#WorkflowPersistenceServiceUnitTestsÚreturnÚNonec           	     ó˜  — t          d¦  «        5 } t          dddd„ i¦  «        ¦   «          t          dddd„ i¦  «        ¦   «         g|j        _        t	          j        dd¦  «        }t	          j        dd¦  «        }d d d ¦  «         n# 1 swxY w Y   t          | |¦  «         t          | |¦  «         |                      ||¦  «         d S )	NzBapp.modules.core.application.workflow_persistence_service.datetimeÚT© Ústrftimec                ó   — dS )NÚ20260101010101r   ©ÚselfÚfmts     ú=C:\Projects\DSCons\tests\test_workflow_persistence_service.pyú<lambda>z|WorkflowPersistenceServiceUnitTests.test_build_review_code_has_expected_prefix_and_unique_timestamp_suffix.<locals>.<lambda>!   ó   € Ð=M€ ó    c                ó   — dS )NÚ20260101010102r   r   s     r   r   z|WorkflowPersistenceServiceUnitTests.test_build_review_code_has_expected_prefix_and_unique_timestamp_suffix.<locals>.<lambda>"   r   r   zprj-001Úlegal_agent)r   ÚtypeÚnowÚside_effectr   Ú_build_review_coder
   ÚassertNotEqual)r   Úmocked_datetimeÚfirstÚseconds       r   ÚFtest_build_review_code_has_expected_prefix_and_unique_timestamp_suffixzjWorkflowPersistenceServiceUnitTests.test_build_review_code_has_expected_prefix_and_unique_timestamp_suffix   s'  € õ ØPñ
ô 
ð 	ààO•�S˜"˜zÐ+MÐ+MÐNÑOÔOÑQÔQØO•�S˜"˜zÐ+MÐ+MÐNÑOÔOÑQÔQð/ˆOÔÔ+õ /ÔAØ˜=ñô ˆEõ 0ÔBØ˜=ñô ˆFð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ 	# 4¨Ñ/Ô/Ð/Ý" 4¨Ñ0Ô0Ð0Ø×Ò˜E 6Ñ*Ô*Ð*Ð*Ð*s   �A-B	Â	BÂBc                ó–  — |                       t          j        d¦  «        d¦  «         |                       t          j        d¦  «        d¦  «         |                       t          j        d¦  «        d¦  «         |                       t          j        d¦  «        d¦  «         |                       t          j        d	¦  «        d¦  «         d S )
Nu   HoÃ n thÃ nhÚ	completedÚawaiting_assignmentÚin_progressu   chÆ°a báº¯t Ä‘áº§uÚplannedÚ	cancelledÚblockedzsomething-else)ÚassertEqualr   Ú_normalize_work_log_status©r   s    r   Ú0test_normalize_work_log_status_maps_known_valueszTWorkflowPersistenceServiceUnitTests.test_normalize_work_log_status_maps_known_values/   sê   € Ø×ÒÝ&ÔAÀ.ÑQÔQØñ	
ô 	
ð 	
ð 	×ÒÝ&ÔAØ%ñô ð ñ		
ô 	
ð 	
ð 	×ÒÝ&ÔAÐBVÑWÔWØñ	
ô 	
ð 	
ð 	×ÒÝ&ÔAÀ+ÑNÔNØñ	
ô 	
ð 	
ð 	×ÒÝ&ÔAÐBRÑSÔSØñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó   — |                       t          j        dd ¦  «        d¦  «         |                       t          j        dd ¦  «        d¦  «         |                       t          j        d d¦  «        d¦  «         |                       t          j        d d¦  «        d¦  «         |                       t          j        d d¦  «        d	¦  «         d S )
NÚfinding_createdÚissue_recordedÚsession_createdÚsystem_syncu"   Cáº­p nháº­t tiáº¿n Ä‘á»™ há»“ sÆ¡Úprogress_updateu    Thiáº¿u biÃªn báº£n nghiá»‡m thuu   CÃ´ng viá»‡c thÃ´ng thÆ°á»�ngÚtask_update)r0   r   Ú_normalize_work_log_action_typer2   s    r   Ú@test_normalize_work_log_action_type_maps_workflow_and_text_hintszdWorkflowPersistenceServiceUnitTests.test_normalize_work_log_action_type_maps_workflow_and_text_hintsG   s  € Ø×ÒÝ&ÔFØ! 4ñô ð ñ		
ô 	
ð 	
ð 	×ÒÝ&ÔFØ! 4ñô ð ñ		
ô 	
ð 	
ð 	×ÒÝ&ÔFØÐ:ñô ð ñ		
ô 	
ð 	
ð 	×ÒÝ&ÔFØÐ8ñô ð ñ		
ô 	
ð 	
ð 	×ÒÝ&ÔFØÐ5ñô ð ñ		
ô 	
ð 	
ð 	
ð 	
r   N©r   r   )Ú__name__Ú
__module__Ú__qualname__r(   r3   r<   r   r   r   r   r      sP   € € € € € ð+ð +ð +ð +ð*
ð 
ð 
ð 
ð0
ð 
ð 
ð 
ð 
ð 
r   r   c                  ó  — e Zd Z ed¦  «         ed¦  «        dd„¦   «         ¦   «         Z ed¦  «         ed¦  «        dd„¦   «         ¦   «         Z ed¦  «         ed¦  «        dd„¦   «         ¦   «         Zdd„Zdd	„Zdd
„Z	dd„Z
dS )Ú#WorkflowPersistenceServiceFlowTestsz@app.modules.core.application.workflow_policy_service.get_personazEapp.modules.core.application.workflow_persistence_service.get_personar   r   c                ó  — |                       ¦   «         |_        |                      ¦   «         |_        t          ¦   «         }t	          |¬¦  «        }t          j        dddddgddddd	d
œdddddddddddœddddddgddidœgdœgdddddddgddidœgd œ¦  «        }|                     |¦  «        }|                      |j	        j
        d¦  «         |                      |j	        j        d!¦  «         |                      |j        d"         j        d¦  «         |                      |j        d"         j        d#¦  «         |                      t          |j        ¦  «        d$¦  «         |                      |j        d%g¦  «         |                      |j        d&¦  «         |                      |j        ¦  «         |                      |j        d'¦  «         |                      |j        ¦  «         |j        }d }||u}	|	sªt3          j        d(|	fd)||f¦  «        d*t7          j        ¦   «         v st3          j        |¦  «        rt3          j        |¦  «        nd*t3          j        |¦  «        t3          j        |¦  «        d+œz  }
d,d-|
iz  }t?          t3          j         |¦  «        ¦  «        ‚d x}x}	}tC          | |j        d.         ¦  «         |                      |j        d/         d0         d1¦  «         d2„ |j"        D ¦   «         }|                      |d         d3¦  «         |                      |d         d3¦  «         d4„ |j#        D ¦   «         }|                      |d         d5¦  «         |                      |d         d6¦  «         d S )7N©Úpostgres_clientúPRJ-001r   úEMP-LEADúEMP-INITÚlegalÚinitial_baselineÚBaselineu   Tá»•ng quan)Úsnapshot_typeÚcaptured_by_employee_codeÚcaptured_by_agent_codeÚlabelÚsummaryúF-001Úmissing_documentõ$   Thiáº¿u quyáº¿t Ä‘á»‹nh phÃª duyá»‡tz
EMP-LAW-01Úhighz
2026-01-10Úpending)Úassigned_department_codeÚassigned_employee_codeÚpriorityÚdue_dateÚstatusu   Ä�ang xá»­ lÃ½u)   Ä�Ã£ xÃ¡c Ä‘á»‹nh vÄƒn báº£n cÃ²n thiáº¿uÚaction_typer5   )Úemployee_codeÚ
agent_codeÚdepartment_codeÚactionrZ   Ú	ai_resultÚmetadata)Úfinding_codeÚfinding_groupÚfinding_typeÚtitleÚresponsible_department_codeÚ
assignmentÚemployee_actionsz
EMP-OPS-01u#   Cáº­p nháº­t tiáº¿n Ä‘á»™ rÃ  soÃ¡tr+   u   Ä�ang rÃ  soÃ¡t checklistu   Ä�Ã£ gá»­i nháº¯c viá»‡cr7   )r\   r]   r^   r_   rZ   rP   Únotesra   )Úproject_codeÚlead_agent_codeÚlead_reviewer_employee_codeÚinitiated_by_employee_codeÚassigned_departmentsÚbaseline_snapshotÚfindingsÚparticipating_employeesÚclosedr   Úverifiedé   z
snapshot-1r   r*   )úis not)zB%(py2)s
{%(py2)s = %(py0)s.created_review_payload
} is not %(py5)sÚfake_postgres)Úpy0Úpy2Úpy5zassert %(py7)sÚpy7Úreview_codera   Úworkflow_typeÚproactive_dossier_reviewc                ó,   — i | ]}|d          |d         “ŒS )r\   rZ   r   ©Ú.0Úitems     r   ú
<dictcomp>z‹WorkflowPersistenceServiceFlowTests.test_start_review_run_persists_review_findings_assignments_and_normalized_work_logs.<locals>.<dictcomp>Ã   s3   € ð 
ð 
ð 
àð �Ô! 4¨¤>ð
ð 
ð 
r   r,   c                ó,   — i | ]}|d          |d         “ŒS )r_   r[   r   r   s     r   r‚   z‹WorkflowPersistenceServiceFlowTests.test_start_review_run_persists_review_findings_assignments_and_normalized_work_logs.<locals>.<dictcomp>Ê   s3   € ð 
ð 
ð 
àð �ŒN˜D Ô/ð
ð 
ð 
r   r8   r6   )$Úmock_persona_payloadÚreturn_valueÚmock_policy_persona_payloadr   r   r   Úmodel_validateÚstart_review_runr0   Úreviewrj   rZ   Úfinding_summariesrb   Úassignment_statusÚlenÚemployee_log_summariesÚcreated_snapshot_idsÚassertGreaterEqualÚreview_action_countÚ
assertTrueÚclose_executedÚautomation_statusÚassertIsNotNoneÚcreated_review_payloadÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr
   Úupserted_sessionsÚappended_actions)r   Úmock_get_personaÚmock_policy_get_personarv   ÚserviceÚrequestrP   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Úsession_statusesÚaction_typess                 r   ÚStest_start_review_run_persists_review_findings_assignments_and_normalized_work_logszwWorkflowPersistenceServiceFlowTests.test_start_review_run_persists_review_findings_assignments_and_normalized_work_logsi   s=  € ð )-×(AÒ(AÑ(CÔ(CÐÔ%Ø/3×/OÒ/OÑ/QÔ/QÐÔ,Ý*Ñ,Ô,ˆÝ,¸]ÐKÑKÔKˆå,Ô;à )Ø#0Ø/9Ø.8Ø)0¨	à%7Ø1;Ø.;Ø'Ø,ð&ð &ð )0Ø)0Ø(:Ø!GØ7>à8?Ø6BØ(.Ø(4Ø&/ð'ð 'ð 2>Ø.;Ø3:Ø*PØ*:Ø.YÐ-ZØ-:Ð<MÐ,Nðð ð
-ðð ðð: *6Ø&3Ø+2Ø"GØ"7Ø#>Ø"<Ð!=Ø%2Ð4EÐ$Fð	ð 	ð,ðQ4ð 4ñ6
ô 6
ˆðp ×*Ò*¨7Ñ3Ô3ˆà×Ò˜œÔ4°iÑ@Ô@Ð@Ø×Ò˜œÔ.°Ñ9Ô9Ð9Ø×Ò˜Ô2°1Ô5ÔBÀGÑLÔLÐLØ×Ò˜Ô2°1Ô5ÔGÈÑTÔTÐTØ×Ò�˜WÔ;Ñ<Ô<¸aÑ@Ô@Ð@Ø×Ò˜Ô5¸°~ÑFÔFÐFØ×Ò Ô ;¸QÑ?Ô?Ð?Ø�Š˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô2°KÑ@Ô@Ð@à×Ò˜]ÔAÑBÔBÐBØÔ3Ð?¸4Ð?Ð3¸4Ð?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?Ð3¸4Ð?Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?ˆ}Ñ?Ô?Ð?Õ?Ô?ˆ}Ñ?Ô?Ð?Ð?Õ?Ô?Ð3Ñ?Ô?Õ?Ô?¸4Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ý"Ø�-Ô6°}ÔEñ	
ô 	
ð 	
ð 	×ÒØÔ0°Ô<¸_ÔMØ&ñ	
ô 	
ð 	
ð

ð 
à%Ô7ð
ñ 
ô 
Ðð 	×ÒÐ)¨,Ô7¸ÑGÔGÐGØ×ÒÐ)¨,Ô7¸ÑGÔGÐGð
ð 
à%Ô6ð
ñ 
ô 
ˆð 	×Ò˜Ð&KÔLÈmÑ\Ô\Ð\Ø×Ò˜Ð&LÔMÐO_Ñ`Ô`Ð`Ð`Ð`r   c                ó®  — |                       ¦   «         |_        |                      ¦   «         |_        t          ¦   «         }t	          |¬¦  «        }t          ¦   «         |_        t          j        dddddddd	dd
œgdœ¦  «        }| 	                    |¦  «        }|  
                    |j        d¦  «         |  
                    |j        j        d¦  «         |                      |j        j        ¦  «         |  
                    |j        j        d¦  «         |                      d|j        j        d         ¦  «         |                      d|j        ¦  «         d S )NrD   rF   r   rG   rH   rQ   rI   rR   rS   ©rb   rc   rd   re   rf   ©rj   rk   rl   rm   rp   r*   Úunavailabler   zoperational-state-unavailableÚerroru   fallback snapshot an toÃ n)r„   r…   r†   r   r   r   Ú"_company_operational_state_servicer   r‡   rˆ   r0   r“   Úoperational_state_snapshotÚsourcer‘   Úused_fallbackÚtotal_projectsÚassertInra   Úmessage)r   r    r¡   rv   r¢   r£   rP   s          r   ÚQtest_start_review_run_returns_fallback_operational_snapshot_when_enrichment_failszuWorkflowPersistenceServiceFlowTests.test_start_review_run_returns_fallback_operational_snapshot_when_enrichment_failsÑ   sc  € ð )-×(AÒ(AÑ(CÔ(CÐÔ%Ø/3×/OÒ/OÑ/QÔ/QÐÔ,Ý*Ñ,Ô,ˆÝ,¸]ÐKÑKÔKˆÝ5SÑ5UÔ5UˆÔ2å,Ô;à )Ø#0Ø/9Ø.8ð )0Ø)0Ø(:Ø!GØ7>ðð ððð ñ
ô 
ˆð$ ×*Ò*¨7Ñ3Ô3ˆà×Ò˜Ô2°KÑ@Ô@Ð@Ø×Ò˜Ô;ÔBÀMÑRÔRÐRØ�Š˜Ô:ÔHÑIÔIÐIØ×Ò˜Ô;ÔJÈAÑNÔNÐNØ�ŠØ+ØÔ.Ô7¸Ô@ñ	
ô 	
ð 	
ð 	�ŠÐ2°G´OÑDÔDÐDÐDÐDr   c                ó  — |                       ¦   «         |_        |                      ¦   «         |_        t          ¦   «         }t	          |¬¦  «        }t          j        dddddddd	dd
œgdœ¦  «        }|                     |¦  «         |                      |j	        d¦  «         |                      |j
        dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         |                      |j        d         dg¦  «         d S )NrD   rF   r   rG   rH   rQ   rI   rR   rS   r­   r®   r   z	tx-conn-1Úcreate_dossier_review_sessionÚcreate_dossier_review_findingÚassign_dossier_review_findingÚ submit_dossier_review_supplementÚverify_dossier_review_findingÚclose_dossier_review_session)r„   r…   r†   r   r   r   r‡   rˆ   r0   Útransaction_callsÚtransaction_connection_tokensÚreceived_connections)r   r    r¡   rv   r¢   r£   s         r   ÚCtest_start_review_run_uses_transaction_wrapper_for_core_write_phasezgWorkflowPersistenceServiceFlowTests.test_start_review_run_uses_transaction_wrapper_for_core_write_phaseü   så  € ð )-×(AÒ(AÑ(CÔ(CÐÔ%Ø/3×/OÒ/OÑ/QÔ/QÐÔ,Ý*Ñ,Ô,ˆÝ,¸]ÐKÑKÔKˆå,Ô;à )Ø#0Ø/9Ø.8ð )0Ø)0Ø(:Ø!GØ7>ðð ððð ñ
ô 
ˆð$ 	× Ò  Ñ)Ô)Ð)à×Ò˜Ô8¸!Ñ<Ô<Ð<Ø×Ò˜ÔDÀ{ÀmÑTÔTÐTØ×ÒØÔ.Ð/NÔOØˆMñ	
ô 	
ð 	
ð 	×ÒØÔ.Ð/NÔOØˆMñ	
ô 	
ð 	
ð 	×ÒØÔ.Ð/NÔOØˆMñ	
ô 	
ð 	
ð 	×ÒØÔ.Ð/QÔRØˆMñ	
ô 	
ð 	
ð 	×ÒØÔ.Ð/NÔOØˆMñ	
ô 	
ð 	
ð 	×ÒØÔ.Ð/MÔNØˆMñ	
ô 	
ð 	
ð 	
ð 	
r   c                ó2   — |                       d¬¦  «         d S )Nzassign_finding:finding-1©Úfailure_step©Ú<assert_failed_transaction_leaves_no_post_commit_side_effectsr2   s    r   Ú2test_start_review_run_rolls_back_when_assign_failszVWorkflowPersistenceServiceFlowTests.test_start_review_run_rolls_back_when_assign_fails7  ó-   € Ø×IÒIØ3ð 	Jñ 	
ô 	
ð 	
ð 	
ð 	
r   c                ó2   — |                       d¬¦  «         d S )NÚcreate_sessionrÅ   rÇ   r2   s    r   Ú:test_start_review_run_rolls_back_when_create_session_failsz^WorkflowPersistenceServiceFlowTests.test_start_review_run_rolls_back_when_create_session_fails<  s-   € Ø×IÒIØ)ð 	Jñ 	
ô 	
ð 	
ð 	
ð 	
r   c                ó2   — |                       d¬¦  «         d S )Nzsubmit_finding:finding-1rÅ   rÇ   r2   s    r   Ú2test_start_review_run_rolls_back_when_submit_failszVWorkflowPersistenceServiceFlowTests.test_start_review_run_rolls_back_when_submit_failsA  rÊ   r   c                ó2   — |                       d¬¦  «         d S )NÚclose_sessionrÅ   rÇ   r2   s    r   Ú1test_start_review_run_rolls_back_when_close_failszUWorkflowPersistenceServiceFlowTests.test_start_review_run_rolls_back_when_close_failsF  s-   € Ø×IÒIØ(ð 	Jñ 	
ô 	
ð 	
ð 	
ð 	
r   Nr=   )r>   r?   r@   r   r«   r¸   rÃ   rÉ   rÍ   rÏ   rÒ   r   r   r   rB   rB   h   s=  € € € € € Ø
€UÐMÑNÔNØ
€UÐRÑSÔSðdað dað dañ TÔSñ OÔNðdaðL €UÐMÑNÔNØ
€UÐRÑSÔSð'Eð 'Eð 'Eñ TÔSñ OÔNð'EðR €UÐMÑNÔNØ
€UÐRÑSÔSð7
ð 7
ð 7
ñ TÔSñ OÔNð7
ðr
ð 
ð 
ð 
ð

ð 
ð 
ð 
ð

ð 
ð 
ð 
ð

ð 
ð 
ð 
ð 
ð 
r   rB   Ú__main__)Ú
__future__r   Úbuiltinsr˜   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter–   ÚunittestÚunittest.mockr   Úapp.models.schemasr   Ú9app.modules.core.application.workflow_persistence_servicer   Ú!test_workflow_persistence_supportr   r   r	   r
   ÚImportErrorr   rB   r>   Úmainr   r   r   ú<module>rà      s§  ðØ "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø `Ð `Ð `Ð `Ð `Ð `ððð ð ð ð ð ð ð ð ð ð ð ð øð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðøøøðL
ð L
ð L
ð L
ð L
Ð*Lñ L
ô L
ð L
ð^a
ð a
ð a
ð a
ð a
Ð*Lñ a
ô a
ð a
ðH ˆzÒÐØ€H„M�O„O€O€O€Oð Ðs   «8 ¸AÁA