§
    ‹Õ™j!	  ã                  ó¬   — 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
mZ d dlmZ d dlmZ d dlmZ d dlmZ  ee¦  «        Zd„ Zd	„ Zd
„ Zd„ Zd„ ZdS )é    )ÚannotationsN)ÚDecimal)Ú
TestClient)Úapp)ÚDataIntegrityService)ÚExcelSyncServicec                 ó^  — t          ¦   «         } |                      ¦   «         }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d	         }d
}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }|d	         }||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }t          |¦  «        }d}||k    }	|	sÇt          j        d|	fd||f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}	}dS )uP   Kiá»ƒm tra dá»‹ch vá»¥ kiá»ƒm toÃ¡n dá»¯ liá»‡u dá»± Ã¡n trÃªn CSDL thá»±c táº¿.ÚstatusÚhealthy©ú==©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6NÚtotal_projectséŒ   )ú>=)z%(py1)s >= %(py4)sÚhealthy_projectsÚintegrity_score_percentg      Y@Úanomaly_countr   Ú	anomalies©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚlen©Úpy0Úpy2r   Úpy7úassert %(py9)sÚpy9)r   Úaudit_all_projects_integrityÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationr   Ú@py_builtinsÚlocalsÚ_should_repr_global_name©ÚserviceÚresultÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_assert1Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10s               ú6C:\Projects\DSCons\tests\test_data_integrity_engine.pyÚ)test_audit_all_projects_integrity_healthyr:      sƒ  € å"Ñ$Ô$€GØ×1Ò1Ñ3Ô3€Fà�(ÔÐ(˜yÐ(Ð˜yÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð˜yÐ(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô(˜yÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ"Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ$Ô%ÐA¨Ð0@Ô)AÐAÐ%Ð)AÒAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ%Ð)AÐAÑAÔAÕAÔAÐ%ÑAÔAÕAÔAÐ)AÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAØÐ+Ô,Ð5°Ð5Ð,°Ò5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð,°Ð5Ñ5Ô5Õ5Ô5Ð,Ñ5Ô5Õ5Ô5°Ñ5Ô5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ø�/Ô"Ð' aÐ'Ð" aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð" aÐ'Ñ'Ô'Õ'Ô'Ð"Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�kÔ"Ð(�3Ð"Ñ#Ô#Ð( qÐ(Ð# qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð# qÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�3Ñ(Ô(Ð(Õ(Ô(�3Ñ(Ô(Ð(Ð(Õ(Ô(Ð"Ñ(Ô(Õ(Ô(Ð#Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ó    c                 ó:  — t          ¦   «         } |                      d¬¦  «        }|d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|d
         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|d         }t          |¦  «        }d}||k    }	|	sÇt          j        d|	fd||f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}	}d	S )uH   Kiá»ƒm tra dá»‹ch vá»¥ Ä‘á»‘i soÃ¡t Excel -> DB á»Ÿ cháº¿ Ä‘á»™ Dry Run.T)Údry_runr=   ©Úis©z%(py1)s is %(py4)sr   r   r   NÚdetected_changes_countr   r   r   Úchangesr   r   r   r!   r"   )r   Úsync_excel_to_dbr$   r%   r&   r'   r(   r   r)   r*   r+   r,   s               r9   Útest_excel_sync_service_dry_runrD      s‚  € åÑ Ô €GØ×%Ò%¨dÐ%Ñ3Ô3€Fà�)ÔÐ$ Ð$Ð Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð Ð$Ñ$Ô$Õ$Ô$ÐÑ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ØÐ*Ô+Ð0¨qÐ0Ð+¨qÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð+¨qÐ0Ñ0Ô0Õ0Ô0Ð+Ñ0Ô0Õ0Ô0¨qÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø�iÔ Ð&�3Ð Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�3Ñ&Ô&Ð&Õ&Ô&�3Ñ&Ô&Ð&Ð&Õ&Ô&Ð Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r;   c            	     óD  — t          ¦   «         } |                      ¦   «         }t          j        }|j        } ||¦  «        }|sæddt          j        ¦   «         v st          j        t          ¦  «        rt          j	        t          ¦  «        ndt          j	        |¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        ndt          j	        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          j        }|j        } ||¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j	        t          ¦  «        ndt          j	        |¦  «        t          j	        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j	        |¦  «        ndt          j	        |¦  «        t          j	        |¦  «        d	œz  }d
d|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}x}x}}	 t          j        |¦  «         dS # t          $ r Y dS w xY w)uE   Kiá»ƒm tra tÃ­nh nÄƒng sao lÆ°u file Excel trÆ°á»›c khi Ä‘á»“ng bá»™.zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}ÚosÚbackup_path)r   r   r   Úpy5r    Nr   )ú>)zg%(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.getsize
}(%(py5)s)
} > %(py10)s)r   r   r   rH   r    Úpy10zassert %(py12)sÚpy12)r   Úbackup_excel_filerF   ÚpathÚexistsr)   r*   r$   r+   r&   r'   r(   Úgetsizer%   ÚremoveÚ	Exception)
r-   rG   r4   r0   r5   r7   Ú@py_assert9Ú@py_assert8Ú@py_format11Ú@py_format13s
             r9   Útest_excel_sync_backup_creationrV   '   s²  € åÑ Ô €GØ×+Ò+Ñ-Ô-€KåŒ7Ð&ˆ7Œ>Ð&ˆ>ˆ>˜+Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�2Ñ&Ô&Ð&Õ&Ô&�2Ñ&Ô&Ð&Ð&Õ&Ô&ˆ7Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜+Ñ&Ô&Ð&Õ&Ô&˜+Ñ&Ô&Ð&Ð&Õ&Ô&Ð&Ñ&Ô&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ÝŒ7Ð+ˆ7Œ?Ð+ˆ?ˆ?˜;Ñ'Ô'Ð+¨!Ð+Ð'¨!Ò+Ð+Ð+Ñ+Õ+Ô+Ð+Ð+Ð+Ð+Ð'¨!Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�2Ñ+Ô+Ð+Õ+Ô+�2Ñ+Ô+Ð+Ð+Õ+Ô+ˆ7Ñ+Ô+Õ+Ô+ˆ?Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+˜;Ñ+Ô+Ð+Õ+Ô+˜;Ñ+Ô+Ð+Ð+Õ+Ô+Ð'Ñ+Ô+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ðÝ
Œ	�+ÑÔÐÐÐøÝð ð ð Øˆˆðøøøs   É;J Ê
JÊJc                 ó¾  — t                                d¦  «        } | j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}|                      ¦   «         }d
}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}d	S )u=   Kiá»ƒm tra API endpoint GET /v1/erp/projects/audit/integrity.z /v1/erp/projects/audit/integrityéÈ   r   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚresponse©r   r   rH   úassert %(py7)sr    Nr
   )Úin)z%(py1)s in %(py3)sÚdata)r   Úpy3zassert %(py5)srH   r   r   r   r   r   r   r   r   )ÚclientÚgetÚstatus_coder$   r%   r)   r*   r+   r&   r'   r(   Újson)rZ   r4   Ú@py_assert4r0   Ú@py_format6r7   r^   r/   r1   Ú@py_format4r2   r3   s               r9   Ú!test_api_audit_integrity_endpointrg   5   sý  € å�zŠzÐ<Ñ=Ô=€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�=Š=‰?Œ?€DØÐˆ8�tÐÐÐÐÕÔÐÐÐÐˆ8�tÐÑÔÕÔˆ8ÑÔÐÕÔÑÔÐÐÕÔ�tÑÔÐÕÔ�tÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐ#Ð˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#Ð˜tÐ#Ñ#Ô#Õ#Ô#ÐÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜tÑ#Ô#Ð#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ø$Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Õ,Ô,Ð$Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,¨Ñ,Ô,Ð,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø�Ô Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r;   c                 óð  — t                                d¦  «        } | j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}|                      ¦   «         }|d
         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d	x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d	x}x}}d	S )u?   Kiá»ƒm tra API endpoint POST /v1/erp/projects/sync/excel-to-db.z./v1/erp/projects/sync/excel-to-db?dry_run=truerX   r   rY   rZ   r[   r\   r    Nr=   Tr>   r@   r   r   r   rA   r   r   )r`   Úpostrb   r$   r%   r)   r*   r+   r&   r'   r(   rc   )rZ   r4   rd   r0   re   r7   r^   r/   r1   r2   r3   s              r9   Ú*test_api_sync_excel_to_db_dry_run_endpointrj   @   sW  € å�{Š{ÐKÑLÔL€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�=Š=‰?Œ?€DØ�	Œ?Ð"˜dÐ"ˆ?˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ?˜dÐ"Ñ"Ô"Õ"Ô"ˆ?Ñ"Ô"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØÐ(Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r;   )Ú
__future__r   Úbuiltinsr)   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter$   rF   ÚpytestÚdecimalr   Úfastapi.testclientr   Úapp.mainr   Ú7app.modules.projects.application.data_integrity_servicer   Ú3app.modules.projects.application.excel_sync_servicer   r`   r:   rD   rV   rg   rj   © r;   r9   ú<module>rw      s  ðØ "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ð Ð Ø XÐ XÐ XÐ XÐ XÐ XØ PÐ PÐ PÐ PÐ PÐ Pð 
ˆ�C‰Œ€ð
)ð 
)ð 
)ð'ð 'ð 'ðð ð ð&ð &ð &ð/ð /ð /ð /ð /r;   