
    ki=                     z   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
Z
ddlmZ ddlZe	j                  j                  dd       ddlmZ  e
j$                  d      Z e
j$                  d      Z e
j$                  d      Zdd	ed
edefdZdd	ed
edef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)u   TDD RED phase - MemoryIndexer 테스트

TC01 ~ TC12: SQLite FTS5 기반 메모리 인덱서 전체 기능 검증.
이 단계에서는 utils/memory_indexer.py 미구현 상태이므로
ImportError만 발생해야 한다 (RED phase).
    N)Pathz/home/jay/workspace)MemoryIndexeruc      ---
    date: "2026-04-05"
    session: 1
    team_id: "dev3"
    task_id: "task-9999"
    tags: [auto-compact, pre-compact]
    auto_generated: true
    ---
    ## 수행한 작업
    - 메모리 인덱서 TDD RED phase 작성
    - SQLite FTS5 테이블 설계 검토

    ## 피드백 및 수정 지시
    - 한국어 검색 성능 확인 필요
u      ---
    name: 위임 규칙 종합
    description: 파일 기반 위임, 논리적 팀, 한정승인 등
    type: feedback
    team_id: "dev3"
    ---
    ### 파일 기반 위임 (절대 규칙)
    - 지시 내용 → 파일 작성 → `--task-file`로 전달.
    - 100자 이내만 `--task` 허용.

    ### 논리적 팀
    - 마케팅/컨설팅/출판/디자인 라우팅 규칙 준수.
uh      ---
    name: 위임 규칙 종합 (업데이트)
    description: 파일 기반 위임, 논리적 팀, 한정승인 등 - 수정됨
    type: feedback
    team_id: "dev3"
    ---
    ### 파일 기반 위임 (절대 규칙, 수정)
    - 지시 내용 → 파일 작성 → `--task-file`로 전달.
    - 200자 이내까지 `--task` 허용으로 변경.
	directoryfilenamereturnc                 >    | |z  }|j                  t        d       |S )u+   임시 디렉토리에 diary 파일 생성.utf-8encoding)
write_textDIARY_CONTENTr   r   fs      0/home/jay/workspace/tests/test_memory_indexer.pymake_diary_filer   F   s!    HALLL1H    c                 >    | |z  }|j                  t        d       |S )u,   임시 디렉토리에 memory 파일 생성.r	   r
   )r   MEMORY_CONTENTr   s      r   make_memory_filer   M   s!    HALL'L2Hr   c                 <   t        | dz        }t        |      }|j                          t        |      }|j                  } |       }|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t        j                  |      t        j                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}t        j                  |      }|j                         }|j!                  d	       |j"                  }	 |	       }
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                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}	x}
x}}|j!                  d       |j"                  }	 |	       }
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                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}	x}
x}}|j                          y)uS   DB 파일이 생성되고 memories + memories_fts 테이블이 존재해야 한다.test_index.dbdb_pathu*   DB 파일이 생성되지 않았습니다.za
>assert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}.exists
}()
}r   r   )py0py1py3py5py7NzESELECT name FROM sqlite_master WHERE type='table' AND name='memories'is not)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.fetchone
}()
} is not %(py7)scursor)r   py2py4r   u0   memories 테이블이 존재하지 않습니다.z
>assert %(py9)spy9zISELECT name FROM sqlite_master WHERE type='table' AND name='memories_fts'u@   memories_fts FTS5 가상 테이블이 존재하지 않습니다.)strr   closer   exists
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationsqlite3connectr!   executefetchone_call_reprcompare)tmp_pathr   indexer@py_assert2@py_assert4@py_assert6@py_format8connr!   @py_assert1@py_assert3@py_assert5@py_format10s                r   test_TC01_db_creationr@   X   s)   (_,-GG,GMMO =O=O!O!OO#OOOOOOO4OOO4OOOOOOOOOOOO=OOOOOO!OOOOOO??7#D[[]F NNO ??\?\D\D(\\\D\\\\\\6\\\6\\\?\\\\\\D\\\*\\\\\\\\ NNS ??l?lDlD(lllDllllll6lll6lll?llllllDlll*llllllllJJLr   c                    t        | dz        }t        |       }t        |      }|j                  t        |            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}|j                  }d}	 ||	      }
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                  |
      t        j                  |      dz  }t        j                  d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}	x}
x}}|j                  }d}	 ||	      }
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                  |
      t        j                  |      dz  }t        j                  d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}	x}
x}}|j                  dd      }t        |t               r|nd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}}|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}	}
y)%u]   diary 파일에서 date, session, team_id, task_id, tags를 올바르게 파싱해야 한다.r   r   Nr   z%(py0)s is not %(py3)sparsedr   r   ,   _parse_file()이 None을 반환했습니다.
>assert %(py5)sr   team_iddev3==zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sr   r"   r#   py6r$   u   team_id 불일치: 
>assert %(py11)spy11task_idz	task-9999u   task_id 불일치: tags ,zauto-compactinz%(py1)s in %(py3)stags_strr   r   u   tags에 'auto-compact' 없음: zpre-compactu   tags에 'pre-compact' 없음: contentu   content가 비어있습니다.zG
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
})r   r"   r#   rM   )r%   r   r   _parse_filer&   r(   r4   r*   r+   r,   r-   r)   r.   r/   get
isinstancejoin)r5   r   
diary_filer6   rC   r7   r<   @py_format4@py_format6r=   r>   @py_assert8@py_assert7r?   @py_format12tags_rawrW   @py_assert0@py_format7s                      r   test_TC02_parse_diary_filerg   w   s   (_,-G *JG,G  Z1FMMOM6MMM6MMMMMM6MMM6MMMMMMMMMMMMM::YiY:i YFY F*YYY FYYYYYY6YYY6YYY:YYYiYYY YYYFYYY.A&**YBWAX,YYYYYYYY::^i^:i ^K^ K/^^^ K^^^^^^6^^^6^^^:^^^i^^^ ^^^K^^^3FvzzR[G\F]1^^^^^^^^zz&"%H%h4x#((8:LHS>X%SSS>XSSS>SSSSSSXSSSXSSSS)H
'SSSSSSSQ=H$QQQ=HQQQ=QQQQQQHQQQHQQQQ(Fxj&QQQQQQQ::BiB:i B BB"BBBBBBB6BBB6BBB:BBBiBBB BBBBBBr   c                 "   t        | dz        }t        |       }t        |      }|j                  t        |            }|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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}|j                  d      xs |j                  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                  |
            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}}|j                  }d} ||      }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                  |      t        j                  |      dz  }t        j                  d|j                  d             dz   d|iz  }t        t        j                  |            dx}x}x}x}}y)u]   메모리 파일에서 name(→title), type, description을 올바르게 파싱해야 한다.r   r   Nr   rB   rC   rD   rE   rF   r   titlenameu*   title(또는 name) 필드가 없습니다.z
>assert %(py0)sr      위임 규칙rT   rV   rX   u!   title에 '위임 규칙' 없음: typefeedbackrI   rK   rL   u   type 불일치: rN   rO   )r%   r   r   rZ   r&   r(   r4   r*   r+   r,   r-   r)   r.   r/   r[   )r5   r   mem_filer6   rC   r7   r<   r_   r`   ri   @py_format1re   r=   r>   ra   rb   r?   rc   s                     r   test_TC03_parse_memory_filerp      s   (_,-G)HG,G  X/FMMOM6MMM6MMMMMM6MMM6MMMMMMMMMMMMMJJw56::f#5E>>>>>>>>>5>>>5>>>>>P?e#PPP?ePPP?PPPPPPePPPePPPP'H%PPPPPPP::TfT:fTT+TTTTTTTTT6TTT6TTT:TTTfTTTTTTTTT/?

6@R?S-TTTTTTTTr   c                 h   t        | dz        }t        |       }t        |      }|j                  t        |            }|j	                          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	      d
z   d|iz  }t        t        j                  |            dx}}t        j                  |      }	|	j!                         }
|
j#                  dt        |      f       |
j%                         d   }|	j	                          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[   단일 파일을 인덱싱하면 memories 테이블에 레코드가 삽입되어야 한다.r   r   indexedrI   z%(py0)s == %(py3)sresultrD   u"   index_file() 반환값 불일치: u    (기대: 'indexed')rF   r   Nz1SELECT COUNT(*) FROM memories WHERE file_path = ?r      countu'   DB에 레코드가 없습니다. count=)r%   r   r   
index_filer&   r(   r4   r*   r+   r,   r-   r)   r.   r/   r0   r1   r!   r2   r3   )r5   r   r^   r6   rt   r7   r<   r_   r`   r;   r!   rv   s               r   test_TC04_index_single_filerx      sa   (_,-G *JG,GJ0FMMOc6Yccc6Ycccccc6ccc6cccYccc"DVJNb ccccccc ??7#D[[]F
NNFZHZ[OOa EJJLH5A:HHH5AHHHHHH5HHH5HHHAHHH@HHHHHHHr   c                    t        | dz        }t        |       }t        |      }|j                  t        |            }|j                  t        |            }|j	                          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}}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      d	z   d
|iz  }	t        t        j                  |	            dx}}y)uZ   파일 내용이 변경되지 않으면 재인덱싱 시 'skipped'를 반환해야 한다.r   r   rr   rI   rs   firstrD   *   첫 번째 인덱싱 반환값 불일치: rF   r   Nskippedsecondu1   재인덱싱(동일 해시) 반환값 불일치: u    (기대: 'skipped'))r%   r   r   rw   r&   r(   r4   r*   r+   r,   r-   r)   r.   r/   )
r5   r   r^   r6   rz   r}   r7   r<   r_   r`   s
             r   test_TC05_incremental_indexingr~      s-   (_,-G *JG,Gs:/EJ0FMMOU5IUUU5IUUUUUU5UUU5UUUIUUU!KE9UUUUUUUr6Yrrr6Yrrrrrr6rrr6rrrYrrr"STZS]]q rrrrrrrr   c                    t        | dz        }t        |       }t        |      }|j                  t        |            }|j	                  t
        d       |j                  t        |            }|j                          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}}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      dz   d|iz  }	t        t        j                  |	            dx}}y)uP   파일 내용이 변경되면 재인덱싱 시 'updated'를 반환해야 한다.r   r   r	   r
   rr   rI   rs   rz   rD   r{   rF   r   Nupdatedr}   u-   변경 후 재인덱싱 반환값 불일치: u    (기대: 'updated'))r%   r   r   rw   r   MEMORY_CONTENT_UPDATEDr&   r(   r4   r*   r+   r,   r-   r)   r.   r/   )
r5   r   rn   r6   rz   r}   r7   r<   r_   r`   s
             r   test_TC06_update_on_changer      sB   (_,-G)HG,Gs8}-E .AH.FMMOU5IUUU5IUUUUUU5UUU5UUUIUUU!KE9UUUUUUUn6Ynnn6Ynnnnnn6nnn6nnnYnnn"OPVzYm nnnnnnnr   c                    t        | dz        }t        |       }t        |      }|j                  t        |             |j	                  d      }|j                          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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|j%                                dz   d|iz  }t        t        j                  |            d
} y
)uL   한국어 검색어로 FTS5 검색 시 관련 결과를 반환해야 한다.r   r   rk   3   search()가 리스트를 반환하지 않습니다.7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r\   resultslistr   r   r"   r#   Nr   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slen)r   r   r   rM   u.   한국어 검색 결과가 비어있습니다.z
>assert %(py8)spy8)	file_pathri   rl   snippetrT   z%(py0)s in %(py2)skeyrz   r   r"   u   결과에 '   ' 키가 없습니다: 
>assert %(py4)sr#   )r%   r   r   rw   searchr&   r\   r   r(   r)   r*   r+   r,   r-   r.   r/   r   r4   keys)r5   r   rn   r6   r   r=   @py_format5r7   r>   r8   rf   @py_format9rz   r   r<   @py_format3s                   r   test_TC07_fts5_search_koreanr      s   (_,-G)HG,Gs8}%nn_-GMMOgt$[$[[&[[[[[[[:[[[:[[[[[[g[[[g[[[[[[t[[[t[[[$[[[[[[w<M!M<!MMM<!MMMMMM3MMM3MMMMMMwMMMwMMM<MMM!MMMMMMMMMMM AJE8 Ve|UUUseUUUUUUsUUUsUUUUUUeUUUeUUUU{3%/Fuzz|nUUUUUUUVr   c           	         t        | dz        }t        | d      }t        | d      }t        |      }|j	                  t        |             |j	                  t        |             |j                  dd      }|j                  dd	      }|j                          |D ]*  }|j                  }d
}	 ||	      }
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                  |
      t        j                  |      dz  }t        j                  d|j                  d
      d      dz   d|iz  }t        t        j                   |            dx}x}	x}
x}}- |D ]*  }|j                  }d
}	 ||	      }
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                  |
      t        j                  |      dz  }t        j                  d|j                  d
      d      dz   d|iz  }t        t        j                   |            dx}x}	x}
x}}- y)uZ   type_filter와 team_filter를 적용하면 조건에 맞는 결과만 반환해야 한다.r   zdiary_test.mdzmem_test.mdr   u   규칙rm   )type_filteru	   메모리diaryrl   rI   rK   rrL   u"   type_filter='feedback'인데 type=u   가 반환됨rN   rO   Nu   type_filter='diary'인데 type=)r%   r   r   r   rw   r   r&   r[   r(   r4   r*   r+   r,   r-   r)   r.   r/   )r5   r   r^   rn   r6   feedback_resultsdiary_resultsr   r<   r=   r>   ra   rb   r?   rc   s                  r   test_TC08_search_with_filterr      s   (_,-G !?;J-8HG,Gs:'s8}% ~~hJ~GNN;GNDMMMO  
uu 	
V 	
uV} 	

 	
}
* 	
 	
}
 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		  	
 	
 		  	
 	
 		 !+ 	
 	
  1v0AO	
 	
 	
 	
 	
 	

  
uu 	
V 	
uV} 	
 	
}' 	
 	
} 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		  	
 	
 		  	
 	
 		 !( 	
 	
  .aeeFm->mL	
 	
 	
 	
 	
 	

r   c                    t        | dz        }| dz  }|j                          | dz  }|j                          |dz  j                  t        d       |dz  j                  t        d       |dz  j                  t        d       |j                  t        d	t        |             |j                  t        d
t        |             t        |      }|j                         }|j                          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}|j'                  dd      |j'                  dd      z   }	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)uJ   reindex_all() 호출 시 DIARY_DIR + ANU_MEMORY_DIR를 재인덱싱한다.r   r   
anu_memory2026-04-05-session-01.mdr	   r
   z2026-04-05-session-02.mddelegation_rules.md	DIARY_DIRANU_MEMORY_DIRr   u3   reindex_all()이 dict를 반환하지 않습니다.r   r\   statsdictr   Nrr   r   r      >=)z%(py0)s >= %(py3)stotal_processedrD   u=   reindex_all() 후 처리된 파일 수가 3 미만입니다: rF   r   )r%   mkdirr   r   r   setattrr   reindex_allr&   r\   r   r(   r)   r*   r+   r,   r-   r.   r/   r[   r4   )r5   monkeypatchr   	diary_diranu_dirr6   r   r=   r   r   r7   r<   r_   r`   s                 r   test_TC09_reindex_allr   !  s+   (_,-G 7"IOO%GMMO ++77PW7X++77PW7X$$00'0R{C	NC'7WFG,G!EMMOeT"Y"YY$YYYYYYY:YYY:YYYYYYeYYYeYYYYYYTYYYTYYY"YYYYYYii	1-		)Q0GGO ?a  ?a                   HwO    r   c                    t        | dz        }t        |       }t        |       }t        |      }|j	                  t        |             |j	                  t        |             |j                         }|j                          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}}	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
   }d}||k\  }	|	st        j"                  d|	fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|d
          dz   d|iz  }t        t        j                   |            d	x}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}}y	)"uL   stats()는 total, by_type, by_team, last_indexed 키를 포함해야 한다.r   r   u-   stats()가 dict를 반환하지 않습니다.r   r\   rt   r   r   NtotalrT   rV   rX   u'   stats()에 'total' 키가 없습니다.rF   r   by_typeu)   stats()에 'by_type' 키가 없습니다.by_teamu)   stats()에 'by_team' 키가 없습니다.last_indexedu.   stats()에 'last_indexed' 키가 없습니다.   r   )z%(py1)s >= %(py4)sr   r#   u   total이 2 미만입니다: 
>assert %(py6)srM   u    by_type이 dict가 아닙니다.z7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
})r   r"   r   r   u    by_team이 dict가 아닙니다.)r%   r   r   r   rw   r   r&   r\   r   r(   r)   r*   r+   r,   r-   r.   r/   r4   )r5   r   r^   rn   r6   rt   r=   r   re   r7   r_   r`   rf   r<   r8   s                  r   test_TC10_statsr   B  s   (_,-G *J)HG,Gs:'s8}%]]_FMMOfd#T#TT%TTTTTTT:TTT:TTTTTTfTTTfTTTTTTdTTTdTTT#TTTTTTG7fGGG7fGGG7GGGGGGfGGGfGGGGGGGGGGGK9KKK9KKK9KKKKKKKKKKKKK KKKKKKKK9KKK9KKK9KKKKKKKKKKKKK KKKKKKKU>V#UUU>VUUU>UUUUUUVUUUVUUUU%UUUUUUU'?QaQ?aQQQ?aQQQ?QQQaQQQ#?w?P!QQQQQQQQY'R:'.R.RR0R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RY'R:'.R.RR0R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Rr   c                    t        | dz        }| dz  }|j                          |dz  j                  t        d       |dz  j                  t        d       |dz  j                  t        d       |dz  j                  d	d       t        |
      }|j                  t        |            }|j                          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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|j'                                dz   d|	iz  }t!        t        j"                  |            d} |d   |d   z   |d   z   |d   z   }
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%|       d&z   d'|iz  }t!        t        j"                  |            dx}}|d   }d}||k(  }|st        j$                  d |fd(||f      t        j                  |      t        j                  |      d)z  }t        j                  d*|d    d+      d,z   d-|iz  }t!        t        j"                  |            dx}x}}y).ui   index_directory()는 디렉토리 내 모든 .md 파일을 인덱싱하고 통계를 반환해야 한다.r   md_filesz
file_01.mdr	   r
   z
file_02.mdz
file_03.mdz
ignore.txtu   무시되어야 할 파일r   u7   index_directory()가 dict를 반환하지 않습니다.r   r\   r   r   r   N)rr   r   r|   errorsrT   r   r   r   u
   stats에 'r   r   r#   rr   r   r|   r   r   rI   rs   r   rD   u-   처리된 파일 수가 3이어야 하는데 u   입니다. stats=rF   r   )z%(py1)s == %(py4)sr   u4   신규 인덱싱 파일 수가 3이어야 하는데 u
   입니다.r   rM   )r%   r   r   r   r   r   index_directoryr&   r\   r   r(   r)   r*   r+   r,   r-   r.   r/   r4   r   )r5   r   md_dirr6   r   r=   r   r   r<   r   r   r7   r_   r`   re   rf   s                   r   test_TC11_index_directoryr   ]  sD   (_,-G
"F
LLN l&&}w&Gl&&~&Hl&&}w&Gl&&'Cg&VG,G##CK0EMMOeT"]"]]$]]]]]]]:]]]:]]]]]]e]]]e]]]]]]T]]]T]]]"]]]]]]: Ue|TTTseTTTTTTsTTTsTTTTTTeTTTeTTTTz#.Eejjl^TTTTTTTU )uY//%	2BBU8_TE 5A:  5A                  8w>OPUwW      q q   q         !    ?uY?O>PPZ[     r   c                 d   t        | dz        }t        |      }|j                  d      }|j                          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
}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
)ua   아무것도 인덱싱하지 않은 빈 DB에서 검색 시 빈 리스트를 반환해야 한다.r   r   u   한국어 검색어r   r   r\   r   r   r   NrI   rs   rD   u,   빈 DB에서 검색 결과가 있습니다: rF   r   )r%   r   r   r&   r\   r   r(   r)   r*   r+   r,   r-   r.   r/   r4   )
r5   r   r6   r   r=   r   r7   r<   r_   r`   s
             r   test_TC12_search_empty_dbr     s/   (_,-GG,Gnn23GMMOgt$[$[[&[[[[[[[:[[[:[[[[[[g[[[g[[[[[[t[[[t[[[$[[[[[[R7b=RRR7bRRRRRR7RRR7RRRbRRRH	RRRRRRRr   )r   )r   )%__doc__builtinsr*   _pytest.assertion.rewrite	assertionrewriter(   osr0   systextwrappathlibr   pytestpathinsertutils.memory_indexerr   dedentr   r   r   r%   r   r   r@   rg   rp   rx   r~   r   r   r   r   r   r   r    r   r   <module>r      s     	  
    ( ) .   ! " ! "  ) 
* 
 t s TX   PT >C2U*I2s$o*V.
JBS6D	Sr   