
    %~i"                        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
mZ e	j                  d	d       Ze	j                  d
d       Z G d d      Zy)u%   VectorStore 테스트 — TDD Phase 3    )annotationsN)VectorStorec                4    t        t        | dz        d      S )u$   임시 경로에 VectorStore 생성.	chroma_dbtest_insights)db_pathcollection_name)r   str)tmp_paths    h/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_vector_store.pystorer      s     s8k#9:O\\    c                     dddddddgdd	g d
ddgddddgddddddddgdd	g dddgddddgdddd d!d"d#d$gd%d&g d'd(d)gd*dd%d+gdd,d-ddd.d/d0gd1d&g d2dd3gd4dd1d5gdd6d7d8d9d:d;d<gd=d>g d?d@dAgdBdd=dCgdgS )Du-   InsightV2 형식의 테스트 데이터 5개.insight-001u   광응고술 보상 기준qau   보상/일반uX   광응고술은 실손보험에서 수술비로 인정되며 입원 기준 적용된다.u    광응고술은 수술비 대상u(   입원 없이도 수술비 청구 가능u	   김전문high)u   광응고술   실손보험u	   수술비u   #보상u   #실손z
2025-12-01u   보험전문가방u	   이설계)idtitletypecategorysummary
key_pointsexpert
confidencerelated_topicstagssource_datesource_chatparticipantszinsight-002u%   고지의무 위반 시 계약 해지regulation_interpretation   고지의무u_   고지의무 위반이 있더라도 보험사가 2년 내 발견하지 못하면 해지 불가.u   2년 경과 후 해지 불가u   고의 위반은 예외u	   박약관)r"   u   계약해지u   약관u   #고지의무u   #약관z
2025-12-02u	   최신입zinsight-003u'   자동차보험 렌트비 청구 방법practical_tipu   보상/자동차uX   사고 후 렌트비는 수리 기간 동안 인정되며 사전 승인이 필요하다.u   수리 기간 렌트비 인정u   사전 보험사 승인 필수u   홍자동차medium)u   자동차보험u	   렌트비u   대물u
   #자동차u   #렌트z
2025-12-03u	   정설계zinsight-004u$   실손보험 비급여 청구 절차uZ   비급여 항목은 영수증과 세부 내역서가 필요하며 온라인 청구 가능.u#   영수증 + 세부 내역서 필수u   앱으로 청구 가능u	   이실손)r   u	   비급여u   청구u   #청구z
2025-12-04u	   김신청zinsight-005u#   종신보험 해약환급금 계산expert_opinionu   보상/장기uP   해약환급금은 납입 기간과 경과 년수에 따라 크게 차이난다.u   초기 해약 시 원금 손실u   10년 이후 환급률 개선u	   최종신low)u   종신보험u   해약환급금u   장기u   #종신u
   #환급금z
2025-12-05u	   박고객 r'   r   r   sample_insightsr(      sE   
  1'q=?ij! K	*'/(+6	
   </&x:<UV! H$i0'/(+6	
   >#*q;=]^$"H!9-'/+[9	
   ;'s@B[\!"E	*'/(+6	
   :$'i<>]^!K-'/(+6	
{L Lr   c                  l    e Z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y)TestVectorStorec                   |j                   } |       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	u,   빈 스토어의 count는 0이어야 한다.r   ==)zD%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == %(py7)sr   )py0py2py4py7zassert %(py9)spy9N)	count
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr   @py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s           r   test_empty_store_count_zeroz+TestVectorStore.test_empty_store_count_zerom   s    {{!{}!!}!!!!}!!!!!!u!!!u!!!{!!!}!!!!!!!!!!r   c                   |j                  d      }t        |t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}t        |      }d}||k(  }|st        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}}y)uF   빈 스토어에서 검색하면 빈 리스트를 반환해야 한다.   보험 청구5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultslistr.   py1r/   r0   Nr   r,   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr.   rK   py3py6assert %(py8)spy8)search_similarrG   rI   r6   r7   r4   r8   r9   r:   r;   rL   r5   )
r<   r   rH   r>   @py_format5@py_assert2r@   @py_assert4@py_format7@py_format9s
             r   test_empty_store_searchz'TestVectorStore.test_empty_store_searchq   s&   &&7'4((((((((z(((z(((((('((('((((((4(((4((((((((((7| q |q    |q      s   s      7   7   |   q       r   c                   |j                  |      }t        |      }||k(  }|s#t        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nd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                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u5   add_insights는 추가된 수를 반환해야 한다.r,   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}r3   rL   r(   )r.   r/   rN   py5zassert %(py7)sr1   N)
add_insightsrL   r4   r5   r6   r7   r8   r9   r:   r;   )r<   r   r(   r3   rU   r=   @py_format6rA   s           r   test_add_insights_returns_countz/TestVectorStore.test_add_insights_returns_countw   s    ""?3O,,u,,,,,u,,,,,,,u,,,u,,,,,,,,,,,,,,,O,,,O,,,,,,,,,,,r   c           	        |j                  |       |j                  } |       }t        |      }||k(  }|sKt        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u?   add_insights 후 count가 올바른 수를 반환해야 한다.r,   )zb%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}r   rL   r(   )r.   r/   r0   rO   r1   r2   assert %(py11)spy11N)r[   r3   rL   r4   r5   r6   r7   r8   r9   r:   r;   )	r<   r   r(   r=   r>   @py_assert8r@   rB   @py_format12s	            r   test_count_after_addz$TestVectorStore.test_count_after_add|   s    ?+{{4{}4O 44} 44444} 4444444u444u444{444}444444444444444O444O444 44444444r   c                   |j                  |       |j                  d      }t        |t              }|sd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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u3   search_similar는 리스트를 반환해야 한다.rE   rF   rG   rH   rI   rJ   N)r[   rR   rG   rI   r6   r7   r4   r8   r9   r:   r;   )r<   r   r(   rH   r>   rS   s         r    test_search_similar_returns_listz0TestVectorStore.test_search_similar_returns_list   s    ?+&&7'4((((((((z(((z(((((('((('((((((4(((4((((((((((r   c                   |j                  |       |j                  dd      }t        |      }d}||k  }|st        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}
|
|	v }|st        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 }|st        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 }|st        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 }|st        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 }|st        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}
}? y)u=   search_similar는 관련 인사이트를 반환해야 한다.u   광응고술 수술비 청구   top_k<=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)srL   rH   rM   rP   rQ   Nr   )in)z%(py1)s in %(py3)sr)rK   rN   assert %(py5)srZ   r   r   distancer   r[   rR   rL   r4   r5   r6   r7   r8   r9   r:   r;   )r<   r   r(   rH   rT   r@   rU   rV   rW   rn   @py_assert0@py_format4r\   s                r   $test_search_similar_relevant_resultsz4TestVectorStore.test_search_similar_relevant_results   sy   ?+&&'Fa&P7| q |q    |q      s   s      7   7   |   q        	"A419414117a<7a7aa":?""":""":""""""""""""""""":?""":""":""""""""""""""""!9>!!!9!!!9!!!!!!!!!!!!!!!!	"r   c                l   |j                  |       |j                  dd      }t        |      }d}||k  }|st        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}}y)u8   top_k 파라미터가 결과 수를 제한해야 한다.u   보험   rh   rj   rl   rL   rH   rM   rP   rQ   Nrq   )	r<   r   r(   rH   rT   r@   rU   rV   rW   s	            r   test_search_similar_top_kz)TestVectorStore.test_search_similar_top_k   s    ?+&&xq&97| q |q    |q      s   s      7   7   |   q       r   c                   |j                  |       |j                  d      }d}||u}|st        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	   }d}	||	k(  }|slt        j                  d
|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            dx}x}}	y)u8   get_by_id는 해당 인사이트를 반환해야 한다.r   Nis notz%(py0)s is not %(py3)sresultr.   rN   ro   rZ   r   r,   z%(py1)s == %(py4)srK   r0   assert %(py6)srO   )
r[   	get_by_idr4   r5   r6   r7   r8   r9   r:   r;   )r<   r   r(   r|   rT   r=   rs   r\   rr   r>   rS   rV   s               r   test_get_by_idzTestVectorStore.test_get_by_id   s    ?+/!!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!d|,},|},,,,|},,,|,,,},,,,,,,r   c                p   |j                  d      }d}||u }|st        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}}y)	u>   존재하지 않는 ID 조회 시 None을 반환해야 한다.nonexistent-idNisz%(py0)s is %(py3)sr|   r}   ro   rZ   )	r   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r|   rT   r=   rs   r\   s          r   test_get_by_id_not_foundz(TestVectorStore.test_get_by_id_not_found   si    !12v~vvvr   c                   |j                  |       |j                         }|j                  d      }d}||u }|st        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}}|j                  } |       }	d
}
||
z
  }|	|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t        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dz  }dd|iz  }t        t        j                  |            d	x}x}	x}x}
}|j                  }d}	 ||	      }d	}||u }
|
st        j                  d|
fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}	x}x}
}y	)uI   delete_by_id는 인사이트를 삭제하고 True를 반환해야 한다.r   Tr   r   r|   r}   ro   rZ   N   r,   )zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == (%(py6)s - %(py8)s)r   before_count)r.   r/   r0   rO   rQ   r_   r`   )zO%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_by_id
}(%(py4)s)
} is %(py9)s)r.   r/   r0   rO   r2   )r[   r3   delete_by_idr4   r5   r6   r7   r8   r9   r:   r;   r   )r<   r   r(   r   r|   rT   r=   rs   r\   r>   @py_assert7@py_assert9r@   rB   rb   ra   s                   r   test_delete_by_idz!TestVectorStore.test_delete_by_id   s   ?+{{}##M2v~vvv{{0{}0q0q 00} 00000} 0000000u000u000{000}000000000000q00000005}5}-55-5555-555555u555u555555}555-55555555555r   c                p   |j                  d      }d}||u }|st        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}}y	)
u?   존재하지 않는 ID 삭제 시 False를 반환해야 한다.r   Fr   r   r|   r}   ro   rZ   N)	r   r4   r5   r6   r7   r8   r9   r:   r;   r   s          r   %test_delete_nonexistent_returns_falsez5TestVectorStore.test_delete_nonexistent_returns_false   sk    ##$45vvvvr   c                   |j                  |       |j                         }i |d   ddig}|j                  |       |j                  } |       }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      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}x}}|j                  d      }
d}|
|u}|st        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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u<   이미 존재하는 ID는 업데이트(upsert)해야 한다.r   r   u$   수정된 광응고술 보상 기준r,   )zD%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == %(py6)sr   count_before)r.   r/   r0   rO   rP   rQ   Nr   ry   r{   r|   r}   ro   rZ   r~   r   r   rO   )r[   r3   r4   r5   r6   r7   r8   r9   r:   r;   r   )r<   r   r(   r   modifiedr=   r>   r@   rV   rW   r|   rT   rs   r\   rr   rS   s                   r   test_upsert_existingz$TestVectorStore.test_upsert_existing   s   ?+{{} \q)[74Z[\8$ {{,{},},,,,},,,,,,u,,,u,,,{,,,},,,,,,,,,,,,,,,, /!!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!gH"HH"HHHHH"HHHHHHH"HHHHHHHHr   N)r   r   returnNone)r   r   r(   
list[dict]r   r   )__name__
__module____qualname__rC   rX   r]   rc   re   rt   rw   r   r   r   r   r   r'   r   r   r*   r*   l   s?    "!-
5
)"!-
6
Ir   r*   )r   r   )r   r   )__doc__
__future__r   builtinsr6   _pytest.assertion.rewrite	assertionrewriter4   pytestkakao_knowledge.vector_storer   fixturer   r(   r*   r'   r   r   <module>r      sX    + "    4 ] ]
 N NlWI WIr   