
    Ui;              	          d dl Z d dlZej                  j                  d e j                  j	                  e j                  j                  e      d             d dlmZm	Z	m
Z
 d dlZd dlZddededede	fdZdd	edede	fd
Z	 	 	 ddede	dede	fdZde	de	fdZddede	fdZ G d d      Z G d d      Z G d d      Zy)    Nz..)	AsyncMock	MagicMockpatchuser_idis_botusernamereturnc                 D    t               }| |_        ||_        ||_        |S N)r   idr   r   )r   r   r   users       C/home/jay/workspace/services/multimodel-bot/tests/test_bot_logic.py
_make_userr      s#    ;DDGDKDMK    bot_idc                 6    t               }| |_        ||_        |S r   )r   r   r   )r   r   bots      r   _make_bot_objr      s    
+CCFCLJr   text	from_user	chat_typec                     t               }| |_        ||_        t               |_        ||j                  _        ||_        |xs g |_        t               |_        |S r   )	r   r   r   chattypereply_to_messageentitiesr   
reply_text)r   r   r   r   r   msgs         r   _make_messager      sN     +CCHCM{CHCHHM+C>rCL[CNJr   messagec                 X    t               }| |_        | |_        | j                  |_        |S )u9   telegram.Update를 모방하는 MagicMock을 반환한다)r   r    effective_messager   effective_user)r    updates     r   _make_updater%   1   s+    [FFN&F#--FMr   bot_usernamec                 <    t               }t        |       |_        |S )N)r   )r   r   r   )r&   ctxs     r   _make_contextr)   :   s    
+C\2CGJr   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestGroupChatResponseConditionsuU   그룹챗에서 봇이 응답해야 하는 / 하지 않아야 하는 조건 테스트c                     ddl m} t        d      }t               }d|_        d|_        t        d      |_        t        d|d|g	      }t        |      } ||d
d      }|du sJ y)u6   그룹챗에서 @멘션 시 봇이 응답해야 한다r   should_respondo   r   mention@mybotu   @mybot 안녕하세요groupr   r   r   r   mybot[r&   owner_user_idTN
	bot_utilsr.   r   r   r   offsetlenlengthr   r%   )selfr.   r   entityr    r$   results          r   test_responds_to_mentionz8TestGroupChatResponseConditions.test_responds_to_mentionH   so    ,#& H)X	
 g&WIV~~r   c                     ddl m} t        d      }t        ddd      }t        d	|d
      }t        d|d
|      }t	        |      } ||dd      }|du sJ y)uL   그룹챗에서 봇 메시지에 리플라이 시 봇이 응답해야 한다r   r-   r/   r0     Tr5   r   r   r   u   저는 봇입니다.r3   r   r   r   u
   고마워!r   r   r   r   r6   r7   Nr:   r.   r   r   r%   )r>   r.   r   bot_useroriginal_bot_messager    r$   r@   s           r   %test_responds_to_reply_to_bot_messagezETestGroupChatResponseConditions.test_responds_to_reply_to_bot_message_   sm    ,#& c$I,2HT\hop1	
 g&WIV~~r   c                     ddl m} d}t        |      }t        d|d      }t	        |      } ||d|	      }|d
u sJ y)uK   오너 유저가 DM으로 메시지를 보내면 봇이 응답해야 한다r   r-   r6   r0   u   봇아 일해라privaterE   r5   r7   TNrG   )r>   r.   owner_id
owner_userr    r$   r@   s          r   test_responds_to_dm_from_ownerz>TestGroupChatResponseConditions.test_responds_to_dm_from_ownert   sM    ,1
# 

 g&WHU~~r   c                     ddl m} t        ddd      }t               }d|_        d|_        t        d      |_        t        d	|d
|g      }t        |      } ||dd      }|du sJ y)u^   다른 봇이 @멘션으로 보낸 메시지에는 응답해야 한다 (봇 간 토론 지원)r   r-   ix  TotherbotrD   r1   r2      @mybot 안녕r3   r4   r5   r6   r7   Nr9   )r>   r.   other_bot_userr?   r    r$   r@   s          r   +test_does_not_respond_to_other_bot_messageszKTestGroupChatResponseConditions.test_does_not_respond_to_other_bot_messages   ss    ,#CzR H $X	
 g&WIV~~r   c                     ddl m} t        ddd      }t               }d|_        d|_        t        d      |_        t        d	|d
|g      }t        |      } ||dd      }|du sJ y)uj   자기 자신(같은 username) 봇이 보낸 메시지에는 응답하지 않아야 한다 (루프 방지)r   r-   rC   Tr5   rD   r1   r2   rR   r3   r4   r6   r7   FNr9   )r>   r.   self_bot_userr?   r    r$   r@   s          r   )test_does_not_respond_to_self_bot_messagezITestGroupChatResponseConditions.test_does_not_respond_to_self_bot_message   sq    ,"3tgNH #X	
 g&WIVr   c                 |    ddl m} t        d      }t        d|d      }t	        |      } ||dd	
      }|du sJ y)uV   멘션/리플라이 없는 일반 그룹 메시지에는 응답하지 않아야 한다r   r-   r/   r0   u   오늘 점심 뭐 먹지?r3   rE   r5   r6   r7   FNrG   )r>   r.   r   r    r$   r@   s         r   .test_does_not_respond_to_regular_group_messagezNTestGroupChatResponseConditions.test_does_not_respond_to_regular_group_message   sH    ,#&,

 g&WIVr   c                     ddl m} d}t        d      }t        d|d      }t	        |      } ||d	|
      }|du sJ y)uA   오너가 아닌 유저의 DM에는 응답하지 않아야 한다r   r-   r6   iɚ;r0   u
   안녕 봇rL   rE   r5   r7   FNrG   )r>   r.   rM   strangerr    r$   r@   s          r   *test_does_not_respond_to_dm_from_non_ownerzJTestGroupChatResponseConditions.test_does_not_respond_to_dm_from_non_owner   sM    ,i0

 g&WHUr   c                     ddl m} t        d      }t        d      }t        d|d      }t        d	|d|
      }t	        |      } ||dd      }|du sJ y)u`   봇이 아닌 다른 유저의 메시지에 리플라이한 경우 응답하지 않아야 한다r   r-   r/   r0      u   원본 메시지r3   rE   u   리플라이rF   r5   r6   r7   FNrG   )r>   r.   user_auser_boriginal_messager    r$   r@   s           r   4test_does_not_respond_to_reply_on_other_user_messagezTTestGroupChatResponseConditions.test_does_not_respond_to_reply_on_other_user_message   sh    ,C(C( ).@F^ef-	
 g&WIVr   c                 T    ddl m} t               }d|_         ||dd      }|du sJ y)u:   update.message가 None이면 응답하지 않아야 한다r   r-   Nr5   r6   r7   F)r:   r.   r   r    )r>   r.   r$   r@   s       r   *test_does_not_respond_when_message_is_nonezJTestGroupChatResponseConditions.test_does_not_respond_when_message_is_none   s-    ,WIVr   c                     ddl m} t               }d|_        t               |_        d|j                  _        g |_        d|_        t               }||_         ||dd      }|du sJ y)	u=   message.from_user가 None이면 응답하지 않아야 한다r   r-   Nr3   r5   r6   r7   F)	r:   r.   r   r   r   r   r   r   r    )r>   r.   r    r$   r@   s        r   ,test_does_not_respond_when_from_user_is_nonezLTestGroupChatResponseConditions.test_does_not_respond_when_from_user_is_none   sa    ,+  {##'  WIVr   N)__name__
__module____qualname____doc__rA   rJ   rO   rT   rW   rY   r\   rb   rd   rf    r   r   r+   r+   E   s7    _.*"., "(r   r+   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestMessageSplittinguU   긴 메시지를 텔레그램 제한(4096자)에 맞게 분할하는 기능 테스트c                 |    ddl m} d} ||      }t        |t              sJ t	        |      dk(  sJ |d   |k(  sJ y)uU   4096자 이하 메시지는 분할하지 않고 리스트 1개로 반환해야 한다r   split_messageu  짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.짧은 메시지입니다.   Nr:   rp   
isinstancelistr<   )r>   rp   
short_textr@   s       r   test_short_message_not_splitz1TestMessageSplitting.test_short_message_not_split  sH    +6
z*&$'''6{aayJ&&&r   c                 X    ddl m} d} ||      }t        |      dk(  sJ |d   |k(  sJ y)u?   정확히 4096자인 메시지는 분할하지 않아야 한다r   ro      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarq   Nr:   rp   r<   )r>   rp   	text_4096r@   s       r   "test_exact_limit_message_not_splitz7TestMessageSplitting.test_exact_limit_message_not_split  s8    +	y)6{aayI%%%r   c                 n    ddl m} ddz  } ||      }t        |t              sJ t	        |      dk\  sJ y)uL   4096자를 초과하는 메시지는 여러 파트로 분할되어야 한다r   ro   ai(#     Nrr   r>   rp   	long_textr@   s       r   +test_long_message_split_into_multiple_partsz@TestMessageSplitting.test_long_message_split_into_multiple_parts   s:    +$J	y)&$'''6{ar   c                 X    ddl m} ddz  } ||      }|D ]  }t        |      dk  rJ  y)u@   분할된 각 파트는 4096자를 초과하지 않아야 한다r   ro   bi:     Nry   r>   rp   r   r@   parts        r   test_each_part_within_limitz0TestMessageSplitting.test_each_part_within_limit*  s9    +%K	y) 	%Dt9$$$	%r   c                 V    ddl m} ddz  } ||      }dj                  |      |k(  sJ y)uM   분할 후 모든 파트를 합치면 원본 메시지와 동일해야 한다r   ro   ci'   N)r:   rp   joinr   s       r    test_split_preserves_all_contentz5TestMessageSplitting.test_split_preserves_all_content4  s.    +%K	y)wwv)+++r   c                     ddl m} ddz  } ||      }t        |      dk\  sJ |D ]  }t        |      dk  rJ  dj                  |      |k(  sJ y)	u;   매우 긴 메시지도 올바르게 분할되어야 한다r   ro   xi   
   r   r   Nr:   rp   r<   r   )r>   rp   very_long_textr@   r   s        r   &test_very_long_message_split_correctlyz;TestMessageSplitting.test_very_long_message_split_correctly=  sa    +u~.6{b    	%Dt9$$$	%wwv.000r   c                 v    ddl m} d} ||      }t        |t              sJ |D ]  }t	        |      dk  rJ  y)uK   줄바꿈이 포함된 긴 메시지도 올바르게 분할되어야 한다r   ro   u  한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
한글 텍스트 한 줄입니다. 여기에 내용이 있습니다.
r   Nrr   r   s        r    test_split_message_with_newlinesz5TestMessageSplitting.test_split_message_with_newlinesI  sH    + c	y)&$''' 	%Dt9$$$	%r   c                 x    ddl m}  |d      }t        |t              sJ t	        |      dk(  sJ |d   dk(  sJ y)uT   빈 문자열은 빈 문자열 1개를 포함한 리스트로 반환되어야 한다r   ro   r   rq   Nrr   )r>   rp   r@   s      r   .test_empty_message_returns_single_empty_stringzCTestMessageSplitting.test_empty_message_returns_single_empty_stringU  sA    +r"&$'''6{aayBr   c                 v    ddl m} d} ||d      }t        |      dk(  sJ |D ]  }t        |      dk  rJ  y)uS   max_len 파라미터를 지정하면 해당 값 기준으로 분할되어야 한다r   ro   ,  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad   )max_len   Nry   )r>   rp   r   r@   r   s        r   test_custom_max_len_parameterz2TestMessageSplitting.test_custom_max_len_parameter_  sI    +tS16{a 	$Dt9###	$r   c                     ddl m} ddz  } ||      }t        |      dk\  sJ |D ]  }t        |      dk  rJ  dj                  |      |k(  sJ y)	uJ   단일 줄이 max_len을 초과할 경우 강제로 분할되어야 한다r   ro   zi@  r~   r   r   Nr   )r>   rp   single_long_liner@   r   s        r   /test_single_line_exceeding_limit_is_force_splitzDTestMessageSplitting.test_single_line_exceeding_limit_is_force_splitj  sf    + :/06{a 	%Dt9$$$	%wwv"2222r   N)rg   rh   ri   rj   rv   r{   r   r   r   r   r   r   r   r   rk   r   r   rm   rm     s7    _	'& %,
1
%	$3r   rm   c                       e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	y)TestSendResponseuS   send_response()가 메시지를 올바르게 분할하여 전송하는지 테스트c                    K   ddl m} t        d      }t        d|d      }t	        |      }t               }dd	z  } ||||       d
{    |j                  j                  dk\  sJ y
7  w)uK   긴 응답을 전송할 때 여러 번 reply_text가 호출되어야 한다r   send_responser/   r0      질문rL   rE   u   응답 i  Nr~   )r:   r   r   r   r%   r)   r   
call_count)r>   r   r   r    r$   contextlong_responses          r   /test_send_long_response_sends_multiple_messagesz@TestSendResponse.test_send_long_response_sends_multiple_messages  sq      	,#&XSg&/!D(FG];;; !!,,111 	<s   AA-
A+!A-c                   K   ddl m} t        d      }t        d|d      }t	        |      }t               }d} ||||       d	{    |j                  j                  d
k(  sJ |j                  j                  d       y	7 ;w)u@   짧은 응답은 reply_text가 한 번만 호출되어야 한다r   r   r/   r0   r   rL   rE   u   짧은 답변입니다.Nrq   )	r:   r   r   r   r%   r)   r   r   assert_called_once_with)r>   r   r   r    r$   r   short_responses          r   -test_send_short_response_sends_single_messagez>TestSendResponse.test_send_short_response_sends_single_message  s      	,#&XSg&/2FG^<<<!!,,111223LM 	=s   ABB<Bc                   K   ddl m} t        d      }t        d|d      }t	        |      }t               }dd	z  } ||||       d
{    |j                  j                  dk(  sJ |j                  j                  d   j                  d   }t        |      dk  sJ |j                  j                  d   j                  d   }t        |      dk\  sJ y
7 w)uY   send_response()는 분할된 각 청크를 순서대로 reply_text로 전송해야 한다r   r   r/   r0   r   rL   rE   r}   i  Nr~   r   rq   )r:   r   r   r   r%   r)   r   r   call_args_listargsr<   )	r>   r   r   r    r$   r   two_chunk_textfirst_call_textsecond_call_texts	            r   7test_send_response_calls_reply_text_with_correct_chunkszHTestSendResponse.test_send_response_calls_reply_text_with_correct_chunks  s      	,#&XSg&/ tFG^<<<!!,,111!,,;;A>CCAF?#t+++"--<<Q?DDQG#$))) 	=s   AC
CBCN)
rg   rh   ri   rj   pytestmarkasyncior   r   r   rk   r   r   r   r   }  s_    ][[2 2  [[N N  [[* *r   r   )Ftestuser)rC   r5   )r3   NN)r5   )ossyspathinsertr   dirname__file__unittest.mockr   r   r   r   pytest_asynciointboolstrr   r   r   r%   r)   r+   rm   r   rk   r   r   <module>r      s    	 
 277<< 94@ A 5 5   T S R[ # s   
  $) 	  ) { {Fm3 m3j:* :*r   