§
     ’j|  ã                  ó®   — d Z ddlmZ ddlZddlmc mZ ddl	m
Z
 ddlZddlmZmZ d„ Zej        j        d„ ¦   «         Zej        j        d„ ¦   «         ZdS )	zOUnit and integration tests for HybridSearchService (BM25 + Dense Qdrant + RRF).é    )ÚannotationsN)Ú	MagicMock)ÚHybridSearchServiceÚbm25_tokenizec                 óZ  — d} t          | ¦  «        }g }d}||v }|}|sd}||v }|}|�sXt          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  }	|                     |	¦  «         |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          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}x}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}}g }d}||v }|}|sd}||v }|}|�sXt          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  }	|                     |	¦  «         |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          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}x}x}x}x}}d S )Nu?   Luáº­t XÃ¢y Dá»±ng 2025 sá»‘ 135/2025/QH15 vÃ  Cá»‘ng Báº¿n Kemu   luáº­tÚluat©Úin)z%(py3)s in %(py5)sÚtokens)Úpy3Úpy5z%(py7)sÚpy7)z%(py10)s in %(py12)s)Úpy10Úpy12z%(py14)sÚpy14é   zassert %(py17)sÚpy17z135/2025/qh15)z%(py1)s in %(py3)s)Úpy1r   úassert %(py5)sr   u   xÃ¢yÚxay)r   Ú
@pytest_arÚ_call_reprcompareÚ	_safereprÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚappendÚ_format_boolopÚAssertionErrorÚ_format_explanation)Útextr   Ú@py_assert1Ú@py_assert2Ú@py_assert4Ú@py_assert0Ú@py_assert9Ú@py_assert11Ú@py_format6Ú@py_format8Ú@py_format13Ú@py_format15Ú@py_format16Ú@py_format18Ú@py_format4s                  ú6C:\Projects\DSCons\tests\test_hybrid_search_service.pyÚtest_strip_accents_and_tokenizer0      sŸ  € ØL€DÝ˜4Ñ Ô €FØ1Ð1ˆ8Ð1ˆ8�vÐÐ1Ð1Ð1Ð1Ð1 Ð1 ¨6Ð!1Ð1Ð1Ð1Ð1Ñ1Õ1Ô1Ð1Ð1Ð1Ð1ˆ8�vÐ1Ñ1Ô1Õ1Ô1ˆ8Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�vÑ1Ô1Ð1Õ1Ô1�vÑ1Ô1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1×1Ò1Ð1Ñ1Ô1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1 ¨6Ð1Ñ1Ô1Õ1Ô1 Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1¨6Ñ1Ô1Ð1Õ1Ô1¨6Ñ1Ô1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1×1Ò1Ð1Ñ1Ô1Ð1Õ1Ô1Ð1Ð1Ñ1Ô1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÐ$ˆ?˜fÐ$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ?˜fÐ$Ñ$Ô$Õ$Ô$ˆ?Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$˜fÑ$Ô$Ð$Õ$Ô$˜fÑ$Ô$Ð$Ð$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ø.Ð.ˆ6Ð.ˆ6�VÐÐ.Ð.Ð.Ð.Ð.˜uÐ.˜u¨˜Ð.Ð.Ð.Ð.Ñ.Õ.Ô.Ð.Ð.Ð.Ð.ˆ6�VÐ.Ñ.Ô.Õ.Ô.ˆ6Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�VÑ.Ô.Ð.Õ.Ô.�VÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.×.Ò.Ð.Ñ.Ô.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.˜u¨Ð.Ñ.Ô.Õ.Ô.˜uÑ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.¨Ñ.Ô.Ð.Õ.Ô.¨Ñ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.×.Ò.Ð.Ñ.Ô.Ð.Õ.Ô.Ð.Ð.Ñ.Ô.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ó    c               ƒ  ó@  K  — t          ¦   «         } t          ¦   «         }dgdz  |j        _        dddddœdd	œd
ddddœdd	œdddddœdd	œg| j        _        t	          | |¬¦  «        }|                     ddd¬¦  «        ƒ d {V —†}t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        nd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"         }	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!         }
|	|
v }|slt          j        d)|fd*|	|
f¦  «        t          j        |	¦  «        t          j        |
¦  «        d%œz  }d&d'|iz  }t          t          j        |¦  «        ¦  «        ‚d x}	x}}
|d!         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d/¬¦  «        ƒ d {V —†}t          |¦  «        }d}||k    }|sòt          j        d#|fd0||f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        ndd1t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd1t          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|d!         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}}
|                     d2d3d4¬¦  «        ƒ d {V —†}t          |¦  «        }d3}||k    }|sòt          j        d#|fd0||f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        ndd5t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd5t          j        |¦  «        t          j        |¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}|d!         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 )6Ngš™™™™™¹?i   zpoint-1u\   Nghá»‹ Ä‘á»‹nh 206/2026/NÄ�-CP vá»� quáº£n lÃ½ chi phÃ­ Ä‘áº§u tÆ° xÃ¢y dá»±ng cÃ´ng trÃ¬nh.Ú	nghi_dinhz206/2026/ND-CP)Údoc_typeÚ
law_numberg)\�Âõ(ì?)Úidr!   ÚmetadataÚscorezpoint-2u^   Há»£p Ä‘á»“ng thi cÃ´ng xÃ¢y dá»±ng há»‡ thá»‘ng cá»‘ng há»™p kÃªnh báº¿n Kem xÃ£ Kiáº¿n Minh.zDA-KM-BENKEM-2025-2026Úhop_dong_thi_cong)Úproject_codeÚdocument_typeg=
×£p=ê?zpoint-3uc   Luáº­t sá»‘ 135/2025/QH15 Luáº­t XÃ¢y dá»±ng 2025 quy Ä‘á»‹nh vá»� miá»…n giáº¥y phÃ©p xÃ¢y dá»±ng.r   z135/2025/QH15gHáz®Gé?©Úqdrant_storeÚembedding_serviceu!   135/2025/QH15 miá»…n giáº¥y phÃ©pé   Úhybrid)ÚqueryÚtop_kÚmode)ú<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)sÚlenÚresults)Úpy0r   r   Úpy6zassert %(py8)sÚpy8r   r6   ©ú==)z%(py1)s == %(py4)s)r   Úpy4zassert %(py6)srH   Ú	rrf_scorer	   )z%(py1)s in %(py4)sÚ
bm25_score)ú>)z%(py1)s > %(py4)su	   báº¿n KemÚdense)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚdense_resultsu#   206/2026/NÄ�-CP quáº£n lÃ½ chi phÃ­r   Úbm25Úbm25_results)r   Úembed_queryÚreturn_valueÚsearchr   rE   r   r   r   r   r   r   r   r    )Úmock_qdrantÚmock_embeddingÚservicerF   r#   Ú@py_assert5r$   Ú@py_format7Ú@py_format9r%   Ú@py_assert3Ú@py_format5rQ   rS   s                 r/   Útest_hybrid_search_rrf_scoringr_      s#  è è € õ ‘+”+€KÝ‘[”[€NØ/2¨e°c©k€NÔÔ+ð
 ØrØ%0Ð@PÐQÐQØð		
ð 	
ð Øtà 8Ø!4ðð ð ð	
ð 	
ð ØyØ%+¸?ÐKÐKØð		
ð 	
ð!'€KÔÔ#õ0 "Ø °Nðñ ô €Gð
 —N’NØ1¸Àð #ñ ô ð ð ð ð ð ð €Gõ ˆw‰<Œ<Ð˜1Ðˆ<˜1ÒÐÐÐÕÔÐÐÐÐˆ<˜1ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔˆ<ÑÔÕÔ˜1ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ�1Œ:�dÔÐ(˜yÐ(Ð˜yÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð˜yÐ(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô(˜yÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ$˜' !œ*Ð$ˆ;˜*Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ;˜*Ð$Ñ$Ô$Õ$Ô$ˆ;Ñ$Ô$Õ$Ô$˜*Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø�1Œ:�lÔ#Ð' aÐ'Ð# aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð# aÐ'Ñ'Ô'Õ'Ô'Ð#Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð "Ÿ.š.¨{À!È'˜.ÑRÔRÐRÐRÐRÐRÐRÐR€MÝˆ}ÑÔÐ" Ð"Ð Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ}Ñ"Ô"Ð"Õ"Ô"ˆ}Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø˜Ô˜DÔ!Ð. YÐ.Ð! YÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð! YÐ.Ñ.Ô.Õ.Ô.Ð!Ñ.Ô.Õ.Ô. YÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð !ŸšØ3¸1À6ð (ñ ô ð ð ð ð ð ð €Lõ ˆ|ÑÔÐ! Ð!Ð Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!Ð Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�3Ñ!Ô!Ð!Õ!Ô!�3Ñ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ|Ñ!Ô!Ð!Õ!Ô!ˆ|Ñ!Ô!Ð!Ð!Õ!Ô!ÐÑ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø˜Œ?˜4Ô Ð- IÐ-Ð  IÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Õ-Ô- IÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r1   c               ƒ  ó„  K  — t          ¦   «         } t          ¦   «         }t          | |¬¦  «        }|                     dd¬¦  «        ƒ d {V —†}g }||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}g | j        _        |                     dd¬¦  «        ƒ d {V —†}g }||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚d x}}d S )Nr<   Ú é   )rA   rB   rJ   )z%(py0)s == %(py3)sÚ	empty_res)rG   r   r   r   ztra cuu thong tinÚno_dense)r   r   rV   r   r   r   r   r   r   r   r    rU   )	rW   rX   rY   rc   r#   r"   r.   r(   rd   s	            r/   Ú.test_hybrid_search_empty_query_and_empty_storere   Q   s  è è € õ ‘+”+€KÝ‘[”[€NÝ!Ø °Nðñ ô €Gð —n’n¨2°Q�nÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7€IØÐˆ9˜Š?ÐÐÐÕÔÐÐÐÐˆ9˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ9ÑÔÐÕÔˆ9ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐà&(€KÔÔ#Ø—^’^Ð*=ÀQ�^ÑGÔGÐGÐGÐGÐGÐGÐG€HØÐˆ8�rŠ>ÐÐÐÕÔÐÐÐÐˆ8�rÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ�rÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐr1   )Ú__doc__Ú
__future__r   Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   Úunittest.mockr   ÚpytestÚ2app.modules.core.application.hybrid_search_servicer   r   r0   ÚmarkÚanyior_   re   © r1   r/   ú<module>rr      s×   ðØ UÐ Uà "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € Ð #Ð #Ð #Ð #Ð #Ð #à €€€ðð ð ð ð ð ð ð ð/ð /ð /ð „Ôð6.ð 6.ñ Ôð6.ðr „Ôðð ñ Ôðð ð r1   