§
     ’j)m  ã                   ó  — 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mZmZmZmZmZmZ d dlmZ  G d„ d¦  «        Z G d„ dej        ¦  «        Z G d	„ d
ej        ¦  «        Zedk    r ej        ¦   «          dS dS )é    N)ÚPath)Ú"CompanyOperationalStateSummaryItemÚDossierCoverageResponseÚ"RemediationArtifactRequirementItemÚRemediationBuildRequestÚRemediationGapItemÚRemediationPlanItemÚRemediationRequiredInputItemÚRemediationTaskItem)ÚRemediationPlanningServicec                   ó$   — e Zd Zdd„Zd„ Zdd„ZdS )ÚStubPostgresClientNTc                 ó*   — |�|ng | _         || _        d S ©N)Ú	_sessionsÚ_enabled)ÚselfÚsessionsÚenableds      ú=C:\Projects\DSCons\tests\test_remediation_planning_service.pyÚ__init__zStubPostgresClient.__init__   s   € Ø%-Ð%9˜˜¸rˆŒØˆŒˆˆó    c                 ó   — | j         S r   )r   )r   s    r   Ú
is_enabledzStubPostgresClient.is_enabled   s
   € ØŒ}Ðr   c                 ór   ‡‡— t          | j        ¦  «        }‰rˆfd„|D ¦   «         }‰rˆfd„|D ¦   «         }|S )Nc                 óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS ©Úproject_code©Úget)Ú.0Úsessionr   s     €r   ú
<listcomp>zDStubPostgresClient.fetch_dossier_review_sessions.<locals>.<listcomp>   s:   ø€ ð ð ð àØ—;’;˜~Ñ.Ô.°,Ò>Ð>ð à>Ð>Ð>r   c                 óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS )Ú	review_idr   )r!   r"   r%   s     €r   r#   zDStubPostgresClient.fetch_dossier_review_sessions.<locals>.<listcomp>$   s6   ø€ ð ð ð Ø#¨w¯{ª{¸;Ñ/GÔ/GÈ9Ò/TÐ/T�Ð/TÐ/TÐ/Tr   )Úlistr   )r   r   r%   Úrowss    `` r   Úfetch_dossier_review_sessionsz0StubPostgresClient.fetch_dossier_review_sessions   s|   øø€ Ý�D”NÑ#Ô#ˆØð 	ðð ð ð à#ðñ ô ˆDð
 ð 	ðð ð ð Ø'+ðñ ô ˆDð ˆr   )NT)NN)Ú__name__Ú
__module__Ú__qualname__r   r   r(   © r   r   r   r      sK   € € € € € ð ð  ð  ð  ðð ð ðð ð ð ð ð r   r   c                   ó   — e Zd Zdd„ZdS )ÚRemediationPlanningSchemasTestsÚreturnNc                 ó  — t          j        i dd“dd“dd“dd“d	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"d#d$dd%d&œg“d'd(d)d*d+dd,d-dd"gd.œ	g“d/d0d,d1d1d,d,g d1d2d3œ	“d4d5d6d7œ¥¦  «        }t          j        dddd
dd8œ¦  «        }t          j        d9d:d;d<d=d
ddd2d>œgid?œ¦  «        }t	          j        dddd
dd@dAgdBgdCgd6d6ddDd6dEœ¦  «        }t          j        ddFddGdHdHd,d,d,dIdJd,idgdKdLdJdJdMdNdOœgdPgdQœdRd6dSœ¦  «        }|                      |j        d1         t          ¦  «         |                      |j	        d1         t          ¦  «         |                      |j        d1         t          ¦  «         |                      |j        d¦  «         |                      |j        d=         d1         d	         d
¦  «         |                      |j        d@¦  «         |                      |j        j        d1         j        dJ¦  «         d S )TNÚplan_idzremediation-plan-1r   úPRJ-001Úreview_session_idú
review-001Ú
finding_idúfinding-001Úfinding_codeúF-001Údocument_typeÚbien_ban_nghiem_thu_noi_boÚdossier_stageÚhoan_thien_ho_soÚpriorityÚhighÚowner_department_codeÚQAÚowner_employee_codeÚNV001Údestination_folderz /du-an/PRJ-001/nghiem-thu-noi-boÚoutput_filenamez-PRJ-001_bien-ban-nghiem-thu-noi-bo_F-001.docxÚnaming_rulez2{project_code}_{document_type}_{finding_code}.docxÚrequired_inputsÚma_du_anu   MÃ£ dá»± Ã¡nTzsession.project_code)Ú
input_codeÚlabelÚrequiredÚsource_hintÚartifact_requirementsÚmau_bien_banu)   Máº«u biÃªn báº£n nghiá»‡m thu ná»™i bá»™Útemplateu'   Biá»ƒu máº«u Ä‘Ã£ Ä‘Æ°á»£c phÃª duyá»‡t)Úartifact_coderI   Úartifact_typerJ   ÚdescriptionÚremediation_taskszremediation-plan-1:task:1Úthu_thap_minh_chungu   Thu tháº­p minh chá»©ngÚdata_collectioné   Úpending)	Útask_idÚ	task_codeÚtitleÚ	task_typer=   Úsequence_noÚstatusÚblockingÚexpected_output_codesÚreadiness_summaryÚneeds_reviewr   u0   Ä�á»§ dá»¯ liá»‡u ná»�n Ä‘á»ƒ láº­p káº¿ hoáº¡ch)	r\   Úready_input_countÚmissing_input_countÚblocking_input_countÚartifact_countÚ
task_countÚblocking_reasonsÚcoverage_gap_countÚmessageuC   Cáº§n rÃ  soÃ¡t máº«u vÃ  minh chá»©ng trÆ°á»›c khi soáº¡n há»“ sÆ¡Úderived_from_sessionsF)rh   ÚsourceÚused_fallback)r   r3   r5   r7   r9   Úremediation_readyu   Sáºµn sÃ ng remediationÚ1ÚinfoÚplans)r7   r9   r=   r_   )ÚcoderI   ÚvalueÚseverityÚmetadataÚblockedu1   Thiáº¿u input: CÄƒn cá»© há»“ sÆ¡ cháº¥t lÆ°á»£ngÚcan_cu_ho_so_chat_luongu"   CÄƒn cá»© há»“ sÆ¡ cháº¥t lÆ°á»£ngÚpostgres)r   r3   r5   r7   r9   Ú
gap_statusrf   Úmissing_input_codesÚmissing_input_labelsÚrequires_document_type_mappingÚcan_build_planr1   rj   rk   ztmp/coverage.jsonõ   Dá»± Ã¡n 01é   é   Úhop_dongzA/file.docxz	file.docxÚrulegÍÌÌÌÌÌì?©Úrelative_pathÚsource_filenamer9   Ú	doc_stageÚclassification_sourceÚclassification_confidenceu$   Thiáº¿u document types trá»�ng yáº¿u)r   Úproject_nameÚtotal_filesÚextractable_filesÚclassified_filesÚunknown_filesÚknowledge_files_ingestedÚknowledge_chunks_ingestedÚdocument_type_countsÚmissing_document_typesÚ	documentsÚreadiness_gapsÚmanifest)r   Úmanifest_pathÚprojectrj   rk   )r	   Úmodel_validater   r   r   r   ÚassertIsInstancerF   r
   rL   r   rR   r   ÚassertEqualr9   rs   rw   r”   r�   )r   ÚplanÚrequestÚsummaryÚgapÚcoverages         r   Ú*test_nested_schema_models_validate_payloadzJRemediationPlanningSchemasTests.test_nested_schema_models_validate_payload+   sÉ  € Ý"Ô1ð:ØÐ/ð:à 	ð:ð $ \ð:ð ˜mð	:ð
  ð:ð  Ð!=ð:ð  Ð!3ð:ð ˜Fð:ð (¨ð:ð & wð:ð %Ð&Hð:ð "Ð#Rð:ð ÐSð:ð "à&0Ø!/Ø$(Ø'=ð	ð ð$ð:ð, (à)7Ø!LØ)3Ø$(Ø'Pðð ð*ð-:ð> $à#>Ø%:Ø!:Ø%6Ø$*Ø'(Ø"+Ø$(Ø2@Ð1Að
ð 
ð&ð?:ðX $Ø,Ø)*Ø+,Ø,-Ø&'Ø"#Ø(*Ø*+ØQð
&ð 
&ðY:ðn aØ1Ø!&ðs:ð :ð :ñ<
ô <
ˆõ| *Ô8à )Ø%1Ø+Ø 'Ø!=ðð ñ
ô 
ˆõ 5ÔCà+Ø2ØØ"àà,3Ø-IØ(.Ø1cð	ð ðð	ðð ñ
ô 
ˆõ& !Ô/à )Ø%1Ø+Ø 'Ø!=Ø'Ø%XÐ$YØ(AÐ'BØ)MÐ(NØ27Ø"'Ø/Ø$Ø!&ðð ñ
ô 
ˆõ& +Ô9à )Ø!4à$-Ø$1Ø#$Ø)*Ø()Ø%&Ø01Ø12Ø-7¸¨OØ/KÐ.Lð .;Ø/:Ø-7Ø)3Ø5;Ø9<ðð ð	"ð (NÐ&Nð+ð ð. %Ø!&ð7ð ñ
ô 
ˆð@ 	×Ò˜dÔ2°1Ô5Õ7SÑTÔTÐTØ×ÒØÔ& qÔ)Õ+Mñ	
ô 	
ð 	
ð 	×Ò˜dÔ4°QÔ7Õ9LÑMÔMÐMØ×Ò˜Ô.Ð0LÑMÔMÐMØ×Ò˜Ô)¨'Ô2°1Ô5°nÔEÀwÑOÔOÐOØ×Ò˜œ¨Ñ3Ô3Ð3Ø×Ò˜Ô)Ô3°AÔ6ÔDÀjÑQÔQÐQÐQÐQr   ©r/   N)r)   r*   r+   r�   r,   r   r   r.   r.   *   s4   € € € € € ðWRð WRð WRð WRð WRð WRr   r.   c                   óš   — e Zd Zdedefd„Zdd„Zdd„Zdd„Zdd„Z	dd	„Z
	 	 dd
„Z	 	 dd„Zdd„Z	 	 dd„Zdd„Z	 	 dd„Z	 	 dd„Zdd„ZdS )ÚRemediationPlanningServiceTestsÚpayloadr/   c                 óþ   — t          j        ¦   «         }|                      |j        ¦  «         t	          |j        ¦  «        dz  }|                     t          j        |d¬¦  «        d¬¦  «         t          |¦  «        S )Núcoverage.jsonF)Úensure_asciiúutf-8©Úencoding)
ÚtempfileÚTemporaryDirectoryÚ
addCleanupÚcleanupr   ÚnameÚ
write_textÚjsonÚdumpsÚstr)r   r¡   Útemp_dirÚpaths       r   Ú_write_manifestz/RemediationPlanningServiceTests._write_manifestÆ   sj   € ÝÔ.Ñ0Ô0ˆØ�Š˜Ô(Ñ)Ô)Ð)Ý�H”MÑ"Ô" _Ñ4ˆØ�Š�œ
 7¸Ð?Ñ?Ô?È'ˆÑRÔRÐRÝ�4‰yŒyÐr   Nc                 óŠ  — dddddddddd	d	d
dddœgddddgdddœdœ
gdœg}|                       dddddddddddig g dœgi¦  «        }t          t          |¦  «        |¬¦  «        }|                     d¬¦  «        }|                      |j        d¦  «         |                      |j        ¦  «         |                      t          |j	        ¦  «        d¦  «         |j	        d         }|                      |j
        d¦  «         |                      |j        ¦  «         |                      t          |j        ¦  «        d ¦  «         |                      t          |j        ¦  «        d¦  «         |                      t          |j        ¦  «        d!¦  «         |                      |j        j        d"¦  «         d#„ |j        D ¦   «         }d$„ |j        D ¦   «         }d%„ |j        D ¦   «         }|                      d&|¦  «         |                      d'|¦  «         |                      d(|¦  «         |                      d|j        ¦  «         d S ))Nr4   r2   r6   r8   r:   r<   Úopenr>   Úquality_assurancerB   Úin_progress)Úassigned_department_codeÚassigned_employee_coder\   r=   u   Ä�á»• bÃª tÃ´ng cá»‘ng há»™pzBV-01, TCVN-02r@   u   Chá»‰ huy trÆ°á»Ÿngu   Ä�áº¡t yÃªu cáº§uz
2026-03-28©Úwork_item_nameÚquality_referenceÚ	attendeesÚinspection_resultÚinspection_date)
r5   r7   r9   r;   r\   rr   Úimpact_levelÚresponsible_department_codeÚassignmentsrs   ©r%   r   ÚfindingsÚprojectsr|   é   r   é	   rU   ©r   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   ©Úpostgres_clientr“   r   rv   é   r~   Úreadyc                 ó   — h | ]	}|j         ’Œ
S r,   )rO   ©r!   Úitems     r   ú	<setcomp>zgRemediationPlanningServiceTests.test_specialized_plan_for_bien_ban_nghiem_thu_noi_bo.<locals>.<setcomp>  s   € ÐTÐTÐT°˜$Ô,ÐTÐTÐTr   c                 ó   — h | ]	}|j         ’Œ
S r,   )rH   rÎ   s     r   rÐ   zgRemediationPlanningServiceTests.test_specialized_plan_for_bien_ban_nghiem_thu_noi_bo.<locals>.<setcomp>  s   € ÐHÐHÐH¨4�t”ÐHÐHÐHr   c                 ó   — h | ]	}|j         ’Œ
S r,   )rX   rÎ   s     r   rÐ   zgRemediationPlanningServiceTests.test_specialized_plan_for_bien_ban_nghiem_thu_noi_bo.<locals>.<setcomp>  s   € ÐHÐHÐH¨�d”nÐHÐHÐHr   Úban_du_thao_bien_banÚthanh_phan_tham_duÚlap_du_thao_bien_ban)r³   r   r   Ú
list_plansr—   rj   ÚassertFalserk   ÚlenÚitemsr9   ÚassertGreaterEqualrF   rL   rR   r_   r\   ÚassertInrD   )	r   r   r“   ÚserviceÚresponser˜   Úartifact_codesÚinput_codesÚ
task_codess	            r   Ú4test_specialized_plan_for_bien_ban_nghiem_thu_noi_bozTRemediationPlanningServiceTests.test_specialized_plan_for_bien_ban_nghiem_thu_noi_boÍ   s¿  € ð *Ø )ð '4Ø(/Ø)EØ);Ø"(Ø$*Ø(.Ø7Jð =PØ:AØ*7Ø,2ð	ð ð(ð /MØ1AØ*.Ð0EÐ)FØ1DØ/;ð%ð %ð#ð ððð ð 
ˆðB ×,Ò,àà(1Ø(5Ø'(Ø-.Ø,-Ø)*Ø45Ø56Ø1MÈqÐ0QØ24Ø%'ðð ððñ
ô 
ˆõ& -Ý.¨xÑ8Ô8Ø'ð
ñ 
ô 
ˆð
 ×%Ò%°9Ð%Ñ=Ô=ˆà×Ò˜œ¨*Ñ5Ô5Ð5Ø×Ò˜Ô/Ñ0Ô0Ð0Ø×Ò�˜Xœ^Ñ,Ô,¨aÑ0Ô0Ð0àŒ~˜aÔ ˆØ×Ò˜Ô+Ð-IÑJÔJÐJØ×Ò˜Ô+Ñ,Ô,Ð,Ø×Ò¥ DÔ$8Ñ 9Ô 9¸1Ñ=Ô=Ð=Ø×Ò¥ DÔ$>Ñ ?Ô ?ÀÑCÔCÐCØ×Ò¥ DÔ$:Ñ ;Ô ;¸QÑ?Ô?Ð?Ø×Ò˜Ô/Ô6¸Ñ@Ô@Ð@àTÐT¸Ô9SÐTÑTÔTˆØHÐH°4Ô3GÐHÑHÔHˆØHÐH°Ô1GÐHÑHÔHˆ
à�ŠÐ,¨nÑ=Ô=Ð=Ø�ŠÐ*¨KÑ8Ô8Ð8Ø�ŠÐ,¨jÑ9Ô9Ð9Ø�ŠÐ2°DÔ4HÑIÔIÐIÐIÐIr   c                 óÂ  — ddddddddœgd	œg}t          t          |¦  «        ¬
¦  «        }|                     d¬¦  «        }|                      t	          |j        ¦  «        d¦  «         |j        d         }|                      |j        d¦  «         |                      |j        ¦  «         |  	                    t	          |j
        ¦  «        d¦  «         |  	                    t	          |j        ¦  «        d¦  «         |  	                    t	          |j        ¦  «        d¦  «         |                      d|j        ¦  «         |                      |j        j        d¦  «         d S )Nz
review-002zPRJ-002zfinding-002zF-002Útai_lieu_khacÚbo_sungrµ   )r5   r7   r9   r;   r\   rÃ   ©rÊ   r   rU   r   rt   )r   r   rÖ   r—   rØ   rÙ   r9   Ú
assertTruerk   rÚ   rF   rL   rR   rÛ   rD   r_   r\   )r   r   rÜ   rÝ   r˜   s        r   Ú2test_generic_document_type_uses_safe_fallback_planzRRemediationPlanningServiceTests.test_generic_document_type_uses_safe_fallback_plan  sj  € ð *Ø )ð '4Ø(/Ø)8Ø)2Ø"(ðð ððð ð
ˆõ -Ý.¨xÑ8Ô8ð
ñ 
ô 
ˆð ×%Ò%°9Ð%Ñ=Ô=ˆà×Ò�˜Xœ^Ñ,Ô,¨aÑ0Ô0Ð0ØŒ~˜aÔ ˆà×Ò˜Ô+¨_Ñ=Ô=Ð=Ø�Š˜Ô*Ñ+Ô+Ð+Ø×Ò¥ DÔ$8Ñ 9Ô 9¸1Ñ=Ô=Ð=Ø×Ò¥ DÔ$>Ñ ?Ô ?ÀÑCÔCÐCØ×Ò¥ DÔ$:Ñ ;Ô ;¸QÑ?Ô?Ð?Ø�Š�o tÔ';Ñ<Ô<Ð<Ø×Ò˜Ô/Ô6¸	ÑBÔBÐBÐBÐBr   c                 ó@  — t          t          g ¦  «        ¬¦  «        }|                     d¬¦  «        }|                      |j        g ¦  «         |                      |j        ¦  «         |                      |j        d¦  «         |                      |j	        ¦  «         d S )Nrå   z	PRJ-EMPTYr   rv   )
r   r   rÖ   r—   rÙ   r×   rk   rj   ræ   rh   ©r   rÜ   rÝ   s      r   Ú+test_empty_data_returns_safe_empty_responsezKRemediationPlanningServiceTests.test_empty_data_returns_safe_empty_response?  s”   € Ý,Õ=OÐPRÑ=SÔ=SÐTÑTÔTˆà×%Ò%°;Ð%Ñ?Ô?ˆà×Ò˜œ¨Ñ,Ô,Ð,Ø×Ò˜Ô/Ñ0Ô0Ð0Ø×Ò˜œ¨*Ñ5Ô5Ð5Ø�Š˜Ô(Ñ)Ô)Ð)Ð)Ð)r   c                 ó  — t          t          g d¬¦  «        ¬¦  «        }|                     d¬¦  «        }|                      |j        g ¦  «         |                      |j        ¦  «         |                      |j        ¦  «         d S )NF)r   rå   zPRJ-DISABLEDr   )r   r   rÖ   r—   rÙ   ræ   rk   rh   ré   s      r   Ú2test_disabled_postgres_returns_safe_empty_responsezRRemediationPlanningServiceTests.test_disabled_postgres_returns_safe_empty_responseI  s†   € Ý,Ý.¨r¸5ÐAÑAÔAð
ñ 
ô 
ˆð ×%Ò%°>Ð%ÑBÔBˆà×Ò˜œ¨Ñ,Ô,Ð,Ø�Š˜Ô.Ñ/Ô/Ð/Ø�Š˜Ô(Ñ)Ô)Ð)Ð)Ð)r   c                 ó¤  — dddddddœdd	d
ddœgdœg}t          t          |¦  «        ¬¦  «        }|                     t          ddd	d
¬¦  «        ¦  «        }|                      |j        ¦  «         |                      |j        j        d	¦  «         |                      |j        j        d
¦  «         |  	                    |j        j
        ¦  «         d S )Nz
review-003zPRJ-003zfinding-003zF-003r:   rµ   ©r5   r7   r9   r\   zfinding-004zF-004rã   rÃ   rå   ©r   r3   r7   r9   )r   r   Ú
build_planr   ÚassertIsNotNonerÏ   r—   r7   r9   ræ   rk   ©r   r   rÜ   rÝ   s       r   Ú+test_build_plan_can_target_specific_findingzKRemediationPlanningServiceTests.test_build_plan_can_target_specific_findingT  s  € ð *Ø )ð '4Ø(/Ø)EØ"(ð	ð ð '4Ø(/Ø)8Ø"(ð	ð ððð ð
ˆõ( -Ý.¨xÑ8Ô8ð
ñ 
ô 
ˆð ×%Ò%Ý#Ø&Ø".Ø$Ø-ð	ñ ô ñ
ô 
ˆð 	×Ò˜Xœ]Ñ+Ô+Ð+Ø×Ò˜œÔ3°WÑ=Ô=Ð=Ø×Ò˜œÔ4°oÑFÔFÐFØ�Š˜œÔ3Ñ4Ô4Ð4Ð4Ð4r   c                 ó¸  — ddddddddd	gd
ddœdœgdœg}t          t          |¦  «        d¬¦  «        }|                     d¬¦  «        }|                      t	          |j        ¦  «        d¦  «         |                      |j        ¦  «         |                      d|j	         
                    ¦   «         ¦  «         |                      |j        d         j        ¦  «         |                      |j        d         j        j        d¦  «         |                      |j        d         j        j        g ¦  «         |                      d|j        d         j	        ¦  «         d S )Nz
review-020zPRJ-020zfinding-020zF-020r:   rµ   u   Háº¡ng má»¥c AzBV-20r@   õ   Ä�áº¡tú
2026-04-03rº   )r5   r7   r9   r\   rs   rÃ   z tmp/manifest-does-not-exist.jsonrÉ   r   rU   úcoverage manifestr   r`   u   fallback an toÃ n)r   r   rÖ   r—   rØ   rÙ   ræ   rk   rÛ   rh   Úlowerr_   r\   rf   rò   s       r   ÚBtest_list_plans_returns_fallback_when_coverage_manifest_is_missingzbRemediationPlanningServiceTests.test_list_plans_returns_fallback_when_coverage_manifest_is_missing{  so  € ð
 *Ø )ð '4Ø(/Ø)EØ"(à.>Ø18Ø*.¨Ø19Ø/;ð%ð %ðð ððð ð
ˆõ* -Ý.¨xÑ8Ô8Ø<ð
ñ 
ô 
ˆð
 ×%Ò%°9Ð%Ñ=Ô=ˆà×Ò�˜Xœ^Ñ,Ô,¨aÑ0Ô0Ð0Ø�Š˜Ô.Ñ/Ô/Ð/Ø�ŠÐ)¨8Ô+;×+AÒ+AÑ+CÔ+CÑDÔDÐDØ�Š˜œ qÔ)Ô7Ñ8Ô8Ð8Ø×Ò˜œ¨Ô*Ô<ÔCÀ^ÑTÔTÐTØ×Ò˜œ¨Ô*Ô<ÔMÈrÑRÔRÐRØ�ŠÐ)¨8¬>¸!Ô+<Ô+DÑEÔEÐEÐEÐEr   c                 óx  — dddddddœgdœg}t          j        ¦   «         }|                      |j        ¦  «         t	          |j        ¦  «        d	z  }|                     d
d¬¦  «         t          t          |¦  «        t          |¦  «        ¬¦  «        }| 
                    t          dddd¬¦  «        ¦  «        }|                      |j        ¦  «         |                      |j        ¦  «         |                      |j        j        ¦  «         |                      d|j                             ¦   «         ¦  «         d S )Nz
review-021zPRJ-021zfinding-021zF-021r:   rµ   rî   rÃ   r£   ú{invalid jsonr¥   r¦   rÉ   rï   r÷   )r¨   r©   rª   r«   r   r¬   r­   r   r   r°   rð   r   rñ   rÏ   ræ   rk   rÛ   rh   rø   )r   r   r±   r“   rÜ   rÝ   s         r   ÚBtest_build_plan_returns_fallback_when_coverage_manifest_is_invalidzbRemediationPlanningServiceTests.test_build_plan_returns_fallback_when_coverage_manifest_is_invalid¢  sW  € ð
 *Ø )ð '4Ø(/Ø)EØ"(ð	ð ððð ð
ˆõ Ô.Ñ0Ô0ˆØ�Š˜Ô(Ñ)Ô)Ð)Ý˜Xœ]Ñ+Ô+¨oÑ=ˆØ× Ò  ¸7Ð ÑCÔCÐCå,Ý.¨xÑ8Ô8Ý˜mÑ,Ô,ð
ñ 
ô 
ˆð
 ×%Ò%Ý#Ø&Ø".Ø$Ø:ð	ñ ô ñ
ô 
ˆð 	×Ò˜Xœ]Ñ+Ô+Ð+Ø�Š˜Ô.Ñ/Ô/Ð/Ø�Š˜œÔ3Ñ4Ô4Ð4Ø�ŠÐ)¨8Ô+;×+AÒ+AÑ+CÔ+CÑDÔDÐDÐDÐDr   c                 óJ  — ddddddddd	id
œgdœg}|                       dddddddddddidgg dœgi¦  «        }t          t          |¦  «        |¬¦  «        }|                     d¬¦  «        }|                      t          |j        ¦  «        d¦  «         |j        d         }|                      |j        d¦  «         |                      d|j	        ¦  «         |  
                    t          d„ |j        D ¦   «         ¦  «        ¦  «         |                      |j        ¦  «         d S )Nz
review-010zPRJ-010zfinding-010zF-010r:   rä   rµ   r»   õ   MÃ³ng Ä‘Ã¡ 1x2©r5   r7   r9   r;   r\   rs   rÃ   rÅ   u   Dá»± Ã¡n 10r~   rÆ   rU   é   r   rÈ   rÉ   r   r   rt   ru   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS )u   chÆ°a phÃ¢n loáº¡iN)rø   )r!   Úreasons     r   ú	<genexpr>zkRemediationPlanningServiceTests.test_list_gaps_surfaces_missing_inputs_and_coverage_gaps.<locals>.<genexpr>û  s0   è è € ÐZÐZ¸6Ð$¨¯ª©¬Ð6ÐZÐZÐZÐZÐZÐZr   )r³   r   r   Ú	list_gapsr—   rØ   rÙ   rw   rÛ   rx   ræ   Úanyrf   r×   r{   ©r   r   r“   rÜ   rÝ   r›   s         r   Ú8test_list_gaps_surfaces_missing_inputs_and_coverage_gapszXRemediationPlanningServiceTests.test_list_gaps_surfaces_missing_inputs_and_coverage_gapsË  s„  € ð *Ø )ð '4Ø(/Ø)EØ)2Ø"(Ø%5Ð7GÐ$Hðð ð	ðð ð
ˆð  ×,Ò,àà(1Ø(5Ø'(Ø-.Ø,-Ø)*Ø45Ø56Ø1;¸Q°Ø3OÐ2PØ%'ðð ððñ
ô 
ˆõ& -Ý.¨xÑ8Ô8Ø'ð
ñ 
ô 
ˆð
 ×$Ò$°)Ð$Ñ<Ô<ˆà×Ò�˜Xœ^Ñ,Ô,¨aÑ0Ô0Ð0ØŒn˜QÔˆØ×Ò˜œ¨Ñ3Ô3Ð3Ø�ŠÐ/°Ô1HÑIÔIÐIØ�ŠÝÐZÐZÀSÔEYÐZÑZÔZÑZÔZñ	
ô 	
ð 	
ð 	×Ò˜Ô+Ñ,Ô,Ð,Ð,Ð,r   c                 óò  — ddddddddd	d
gdddœdœgdœg}|                       dddddddddddidgg dœgi¦  «        }t          t          |¦  «        |¬¦  «        }|                     d¬¦  «        }|                      t          |j        ¦  «        d¦  «         |j        d         }|                      |j        d¦  «         |                      |j        g ¦  «         |  	                    |j
        ¦  «         d S )Nz
review-011zPRJ-011zfinding-011zF-011r:   rä   rµ   rþ   zBV-11r@   rõ   rö   rº   rÿ   rÃ   rÅ   u   Dá»± Ã¡n 11r}   r   rË   r   rU   rÈ   rÉ   r   r`   )r³   r   r   r  r—   rØ   rÙ   rw   rf   ræ   r{   r  s         r   ÚBtest_list_gaps_marks_manifest_only_gap_as_needs_review_not_blockedzbRemediationPlanningServiceTests.test_list_gaps_marks_manifest_only_gap_as_needs_review_not_blockedÿ  s`  € ð
 *Ø )ð '4Ø(/Ø)EØ)2Ø"(à.>Ø18Ø*.¨Ø19Ø/;ð%ð %ðð ððð ð
ˆð, ×,Ò,àà(1Ø(5Ø'(Ø-.Ø,-Ø)*Ø45Ø56Ø1;¸Q°Ø3OÐ2PØ%'ðð ððñ
ô 
ˆõ& -Ý.¨xÑ8Ô8Ø'ð
ñ 
ô 
ˆð
 ×$Ò$°)Ð$Ñ<Ô<ˆà×Ò�˜Xœ^Ñ,Ô,¨aÑ0Ô0Ð0ØŒn˜QÔˆØ×Ò˜œ¨Ñ8Ô8Ð8Ø×Ò˜Ô-¨rÑ2Ô2Ð2Ø�Š˜Ô*Ñ+Ô+Ð+Ð+Ð+r   c                 ón  — |                       ddi dd“dd“dd“d	d
“dd“dd“dd“dd“dd“dd“dddi“ddg“ddg“ddg“dd g“d!dg“d"dg“d#d$d%ddd&d'd(œgi¥gd)œ¦  «        }t          t          g ¦  «        |¬*¦  «        }|                     d¦  «        }|                      |j        d¦  «         |                      |j        d+¦  «         |                      |j        j        d¦  «         |                      |j        j	        d,         j
        d¦  «         |                      |j        j        ¦  «         d S )-Nzhd2026-batch-001z2026-04-03T02:00:00Zr   z	PRJ-COVERr‡   u   Dá»± Ã¡n CoverageÚproject_rootu   HÄ�-2026/PRJ-COVERÚproject_root_existsTrˆ   rË   r‰   r~   rŠ   rÆ   r‹   rU   rŒ   r�   é
   rŽ   r   r}   r�   r:   Úsample_unknown_fileszunknown/a.txtÚsample_skipped_filesz
skip/b.dwlÚmissing_fileszgone/c.docxÚingested_document_typesÚstagesr�   zPRJ-COVER/contract.docxzcontract.docxr€   gffffffî?r�   )Úingest_batchÚgenerated_atrÅ   rÉ   r’   r   )r³   r   r   Úget_project_coverager—   r   rj   r”   r‹   r�   r9   ræ   r‘   ©r   r“   rÜ   rÝ   s       r   Ú0test_get_project_coverage_reads_manifest_payloadzPRemediationPlanningServiceTests.test_get_project_coverage_reads_manifest_payload8  s  € Ø×,Ò,à 2Ø 6ðØ&¨ðà&Ð(;ðð 'Ð(<ðð .¨tð	ð
 & qðð ,¨Qðð +¨Aðð (¨ðð 3°Aðð 4°Rðð /°¸Q°ðð 1Ð3OÐ2Pðð /°Ð0Aðð /°°ðð (¨-¨ðð  2°J°<ð!ð" ! : ,ð#ð$ $à1JØ3BØ1;Ø-7Ø9?Ø=Aðð ð	&ð%ð ðð"ð "ñ$
ô $
ˆõJ -Ý.¨rÑ2Ô2Ø'ð
ñ 
ô 
ˆð
 ×/Ò/°Ñ<Ô<ˆà×Ò˜Ô.°Ñ<Ô<Ð<Ø×Ò˜œ¨*Ñ5Ô5Ð5Ø×Ò˜Ô)Ô7¸Ñ;Ô;Ð;Ø×Ò˜Ô)Ô3°AÔ6ÔDÀjÑQÔQÐQØ�Š˜Ô(Ô7Ñ8Ô8Ð8Ð8Ð8r   c                 óþ  — t          t          g ¦  «        d¬¦  «        }|                     d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        ¦  «         |                      |j        j	        d¦  «         |  
                    |j        j        ¦  «         |                      |j        j        ¦  «         |                      d|j        ¦  «         d S )Nz"tmp/coverage-manifest-missing.jsonrÉ   zPRJ-FALLBACKÚfallbackr   õ!   fallback coverage rá»—ng an toÃ n)r   r   r  r—   r   rj   ræ   rk   r”   rˆ   r×   r�   r‘   rÛ   rh   ré   s      r   ÚCtest_get_project_coverage_returns_fallback_when_manifest_is_missingzcRemediationPlanningServiceTests.test_get_project_coverage_returns_fallback_when_manifest_is_missingk  sí   € õ -Ý.¨rÑ2Ô2Ø>ð
ñ 
ô 
ˆð
 ×/Ò/°Ñ?Ô?ˆà×Ò˜Ô.°Ñ?Ô?Ð?Ø×Ò˜œ¨*Ñ5Ô5Ð5Ø�Š˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô)Ô5°qÑ9Ô9Ð9Ø×Ò˜Ô)Ô3Ñ4Ô4Ð4Ø�Š˜Ô(Ô7Ñ8Ô8Ð8Ø�ŠÐ9¸8Ô;KÑLÔLÐLÐLÐLr   c                 óv  — t          j        ¦   «         }|                      |j        ¦  «         t	          |j        ¦  «        dz  }|                     dd¬¦  «         t          t          g ¦  «        t          |¦  «        ¬¦  «        }| 
                    d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        ¦  «         |                      |j        j        d¦  «         |                      d	|j                             ¦   «         ¦  «         d S )
Nr£   rû   r¥   r¦   rÉ   zPRJ-INVALIDr  r   r÷   )r¨   r©   rª   r«   r   r¬   r­   r   r   r°   r  r—   r   rj   ræ   rk   r”   r‹   rÛ   rh   rø   )r   r±   r“   rÜ   rÝ   s        r   ÚCtest_get_project_coverage_returns_fallback_when_manifest_is_invalidzcRemediationPlanningServiceTests.test_get_project_coverage_returns_fallback_when_manifest_is_invalid}  s  € õ Ô.Ñ0Ô0ˆØ�Š˜Ô(Ñ)Ô)Ð)Ý˜Xœ]Ñ+Ô+¨oÑ=ˆØ× Ò  ¸7Ð ÑCÔCÐCÝ,Ý.¨rÑ2Ô2Ý˜mÑ,Ô,ð
ñ 
ô 
ˆð
 ×/Ò/°Ñ>Ô>ˆà×Ò˜Ô.°Ñ>Ô>Ð>Ø×Ò˜œ¨*Ñ5Ô5Ð5Ø�Š˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô)Ô7¸Ñ;Ô;Ð;Ø�ŠÐ)¨8Ô+;×+AÒ+AÑ+CÔ+CÑDÔDÐDÐDÐDr   c                 óî  — |                       dg i¦  «        }t          t          g ¦  «        |¬¦  «        }|                     d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        ¦  «         |                      |j	        j
        d¦  «         |                      |j	        j        ¦  «         |                      d|j        ¦  «         d S )NrÅ   rÉ   zPRJ-404r  r   r  )r³   r   r   r  r—   r   rj   ræ   rk   r”   rˆ   r‘   rÛ   rh   r  s       r   Ú>test_get_project_coverage_returns_fallback_for_missing_projectz^RemediationPlanningServiceTests.test_get_project_coverage_returns_fallback_for_missing_project‘  sé   € Ø×,Ò,¨j¸"Ð-=Ñ>Ô>ˆÝ,Ý.¨rÑ2Ô2Ø'ð
ñ 
ô 
ˆð
 ×/Ò/°	Ñ:Ô:ˆà×Ò˜Ô.°	Ñ:Ô:Ð:Ø×Ò˜œ¨*Ñ5Ô5Ð5Ø�Š˜Ô.Ñ/Ô/Ð/Ø×Ò˜Ô)Ô5°qÑ9Ô9Ð9Ø�Š˜Ô(Ô7Ñ8Ô8Ð8Ø�ŠÐ9¸8Ô;KÑLÔLÐLÐLÐLr   rž   )r)   r*   r+   Údictr°   r³   rá   rç   rê   rì   ró   rù   rü   r  r	  r  r  r  r  r,   r   r   r    r    Å   s�  € € € € € ð tð °ð ð ð ð ðOJð OJð OJð OJðbCð Cð Cð CðB*ð *ð *ð *ð	*ð 	*ð 	*ð 	*ð%5ð %5ð %5ð %5ðN%Fà	ð%Fð %Fð %Fð %FðN'Eà	ð'Eð 'Eð 'Eð 'EðR2-ð 2-ð 2-ð 2-ðh7,à	ð7,ð 7,ð 7,ð 7,ðr19ð 19ð 19ð 19ðfMà	ðMð Mð Mð Mð$Eà	ðEð Eð Eð Eð(Mð Mð Mð Mð Mð Mr   r    Ú__main__)ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr®   r¨   ÚunittestÚpathlibr   Úapp.models.schemasr   r   r   r   r   r	   r
   r   Ú9app.modules.core.application.remediation_planning_servicer   r   ÚTestCaser.   r    r)   Úmainr,   r   r   ú<module>r.     s�  ðØ  € € € € € € € € € € € € €€€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð aÐ `Ð `Ð `Ð `Ð `ðð ð ð ð ñ ô ð ð.XRð XRð XRð XRð XR hÔ&7ñ XRô XRð XRðvZMð ZMð ZMð ZMð ZM hÔ&7ñ ZMô ZMð ZMðz ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   