
    %~iJ                        d Z ddlZddlmc mZ ddlZddlZddl	m
Z
 ddlmZmZ dZdedefdZdefd	Zdefd
Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      ZdZej<                  j>                  ej<                  jA                  ejB                  jE                  e       d e !       G d" d#                    Z#y)$uH   
카카오톡 파서 단위 테스트
테스터: 모리건 (개발3팀)
    N)parse_kakao_chat)MessageTypeUserMetaut   앞서가는 설계사, 스레드 보상스터디 님과 카카오톡 대화
저장한 날짜 : 2026-04-08 13:11:28
bodyreturnc                 `    t         dz   |z   }| dz  }|j                  |d       t        |      S )uK   헤더 + body 를 합쳐 임시 파일을 만들고 경로를 반환한다.
zchat.txtutf-8encoding)HEADER
write_textstr)tmp_pathr   contentps       h/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_kakao_parser.pymake_chat_filer      s3    tmd"G:ALL7L+q6M    c                 P    | dz  }|j                  t        d       t        |      S )Nzheader_only.txtr
   r   )r   r   r   r   r   s     r   make_header_only_filer      s&    $$ALL'L*q6Mr   c                 H    | dz  }|j                  dd       t        |      S )Nz	empty.txt r
   r   )r   r   r   s     r   make_empty_filer   %   s%    ;ALLgL&q6Mr   c                       e Zd Zd Zd Zy)TestHeaderParsingc                 4   t        t        |d            }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nr   header	chat_nameL   앞서가는 설계사, 스레드 보상스터디 님과 카카오톡 대화==z%(py1)s == %(py4)spy1py4assert %(py6)spy6r   r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationselfr   result@py_assert0@py_assert3@py_assert2@py_format5@py_format7s           r   test_chat_namez TestHeaderParsing.test_chat_name0   sn    !.2">?h,~0~~,0~~~~~,0~~~~,~~~0~~~~~~~~r   c                 4   t        t        |d            }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nr   r   	save_date2026-04-08 13:11:28r"   r$   r%   r(   r)   r*   r0   s           r   test_save_datez TestHeaderParsing.test_save_date4   sn    !.2">?h,E0EE,0EEEEE,0EEEE,EEE0EEEEEEEEr   N)__name__
__module____qualname__r8   r<    r   r   r   r   /   s    Fr   r   c                       e Zd Zd Zd Zy)TestBasicMessageParsingc                 
   d}t        t        ||            }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}}|d
   }
|
j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|
j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|
j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|
j                  }t        j                   }||k(  }|st        j                  d|fd||f      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t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}}d}|
j"                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )N   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 광응고술 분쟁이 굉장히 많았습니다.
messages   r"   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenpy0r&   py3r)   assert %(py8)spy8r   
2025-12-03)z,%(py2)s
{%(py2)s = %(py0)s.date
} == %(py5)smsgrJ   py2py5assert %(py7)spy717:46)z,%(py2)s
{%(py2)s = %(py0)s.time
} == %(py5)s   이해철/프라임/부산)z,%(py2)s
{%(py2)s = %(py0)s.user
} == %(py5)s)zI%(py2)s
{%(py2)s = %(py0)s.type
} == %(py6)s
{%(py6)s = %(py4)s.MESSAGE
}r   rJ   rQ   r'   r)   u   광응고술in)z/%(py1)s in %(py5)s
{%(py5)s = %(py3)s.content
})r&   rK   rR   )r   r   rH   r+   r,   @py_builtinslocals_should_repr_global_namer-   r.   r/   datetimeusertyper   MESSAGEr   )r1   r   r   r2   rE   r5   @py_assert5@py_assert4r7   @py_format9rO   @py_assert1r4   @py_format6@py_format8r3   s                   r   test_single_message_fieldsz2TestBasicMessageParsing.test_single_message_fields>   s   m 	 ".4"@A*%8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!qkxx'<'x<''''x<''''''s'''s'''x'''<'''''''xx"7"x7""""x7""""""s"""s"""x"""7"""""""xx777x77777x7777777s777s777x77777777777xx.;...x.....x.......s...s...x......;...;...........,,~,,,,~,,,~,,,,,,,,,,,,,,,,,,,r   c                 P   d}t        t        ||            }|d   d   j                  }d }||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}|j                  }d
}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|j                  }d}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	|j                  }d}	||	k(  }
|
st        j                  d|
fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y )NrD   rE   r   )is not)z%(py0)s is not %(py3)smeta)rJ   rK   assert %(py5)srR   	   이해철r"   z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)srP   rS   rT   	   프라임z/%(py2)s
{%(py2)s = %(py0)s.company
} == %(py5)s   부산z.%(py2)s
{%(py2)s = %(py0)s.region
} == %(py5)s)r   r   	user_metar+   r,   rZ   r[   r\   r-   r.   r/   namecompanyregion)r1   r   r   r2   rk   r5   re   @py_format4rf   rc   r4   rg   s               r   test_user_meta_parsedz-TestBasicMessageParsing.test_user_meta_parsedM   s   m 	 ".4"@Aj!!$..t4t4tt4yy'K'yK''''yK''''''t'''t'''y'''K'''''''||*{*|{****|{******t***t***|***{*******{{&h&{h&&&&{h&&&&&&t&&&t&&&{&&&h&&&&&&&r   N)r=   r>   r?   rh   rx   r@   r   r   rB   rB   =   s    -
'r   rB   c                       e Zd Zd Zd Zd Zy)TestMultilineMessageMergec                    d}t        t        ||            }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}}y )
N   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 광응고술 분쟁이 굉장히 많았습니다.
판결도 수술이다. 아니다. 엇갈렸죠.
rE   rF   r"   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srH   rJ   rQ   r'   rT   assert %(py9)spy9r   r   rH   r+   r,   rZ   r[   r\   r-   r.   r/   
r1   r   r   r2   re   r4   @py_assert6rb   rg   @py_format10s
             r   test_continuation_lines_mergedz8TestMultilineMessageMerge.test_continuation_lines_merged_   s    A 	
 ".4"@A*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++r   c                    d}t        t        ||            }|d   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  }d	d
|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr|   rE   r   r	   rX   )z%(py1)s in %(py3)sr   )r&   rK   rl   rR   u   판결도 수술이다)r   r   r   r+   r,   r-   rZ   r[   r\   r.   r/   )	r1   r   r   r2   r   r3   r5   rw   rf   s	            r   %test_continuation_content_has_newlinez?TestMultilineMessageMerge.test_continuation_content_has_newlineh   s    A 	
 ".4"@A$Q'//twtwtww'2'72222'7222'222222722272222222r   c                    d}t        t        ||            }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}}y )
Nu   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 첫 번째 메시지
[이해철/프라임/부산] [오후 5:47] 두 번째 메시지
rE      r"   r}   rH   r~   r   r   r   r   s
             r   %test_two_separate_messages_not_mergedz?TestMultilineMessageMerge.test_two_separate_messages_not_mergeds   s    P 	
 ".4"@A*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++r   N)r=   r>   r?   r   r   r   r@   r   r   rz   rz   ^   s    ,	3,r   rz   c                   8    e Zd ZdZdedefdZd Zd Zd Zd Z	y	)
TestTimeConversionuU   오전/오후 시간을 24시간제 문자열로 올바르게 변환하는지 검증.time_strr   c                 \    d| d}t        t        ||            }|d   d   j                  S )Nu[   --------------- 2025년 12월 3일 수요일 ---------------
[테스터/테스트/서울] [u   ] 테스트 메시지
rE   r   )r   r   r^   )r1   r   r   r   r2   s        r   _single_msg_timez#TestTimeConversion._single_msg_time   sC    --5J6MO 	 ".4"@Aj!!$)))r   c           	         | j                   }d} |||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   오후 5:46rU   r"   z`%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s._single_msg_time
}(%(py3)s, %(py5)s)
} == %(py10)sr1   r   rJ   rQ   rK   rR   rT   py10assert %(py12)spy12	r   r+   r,   rZ   r[   r\   r-   r.   r/   	r1   r   re   rc   r   @py_assert9@py_assert8@py_format11@py_format13s	            r   test_afternoonz!TestTimeConversion.test_afternoon       $$H}H$X}=HH=HHHH=HHHHHHtHHHtHHH$HHHHHHXHHHXHHH}HHH=HHHHHHHHHHHr   c           	         | j                   }d} |||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   오전 9:00z09:00r"   r   r1   r   r   r   r   r   r   s	            r   test_morningzTestTimeConversion.test_morning   r   r   c           	         | j                   }d} |||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   오후 12:30z12:30r"   r   r1   r   r   r   r   r   r   s	            r   	test_noonzTestTimeConversion.test_noon       $$I~I$X~>I'I>'IIII>'IIIIIItIIItIII$IIIIIIXIIIXIII~III>III'IIIIIIIIr   c           	         | j                   }d} |||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   오전 12:30z00:30r"   r   r1   r   r   r   r   r   r   s	            r   test_midnightz TestTimeConversion.test_midnight   r   r   N)
r=   r>   r?   __doc__r   r   r   r   r   r   r@   r   r   r   r      s0    _*3 *3 *IIJJr   r   c                   4    e Zd ZdedefdZd Zd Zd Zd Z	y)	TestMediaMessageTypescontent_liner   c                 \    d| d}t        t        ||            }|d   d   j                  S )Nuh   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:47] r	   rE   r   )r   r   r`   )r1   r   r   r   r2   s        r   	_msg_typezTestMediaMessageTypes._msg_type   sB    ::FrK 	 ".4"@Aj!!$)))r   c           
      4   | j                   }d} |||      }t        j                  }||k(  }|s_t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   사진r"   zu%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s._msg_type
}(%(py3)s, %(py5)s)
} == %(py11)s
{%(py11)s = %(py9)s.PHOTO
}r1   r   r   rJ   rQ   rK   rR   rT   r   py11assert %(py13)spy13r   r   PHOTOr+   r,   rZ   r[   r\   r-   r.   r/   	r1   r   re   rc   r   @py_assert10r   @py_format12@py_format14s	            r   test_photo_typez%TestMediaMessageTypes.test_photo_type   s    ~~FF~h1F[5F5FF15FFFFF15FFFFFFFtFFFtFFF~FFFFFFhFFFhFFFFFF1FFFFFF[FFF[FFF5FFFFFFFFFr   c           
      4   | j                   }d} |||      }t        j                  }||k(  }|s_t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   이모티콘r"   )zx%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s._msg_type
}(%(py3)s, %(py5)s)
} == %(py11)s
{%(py11)s = %(py9)s.EMOTICON
}r1   r   r   r   r   r   )r   r   EMOTICONr+   r,   rZ   r[   r\   r-   r.   r/   r   s	            r   test_emoticon_typez(TestMediaMessageTypes.test_emoticon_type   s    ~~OO~h7O;;O;OO7;OOOOO7;OOOOOOOtOOOtOOO~OOOOOOhOOOhOOOOOO7OOOOOO;OOO;OOO;OOOOOOOOOr   c           
      4   | j                   }d} |||      }t        j                  }||k(  }|s_t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu	   동영상r"   )zu%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s._msg_type
}(%(py3)s, %(py5)s)
} == %(py11)s
{%(py11)s = %(py9)s.VIDEO
}r1   r   r   r   r   r   )r   r   VIDEOr+   r,   rZ   r[   r\   r-   r.   r/   r   s	            r   test_video_typez%TestMediaMessageTypes.test_video_type   s    ~~II~h4I8I8II48IIIII48IIIIIIItIIItIII~IIIIIIhIIIhIIIIII4IIIIIIIIIIII8IIIIIIIIIr   c           
      4   | j                   }d} |||      }t        j                  }||k(  }|s_t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}x}}y )
Nu   사진 3장r"   r   r1   r   r   r   r   r   r   r   s	            r   test_photo_multiplez)TestMediaMessageTypes.test_photo_multiple   s    ~~KK~h6K+:K:KK6:KKKKK6:KKKKKKKtKKKtKKK~KKKKKKhKKKhKKKKKK6KKKKKK+KKK+KKK:KKKKKKKKKr   N)
r=   r>   r?   r   r   r   r   r   r   r   r@   r   r   r   r      s-    * * *GPJLr   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestSystemJoinLeaveKickc                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d x}x}}y c c}w )N   --------------- 2025년 12월 3일 수요일 ---------------
전종혁 / 인카 / 수원님이 들어왔습니다.타인, 기관 등의 사칭에 유의해 주세요.
rE   rF   >=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srH   	join_msgsrI   rL   rM   )r   r   r`   r   JOINrH   r+   r,   rZ   r[   r\   r-   r.   r/   )r1   r   r   r2   mr   r5   rb   rc   r7   rd   s              r   test_join_message_typez.TestSystemJoinLeaveKick.test_join_message_type   s    E 	
 ".4"@A &z 2Q1aff@P@P6PQQ	Q9~""~""""~""""""s"""s""""""9"""9"""~"""""""""" R   "EEc                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}|d   }|j
                  }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }
dd	|
iz  }t        t        j                  |            d x}x}x}	}y c c}w )
Nr   rE   r   u   전종혁 / 인카 / 수원r"   z,%(py3)s
{%(py3)s = %(py1)s.user
} == %(py6)sr&   rK   r)   rL   rM   )r   r   r`   r   r   r_   r+   r,   r-   r.   r/   )r1   r   r   r2   r   r   r3   r5   rb   rc   r7   rd   s               r   test_join_message_userz.TestSystemJoinLeaveKick.test_join_message_user   s    E 	
 ".4"@A &z 2Q1aff@P@P6PQQ	Q|A|  A$AA $AAAAA $AAAA|AAA AAA$AAAAAAAA R   "C+C+c                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d x}x}}y c c}w )Nl   --------------- 2025년 12월 3일 수요일 ---------------
김덕호 / KB / 대전님이 나갔습니다.
rE   rF   r"   rG   rH   
leave_msgsrI   rL   rM   )r   r   r`   r   LEAVErH   r+   r,   rZ   r[   r\   r-   r.   r/   )r1   r   r   r2   r   r   r5   rb   rc   r7   rd   s              r   test_leave_message_typez/TestSystemJoinLeaveKick.test_leave_message_type   s    ? 	 ".4"@A!'
!3SAqvvARAR7RaS
S:#!#!####!######s###s######:###:######!####### Tr   c                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}|d   }|j
                  }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }
dd	|
iz  }t        t        j                  |            d x}x}x}	}y c c}w )
Nr   rE   r   u   김덕호 / KB / 대전r"   r   r   rL   rM   )r   r   r`   r   r   r_   r+   r,   r-   r.   r/   )r1   r   r   r2   r   r   r3   r5   rb   rc   r7   rd   s               r   test_leave_message_userz/TestSystemJoinLeaveKick.test_leave_message_user   s    ? 	 ".4"@A!'
!3SAqvvARAR7RaS
S!}>}!!>%>>!%>>>>>!%>>>>}>>>!>>>%>>>>>>>> Tr   c                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	d	d
|	iz  }
t        t        j                  |
            d x}x}}y c c}w )No   --------------- 2025년 12월 3일 수요일 ---------------
간식 먹는 프렌즈님을 내보냈습니다.
rE   rF   r"   rG   rH   	kick_msgsrI   rL   rM   )r   r   r`   r   KICKrH   r+   r,   rZ   r[   r\   r-   r.   r/   )r1   r   r   r2   r   r   r5   rb   rc   r7   rd   s              r   test_kick_message_typez.TestSystemJoinLeaveKick.test_kick_message_type   s    B 	 ".4"@A &z 2Q1aff@P@P6PQQ	Q9~""~""""~""""""s"""s""""""9"""9"""~"""""""""" Rr   c                    d}t        t        ||            }|d   D cg c]"  }|j                  t        j                  k(  s!|$ }}|d   }|j
                  }d}||k(  }	|	st        j                  d|	fd||f      t        j                  |      t        j                  |      t        j                  |      dz  }
dd	|
iz  }t        t        j                  |            d x}x}x}	}y c c}w )
Nr   rE   r   u   간식 먹는 프렌즈r"   r   r   rL   rM   )r   r   r`   r   r   r_   r+   r,   r-   r.   r/   )r1   r   r   r2   r   r   r3   r5   rb   rc   r7   rd   s               r   test_kick_message_userz.TestSystemJoinLeaveKick.test_kick_message_user   s    B 	 ".4"@A &z 2Q1aff@P@P6PQQ	Q|=|  =$== $===== $====|=== ===$======== Rr   N)	r=   r>   r?   r   r   r   r   r   r   r@   r   r   r   r      s!    #B$?#>r   r   c                       e Zd Zd Zd Zy)TestBotFilteringc                    d}t        t        ||            }|d   D ]<  }|j                  }t        j                  }||k7  }|st        j                  d|fd||f      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t        j                  |      dz  }t        j                  d|       d	z   d
|iz  }	t        t        j                  |	            d x}x}}? y )Nu   --------------- 2025년 12월 3일 수요일 ---------------
[오픈채팅봇] [오후 5:38] 📚 한 발 앞서가는 설계사, 환영합니다.
━━━━━━━━━━━━━
‼️ 대화명 변경 필수 ‼️
rE   )!=)zE%(py2)s
{%(py2)s = %(py0)s.type
} != %(py6)s
{%(py6)s = %(py4)s.BOT
}rO   r   rW   u)   bot 메시지가 messages 에 포함됨: 
>assert %(py8)srM   )r   r   r`   r   BOTr+   r,   rZ   r[   r\   r-   _format_assertmsgr.   r/   )
r1   r   r   r2   rO   re   rb   r4   r7   rd   s
             r   'test_bot_message_excluded_from_messagesz8TestBotFiltering.test_bot_message_excluded_from_messages   s8   6 	 ".4"@A*% 	C88 { 8.   8  v     I   I   v    +  I  +  I  /    <C5A     	r   c                 P   d}t        t        ||            }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}x}}|d   d
   }
|
j                  }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}
x}x}}y )Nu   --------------- 2025년 12월 3일 수요일 ---------------
[오픈채팅봇] [오후 5:38] 환영합니다.
[이해철/프라임/부산] [오후 5:46] 안녕하세요.
rE   rF   r"   r}   rH   r~   r   r   r   rV   r   r   rL   rM   )r   r   rH   r+   r,   rZ   r[   r\   r-   r.   r/   r_   )r1   r   r   r2   re   r4   r   rb   rg   r   r3   r5   rc   r7   rd   s                  r   .test_bot_message_not_counted_in_total_messagesz?TestBotFiltering.test_bot_message_not_counted_in_total_messages  s   L 	
 ".4"@A*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++j!!$I$))I-II)-IIIII)-IIII$III)III-IIIIIIIIr   N)r=   r>   r?   r   r   r@   r   r   r   r      s    	Jr   r   c                   :    e Zd ZdedefdZd Zd Zd Zd Z	d Z
y	)
TestNicknameMetaParsingnicknamer   c                 \    d| d}t        t        ||            }|d   d   j                  S )Nu>   --------------- 2025년 12월 3일 수요일 ---------------
[u   ] [오후 5:46] 테스트
rE   r   )r   r   rs   )r1   r   r   r   r2   s        r   _parse_metaz#TestNicknameMetaParsing._parse_meta  sB    z46 	 ".4"@Aj!!$...r   c                    | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d	}||k(  }|st        j                  d|fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )NrV   rm   r"   rn   rk   rP   rS   rT   ro   rp   rq   rr   r   rt   r+   r,   rZ   r[   r\   r-   r.   r/   ru   rv   r1   r   rk   re   rc   r4   rf   rg   s           r   test_three_parts_slashz.TestNicknameMetaParsing.test_three_parts_slash   s\   *FGyy'K'yK''''yK''''''t'''t'''y'''K'''''''||*{*|{****|{******t***t***|***{*******{{&h&{h&&&&{h&&&&&&t&&&t&&&{&&&h&&&&&&&r   c                    | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d	}||k(  }|st        j                  d|fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nu   강나윤 / 인카 / 수도권u	   강나윤r"   rn   rk   rP   rS   rT   u   인카rp   u	   수도권rr   r   r   s           r   "test_three_parts_slash_with_spacesz:TestNicknameMetaParsing.test_three_parts_slash_with_spaces&  s\   *JKyy'K'yK''''yK''''''t'''t'''y'''K'''''''||'x'|x''''|x''''''t'''t'''|'''x'''''''{{)k){k)))){k))))))t)))t))){)))k)))))))r   c                    | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nu   양희원/부산u	   양희원r"   rn   rk   rP   rS   rT   isz/%(py2)s
{%(py2)s = %(py0)s.company
} is %(py5)srq   rr   r   r   s           r   test_two_parts_no_companyz1TestNicknameMetaParsing.test_two_parts_no_company,  s\   *<=yy'K'yK''''yK''''''t'''t'''y'''K'''''''||#t#|t####|t######t###t###|###t#######{{&h&{h&&&&{h&&&&&&t&&&t&&&{&&&h&&&&&&&r   c                    | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|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                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nu   하트를 든 라이언r"   rn   rk   rP   rS   rT   r   r   )z.%(py2)s
{%(py2)s = %(py0)s.region
} is %(py5)sr   r   s           r   test_no_slash_plain_namez0TestNicknameMetaParsing.test_no_slash_plain_name2  s`   *CDyy555y55555y5555555t555t555y55555555555||#t#|t####|t######t###t###|###t#######{{"d"{d""""{d""""""t"""t"""{"""d"""""""r   c                    | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d	}||k(  }|st        j                  d|fd
||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nu   정혜정/AIA/ 서울u	   정혜정r"   rn   rk   rP   rS   rT   AIArp   u   서울rr   r   r   s           r   test_three_parts_mixed_spacingz6TestNicknameMetaParsing.test_three_parts_mixed_spacing8  s\   *AByy'K'yK''''yK''''''t'''t'''y'''K'''''''||$u$|u$$$$|u$$$$$$t$$$t$$$|$$$u$$$$$$${{&h&{h&&&&{h&&&&&&t&&&t&&&{&&&h&&&&&&&r   N)r=   r>   r?   r   r   r   r   r   r   r   r   r@   r   r   r   r     s.    /c /h /'*'#'r   r   c                       e Zd Zd Zd Zy)TestDateTrackingc                    d}t        t        ||            }|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}x}}|d
   }
|
j                  }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}
x}x}}|d   }
|
j                  }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd	|iz  }	t        t        j                  |	            d x}
x}x}}y )Nu   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 12월 3일 메시지
--------------- 2025년 12월 4일 목요일 ---------------
[이해철/프라임/부산] [오전 9:00] 12월 4일 메시지
rE   r   r"   rG   rH   rI   rL   rM   r   rN   z,%(py3)s
{%(py3)s = %(py1)s.date
} == %(py6)sr   rF   z
2025-12-04)r   r   rH   r+   r,   rZ   r[   r\   r-   r.   r/   r]   )r1   r   r   r2   rE   r5   rb   rc   r7   rd   r3   s              r   .test_messages_get_correct_date_after_separatorz?TestDateTracking.test_messages_get_correct_date_after_separatorE  s   P 	 ".4"@A*%8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!{/{/</<////<///{//////<///////{/{/</<////<///{//////<///////r   c                    d}t        t        ||            }|d   }|d   }|j                  }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      t        j
                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d x}x}x}}|d
   }|j                  }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      t        j
                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d x}x}x}}|d   }|j                  }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      t        j
                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d x}x}x}}y )Nu   --------------- 2025년 12월 3일 수요일 ---------------
[A/B/C] [오후 1:00] 메시지1
[A/B/C] [오후 2:00] 메시지2
--------------- 2025년 12월 5일 금요일 ---------------
[A/B/C] [오전 8:00] 메시지3
rE   r   rN   r"   r   r   rL   rM   rF   r   z
2025-12-05)r   r   r]   r+   r,   r-   r.   r/   )r1   r   r   r2   rE   r3   r5   rb   rc   r7   rd   s              r   test_multiple_date_separatorsz.TestDateTracking.test_multiple_date_separatorsR  s^   1 	 ".4"@A*%{/{/</<////<///{//////<///////{/{/</<////<///{//////<///////{/{/</<////<///{//////<///////r   N)r=   r>   r?   r  r  r@   r   r   r   r   D  s    00r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestEdgeCasesc                 ,   t        t        |            }|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y NrE   r"   r$   r%   r(   r)   r   r   r+   r,   r-   r.   r/   r0   s           r   &test_empty_file_returns_empty_messagesz4TestEdgeCases.test_empty_file_returns_empty_messagesf  sc    !/(";<j!'R'!R''''!R'''!'''R'''''''r   c                 (   t        t        |            }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr    r   rX   )z%(py1)s in %(py4)sr%   r(   r)   r:   r  r0   s           r   test_empty_file_header_defaultsz-TestEdgeCases.test_empty_file_header_defaultsj  s    !/(";<.fX..{.....{....{............fX..{.....{....{...........r   c                 ,   t        t        |            }|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y r  r   r   r+   r,   r-   r.   r/   r0   s           r   !test_header_only_file_no_messagesz/TestEdgeCases.test_header_only_file_no_messagesp  sd    !"7"ABj!'R'!R''''!R'''!'''R'''''''r   c                 2   t        t        |            }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nstatstotal_messagesr   r"   r$   r%   r(   r)   r  r0   s           r    test_header_only_file_stats_zeroz.TestEdgeCases.test_header_only_file_stats_zerot  si    !"7"ABg/05A50A55550A5550555A5555555r   c                    d}t        t        ||            }|d   d   }|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t        j
                  |      t        j
                  |      dz  }d	d
|iz  }	t        t        j                  |	            d x}x}x}}y )Nu   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 메시지1
[이해철/프라임/부산] [오후 5:47] 메시지2
r  r  rE   r"   z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}rH   r&   rK   rR   rT   r   r   )r   r   rH   r+   r,   r-   rZ   r[   r\   r.   r/   )
r1   r   r   r2   r3   rc   r   r5   rg   r   s
             r   /test_stats_total_messages_matches_messages_listz=TestEdgeCases.test_stats_total_messages_matches_messages_listx  s    F 	
 ".4"@Ag/0Kz8JKC8J4KK04KKKKK04KKKK0KKKKKKCKKKCKKK8JKKK4KKKKKKKKr   c                 8   d}t        t        ||            }|d   d   }d}||kD  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nus   --------------- 2025년 12월 3일 수요일 ---------------
[이해철/프라임/부산] [오후 5:46] 메시지1
r  total_linesr   )>)z%(py1)s > %(py4)sr%   r(   r)   r*   )	r1   r   r   r2   r3   r4   r5   r6   r7   s	            r   test_stats_total_lines_positivez-TestEdgeCases.test_stats_total_lines_positive  sv    F 	 ".4"@Ag}-11-1111-111-1111111111r   N)	r=   r>   r?   r	  r  r  r  r  r  r@   r   r   r  r  e  s!    (/(6L2r   r  z)/home/jay/workspace/data/kakao-sample.txtu   샘플 파일 없음: )reasonc                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestIntegrationSampleFilec                 @   t        t              }|d   }t        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }t        j                  dt        |d                dz   d	|iz  }t        t        j                  |            d x}x}x}}y )
NrE   ip  r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)srH   r~   u   메시지 수가 6,000 미만: z
>assert %(py9)sr   )r   SAMPLE_PATHrH   r+   r,   rZ   r[   r\   r-   r   r.   r/   )r1   r2   re   r4   r   rb   rg   r   s           r   test_message_count_reasonablez7TestIntegrationSampleFile.test_message_count_reasonable  s   !+.*% 	
s%& 	
$ 	
&$. 	
 	
&$ 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 & 	
 	
 		 ' 	
 	
 		 +/ 	
 	
  .c&2D.E-FG	
 	
 	
 	
 	
 	
r   c                    t        t              }|d   D cg c]"  }|j                  t        j                  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 )NrE   r   r"   rG   rH   bot_msgsrI   u   bot 메시지 u'   개가 필터링되지 않고 포함됨r   rM   )r   r  r`   r   r   rH   r+   r,   rZ   r[   r\   r-   r   r.   r/   )	r1   r2   r   r"  r5   rb   rc   r7   rd   s	            r   test_no_bot_messages_in_resultz8TestIntegrationSampleFile.test_no_bot_messages_in_result  sA   !+.%j1O!QVV{5NAOO8} 	
 	
}! 	
 	
 	
} 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 !" 	
 	
  S]O+RS	
 	
 	
 	
 	
 	
 Ps
   "E5E5c                 (   t        t              }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr  r  i  r"   r$   r%   r(   r)   r   r  r+   r,   r-   r.   r/   r1   r2   r3   r4   r5   r6   r7   s          r   test_stats_total_linesz0TestIntegrationSampleFile.test_stats_total_lines  sd    !+. g}-66-6666-666-6666666666r   c                    t        t              }|d   d   }|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t        j
                  |      t        j
                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}x}}y )
Nr  r  rE   r"   r  rH   r  r   r   )r   r  rH   r+   r,   r-   rZ   r[   r\   r.   r/   )r1   r2   r3   rc   r   r5   rg   r   s           r   $test_stats_total_messages_consistentz>TestIntegrationSampleFile.test_stats_total_messages_consistent  s    !+.g/0Kz8JKC8J4KK04KKKKK04KKKK0KKKKKKCKKKCKKK8JKKK4KKKKKKKKr   c                 (   t        t              }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr   r    r!   r"   r$   r%   r(   r)   r%  r&  s          r   test_header_chat_namez/TestIntegrationSampleFile.test_header_chat_name  s    !+.h, 	
Z	
,Z
 	
 	
,Z	
 	
 		 - 	
 	
 		 [	
 	
 	
 	
 	
 	
 	
r   c                 (   t        t              }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr   r:   r;   r"   r$   r%   r(   r)   r%  r&  s          r   test_header_save_datez/TestIntegrationSampleFile.test_header_save_date  sg    !+.h,E0EE,0EEEEE,0EEEE,EEE0EEEEEEEEr   c                 \   t        t              }t        j                  t        j                  t        j
                  t        j                  h}|d   D ]V  }|j                  }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d }|j                   |v s|j"                  }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d }Y y )NrE   u   date 없음: z*
>assert %(py2)s
{%(py2)s = %(py0)s.date
}rO   rJ   rQ   u   time 없음: z*
>assert %(py2)s
{%(py2)s = %(py0)s.time
})r   r  r   ra   r   r   r   r]   r+   r   rZ   r[   r\   r-   r.   r/   r`   r^   )r1   r2   
chat_typesrO   re   @py_format3s         r   $test_all_messages_have_date_and_timez>TestIntegrationSampleFile.test_all_messages_have_date_and_time  s   !+.!));+<+<k>R>RT_TeTef
*% 	7C882822}SE2222222322232228222222xx:%xx6x66=!6666666s666s666x666666	7r   c                    t        t              }|d   D ]  }|j                  t        j                  k(  s!|j
                  }|st        j                  d|       dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d } y )NrE   u   user 없음: z*
>assert %(py2)s
{%(py2)s = %(py0)s.user
}rO   r/  )r   r  r`   r   ra   r_   r+   r   rZ   r[   r\   r-   r.   r/   )r1   r2   rO   re   r1  s        r    test_all_chat_messages_have_userz:TestIntegrationSampleFile.test_all_chat_messages_have_user  s    !+.*% 	7Cxx;...xx6x66=!6666666s666s666x666666	7r   N)r=   r>   r?   r   r#  r'  r)  r+  r-  r2  r4  r@   r   r   r  r    s,    

7L
F77r   r  )$r   builtinsrZ   _pytest.assertion.rewrite	assertionrewriter+   ospytestkakao_knowledge.kakao_parserr   kakao_knowledge.modelsr   r   r   r   r   r   r   r   rB   rz   r   r   r   r   r   r   r  r  markintegrationskipifpathexistsr  r@   r   r   <module>rB     s&    	  9 8/ 3 3 s  F F' 'B, ,FJ J<L L67> 7>|J J>&' &'Z0 0B"2 "2R : 
{###K=1  /7 /7	 
/7r   