§
     ’jk*  ã                  óÆ   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ  G d„ dej        ¦  «        ZdS )zbUnit and integration tests for multi-version document management, AI diffing, and audit readiness.é    )ÚannotationsN)ÚAny)Ú	MagicMockÚpatch)Ú
TestClient)Úget_current_user)ÚErpDatabaseClient)Ú
create_app)ÚDocumentProcessingServicec                  ó¤   — e Zd Zdd„Zdd„Zdd„Zdd„Z ed¦  «        dd
„¦   «         Z ed¦  «         ed¦  «        dd„¦   «         ¦   «         Z	dS )ÚTestDocumentVersioningAndAuditÚreturnÚNonec                ó:   — t          ¦   «         | _        g | _        d S ©N)r	   Ú
erp_clientÚcreated_doc_ids)Úselfs    ú>C:\Projects\DSCons\tests\test_document_versioning_and_audit.pyÚsetUpz$TestDocumentVersioningAndAudit.setUp   s   € Ý+Ñ-Ô-ˆŒØ*,ˆÔÐÐó    c           	     óR  — | j                              ¦   «         5 }|                     ¦   «         5 }| j        D ],}	 |                     d|||f¦  «         Œ# t
          $ r Y Œ)w xY w|                     ¦   «          d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nz\DELETE FROM erp_documents WHERE id = %s OR parent_document_id = %s OR root_document_id = %s;)r   Úget_connectionÚcursorr   ÚexecuteÚ	ExceptionÚcommit)r   ÚconnÚcurÚdoc_ids       r   ÚtearDownz'TestDocumentVersioningAndAudit.tearDown   sE  € ØŒ_×+Ò+Ñ-Ô-ð 
	°Ø—’‘”ð 	 #Ø"Ô2ð ð �FðØŸšØzØ# V¨VÐ4ñô ð ð øõ %ð ð ð Ø˜ðøøøà—’‘”�ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	sW   šB¯
BºAÁBÁ
A!	ÁBÁ A!	Á!BÁ8BÂB	ÂBÂB	ÂBÂB Â#B c           
     óª  — | j                              ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     ¦   «         }|rt          |d         ¦  «        nd }d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   |ddddddd	d
dœ	}| j                              |¦  «        }| j                             |d         ¦  «         |  	                    |d         d	¦  «         |  	                    |d         d¦  «         |  
                    |d         ¦  «         |  	                    |d         d¦  «         dddddiddœ}| j                              |d         |¬¦  «        }| j                             |d         ¦  «         |  	                    |d         d¦  «         |  	                    |d         d¦  «         |  
                    |d         ¦  «         |  	                    |d         |d         ¦  «         |  	                    |d         |d         ¦  «         |  	                    |d         d¦  «         | j                              |d         ¦  «        }	|                      |	d         ¦  «         dddd œ}
| j                              |d         |
¬¦  «        }| j                             |d         ¦  «         |  	                    |d         d!¦  «         |  	                    |d         d¦  «         |  
                    |d         ¦  «         | j                              |d         ¦  «        }|  	                    t          |¦  «        d"¦  «         |  	                    |d#         d         d	¦  «         |  	                    |d         d         d¦  «         |  	                    |d         d         d!¦  «         d S )$Nz!SELECT id FROM companies LIMIT 1;Úidz01/2026/CV-TESTu-   CÃ´ng vÄƒn xin gia háº¡n tiáº¿n Ä‘á»™ láº§n 1ÚdispatchÚCVÚdraftÚstage_01_initiationzv1.0u'   Báº£n dá»± tháº£o ban Ä‘áº§u chÆ°a kÃ½.)	Ú
company_idÚdocument_codeÚdocument_titleÚdocument_groupÚdocument_typeÚsignature_statusÚproject_stageÚversion_numberÚsummary_contentr/   Úversion_indexé   Úis_active_versionr-   uM   CÃ´ng vÄƒn xin gia háº¡n tiáº¿n Ä‘á»™ láº§n 1 (Ä�Ã£ sá»­a lá»—i ngÃ y thÃ¡ng)Úsigned_unsigned_sealu3   Sá»­a láº¡i ngÃ y káº¿t thÃºc tá»« 30/08 sang 15/09Úsummary_of_changesu.   Ä�iá»�u chá»‰nh má»‘c thá»�i gian hoÃ n thÃ nhz/static/uploads/test_v1_1.pdf)r*   r-   Úchange_summaryÚdiff_analysisÚfile_url)Úparent_doc_idÚpayloadzv1.1é   Úparent_document_idÚroot_document_idÚfully_executeduB   Ä�Ã£ cÃ³ chá»¯ kÃ½ GiÃ¡m Ä‘á»‘c vÃ  Ä‘Ã³ng dáº¥u Ä‘á»� phÃ¡p nhÃ¢nz'/static/uploads/test_v_final_signed.pdf)r-   r6   r8   z
v3.0_Finalé   r   )r   r   r   r   ÚfetchoneÚstrÚcreate_documentr   ÚappendÚassertEqualÚ
assertTrueÚcreate_document_versionÚget_documentÚassertFalseÚlist_document_versionsÚlen)r   r   r   Úrowr(   Úinitial_payloadÚdoc_v1Ú
v2_payloadÚdoc_v1_1Úold_docÚ
v3_payloadÚdoc_v_finalÚversionss                r   Ú test_create_and_version_documentz?TestDocumentVersioningAndAudit.test_create_and_version_document%   s]  € àŒ_×+Ò+Ñ-Ô-ð 	9°°t·{²{±}´}ð 	9ÈØ�KŠKÐ;Ñ<Ô<Ð<Ø—,’,‘.”.ˆCØ+.Ð8�˜S œY™œ˜°DˆJð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð %Ø.ØMØ(Ø!Ø 'Ø2Ø$ØHð

ð 

ˆð ”×0Ò0°ÑAÔAˆØÔ×#Ò# F¨4¤LÑ1Ô1Ð1Ø×Ò˜Ð 0Ô1°6Ñ:Ô:Ð:Ø×Ò˜ Ô0°!Ñ4Ô4Ð4Ø�Š˜Ð2Ô3Ñ4Ô4Ð4Ø×Ò˜Ð 2Ô3°WÑ=Ô=Ð=ð nØ 6ØSà$Ð&Vðð 8ð
ð 
ˆ
ð ”?×:Ò:Ø  œ,°
ð ;ñ 
ô 
ˆð 	Ô×#Ò# H¨T¤NÑ3Ô3Ð3à×Ò˜Ð"2Ô3°VÑ<Ô<Ð<Ø×Ò˜ /Ô2°AÑ6Ô6Ð6Ø�Š˜Ð!4Ô5Ñ6Ô6Ð6Ø×Ò˜Ð"6Ô7¸À¼ÑFÔFÐFØ×Ò˜Ð"4Ô5°v¸d´|ÑDÔDÐDØ×Ò˜Ð"4Ô5Ð7MÑNÔNÐNð ”/×.Ò.¨v°d¬|Ñ<Ô<ˆØ×Ò˜Ð!4Ô5Ñ6Ô6Ð6ð !1ØbØAð
ð 
ˆ
ð
 ”o×=Ò=Ø" 4œ.°*ð >ñ 
ô 
ˆð 	Ô×#Ò# K°Ô$5Ñ6Ô6Ð6à×Ò˜Ð%5Ô6¸ÑEÔEÐEØ×Ò˜Ð%7Ô8Ð:JÑKÔKÐKØ�Š˜Ð$7Ô8Ñ9Ô9Ð9ð ”?×9Ò9¸+ÀdÔ:KÑLÔLˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×Ò˜ !œÐ%5Ô6¸Ñ?Ô?Ð?Ø×Ò˜ !œÐ%5Ô6¸Ñ?Ô?Ð?Ø×Ò˜ !œÐ%5Ô6¸ÑEÔEÐEÐEÐEs5   šB¯AA>Á2BÁ>B	ÂBÂB	ÂBÂBÂBc                ól  — | j                              ¦   «         }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         d S )NÚtotal_documentsÚfully_executed_countÚmissing_seal_countÚdraft_countÚaudit_readiness_scoreÚreadiness_statusÚaudit_warning_notes)r   Úget_audit_readiness_reportÚassertIn)r   Úreports     r   Útest_audit_readiness_reportz:TestDocumentVersioningAndAudit.test_audit_readiness_reportp   s­   € Ø”×;Ò;Ñ=Ô=ˆØ�ŠÐ'¨Ñ0Ô0Ð0Ø�ŠÐ,¨fÑ5Ô5Ð5Ø�ŠÐ*¨FÑ3Ô3Ð3Ø�Š�m VÑ,Ô,Ð,Ø�ŠÐ-¨vÑ6Ô6Ð6Ø�ŠÐ(¨&Ñ1Ô1Ð1Ø�ŠÐ+¨VÑ4Ô4Ð4Ð4Ð4r   z8app.modules.agents.application.llm_client.LLMClient.chatÚ	mock_chatr   c           
     ó’  ‡— dd l }t          j        dddddddd	œgd
œ¦  «        Šdˆfd„}||_        t	          ¦   «         }|                     |                     dddd¬¦  «        ¦  «        }|                      d|¦  «         |                      |d         d¦  «         |                      t          |d         ¦  «        d¦  «         d S )Nr   uF   Sá»­a Ä‘á»•i Ä‘iá»�u khoáº£n thanh toÃ¡n tá»« 30 ngÃ y thÃ nh 15 ngÃ yu,   RÃºt ngáº¯n thá»�i gian thu há»“i cÃ´ng ná»£u'   PhÃ¹ há»£p tiáº¿n Ä‘á»™ thi cÃ´ng má»›iu	   Ä�iá»�u 5u   30 ngÃ yu   15 ngÃ yu   Thá»�a thuáº­n láº¡i)ÚsectionÚ	old_valueÚ	new_valueÚreason©r5   Úfinancial_impactÚlegal_impactÚkey_differencesÚargsr   Úkwargsr   rA   c               Ÿ  ó   •K  — ‰S r   © )rk   rl   Úmock_diff_responses     €r   Ú	fake_chatzSTestDocumentVersioningAndAudit.test_compare_document_versions_ai.<locals>.fake_chatŽ   s   øè è € Ø%Ð%r   uL   Há»£p Ä‘á»“ng thanh toÃ¡n trong vÃ²ng 30 ngÃ y ká»ƒ tá»« ngÃ y nghiá»‡m thu.uL   Há»£p Ä‘á»“ng thanh toÃ¡n trong vÃ²ng 15 ngÃ y ká»ƒ tá»« ngÃ y nghiá»‡m thu.zHD_v1.0.docxzHD_v1.1_Final.docx)Úold_textÚnew_textÚfilename_oldÚfilename_newr5   rh   rj   r2   )rk   r   rl   r   r   rA   )
ÚasyncioÚjsonÚdumpsÚside_effectr   ÚrunÚcompare_document_versionsr^   rD   rJ   )r   ra   ru   rp   ÚserviceÚresultro   s         @r   Ú!test_compare_document_versions_aiz@TestDocumentVersioningAndAudit.test_compare_document_versions_aiz   s  ø€ àˆˆˆå!œZà&nØ$RØ Ið $/Ø%/Ø%/Ø"8ð	ð ð$ð	ð ñ
ô 
Ðð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð !*ˆ	Ôå+Ñ-Ô-ˆØ—’Ø×-Ò-ØgØgØ+Ø1ð	 .ñ ô ñ
ô 
ˆð 	�ŠÐ*¨FÑ3Ô3Ð3Ø×ÒØÐ%Ô&Ð(Vñ	
ô 	
ð 	
ð 	×Ò�˜VÐ$5Ô6Ñ7Ô7¸Ñ;Ô;Ð;Ð;Ð;r   z_app.modules.core.application.document_processing_service.DocumentProcessingService.run_pipelinezlapp.modules.core.application.document_processing_service.DocumentProcessingService.compare_document_versionsÚ	mock_diffÚmock_pipelinec           	     óz  — d'd„}||_         ddi|_        t          ¦   «         }d(d	„}||j        t          <   t          |¦  «        }|                     d
ddddddœ¬¦  «        }|                      |j        d¦  «         | 	                    ¦   «         }|d         }	| j
                             |	¦  «         d}
|                     d|	› d�ddt          j        |
¦  «        dfidddœ¬¦  «        }|                      |j        d¦  «         | 	                    ¦   «         }| j
                             |d         ¦  «         |                      |d         d¦  «         |                     d|	› d�¦  «        }|                      |j        d¦  «         | 	                    ¦   «         }|                      t          |¦  «        d ¦  «         |                     d|d         › d!�dd"i¬¦  «        }|                      |j        d¦  «         | 	                    ¦   «         }|                      |d         d"¦  «         |                      |d#         d$¦  «         |                     d%¦  «        }|                      |j        d¦  «         | 	                    ¦   «         }|                      d&|¦  «         |                      d#|¦  «         d S ))Nrk   r   rl   r   údict[str, Any]c               Ÿ  ó   K  — dddg dœS )Nõ8   Báº£n Ä‘Ã£ kÃ½ nhÃ¡y cá»§a TrÆ°á»Ÿng phÃ²ng Ká»¹ thuáº­tu   KhÃ´ng phÃ¡t hiá»‡n thay Ä‘á»•iu   Ä�Ã£ kÃ½ nhÃ¡yrg   rn   )rk   rl   s     r   Ú	fake_diffz^TestDocumentVersioningAndAudit.test_api_document_version_and_diff_endpoints.<locals>.fake_diff¬   s!   è è € à&`Ø$EØ 0Ø#%ð	ð ð r   ÚstatusÚsuccessc                 ó   — dddddœS )Nztest-superadmin-idzsuperadmin@dscons.vnÚ
superadminzTest Super Admin)Úuser_idÚemailÚroleÚ	full_namern   rn   r   r   Úoverride_get_current_userznTestDocumentVersioningAndAudit.test_api_document_version_and_diff_endpoints.<locals>.override_get_current_user¹   s   € à/Ø/Ø$Ø/ð	ð ð r   z/v1/erp/documentsu/   Tá»� trÃ¬nh phÃª duyá»‡t biá»‡n phÃ¡p thi cÃ´ngÚTTrÚoutgoingÚstage_02_technicalr&   )r*   r,   Úcategoryr.   r-   )rv   éÈ   r#   s(   Noi dung to trinh da ky nhay va dong dauz/v1/erp/documents/z/upload-versionÚfilezto_trinh_v2.txtz
text/plainrƒ   Úreviewed)r6   r-   )ÚfilesÚdatar-   z	/versionsr;   z/signature-statusr>   rZ   éd   z!/v1/erp/documents/audit-readinessrV   )rk   r   rl   r   r   r�   )r   r�   )rx   Úreturn_valuer
   Údependency_overridesr   r   ÚpostrD   Ústatus_coderv   r   rC   ÚioÚBytesIOÚgetrJ   r^   )r   r~   r   r„   Úappr�   ÚclientÚ
create_resÚdoc_datar    Úmock_file_contentÚupload_ver_resÚver_docÚversions_resÚv_listÚsig_update_resÚupdated_docÚ	audit_resÚ
audit_datas                      r   Ú,test_api_document_version_and_diff_endpointszKTestDocumentVersioningAndAudit.test_api_document_version_and_diff_endpoints£   s  € ð	ð 	ð 	ð 	ð !*ˆ	ÔØ&.°	Ð%:ˆÔ"å‰lŒlˆð	ð 	ð 	ð 	ð 6OˆÔ Õ!1Ñ2Ý˜C‘”ˆð —[’[Øà"SØ!&Ø&Ø!5Ø$+ðð ð !ñ 	
ô 	
ˆ
ð 	×Ò˜Ô/°Ñ5Ô5Ð5Ø—?’?Ñ$Ô$ˆØ˜$”ˆØÔ×#Ò# FÑ+Ô+Ð+ð HÐØŸšØ8 Ð8Ð8Ð8àÐ*­B¬JÐ7HÑ,IÔ,IÈ<ÐXðð #]Ø$.ðð ð %ñ 	
ô 	
ˆð 	×Ò˜Ô3°SÑ9Ô9Ð9Ø ×%Ò%Ñ'Ô'ˆØÔ×#Ò# G¨D¤MÑ2Ô2Ð2Ø×Ò˜Ð!3Ô4°jÑAÔAÐAð —z’zÐ"H°vÐ"HÐ"HÐ"HÑIÔIˆØ×Ò˜Ô1°3Ñ7Ô7Ð7Ø×"Ò"Ñ$Ô$ˆØ×Ò�˜V™œ aÑ(Ô(Ð(ð  ŸšØA ¨¤ÐAÐAÐAØ$Ð&6Ð7ð %ñ 
ô 
ˆð 	×Ò˜Ô3°SÑ9Ô9Ð9Ø$×)Ò)Ñ+Ô+ˆØ×Ò˜Ð%7Ô8Ð:JÑKÔKÐKØ×Ò˜Ð%<Ô=¸sÑCÔCÐCð —J’JÐBÑCÔCˆ	Ø×Ò˜Ô.°Ñ4Ô4Ð4Ø—^’^Ñ%Ô%ˆ
Ø�ŠÐ'¨Ñ4Ô4Ð4Ø�ŠÐ-¨zÑ:Ô:Ð:Ð:Ð:r   N)r   r   )ra   r   r   r   )r~   r   r   r   r   r   )
Ú__name__Ú
__module__Ú__qualname__r   r!   rT   r`   r   r}   r¬   rn   r   r   r   r      sñ   € € € € € ð-ð -ð -ð -ðð ð ð ðIFð IFð IFð IFðV5ð 5ð 5ð 5ð €UÐEÑFÔFð&<ð &<ð &<ñ GÔFð&<ðP €UØiñô ð €UØvñô ðQ;ð Q;ð Q;ñô ñô ðQ;ð Q;ð Q;r   r   )Ú__doc__Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arrœ   rv   ÚunittestÚtypingr   Úunittest.mockr   r   Úfastapi.testclientr   Ú"app.modules.auth.presentation.authr   Úapp.core.postgres.erp_clientr	   Úapp.mainr
   Ú8app.modules.core.application.document_processing_servicer   ÚTestCaser   rn   r   r   ú<module>rÁ      s  ðØ hÐ hà "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à )Ð )Ð )Ð )Ð )Ð )à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^ðg;ð g;ð g;ð g;ð g; XÔ%6ñ g;ô g;ð g;ð g;ð g;r   