§
    v�›j»  ã                   óÌ   — d Z ddlZddlmc mZ ddl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edk    r ej        ¦   «          dS dS )z[Unit and Integration Tests for Cross-Agent OCR Validation and Human-in-the-Loop Quarantine.é    N)Ú	AsyncMockÚpatch)Ú
TestClient)Úget_current_user)ÚErpDatabaseClient)Ú
create_app)ÚDocumentProcessingServicec                   óX   — e Zd Zd„ Zd„ Zd„ Zd„ Z ede¬¦  «        d„ ¦   «         Z	d„ Z
d	S )
ÚTestDocumentCrossAgentAuditc                 óò  — t          | j        ¦  «        D ]/}	 | j                             |d¬¦  «         Œ # t          $ r Y Œ,w xY w| j                             ¦   «          	 | j                             ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         | 	                    ¦   «          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 # t          $ r Y d S w xY w)NT)Údelete_all_versionsu~  
                    DELETE FROM erp_documents
                    WHERE document_code IN ('TEST-BB-QUARANTINE-001', 'TEST-CROSS-AUDIT-001', '99/2026/CV-TEST')
                       OR document_title LIKE '%ká»¹ sÆ° Quá»³nh%'
                       OR document_title = 'BiÃªn báº£n nghi ngá»� sai sá»‘'
                       OR document_title = 'File scan CV 99';
                )
ÚlistÚcreated_doc_idsÚ
erp_clientÚdelete_documentÚ	ExceptionÚclearÚget_connectionÚcursorÚexecuteÚcommit)ÚselfÚdoc_idÚconnÚcurs       ú;C:\Projects\DSCons\tests\test_document_cross_agent_audit.pyÚ_cleanup_test_documentsz3TestDocumentCrossAgentAudit._cleanup_test_documents   s›  € Ý˜4Ô/Ñ0Ô0ð 	ð 	ˆFðØ”×/Ò/°ÈDÐ/ÑQÔQÐQÐQøÝð ð ð Ø�ðøøøàÔ×"Ò"Ñ$Ô$Ð$ð	Ø”×/Ò/Ñ1Ô1ð °T¸4¿;º;¹=¼=ð ÈCØ—’ð ñ ô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøsi   ˜5µ
AÁAÁC( Á8CÂ*CÂ7CÃC	ÃCÃ
C	ÃCÃC( ÃCÃC( Ã"CÃ#C( Ã(
C6Ã5C6c                 ó–   — t          ¦   «         | _        t          | j        ¬¦  «        | _        g | _        |                      ¦   «          d S )N)r   )r   r   r	   Údoc_servicer   r   ©r   s    r   ÚsetUpz!TestDocumentCrossAgentAudit.setUp%   sD   € Ý+Ñ-Ô-ˆŒÝ4ÀÄÐPÑPÔPˆÔØ*,ˆÔØ×$Ò$Ñ&Ô&Ð&Ð&Ð&ó    c                 ó.   — |                       ¦   «          d S )N)r   r    s    r   ÚtearDownz$TestDocumentCrossAgentAudit.tearDown+   s   € Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&r"   c                 ó°  — ddddœ}| j                              |d¦  «        }d„ |D ¦   «         }|                      t          |¦  «        d¦  «         dd	d
dœ}| j                              |d¦  «        }d„ |D ¦   «         }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         dS )uR   Kiá»ƒm tra cÃ¡c quy táº¯c logic cá»©ng (MST, ngÃ y thÃ¡ng, Ä‘á»™ dÃ i vÄƒn báº£n).Ú
0202111150z
2026-03-15uD   BiÃªn báº£n nghiá»‡m thu cÃ´ng viá»‡c xÃ¢y dá»±ng cá»�c khoan nhá»“i)Úpartner_tax_codeÚ
issue_dateÚdocument_titleun   Cá»˜NG HÃ’A XÃƒ Há»˜I CHá»¦ NGHÄ¨A VIá»†T NAM. BiÃªn báº£n nghiá»‡m thu cÃ´ng viá»‡c xÃ¢y dá»±ng cÃ´ng trÃ¬nh.c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )ÚseverityÚerror)Úget©Ú.0Úfs     r   ú
<listcomp>zQTestDocumentCrossAgentAudit.test_validate_deterministic_rules.<locals>.<listcomp><   s.   € ÐHÐHÐH˜Q¨1¯5ª5°Ñ+<Ô+<ÀÒ+GÐ+G�qÐ+GÐ+GÐ+Gr"   r   Ú
02021ABC99z
2099-01-01ÚCVu	   Scan má»�c                 ó   — g | ]
}|d          ‘ŒS )Úfield© r.   s     r   r1   zQTestDocumentCrossAgentAudit.test_validate_deterministic_rules.<locals>.<listcomp>I   s   € Ð<Ð<Ð<¨˜!˜Gœ*Ð<Ð<Ð<r"   r'   r(   r)   Úraw_textN)r   Úvalidate_deterministic_rulesÚassertEqualÚlenÚassertIn)r   Úvalid_extractedÚflagsÚerror_flagsÚinvalid_extractedÚflags_invalidÚfields_flaggeds          r   Ú!test_validate_deterministic_rulesz=TestDocumentCrossAgentAudit.test_validate_deterministic_rules/   s  € ð !-Ø&Ødð
ð 
ˆð
 Ô ×=Ò=ØØ|ñ
ô 
ˆð
 IÐH %ÐHÑHÔHˆØ×Ò�˜[Ñ)Ô)¨1Ñ-Ô-Ð-ð !-Ø&Ø"ð
ð 
Ðð
 Ô(×EÒEØØñ
ô 
ˆð =Ð<¨mÐ<Ñ<Ô<ˆØ�ŠÐ(¨.Ñ9Ô9Ð9Ø�Š�l NÑ3Ô3Ð3Ø�ŠÐ&¨Ñ7Ô7Ð7Ø�Š�j .Ñ1Ô1Ð1Ð1Ð1r"   z8app.modules.agents.application.llm_client.LLMClient.chat)Únew_callablec                 óJ  — ddl }d}d}||g|_        | j                             ddddd	œ¦  «        }|d
         }| j                             |¦  «         |                     | j                             |ddd¬¦  «        ¦  «         | j         	                    |¦  «        }|  
                    |¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         |                      d|d         ¦  «         dS )u]   Kiá»ƒm tra quy trÃ¬nh cháº¡y pipeline vá»›i Agent Tháº£o + Thá»§y vÃ  phÃ¢n luá»“ng cÃ¡ch ly.r   Nu7  {
            "document_code": "99/2026/CV-TEST",
            "document_title": "CÃ´ng vÄƒn cáº£nh bÃ¡o tiáº¿n Ä‘á»™ vÃ  khá»‘i lÆ°á»£ng cá»‘ng Kiáº¿n Minh",
            "document_type": "CV",
            "signature_status": "fully_executed",
            "partner_tax_code": "0202111150",
            "issue_date": "2026-04-10",
            "issuer_name": "CÃ´ng ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n",
            "signer_name": "Ä�inh VÄƒn SÆ¡n",
            "summary_content": "ThÃ´ng bÃ¡o tiáº¿n Ä‘á»™ thi cÃ´ng cá»‘ng Báº¿n Kem vÃ  tráº¡m bÆ¡m Kiáº¿n Minh."
        }uÜ   {
            "confidence_score": 92,
            "cross_audit_summary": "Dá»¯ liá»‡u bÃ³c tÃ¡ch trÃ¹ng khá»›p 100% vá»›i ná»™i dung vÄƒn báº£n gá»‘c, chá»¯ kÃ½ giÃ¡m Ä‘á»‘c rÃµ rÃ ng.",
            "flags": []
        }zTEST-CROSS-AUDIT-001zFile scan CV 99r3   Úincoming)Údocument_coder)   Údocument_typeÚcategoryÚidÚ zcong_van_99.pdfÚpdf)r   Úfile_path_strÚfilenameÚfile_formatrF   z99/2026/CV-TESTÚocr_confidence_scoreéZ   Úquarantine_statusr   u$   Dá»¯ liá»‡u bÃ³c tÃ¡ch trÃ¹ng khá»›pÚcross_audit_summary)ÚasyncioÚside_effectr   Úcreate_documentr   ÚappendÚrunr   Úrun_pipelineÚget_documentÚassertIsNotNoner9   ÚassertGreaterEqualr;   )r   Úmock_llm_chatrS   Úthao_responseÚthuy_responseÚinitial_docr   Úupdated_docs           r   Ú.test_cross_agent_audit_and_quarantine_pipelinezJTestDocumentCrossAgentAudit.test_cross_agent_audit_and_quarantine_pipelineO   s[  € ð 	ˆˆˆð
ˆðˆð &3°MÐ$BˆÔ!ð ”o×5Ò5à!7Ø"3Ø!%Ø&ð	ð ñ
ô 
ˆð ˜TÔ"ˆØÔ×#Ò# FÑ+Ô+Ð+ð 	�ŠØÔ×)Ò)ØØ Ø*Ø!ð	 *ñ ô ñ	
ô 	
ð 	
ð ”o×2Ò2°6Ñ:Ô:ˆØ×Ò˜[Ñ)Ô)Ð)Ø×Ò˜ _Ô5Ð7HÑIÔIÐIØ×Ò Ð,BÔ CÀRÑHÔHÐHØ×Ò˜Ð%8Ô9¸7ÑCÔCÐCØ�ŠÐ<¸kÐJ_Ô>`ÑaÔaÐaÐaÐar"   c                 ó"  — t          ¦   «         }d„ |j        t          <   t          |¦  «        }| j                             ddddddœ¦  «        }|d         }| j                             |¦  «         |                     d|› d	�¦  «        }|  	                    |j
        d
¦  «         |                     ¦   «         }|  	                    |d         d¦  «         |                     d|› d�ddi¬¦  «        }|  	                    |j
        d
¦  «         |                     ¦   «         }|  	                    |d         d¦  «         |  	                    |d         d¦  «         |  	                    |d         d¦  «         |                      |d         ¦  «         dS )u`   Kiá»ƒm tra luá»“ng con ngÆ°á»�i tháº©m duyá»‡t giáº£i tá»�a cÃ¡ch ly vÃ  ghi nháº­n audit trail.c                  ó   — ddddœS )Nzusr-01úengineer.quynh@dscons.vnÚpm)Úuser_idÚemailÚroler6   r6   r"   r   ú<lambda>zTTestDocumentCrossAgentAudit.test_human_approval_quarantine_release.<locals>.<lambda>‹   s   € ØØ/Øð>
ð >
€ r"   zTEST-BB-QUARANTINE-001u   BiÃªn báº£n nghi ngá»� sai sá»‘ÚBBÚquarantined)rF   r)   rG   rQ   ÚstatusrI   z/v1/erp/documents/z/audit-detailséÈ   rQ   z/approver)   uI   BiÃªn báº£n Ä‘Ã£ Ä‘Æ°á»£c ká»¹ sÆ° Quá»³nh chá»‰nh sá»­a vÃ  chuáº©n hÃ³a)Újsonrl   ÚvalidÚapprovedÚverified_by_user_idrd   Úverified_atN)r   Údependency_overridesr   r   r   rU   r   rV   r-   r9   Ústatus_codern   ÚpostrZ   )	r   ÚappÚclientÚdocr   Ú	audit_resÚ
audit_dataÚapprove_resÚapproved_docs	            r   Ú&test_human_approval_quarantine_releasezBTestDocumentCrossAgentAudit.test_human_approval_quarantine_releaseˆ   s¿  € å‰lŒlˆð6
ð 6
ˆÔ Õ!1Ñ2õ
 ˜C‘”ˆð Œo×-Ò-à!9Ø"CØ!%Ø%2Ø'ðð ñ
ô 
ˆð �T”ˆØÔ×#Ò# FÑ+Ô+Ð+ð —J’JÐJ°FÐJÐJÐJÑKÔKˆ	Ø×Ò˜Ô.°Ñ4Ô4Ð4Ø—^’^Ñ%Ô%ˆ
Ø×Ò˜Ð$7Ô8¸-ÑHÔHÐHð —k’kØ1 Ð1Ð1Ð1à Ð"mðð "ñ 
ô 
ˆð 	×Ò˜Ô0°#Ñ6Ô6Ð6Ø"×'Ò'Ñ)Ô)ˆà×Ò˜ hÔ/°Ñ9Ô9Ð9Ø×Ò˜Ð&9Ô:¸JÑGÔGÐGØ×ÒØÐ.Ô/Ð1Kñ	
ô 	
ð 	
ð 	×Ò˜\¨-Ô8Ñ9Ô9Ð9Ð9Ð9r"   N)Ú__name__Ú
__module__Ú__qualname__r   r!   r$   rB   r   r   ra   r}   r6   r"   r   r   r      s’   € € € € € ðð ð ð,'ð 'ð 'ð'ð 'ð 'ð2ð 2ð 2ð@ €UÐEÐT]Ð^Ñ^Ô^ð6bð 6bñ _Ô^ð6bðp,:ð ,:ð ,:ð ,:ð ,:r"   r   Ú__main__)Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚunittestÚ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   r~   Úmainr6   r"   r   ú<module>r’      sü   ðØ aÐ aà  € € € € € € € € € € € € €€€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à )Ð )Ð )Ð )Ð )Ð )à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^ðf:ð f:ð f:ð f:ð f: (Ô"3ñ f:ô f:ð f:ðR ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr"   