
    %~iV                         d Z 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 e	j                  dee   fd       Ze	j                  d        Z G d d      Zy)	u>   
knowledge_graph 단위 테스트
테스터: 루 (개발3팀)
    N)KnowledgeGraphreturnc                  @   i ddddddddd	d
dg ddddddg ddg dddddddgddgddddi dd dd!dd"dd#d	d$dg d%dd&dddg d'dg d(dd)dddd*gdd&gdd+dd+i dd,dd-dd.dd/d	d0dg d1dddd2dg d3dg d4dd5dddd6gddgdd+dd+i dd7dd8dd9ddd	d:dg d;dd<dddg d=dg d>dd?dd@ddAgdd<gdd+dd+i ddBddCddDddEd	dFdg dGdd&dd2dg dHdg dIddJddKddLgdd&gdd+dd+gS )MuK   테스트용 InsightV2 dict 리스트 (5개, 다양한 카테고리/태그)idinsight-001titleu   광응고술 보상 기준typeqacategory   보상/장기summaryuE   광응고술은 약관 개정으로 실비 보상이 가능합니다.
key_points)u   약관 개정u   레이저 수술 포함u   실비 적용expert   이해철/프라임/부산
confidencehighrelated_topics)   실비보상   약관해석u   레이저수술tags)u   광응고술   보상   실비r   source_datez
2025-12-03source_chatu   보험설계사 커뮤니티
raw_threadu+   [이해철] 광응고술은 보상됩니다participantsquestionu2   광응고술 시 실비 보상이 가능한가요?answeru1   네, 약관 개정 이후 보상 가능합니다.insight-002u,   고지의무 위반 시 보상 거절 사례case_analysis   고지의무uE   비만약 처방 미고지로 면책된 사례가 발생했습니다.)	   비만약u   고지의무 위반   면책u   박유진/인카/서울)r!   r#   r"   )r!   r#   r   z
2025-12-04u#   [박유진] 비만약 면책 사례 insight-003u&   실비보험 자기부담금 계산법practical_tipu   보상/일반uU   실비보험 자기부담금은 의원/병원/종합병원에 따라 달라집니다.)   자기부담금u
   의원 10%u   종합병원 20%medium)r   r'   u	   병원급)r   r'   r   z
2025-12-05u)   [이해철] 자기부담금 계산 방법insight-004u!   암보험 진단비 지급 기준regulation_interpretationuE   암 진단비는 조직검사 결과지 기준으로 지급됩니다.)u   조직검사u   암 진단서u   지급 시기u   김민수/교보/서울)	   암보험	   진단비r   )r+   r,   r   z
2025-12-06u   장기보험 채널u    [김민수] 암 진단비 기준zinsight-005u3   영업 노하우: 거절 고객 재접근 타이밍expert_opinionu   영업노하우uC   거절 고객에게는 3개월 후 재접근이 효과적입니다.)u   거절 후 3개월u   라이프 이벤트 활용u   재접근 스크립트)u   영업전략   고객관리u	   재접근)u   영업r.   u	   노하우z
2025-12-07u   영업 전략 채널u*   [박유진] 거절 고객 재접근 방법 r/       k/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_knowledge_graph.pysample_insightsr2      s$   	
-	
1	
 D	
 		

 ^	
 W	
 2	
 &	
 Q	
 H	
 <	
 9	
 HI	
 9:	
 L	
  I!	
$	
-	
C	
 O	
 		

 ^	
 H	
 /	
 &	
 E	
 8	
 <	
 9	
 @A	
 67	
 	
  b!	
$	
-	
=	
 O	
 		

 n	
 O	
 2	
 (	
 N	
 A	
 <	
 9	
 FG	
 9:	
 	
  b!	
$	
-	
8	
 /	
 		

 ^	
 L	
 /	
 &	
 H	
 8	
 <	
 0	
 =>	
 67	
 	
  b!	
$	
-	
J	
 $	
 )		

 \	
 h	
 /	
 (	
 K	
 ;	
 <	
 1	
 GH	
 67	
 	
  b!	
S[ [r0   c                     t        | dz        }t        | dz        }t        | dz        }t        |||      }|j                  |       |S )uP   임시 디렉토리에 KnowledgeGraph 인스턴스 생성 후 build까지 실행insights
graph.jsoninsights_index.json)strr   build_from_insights)tmp_pathr2   insights_dir
graph_path
index_pathbuilders         r1   graph_builderr>   t   sS     x*,-LX,-JX 556J\:zBG0Nr0   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"y!)"TestKnowledgeGraphu!   지식 그래프 빌더 테스트c           	         t        j                  |j                        }t        |j	                  d            }t        |      }t        |      }||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                  |      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  }t        j                  dt        |       d	t        |             d
z   d|iz  }	t        t        j                  |	            dx}x}}y)uE   build_from_insights 후 마크다운 파일이 생성되어야 한다*.md==)zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}lenmd_filesr2   py0py1py3py5py6py8u*   마크다운 파일 수 불일치: 기대=	   , 실제=
>assert %(py10)spy10N)pathlibPathr:   listglobrE   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)
selfr>   r2   r:   rF   @py_assert2@py_assert7@py_assert4@py_format9@py_format11s
             r1   !test_build_creates_markdown_filesz4TestKnowledgeGraph.test_build_creates_markdown_files   s   ||M$>$>?))&128} 	
O 4 	
} 44 	
 	
 	
} 4 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
	6	
 	
  !$ 	
 	
 		 !$ 	
 	
	6	
 	
  %4 	
 	
 		 %4 	
 	
 		 !5 	
 	
  9_9M8NiX[\dXeWfg	
 	
 	
 	
 	
 	
r0   c                 b   t        j                  |j                        }|dz  }|j                  } |       }|st	        j
                  d      dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}|j                  d      }|j                  }d	} ||      }|st	        j
                  d
      dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }	t        t	        j                  |	            dx}x}}|j                  d      }
t        d t!        |
      D              }d}||k\  }|st	        j"                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t	        j
                  d      dz   d|iz  }t        t	        j                  |            dx}}y)u;   마크다운 파일에 YAML frontmatter가 있어야 한다insight-001.mdu   insight-001.md 파일이 없음zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}md_file)rH   py2py4Nutf-8encoding---u0   YAML frontmatter가 '---'로 시작하지 않음zN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}contentrH   rh   ri   rL   
c              3   Z   K   | ]#  \  }}|j                         d k(  s|dkD  s d % yw)rm   r      N)strip).0ilines      r1   	<genexpr>zHTestKnowledgeGraph.test_markdown_has_yaml_frontmatter.<locals>.<genexpr>   s*     _4tzz|u?TYZ]^Y^!_s   +++rr   >=)z%(py0)s >= %(py3)sclose_countrH   rJ   u'   YAML frontmatter 닫힘 '---'가 없음
>assert %(py5)srK   )rQ   rR   r:   existsrU   r[   rW   rX   rY   rZ   r\   r]   	read_text
startswithsplitsum	enumeraterV   )r^   r>   r:   rg   @py_assert1@py_assert3@py_format5rn   @py_assert5@py_format7linesrz   r_   @py_format4@py_format6s                  r1   "test_markdown_has_yaml_frontmatterz5TestKnowledgeGraph.test_markdown_has_yaml_frontmatter   s   ||M$>$>?!11~~B~BBB!BBBBBBBwBBBwBBB~BBBBBBBBB##W#5!!\%\!%(\(\\*\\\\\\\w\\\w\\\!\\\%\\\(\\\\\\d#_9U+;__J{aJJJ{aJJJJJJ{JJJ{JJJaJJJ!JJJJJJJr0   c                 N   t        j                  |j                        }|dz  }|j                  d      }dD ]  }||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      ndd	z  }t	        j                  d
| d      dz   d|iz  }t        t	        j                  |            d} y)uV   YAML frontmatter에 필수 필드(id, title, type, category, tags)가 있어야 한다rf   rj   rk   )zid:ztitle:ztype:z	category:ztags:zconfidence:inz%(py0)s in %(py2)sfieldrn   rH   rh   u   frontmatter에 'u   ' 필드 없음
>assert %(py4)sri   N)rQ   rR   r:   r~   rU   rV   rW   rX   rY   rZ   r[   r\   r]   )	r^   r>   r:   rg   rn   r   r   @py_format3r   s	            r1   2test_markdown_frontmatter_contains_required_fieldszETestKnowledgeGraph.test_markdown_frontmatter_contains_required_fields   s    ||M$>$>?!11##W#5T 	OEG#NNN5GNNNNNN5NNN5NNNNNNGNNNGNNNN'7wo%NNNNNNN	Or0   c                    t        j                  |j                        }d}|j                  d      D ]!  }|j	                  d      }d|v sd|v sd} n |s{t        j                  d      d	z   d
dt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            y)u>   관련 인사이트에 [[backlink]] 형식이 있어야 한다FrB   rj   rk   z[[z]]Tu;   [[backlink]] 형식의 관련 인사이트 링크가 없음
>assert %(py0)srH   found_backlinkN)rQ   rR   r:   rT   r~   rU   r[   rW   rX   rY   rZ   r\   r]   )r^   r>   r:   r   rg   rn   @py_format1s          r1   test_markdown_has_backlinksz.TestKnowledgeGraph.test_markdown_has_backlinks   s    ||M$>$>?#((0 	G'''9Gw47?!%		
 \\\\\\\\\~\\\~\\\\\~r0   c                 \   t        j                  |j                        }|dz  }|j                  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  }t	        j                  d	      d
z   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  }t	        j                  d      d
z   d|iz  }t        t	        j                  |            dx}}y)uL   type=qa인 인사이트 마크다운에 ## 질문 섹션이 있어야 한다rf   rj   rk   u	   ## 질문r   z%(py1)s in %(py3)srn   rI   rJ   u3   qa 타입 마크다운에 '## 질문' 섹션 없음r|   rK   Nu	   ## 답변u3   qa 타입 마크다운에 '## 답변' 섹션 없음rQ   rR   r:   r~   rU   rV   rZ   rW   rX   rY   r[   r\   r]   	r^   r>   r:   rg   rn   @py_assert0r_   r   r   s	            r1   %test_markdown_qa_has_question_sectionz8TestKnowledgeGraph.test_markdown_qa_has_question_section   s    ||M$>$>?!11##W#5\{g%\\\{g\\\{\\\\\\g\\\g\\\\'\\\\\\\\{g%\\\{g\\\{\\\\\\g\\\g\\\\'\\\\\\\r0   c                    t        j                  |j                        }|dz  }|j                  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  }t	        j                  d	      d
z   d|iz  }t        t	        j                  |            dx}}y)uV   type이 qa가 아닌 인사이트 마크다운에 ## 요약 섹션이 있어야 한다zinsight-002.mdrj   rk   u	   ## 요약r   r   rn   r   u7   non-qa 타입 마크다운에 '## 요약' 섹션 없음r|   rK   Nr   r   s	            r1   (test_markdown_non_qa_has_summary_sectionz;TestKnowledgeGraph.test_markdown_non_qa_has_summary_section   s    ||M$>$>?!11##W#5`{g%```{g```{``````g```g````'```````r0   c                    t        j                  |j                        }|dz  }|j                  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  }t	        j                  d	      d
z   d|iz  }t        t	        j                  |            dx}}y)u>   마크다운에 ## 핵심 포인트 섹션이 있어야 한다rf   rj   rk   u   ## 핵심 포인트r   r   rn   r   u3   마크다운에 '## 핵심 포인트' 섹션 없음r|   rK   Nr   r   s	            r1   $test_markdown_has_key_points_sectionz7TestKnowledgeGraph.test_markdown_has_key_points_section   s    ||M$>$>?!11##W#5$f$/fff$fff$fffffffffffff1fffffffr0   c           
         t         j                  }|j                  } ||      }|j                  } |       }|s(t	        j
                  d      dz   dt        j                         v st	        j                  t               rt	        j                  t               ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}x}x}x}}y)u+   graph.json 파일이 생성되어야 한다u   graph.json 파일이 없음z
>assert %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.Path
}(%(py5)s
{%(py5)s = %(py3)s.graph_path
})
}.exists
}()
}rQ   r>   rH   rh   rJ   rK   py7py9py11N)rQ   rR   r;   r}   rU   r[   rW   rX   rY   rZ   r\   r]   r^   r>   r   ra   @py_assert6@py_assert8@py_assert10@py_format12s           r1   test_graph_json_createdz*TestKnowledgeGraph.test_graph_json_created   s    ||]M44]|45]5<<]<>]>]]@]]]]]]]w]]]w]]]|]]]]]]M]]]M]]]4]]]5]]]<]]]>]]]]]]]r0   c           	         t        j                  t        j                  |j                        j                  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  }t        j                  d      d	z   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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}|d   }t        |      }	t        |      }
|	|
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                  |	      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  }t        j                  dt        |       dt        |d                dz   d|iz  }t        t        j                  |            dx}x}	x}}
y)u0   graph.json에 nodes와 edges가 있어야 한다rj   rk   nodesr   r   
graph_datar   u    graph.json에 'nodes' 키 없음r|   rK   Nedgesu    graph.json에 'edges' 키 없음rC   )zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}rE   r2   )rH   rh   ri   rL   r   r   u   nodes 수 불일치: 기대=rN   z
>assert %(py11)sr   )jsonloadsrQ   rR   r;   r~   rU   rV   rZ   rW   rX   rY   r[   r\   r]   rE   )r^   r>   r2   r   r   r_   r   r   r   r   r   r   @py_format10r   s                 r1   test_graph_has_nodes_and_edgesz1TestKnowledgeGraph.test_graph_has_nodes_and_edges   ss   ZZ]-E-E F P PZa P bc
Hw*$HHHw*HHHwHHHHHH*HHH*HHHH&HHHHHHHHw*$HHHw*HHHwHHHHHH*HHH*HHHH&HHHHHHHg& 	
s&' 	
3+? 	
'+?? 	
 	
 	
'+? 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ' 	
 	
 		 ( 	
 	
	6	
 	
  ,/ 	
 	
 		 ,/ 	
 	
	6	
 	
  0? 	
 	
 		 0? 	
 	
 		 ,@ 	
 	
  +3+?*@	#jY`NaJbIcd	
 	
 	
 	
 	
 	
r0   c                 j   t        j                  t        j                  |j                        j                  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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            d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  }t        j                  d      d	z   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  }t        j                  d      d	z   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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}y)u.   graph.json에 stats 섹션이 있어야 한다rj   rk   statsr   r   r   r   u    graph.json에 'stats' 키 없음r|   rK   Ntotal_nodesu   stats에 'total_nodes' 없음total_edgesu   stats에 'total_edges' 없음
categoriesu   stats에 'categories' 없음)r   r   rQ   rR   r;   r~   rU   rV   rZ   rW   rX   rY   r[   r\   r]   )r^   r>   r   r   r_   r   r   r   s           r1   test_graph_has_statsz'TestKnowledgeGraph.test_graph_has_stats   s   ZZ]-E-E F P PZa P bc
Hw*$HHHw*HHHwHHHHHH*HHH*HHHH&HHHHHHH7#F}%FFF}FFF}FFFFFFFFFFFFF'FFFFFFFF}%FFF}FFF}FFFFFFFFFFFFF'FFFFFFFD|u$DDD|uDDD|DDDDDDuDDDuDDDD&DDDDDDDr0   c                 ^   t        j                  t        j                  |j                        j                  d            }|d   }|D cg c]  }|j                  d      dk(  s| }}t        |      }d}||kD  }|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  }	t        j                  d      dz   d|	iz  }
t        t        j                   |
            dx}x}}ddht#        fd|D              }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                   |            yc c}w )uG   같은 태그를 가진 인사이트 사이에 edge가 있어야 한다rj   rk   r   relation
shared_tagr   >z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)srE   shared_tag_edgesrH   rI   rJ   rL   u"   shared_tag 관계 엣지가 없음
>assert %(py8)srM   N)r   r   )r   r   c              3   6   K   | ]  }|d    |d   fv   ywfromtoNr/   rt   epairs     r1   rw   zBTestKnowledgeGraph.test_shared_tag_creates_edge.<locals>.<genexpr>   (      
-.QvY$ D(
   uW   insight-001과 insight-002 사이에 shared_tag 엣지 없음 (공유 태그: '보상')r   rH   foundr   r   rQ   rR   r;   r~   getrE   rU   rV   rW   rX   rY   rZ   r[   r\   r]   any)r^   r>   r   r   r   r   r_   r   ra   r   rb   r   r   r   s                @r1   test_shared_tag_creates_edgez/TestKnowledgeGraph.test_shared_tag_creates_edge   sl   ZZ]-E-E F P PZa P bc
7# 
j 1\ AA
 
 #$NqN$q(NNN$qNNNNNNsNNNsNNNNNN#NNN#NNN$NNNqNNN*NNNNNNNN.0NO 
2B
 
 ooooooooouooouooooou
   H*'H*c                 ^   t        j                  t        j                  |j                        j                  d            }|d   }|D cg c]  }|j                  d      dk(  s| }}t        |      }d}||kD  }|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  }	t        j                  d      dz   d|	iz  }
t        t        j                   |
            dx}x}}ddht#        fd|D              }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                   |            yc c}w )uC   같은 카테고리 인사이트 사이에 edge가 있어야 한다rj   rk   r   r   same_categoryr   r   r   rE   same_cat_edgesr   u%   same_category 관계 엣지가 없음r   rM   N)r   r)   )r)   r   c              3   6   K   | ]  }|d    |d   fv   ywr   r/   r   s     r1   rw   zETestKnowledgeGraph.test_same_category_creates_edge.<locals>.<genexpr>   r   r   u@   insight-001과 insight-004 사이에 same_category 엣지 없음r   rH   r   r   )r^   r>   r   r   r   r   r_   r   ra   r   rb   r   r   r   s                @r1   test_same_category_creates_edgez2TestKnowledgeGraph.test_same_category_creates_edge   s^   ZZ]-E-E F P PZa P bc
7#%*SaeeJ.??.R!SS>"OQO"Q&OOO"QOOOOOOsOOOsOOOOOO>OOO>OOO"OOOQOOO(OOOOOOOO.0NO 
2@
 
 XXXXXXXXXuXXXuXXXXXu Tr   c                 L   t        j                  t        j                  |j                        j                  d            }|d   }|D cg c]  }|j                  d      dk(  s| }}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  }	t        j                  dt        |       d      dz   d|	iz  }
t        t        j                   |
            dx}x}}yc c}w )uj   related_topics 교집합이 2개 이상이면 edge가 생기고, 1개 이하면 생기지 않아야 한다rj   rk   r   r   related_topicr   rC   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srE   rt_edgesr   uL   교집합 2개 미만인 데이터인데 related_topic 엣지가 생성됨: u   개r   rM   N)r   r   rQ   rR   r;   r~   r   rE   rU   rV   rW   rX   rY   rZ   r[   r\   r]   )r^   r>   r   r   r   r   r_   r   ra   r   rb   s              r1   test_related_topic_creates_edgez2TestKnowledgeGraph.test_related_topic_creates_edge   st   ZZLL112<<g<N

 7#$M!j(9_(LAMM 8} 	
 	
}! 	
 	
 	
} 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 !" 	
 	
  [[^_g[hZiilm	
 	
 	
 	
 	
 	
 Ns   F!&F!c                 ^   t        j                  t        j                  |j                        j                  d            }|d   }|D cg c]  }|j                  d      dk(  s| }}t        |      }d}||kD  }|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  }	t        j                  d      dz   d|	iz  }
t        t        j                   |
            dx}x}}ddht#        fd|D              }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                   |            yc c}w )uJ   같은 expert가 답변한 인사이트 사이에 edge가 있어야 한다rj   rk   r   r   same_expertr   r   r   rE   same_expert_edgesr   u#   same_expert 관계 엣지가 없음r   rM   N)r   r%   )r%   r   c              3   6   K   | ]  }|d    |d   fv   ywr   r/   r   s     r1   rw   zCTestKnowledgeGraph.test_same_expert_creates_edge.<locals>.<genexpr>  r   r   u>   insight-001과 insight-003 사이에 same_expert 엣지 없음r   rH   r   r   )r^   r>   r   r   r   r   r_   r   ra   r   rb   r   r   r   s                @r1   test_same_expert_creates_edgez0TestKnowledgeGraph.test_same_expert_creates_edge  sb   ZZ]-E-E F P PZa P bc
7#(-T1z1Bm1SQTT$%PP%)PPP%PPPPPPsPPPsPPPPPP$PPP$PPP%PPPPPP+PPPPPPPP.0NO 
2C
 
 VVVVVVVVVuVVVuVVVVVu Ur   c           
         t        j                  t        j                  |j                        j                  d            }|d   }t               }|D ].  }t        t        |d   |d   g      |d   gz         }||v}|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }t        j                  d|d    d|d    d|d    d      dz   d|iz  }	t!        t        j"                  |	            d}|j%                  |       1 y)u?   중복 엣지가 없어야 한다 (A→B와 B→A는 하나만)rj   rk   r   r   r   r   )not in)z%(py0)s not in %(py2)skeyseenr   u   중복 엣지 발견: u    ↔ z ()r   ri   N)r   r   rQ   rR   r;   r~   settuplesortedrU   rV   rW   rX   rY   rZ   r[   r\   r]   add)
r^   r>   r   r   r   r   r   r   r   r   s
             r1   test_no_duplicate_edgesz*TestKnowledgeGraph.test_no_duplicate_edges  s   ZZ]-E-E F P PZa P bc
7#u 	A&	1T734*FGCd?hhh3dhhhhhh3hhh3hhhhhhdhhhdhhhh&<QvYKuQtWIUWXYZdXeWffg$hhhhhhhHHSM	r0   c                    t        j                  t        j                  |j                        j                  d            }|d   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  }t        j                  d	|       d
z   d|iz  }t        t        j                  |            dx}}|d   }t        t         f}	t#        ||	      }
|
st        j                  d|d          dz   dt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            dx}x}	}
 y)u/   모든 엣지에 weight 값이 있어야 한다rj   rk   r   weightr   r   edger   u   엣지에 weight 없음: r|   rK   Nu   weight가 숫자가 아님: z7
>assert %(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py4)s)
}
isinstancero   )r   r   rQ   rR   r;   r~   rU   rV   rZ   rW   rX   rY   r[   r\   r]   intfloatr   )r^   r>   r   r   r   r_   r   r   r   r   r   r   s               r1   test_edge_has_weightz'TestKnowledgeGraph.test_edge_has_weight  s=   ZZ]-E-E F P PZa P bc
w' 	mDG8t#GGG8tGGG8GGGGGGtGGGtGGGG'@%GGGGGGG"8nlsEll:nl;l;ll?[\`ai\j[k=lllllll:lll:lllnlllllll;llllll	mr0   c           
         t         j                  }|j                  } ||      }|j                  } |       }|s(t	        j
                  d      dz   dt        j                         v st	        j                  t               rt	        j                  t               ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}x}x}x}}y)u4   insights_index.json 파일이 생성되어야 한다u$   insights_index.json 파일이 없음z
>assert %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.Path
}(%(py5)s
{%(py5)s = %(py3)s.index_path
})
}.exists
}()
}rQ   r>   r   N)rQ   rR   r<   r}   rU   r[   rW   rX   rY   rZ   r\   r]   r   s           r1   test_index_json_createdz*TestKnowledgeGraph.test_index_json_created#  s    ||fM44f|45f5<<f<>f>ff@fffffffwfffwfff|ffffffMfffMfff4fff5fff<fff>fffffffr0   c                 f   t        j                  t        j                  |j                        j                  d            }dD ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d	| d
      dz   d|iz  }t        t        j                  |            d} y)u[   인덱스에 필수 키(by_id, by_category, by_tag, by_expert, by_type)가 있어야 한다rj   rk   )by_idby_categoryby_tag	by_expertby_typer   r   r   
index_datar   u   인덱스에 'u   ' 키 없음r   ri   N)r   r   rQ   rR   r<   r~   rU   rV   rW   rX   rY   rZ   r[   r\   r]   )r^   r>   r   r   r   r   r   s          r1   test_index_has_all_keysz*TestKnowledgeGraph.test_index_has_all_keys'  s    ZZ]-E-E F P PZa P bc
M 	IC*$HHH3*HHHHHH3HHH3HHHHHH*HHH*HHHHse<&HHHHHHH	Ir0   c                    t        j                  t        j                  |j                        j                  d            }|d   }|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  }t        j                  d|d    d	      d
z   d|iz  }	t        t        j                  |	            dx}}d}||d      }
||
v }|st        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}
d}||d      }
||
v }|st        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}
 y)u:   인덱스 by_id에 모든 인사이트가 있어야 한다rj   rk   r   r   r   r   r   u	   by_id에 u    없음r|   rK   Nr   z%(py1)s in %(py4)srI   ri   u   by_id 항목에 title 없음
>assert %(py6)srL   fileu   by_id 항목에 file 없음r   r   rQ   rR   r<   r~   rU   rV   rZ   rW   rX   rY   r[   r\   r]   )r^   r>   r2   r   r   insightr   r_   r   r   r   r   r   s                r1   test_index_by_idz#TestKnowledgeGraph.test_index_by_id-  s   ZZ]-E-E F P PZa P bc
7#& 	QG4=M=E)MMM=EMMM=MMMMMMEMMMEMMMMYwt}oW+MMMMMMMReGDM2R722RRR72RRR7RRR2RRR4RRRRRRRRPU74=1P611PPP61PPP6PPP1PPP3PPPPPPPP	Qr0   c                 \   t        j                  t        j                  |j                        j                  d            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}d}|d   }||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}}y)u=   인덱스에서 카테고리별 조회가 정확해야 한다rj   rk   r   r   r   r   r   u%   by_category에 '보상/장기' 없음r|   rK   Nr   r   r  u#   보상/장기에 insight-001 없음r  rL   r)   u#   보상/장기에 insight-004 없음r  )r^   r>   r   r   r   r_   r   r   r   r   r   s              r1   test_index_by_categoryz)TestKnowledgeGraph.test_index_by_category6  sY   ZZ]-E-E F P PZa P bc
 /V+-VVV+VVVVVVVVV+VVV+VVVV/VVVVVVVcO <c} <<ccc} <ccc}ccc <ccc>cccccccccO <c} <<ccc} <ccc}ccc <ccc>ccccccccr0   c                 2   t        j                  t        j                  |j                        j                  d            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}d}|d   }||v }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}}y)u>   인덱스 by_tag에 태그별 인사이트가 있어야 한다rj   rk   r   r   r   r   r   u   by_tag에 '보상' 없음r|   rK   Nr   r   r  u&   by_tag['보상']에 insight-001 없음r  rL   r  )r^   r>   r   r   r   r_   r   r   r   r   r   s              r1   test_index_by_tagz$TestKnowledgeGraph.test_index_by_tag?  s    ZZ]-E-E F P PZa P bc
H%>x6!>>>x6>>>x>>>>>>6>>>6>>>>#>>>>>>>Zx 0Z} 00ZZZ} 0ZZZ}ZZZ 0ZZZ2ZZZZZZZZr0   c                    t        j                  t        j                  |j                        j                  d            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            d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}}y)uD   인덱스 by_expert에 전문가별 인사이트가 있어야 한다rj   rk   r   r   r   r   r   u0   by_expert에 '이해철/프라임/부산' 없음r|   rK   Nr   r   r  assert %(py6)srL   r  )r^   r>   r   r   r   r_   r   r   r   r   r   s              r1   test_index_by_expertz'TestKnowledgeGraph.test_index_by_expertG  s    ZZ]-E-E F P PZa P bc
{+	+l+y8lll+ylll+llllllylllyllll:lllllllG	*F GG} GGGGG} GGGG}GGG GGGGGGGGr0   c                    t        j                  t        j                  |j                        j                  d            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            d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}}y)u?   인덱스 by_type에 타입별 인사이트가 있어야 한다rj   rk   r   r
   r   r   r   u   by_type에 'qa' 없음r|   rK   Nr   r   r  r  rL   r  )r^   r>   r   r   r   r_   r   r   r   r   r   s              r1   test_index_by_typez%TestKnowledgeGraph.test_index_by_typeN  s    ZZ]-E-E F P PZa P bc
Y'8tw888tw888t888888w888w8888 8888888--}----}---}----------r0   c                 n   |j                  dd      }t        |t              }|s!t        j                  d      dz   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}||kD  }|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  }t        j                  d      dz   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  }t        j                  d|
       dz   d|iz  }t        t        j                  |            d
x}} y
)u<   get_related가 연결된 인사이트를 반환해야 한다r   rr   	max_depthu,   get_related 반환값이 리스트가 아님7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   relatedrS   rH   rI   rh   ri   Nr   r   r   rE   r   u/   insight-001의 연결된 인사이트가 없음r   rM   r   r   r   itemr   u   related 항목에 id 없음: r|   rK   )get_relatedr   rS   rU   r[   rW   rX   rY   rZ   r\   r]   rE   rV   )r^   r>   r  r   r   r_   r   ra   r   rb   r  r   r   r   s                 r1   "test_get_related_returns_connectedz5TestKnowledgeGraph.test_get_related_returns_connectedU  s   ++MQ+G'4(X(XX*XXXXXXXzXXXzXXXXXX'XXX'XXXXXX4XXX4XXX(XXXXXX7|RaR|aRRR|aRRRRRRsRRRsRRRRRR7RRR7RRR|RRRaRRR!RRRRRRRR 	HDG44<GGG44GGG4GGGGGG4GGG4GGGG#@!GGGGGGG	Hr0   c           	         |j                  dd      }|j                  dd      }t        |      }t        |      }||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                  |      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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)u>   get_related max_depth=2는 2-hop 연결도 반환해야 한다r   rr   r     rx   )zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}rE   
related_d2
related_d1rG   u-   depth=2가 depth=1보다 적은 결과 반환rO   rP   N)r  rE   rU   rV   rW   rX   rY   rZ   r[   r\   r]   )	r^   r>   r  r  r_   r`   ra   rb   rc   s	            r1   test_get_related_depth2z*TestKnowledgeGraph.test_get_related_depth2^  s   "..}.J
"..}.J
:b#j/b/1bbb/bbbbbbsbbbsbbbbbb:bbb:bbbbbbbbb#bbb#bbbbbbjbbbjbbb/bbb3bbbbbbbbr0   c                 ~   |j                  d      }t        |t              }|s!t        j                  d      dz   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}d	}||v }|st        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)u$   태그 검색이 정확해야 한다r   u.   search_by_tag 반환값이 리스트가 아님r  r   resultsrS   r  Nr   r   r   r   u-   search_by_tag('보상')에 insight-001 없음r|   rK   r   u-   search_by_tag('보상')에 insight-002 없음)search_by_tagr   rS   rU   r[   rW   rX   rY   rZ   r\   r]   rV   	r^   r>   r  r   r   r   r_   r   r   s	            r1   test_search_by_tagz%TestKnowledgeGraph.test_search_by_tage  sp   --h7'4(Z(ZZ*ZZZZZZZzZZZzZZZZZZ'ZZZ'ZZZZZZ4ZZZ4ZZZ(ZZZZZZX}'XXX}XXX}XXXXXXXXXXXXX)XXXXXXXX}'XXX}XXX}XXXXXXXXXXXXX)XXXXXXXr0   c                    |j                  d      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            d	x}}y	)
u:   존재하지 않는 태그 검색 시 빈 리스트 반환u   존재하지않는태그xyzrC   z%(py0)s == %(py3)sr  r{   u/   없는 태그 검색 시 빈 리스트 아님: r|   rK   N)
r   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r>   r  r_   r   r   r   s          r1   test_search_by_tag_not_foundz/TestKnowledgeGraph.test_search_by_tag_not_foundl  s|    --.KLYw"}YYYw"YYYYYYwYYYwYYY"YYY OPWyYYYYYYYr0   c                 ~   |j                  d      }t        |t              }|s!t        j                  d      dz   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}d	}||v }|st        j                  d
|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y)u*   카테고리 검색이 정확해야 한다r   u3   search_by_category 반환값이 리스트가 아님r  r   r  rS   r  Nr   r   r   r   u9   search_by_category('보상/장기')에 insight-001 없음r|   rK   r)   u9   search_by_category('보상/장기')에 insight-004 없음)search_by_categoryr   rS   rU   r[   rW   rX   rY   rZ   r\   r]   rV   r!  s	            r1   test_search_by_categoryz*TestKnowledgeGraph.test_search_by_categoryq  sp   22?C'4(_(__*_______z___z______'___'______4___4___(______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dd}ddddddddddddd)dddddddr0   c                    |j                  d      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       dz   d|iz  }t        t        j                  |            d	x}}y	)
u@   존재하지 않는 카테고리 검색 시 빈 리스트 반환u   없는카테고리xyzrC   r$  r  r{   u5   없는 카테고리 검색 시 빈 리스트 아님: r|   rK   N)
r(  rU   rV   rW   rX   rY   rZ   r[   r\   r]   r%  s          r1   !test_search_by_category_not_foundz4TestKnowledgeGraph.test_search_by_category_not_foundx  s}    223JK_w"}___w"______w___w___"___ UV]U^_______r0   c                 j   t        t        |dz        t        |dz        t        |dz              }|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  }t        j                  d	      d
z   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  }t        j                  d      d
z   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  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}}|d   }	t        |	t              }
|
st        j                  d      dz   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              }
|
st        j                  d      dz   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              }
|
st        j                  d      dz   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        |      }||k(  }|st        j                  d|fd||f      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}}y) uM   build_from_insights 반환값에 nodes, edges, categories가 있어야 한다r4   r5   r6   r   r   r   resultr   u!   build 반환값에 'nodes' 없음r|   rK   Nr   u!   build 반환값에 'edges' 없음r   u&   build 반환값에 'categories' 없음u   nodes가 int가 아님z7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r   r   )rH   rh   rJ   rK   u   edges가 int가 아님u   categories가 dict가 아님dictrC   )z0%(py1)s == %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}rE   r2   )rI   rJ   ri   rL   zassert %(py8)srM   )r   r7   r8   rU   rV   rZ   rW   rX   rY   r[   r\   r]   r   r   r.  rE   )r^   r9   r2   r=   r-  r   r_   r   r   r   ra   r   r   rb   s                 r1   test_build_returns_statsz+TestKnowledgeGraph.test_build_returns_stats}  s    :%&<'(001

 ,,_=Ew& EEEw&EEEwEEEEEE&EEE&EEEE"EEEEEEEEw& EEEw&EEEwEEEEEE&EEE&EEEE"EEEEEEEO|v%OOO|vOOO|OOOOOOvOOOvOOOO'OOOOOOO /Iz/3/I/II1IIIIIIIzIIIzIII/IIIIII3III3III/IIIIII /Iz/3/I/II1IIIIIIIzIIIzIII/IIIIII3III3III/IIIIII .Uz.5U5UU7UUUUUUUzUUUzUUU.UUUUUUUUUUUU5UUUUUUg6#o"66"66666"6666666666#666#666666o666o666"66666666r0   c                    t        t        |dz        t        |dz        t        |dz              }|j                  g       }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d	      d
z   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}x}}t        j                  t        j                  |j                        j                  d            }	|	d   }g }||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}x}}|	d   }g }||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}x}}y)u@   빈 인사이트 리스트에 에러 없이 빈 그래프 생성r4   r5   r6   r   r   rC   )z%(py1)s == %(py4)sr  u#   빈 입력 시 nodes가 0이 아님r  rL   Nr   u#   빈 입력 시 edges가 0이 아님rj   rk   u1   빈 그래프의 nodes가 빈 리스트가 아님u1   빈 그래프의 edges가 빈 리스트가 아님)r   r7   r8   rU   rV   rZ   r[   r\   r]   r   r   rQ   rR   r;   r~   )
r^   r9   r=   r-  r   r   r_   r   r   r   s
             r1   test_empty_insights_no_errorz/TestKnowledgeGraph.test_empty_insights_no_error  s    :%&<'(001

 ,,R0gJ!J!#JJJ!JJJJJJ!JJJ%JJJJJJJJgJ!J!#JJJ!JJJJJJ!JJJ%JJJJJJJJZZW-?-? @ J JT[ J \]
'"]b]"b(]]]"b]]]"]]]b]]]*]]]]]]]]'"]b]"b(]]]"b]]]"]]]b]]]*]]]]]]]]r0   N)#__name__
__module____qualname____doc__rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r"  r&  r)  r+  r/  r1  r/   r0   r1   r@   r@      s    +

KO
]]ag^
Ep Y
WmgIQd[H.HcYZ
e`
7 ^r0   r@   )r5  builtinsrW   _pytest.assertion.rewrite	assertionrewriterU   r   rQ   pytestkakao_knowledge.knowledge_graphr   fixturerS   r.  r2   r>   r@   r/   r0   r1   <module>r=     si        : ]d ] ]@  U^ U^r0   