
    %~i-0                        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 ddlmZ ddlmZ e	j                   dd       Ze	j                   d        Z G d	 d
      Zy)u,   IncrementalUpdater 테스트 — TDD Phase 3    )annotationsN)VectorStore)KnowledgeGraph)IncrementalUpdaterc                     dddddddgdd	d
dgddgddddgddddddddgddddgddgddddgdd d!d"d#d$d%d&gd'd(d)d*gd+d,gd-dd'd.gdgS )/u:   기존 DB에 들어갈 InsightV2 형식 인사이트 3개.zinsight-001u   광응고술 보상 기준qa   보상/일반u=   광응고술은 실손보험에서 수술비로 인정된다.u    광응고술은 수술비 대상u(   입원 없이도 수술비 청구 가능	   김전문low   광응고술   실손보험u   #보상   #실손z
2025-12-01   보험전문가방	   이설계idtitletypecategorysummary
key_pointsexpert
confidencerelated_topicstagssource_datesource_chatparticipantszinsight-002u%   고지의무 위반 시 계약 해지regulation_interpretationu   고지의무u_   고지의무 위반이 있더라도 보험사가 2년 내 발견하지 못하면 해지 불가.u   2년 경과 후 해지 불가u   고의 위반은 예외u	   박약관highu   계약해지u   #고지의무u   #약관z
2025-12-02u	   최신입zinsight-003u'   자동차보험 렌트비 청구 방법practical_tipu   보상/자동차u:   사고 후 렌트비는 수리 기간 동안 인정된다.u   수리 기간 렌트비 인정u   사전 보험사 승인 필수u   홍자동차mediumu   자동차보험u	   렌트비u
   #자동차u   #렌트z
2025-12-03u	   정설계 r#       o/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_incremental_updater.pysample_insightsr&      s    
  1'V=?ij!-~>	*'/(+6	
   </&x:<UV! -~>$i0'/(+6	
   >#*S;=]^$"0+>!9-'/+[9	
?. .r$   c                   t        | dz        }t        | dz        }t        | dz        }t        | dz        }t        |d      }|j                  |       t        |||      }|j	                  |       t        ||      }|||||||d	S )
u9   VectorStore + KnowledgeGraph + IncrementalUpdater 설정.	chroma_dbinsightsz
graph.jsonz
index.jsontest_insights)db_pathcollection_name)insights_dir
graph_path
index_path)vector_storegraph)storer1   updaterexisting_insightsr-   r.   r/   )strr   add_insightsr   build_from_insightsr   )	tmp_pathr&   r+   r-   r.   r/   r2   r1   r3   s	            r%   setupr9   E   s     ([()Gx*,-LX,-JX,-JIE	'!E
 
o. e5AG ,$   r$   c                  D    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	y)
TestIncrementalUpdaterc                0   |d   }|j                  g       }|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}}y	)uM   빈 new_insights 리스트 처리 시 올바른 stats를 반환해야 한다.r3   newr   ==z%(py1)s == %(py4)spy1py4assert %(py6)spy6N	augmentedtotal_processed)update
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanation)	selfr9   r3   stats@py_assert0@py_assert3@py_assert2@py_format5@py_format7s	            r%   test_empty_new_insightsz.TestIncrementalUpdater.test_empty_new_insightsj   s   &+I&6r"U| q |q    |q   |   q       [!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&&',1,'1,,,,'1,,,',,,1,,,,,,,r$   c                   |d   }|d   }|j                         }ddddddd	gd
dg dddgddd
gdg}|j                  |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}||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   }||v }	|	slt        j                  d |	fd!||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}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}}y)'uD   완전히 새로운 인사이트는 'new'로 처리되어야 한다.r3   r2   zinsight-010u!   세금 절세 전략 연금보험expert_opinionu   세금/절세uI   연금보험을 통한 절세 효과와 연말정산 세액공제 방법.u    연금보험 세액공제 가능u   납입 한도 내 절세u   세금전문가r    )u   세금u   절세u   연금u   #세금u   #절세
2025-12-10r   r   333333?similarity_thresholdr=      r>   r@   rA   rD   rE   NrF   r   rG   new_idsinz%(py1)s in %(py4)s)zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == (%(py6)s + %(py8)s)count_before)py0py2rC   rE   py8zassert %(py11)spy11)
countrH   rI   rJ   rK   rL   rM   @py_builtinslocals_should_repr_global_name)rN   r9   r3   r2   ra   new_insightsrO   rP   rQ   rR   rS   rT   @py_assert1@py_assert7@py_assert9@py_assert5@py_format10@py_format12s                     r%   test_new_insight_addedz-TestIncrementalUpdater.test_new_insight_addedr   si   &+I&6"7^{{}
 $<(+fAC]^+$"@"I.+3!2 3
$ |$GU| q |q    |q   |   q       [!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&&',1,'1,,,,'1,,,',,,1,,,,,,,0i 00} 00000} 0000}000 00000000{{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0r$   c                :   |d   }dddddddgd	d
g dddgddd	dgdg}|j                  |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}||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(  }|st        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}}y)#u\   유사한 인사이트(같은 카테고리+타입)는 'augmented'로 처리되어야 한다.r3   zinsight-020u'   광응고술 실손보험 청구 안내r   r	   uf   광응고술은 실손보험 수술비 항목으로 청구 가능하며 입원 기준이 적용된다.u   수술비로 청구 가능u   병원 영수증 필요u	   이전문r"   )r   r   u	   수술비r   u   #수술rX   r   u	   김신입r   rY   rZ   rF   r\   r>   r@   rA   rD   rE   NrG   augmented_ids)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)rb   rc   rC   py7zassert %(py9)spy9)
rH   rI   rJ   rK   rL   rM   rt   rg   rh   ri   )rN   r9   r3   similar_insightsrO   rP   rQ   rR   rS   rT   rk   @py_assert6rn   @py_format8ro   s                  r%   test_augment_existingz,TestIncrementalUpdater.test_augment_existing   s   &+I&6
 $B+ D;=VW%&"O"I.+3!,k :
$ /dK[!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&&',1,'1,,,,'1,,,',,,1,,,,,,,)/s)*/a/*a////*a//////s///s///)///*///a///////r$   c                   |d   }|d   }ddddddd	gd
dg dddgddd
gdg}|j                  |d      }|d   dk(  r|d   d   }|j                  |      }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y)u0   보강 시 key_points가 병합되어야 한다.r3   r2   zinsight-021u$   광응고술 보험금 청구 절차r   r	   u=   광응고술 수술비 청구 시 필요한 서류와 절차.u   의사 소견서 필수u   청구 기한 3년u	   박전문r    )r   r   u   청구서류r   u   #청구z
2025-12-11r   r   rY   rZ   rF   r\   rs   r   N)is not)z%(py0)s is not %(py3)sresult)rb   py3assert %(py5)spy5)
rH   	get_by_idrI   rJ   rg   rh   ri   rK   rL   rM   )rN   r9   r3   r2   rw   rO   augmented_idr}   rR   rk   @py_format4@py_format6s               r%   test_augment_merges_key_pointsz5TestIncrementalUpdater.test_augment_merges_key_points   s    &+I&6"7^
 $?+Z8:NO%$"R"I.+3!,
$ /dK " 1!4L__\2F!%%6%%%%6%%%%%%6%%%6%%%%%%%%%%	 #r$   c                
   |d   }dddddddgd	d
ddgdgddd	gdg}|j                  |      }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}}|d   }	t        |	t              }
|
sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }t        t        j                  |            dx}	}
|d   }	t        |	t              }
|
sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |
      dz  }t        t        j                  |            dx}	}
y) u9   update()는 올바른 통계 dict를 반환해야 한다.r3   zinsight-030u#   손해사정사 역할과 활용법r!   u   손해사정uP   손해사정사는 보험금 청구 분쟁 시 전문가 도움을 제공한다.u   무료 상담 가능u   복잡한 사고 필수u   손해사정가r"   u   보험분쟁u   #손해사정z
2025-12-12r   r   r=   r^   z%(py1)s in %(py3)srO   rB   r~   r   r   NrF   rG   r]   rs   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelist)rb   rc   r~   r   )rH   rI   rJ   rK   rg   rh   ri   rL   rM   r   r   )rN   r9   r3   rj   rO   rP   rR   r   r   rk   @py_assert4s              r%   test_update_returns_statsz0TestIncrementalUpdater.test_update_returns_stats   s#   &+I&6 $>'*m57PQ+&#1>"B()+3!2 3
$ |, u~uu#{e####{e###{######e###e####### ) E)))) E))) ))))))E)))E)))))))!yE!!!!yE!!!y!!!!!!E!!!E!!!!!!!'%''''%'''''''''%'''%'''''''	*1z*D11111111z111z111*111111D111D111111111107z0$77777777z777z7770777777$777$7777777777r$   c                   |d   }|d   d   j                         }|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ddgddddgdgdddgd}	|j                  ||	      }
|
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}}y)uJ   보강 시 confidence가 상향되어야 한다 (low → medium → high).r3   r4   r   r   r   r>   r@   rA   rD   rE   Nzaugment-testu   광응고술 추가 정보r   r	   u;   광응고술 실손 청구 추가 정보 및 주의 사항.u   추가 서류 필요u   추가전문가r"   r   r   r   z
2025-12-13r   r   )r"   r    r^   r`   )copyrI   rJ   rK   rL   rM   _augment_insight)rN   r9   r3   existingrP   rQ   rR   rS   rT   new_insightrF   s              r%   "test_confidence_upgrade_on_augmentz9TestIncrementalUpdater.test_confidence_upgrade_on_augment   s    &+I&6 ,-a0557%..%....%...%.......... !1'T12'"-~>K'/./
" ,,X{C	&<*<<&*<<<<<&*<<<<&<<<*<<<<<<<<r$   c                   |d   }|d   d   j                         }dddddd	gd
ddgdgddd
dgd}|j                  ||      }t        |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}}y)uB   보강 시 participants가 합집합으로 병합되어야 한다.r3   r4   r   zparticipant-testu   광응고술 추가 논의r   r	   u,   광응고술 관련 추가 전문가 의견.u   추가 포인트u   신규전문가r"   r   r   z
2025-12-14r   r   r   r   r
   r^   r   r   r   r   N)r   r   setrI   rJ   rK   rg   rh   ri   rL   rM   )rN   r9   r3   r   r   rF   r   rP   rR   r   r   s              r%    test_augment_merges_participantsz7TestIncrementalUpdater.test_augment_merges_participants  s   &+I&6,-a0557 %1'E-.'"-.K'/.<
  ,,X{C	9^45*{l****{l***{******l***l********{l****{l***{******l***l******* 0 L0000 L000 000000L000L0000000r$   N)returnNone)
__name__
__module____qualname__rU   rq   rz   r   r   r   r   r#   r$   r%   r;   r;   i   s(    -!1F0:&B8B=:1r$   r;   )r   z
list[dict])__doc__
__future__r   builtinsrg   _pytest.assertion.rewrite	assertionrewriterI   pytestkakao_knowledge.vector_storer   kakao_knowledge.knowledge_graphr   #kakao_knowledge.incremental_updaterr   fixturer&   r9   r;   r#   r$   r%   <module>r      sY    2 "    4 : B 0 0f  FC1 C1r$   