
    hi3u                     n   d dl Z d dlZej                  j                  d e j                  j	                  e j                  j                  e      d             d dlZd dlm	Z	 d dl
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y)    Nz..)patchc                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestParseDurationu!   parse_duration() 함수 테스트c                 *    ddl m}  |d      dk(  sJ y)u   '30분간' → 30r   parse_duration   30분간 토론해줘   Ndiscussion_managerr   selfr   s     L/home/jay/workspace/services/multimodel-bot/tests/test_discussion_manager.pytest_parse_minutes_koreanz+TestParseDuration.test_parse_minutes_korean   s    556"<<<    c                 *    ddl m}  |d      dk(  sJ y)u   '30분동안' → 30r   r   u   30분동안 얘기해줘r
   Nr   r   s     r   test_parse_minutes_korean_dongz0TestParseDuration.test_parse_minutes_korean_dong   s    589R???r   c                 *    ddl m}  |d      dk(  sJ y)u   '2시간동안' → 120r   r   u   2시간동안 토론해줘x   Nr   r   s     r   test_parse_hours_koreanz)TestParseDuration.test_parse_hours_korean   s    5:;sBBBr   c                 *    ddl m}  |d      dk(  sJ y)u   '2시간' → 120r   r   u   2시간 토론해줘r   Nr   r   s     r   test_parse_hours_korean_barez.TestParseDuration.test_parse_hours_korean_bare%   s    545<<<r   c                 *    ddl m}  |d      dk(  sJ y)u   '30min' → 30r   r   zdiscuss for 30minr
   Nr   r   s     r   test_parse_minutes_englishz,TestParseDuration.test_parse_minutes_english+   s    512b888r   c                 *    ddl m}  |d      dk(  sJ y)u   '2hour' → 120r   r   ztalk for 2hourr   Nr   r   s     r   test_parse_hours_englishz*TestParseDuration.test_parse_hours_english1   s    5./3666r   c                 *    ddl m}  |d      dk(  sJ y)u   '2hr' → 120r   r   zdiscuss for 2hrr   Nr   r   s     r   test_parse_hours_english_hrz-TestParseDuration.test_parse_hours_english_hr7   s    5/0C777r   c                 *    ddl m}  |d      dk(  sJ y)u   300분 → 180분으로 캡r   r   u   300분간 토론   Nr   r   s     r   test_max_duration_capz'TestParseDuration.test_max_duration_cap=   s    501S888r   c                 .    ddl m}  |d      }|dk(  sJ y)u   10시간 → 180분으로 캡r   r   u   10시간동안 토론r    Nr   )r   r   results      r   test_max_hours_capz$TestParseDuration.test_max_hours_capC   s    5 78}}r   c                 $    ddl m}  |d      J y)u   일반 텍스트 → Noner   r   u   안녕하세요 반갑습니다Nr   r   s     r   test_no_durationz"TestParseDuration.test_no_durationJ   s    5?@HHHr   c                 $    ddl m}  |d      J y)u   빈 문자열 → Noner   r    Nr   r   s     r   test_no_duration_emptyz(TestParseDuration.test_no_duration_emptyP   s    5b!)))r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r!   r$   r&   r)    r   r   r   r      s?    +=@C=9789I*r   r   c                   p    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zy)TestDiscussionManageru%   DiscussionManager 클래스 테스트c                     ddl m}  |       S Nr   DiscussionManagerr   r4   r   r4   s     r   _make_managerz#TestDiscussionManager._make_manager_       8 ""r   c                     | j                         }d}|j                  |      du sJ |j                  |d       |j                  |      du sJ y)u>   유저 메시지를 받으면 토론 모드가 활성화된다d   F   토론 시작해줘TN)r7   is_discussion_activeon_user_messager   mgrchat_ids      r   &test_user_message_activates_discussionz<TestDiscussionManager.test_user_message_activates_discussiond   sX      "''0E999G%:;''0D888r   c                     ddl m}  |       }d}|j                  |d       |j                  |   }|j                  dk(  sJ y)u>   시간 키워드가 있으면 duration_minutes가 설정된다r   r3   e   r	   r
   Nr   r4   r=   _statesduration_minutesr   r4   r?   r@   states        r   -test_user_message_with_duration_sets_durationzCTestDiscussionManager.test_user_message_with_duration_sets_durationm   sE    8!G%<=G$%%+++r   c                     ddl m}  |       }d}|j                  |d       |j                  |   }|j                  J y)uG   시간 키워드 없으면 duration_minutes가 None이다 (idle 모드)r   r3   f   r;   NrD   rG   s        r   ,test_user_message_without_duration_sets_nonezBTestDiscussionManager.test_user_message_without_duration_sets_nonex   sC    8!G%:;G$%%---r   c                    ddl m}  |       }d}|j                  |d       |j                  d   }||j                  |   _        |j                  |      }||j                  d   k(  sJ |j                  |j                  d         }||j                  d   k(  sJ |j                  |j                  d         }||j                  d   k(  sJ y)uG   봇 응답 후 라운드 로빈 순서대로 다음 턴이 설정된다r   r3   g      토론해줘      N)r   r4   r=   BOT_USERNAMESrE   current_turnon_bot_response)r   r4   r?   r@   	first_botnext_bot	next_bot2	next_bot3s           r   test_round_robin_turn_orderz1TestDiscussionManager.test_round_robin_turn_order   s    8!G^4 &33A6	,5G)&&y1,::1====''(9(G(G(JK	-;;A>>>> ''(9(G(G(JK	-;;A>>>>r   c                    ddl m}  |       }d}|j                  |d       t        j                         |j                  dz   z
  |j
                  |   _        |j                         }|J |j                  |      du sJ y)uA   IDLE_TIMEOUT 초과 후 advance_turn() 시 토론이 종료된다r   r3   h   rO   <   NF)	r   r4   r=   timeIDLE_TIMEOUTrE   last_user_message_timeadvance_turnr<   r   r4   r?   r@   r#   s        r   "test_idle_timeout_stops_discussionz8TestDiscussionManager.test_idle_timeout_stops_discussion   s{    8!G^46:iikSEUEUXZEZ6[G3!!#~~''0E999r   c                     ddl m}  |       }d}|j                  |d       t        j                         dz
  |j                  |   _        |j                         du sJ y)u9   시간 한정 모드에서는 idle 체크를 무시한다r   r3   i   r	   ih  FN)r   r4   r=   r]   rE   r_   check_should_stopr   r4   r?   r@   s       r   test_timed_mode_ignores_idlez2TestDiscussionManager.test_timed_mode_ignores_idle   sX    8!G%<=6:iikC6GG3 $$&%///r   c                     ddl m}  |       }d}|j                  |d       t        j                         dz
  |j                  |   _        |j                         du sJ y)uC   시간 한정 모드에서 duration_minutes 초과 시 종료된다r   r3   j   u   1분간 토론해줘r   TN)r   r4   r=   r]   rE   
start_timere   rf   s       r   $test_timed_mode_stops_after_durationz:TestDiscussionManager.test_timed_mode_stops_after_duration   sV    8!G%;<*.))+*;G'$$&$...r   c                 d   ddl m}  |       }d}|j                  |d       t        j                         dz
  |j                  |   _        t        j                         }|j                  |d       t        j                         }|j                  |   j
                  }||cxk  r	|dz   k  sJ  J y)	u9   유저 메시지가 오면 idle 타이머가 리셋된다r   r3   k   rO     u   계속 얘기해줘g{Gz?N)r   r4   r=   r]   rE   r_   )r   r4   r?   r@   beforeafternew_times          r   #test_user_message_resets_idle_timerz9TestDiscussionManager.test_user_message_resets_idle_timer   s    8!G^46:iikC6GG3 G%:;		;;w'>>1UT\11111r   c                     ddl m}  |       }d}|j                  |d       |j                  |      du sJ |j	                          |j                  |      du sJ y)u6   stop_discussion() 호출 시 상태가 초기화된다r   r3   l   rO   TFN)r   r4   r=   r<   stop_discussionrf   s       r   !test_stop_discussion_resets_statez7TestDiscussionManager.test_stop_discussion_resets_state   s`    8!G^4''0D888''0E999r   c                     ddl m}  |       }d}|j                  |d       |j                  d   }||j                  |   _        |j                  |dd|      }|du sJ y)	uC   토론 모드에서 현재 턴이 자신이면 True를 반환한다r   r3   m   rO   someuserTbot_usernamesender_usernamesender_is_botr@   Nr   r4   r=   rR   rE   rS   should_bot_respond)r   r4   r?   r@   my_botr#   s         r   1test_should_bot_respond_during_discussion_my_turnzGTestDiscussionManager.test_should_bot_respond_during_discussion_my_turn   sr    8!G^4"003,2G)''&	 ( 
 ~~r   c                     ddl m}  |       }d}|j                  |d       |j                  d   |j                  |   _        |j                  |j                  d   dd|      }|d	u sJ y
)uK   토론 모드에서 현재 턴이 자신이 아니면 False를 반환한다r   r3   n   rO   rP   ry   Trz   FNr~   ra   s        r   #test_should_bot_respond_not_my_turnz9TestDiscussionManager.test_should_bot_respond_not_my_turn   sx    8!G^4,=,K,KA,NG)''*88;&	 ( 
 r   c                     ddl m}  |       }d}|j                  |j                  d   |j                  d   d|      }|du sJ y)	uE   토론 모드가 아닐 때 봇 메시지에는 False를 반환한다r   r3   o   rP   Trz   FN)r   r4   r   rR   ra   s        r   8test_should_bot_respond_non_discussion_bot_message_falsezNTestDiscussionManager.test_should_bot_respond_non_discussion_bot_message_false	  sY    8! ''*88;-;;A>	 ( 
 r   c                     ddl m}  |       }d}|j                  |d       |j                  d   }||j                  |   _        |j                         }||j                  d   k(  sJ y)uH   get_next_bot()은 마지막 봇 다음에 첫 번째 봇을 반환한다r   r3   p   rO   N)r   r4   r=   rR   rE   rS   get_next_bot)r   r4   r?   r@   last_botrV   s         r   test_get_next_bot_wraps_aroundz4TestDiscussionManager.test_get_next_bot_wraps_around  sk    8!G^4$2226,4G)##%,::1====r   c                     ddl m}  |       }d}d}|j                  |d       |j                  |      du sJ |j                  |      du sJ y)	u9   서로 다른 chat_id는 독립적인 상태를 가진다r   r3         rO   TFN)r   r4   r=   r<   )r   r4   r?   	chat_id_a	chat_id_bs        r   %test_multiple_chats_independent_statez;TestDiscussionManager.test_multiple_chats_independent_state'  sY    8!		I~6''	2d:::''	2e;;;r   c                    ddl m}  |       }d}|j                  |d       t        j                         |j                  |   _        |j                  d   |j                  |   _        |j                         }||j                  v sJ y)uG   토론 진행 중 advance_turn()은 다음 봇 username을 반환한다r   r3   q   rO   N)	r   r4   r=   r]   rE   r_   rR   rS   r`   ra   s        r   .test_advance_turn_returns_next_bot_when_activezDTestDiscussionManager.test_advance_turn_returns_next_bot_when_active3  sx    8!G^46:iikG3,=,K,KA,NG)!!#*88888r   N)r*   r+   r,   r-   r7   rA   rI   rL   rY   rb   rg   rk   rr   rv   r   r   r   r   r   r   r.   r   r   r0   r0   \   sU    /#
9	,	.?.:0/2&:&$ >
<9r   r0   c                   P    e Zd ZdZddededefdZddedefd	Zd
 Z	d Z
d Zd Zy)TestShouldRespondBotMessagesuV   bot_utils.should_respond()의 봇 메시지 처리 테스트 (수정된 동작 반영)user_idis_botusernamec                 J    ddl m}  |       }||_        ||_        ||_        |S Nr   	MagicMock)unittest.mockr   idr   r   )r   r   r   r   r   users         r   
_make_userz'TestShouldRespondBotMessages._make_userK  s&    +{ r   Ntext	chat_typec                     ddl m}m}  |       }||_        ||_         |       |_        ||j
                  _        d |_        |xs g |_         |       |_	        |S )Nr   )	AsyncMockr   )
r   r   r   r   	from_userchattypereply_to_messageentities
reply_text)r   r   r   r   r   r   r   msgs           r   _make_messagez*TestShouldRespondBotMessages._make_messageT  sO    6k!;!#~2"
r   c                 ^    ddl m}  |       }||_        ||_        |j                  |_        |S r   )r   r   messageeffective_messager   effective_user)r   r   r   updates       r   _make_updatez)TestShouldRespondBotMessages._make_updatea  s.    + #*  ' 1 1r   c                    ddl m} | j                  ddd      }t        ddg	      j	                         }d
|_        d|_        t        d      |_        | j                  d|d|g      }| j                  |      } ||dd      }|du sJ y)uS   자기 자신(같은 username)이 보낸 봇 메시지에는 응답하지 않는다r   should_respond  Tmybotr   r   r   zunittest.mockr   )fromlistmention@mybot   @mybot 안녕groupr   r   r   r   [r{   owner_user_idFN)	bot_utilsr   r   
__import__r   r   offsetlenlengthr   r   )r   r   self_botentityr   r   r#   s          r   #test_self_bot_message_returns_falsez@TestShouldRespondBotMessages.test_self_bot_message_returns_falsej  s    , ??3tg?NO{mDNNPH$$ X	 % 
 ""7+WIVr   c                     ddl m} ddlm} | j	                  ddd      } |       }d|_        d|_        t        d	      |_        | j                  d
|d|g      }| j                  |      } ||dd      }|du sJ y)uO   다른 봇이 @멘션한 메시지에는 응답해야 한다 (수정된 동작)r   r   r   x  Totherbotr   r   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   	other_botr   r   r   r#   s           r   0test_other_bot_message_with_mention_returns_truezMTestShouldRespondBotMessages.test_other_bot_message_with_mention_returns_true  s    +,OOCzOR	H$$ X	 % 
 ""7+WIV~~r   c                     ddl m} ddlm} | j	                  ddd      } |       }d|_        d|_        t        d	      |_        | j                  d
|d|g      }d|j                  _        | j                  |      } ||dd      }|du sJ y)uH   다른 봇이지만 sender.username이 None이면 응답하지 않는다r   r   r   r   TNr   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   s           r   *test_other_bot_username_none_returns_falsezGTestShouldRespondBotMessages.test_other_bot_username_none_returns_false  s    +,OOCtOL	H$$ X	 % 
 &*"""7+WIV ~~r   )Ftestuser)r   N)r*   r+   r,   r-   intboolstrr   r   r   r   r   r   r.   r   r   r   r   H  sF    `# t s # S ,0r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestDetectCodeAnalysisu'   detect_code_analysis() 함수 테스트c                 (    ddl m}  |d      du sJ y)uE   '코드 구조를 분석해줘' → True (코드, 분석 2개 매칭)r   detect_code_analysis   코드 구조를 분석해줘TNr   r   r   r   s     r   +test_detect_code_analysis_with_two_keywordszBTestDetectCodeAnalysis.test_detect_code_analysis_with_two_keywords  s    ;#$CDLLLr   c                 (    ddl m}  |d      du sJ y)u-   .py 파일 읽어줘 → True (경로 패턴)r   r   u   .py 파일 읽어줘TNr   r   s     r   #test_detect_code_analysis_with_pathz:TestDetectCodeAnalysis.test_detect_code_analysis_with_path  s    ;#$:;tCCCr   c                 (    ddl m}  |d      du sJ y)u9   /home/jay/workspace 코드 → True (프로젝트 경로)r   r   u   /home/jay/workspace 코드TNr   r   s     r   +test_detect_code_analysis_with_project_pathzBTestDetectCodeAnalysis.test_detect_code_analysis_with_project_path  s    ;#$@ATIIIr   c                 (    ddl m}  |d      du sJ y)u!   '오늘 날씨 어때?' → Falser   r      오늘 날씨 어때?FNr   r   s     r   (test_detect_code_analysis_normal_messagez?TestDetectCodeAnalysis.test_detect_code_analysis_normal_message  s    ;#$;<EEEr   c                 (    ddl m}  |d      du sJ y)u*   '코드 좋아' → False (1개만 매칭)r   r   u   코드 좋아FNr   r   s     r   (test_detect_code_analysis_single_keywordz?TestDetectCodeAnalysis.test_detect_code_analysis_single_keyword  s    ;#O4===r   c                 (    ddl m}  |d      du sJ y)u.   'analyze the function implementation' → Truer   r   z#analyze the function implementationTNr   r   s     r   !test_detect_code_analysis_englishz8TestDetectCodeAnalysis.test_detect_code_analysis_english  s    ;#$IJdRRRr   N)
r*   r+   r,   r-   r   r   r   r   r   r   r.   r   r   r   r     s(    1MDJF>Sr   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
!TestDiscussionManagerCodeAnalysisu0   DiscussionManager 코드 분석 모드 테스트c                     ddl m}  |       S r2   r5   r6   s     r   r7   z/TestDiscussionManagerCodeAnalysis._make_manager  r8   r   c                     | j                         }d}|j                  |d       |j                  |   }|j                  dk(  sJ y)uJ   코드 분석 메시지 시 current_turn이 'claude_view_bot'이어야 함i,  r   claude_view_botN)r7   r=   rE   rS   r   r?   r@   rH   s       r   )test_code_analysis_mode_sets_claude_firstzKTestDiscussionManagerCodeAnalysis.test_code_analysis_mode_sets_claude_first  sI      "G%DEG$!!%6666r   c                     | j                         }d}|j                  |d       |j                  |   }|j                  du sJ y)u<   코드 분석 메시지 시 state.code_analysis_mode == Truei-  r   TNr7   r=   rE   code_analysis_moder   s       r    test_code_analysis_mode_flag_setzBTestDiscussionManagerCodeAnalysis.test_code_analysis_mode_flag_set  sH      "G%DEG$''4///r   c                     | j                         }d}|j                  |d       |j                  |   }|j                  du sJ y)u6   일반 메시지 시 state.code_analysis_mode == Falsei.  r   FNr   r   s       r   )test_normal_message_no_code_analysis_modezKTestDiscussionManagerCodeAnalysis.test_normal_message_no_code_analysis_mode  sH      "G%<=G$''5000r   c                 v    | j                         }d}|j                  |d       |j                  |      du sJ y)u/   is_code_analysis_mode() 메서드 동작 확인i/  r   TN)r7   r=   is_code_analysis_moder>   s      r   'test_is_code_analysis_mode_returns_truezITestDiscussionManagerCodeAnalysis.test_is_code_analysis_mode_returns_true
  s?      "G%DE((1T999r   c                 N    | j                         }|j                  d      du sJ y)u$   존재하지 않는 chat_id면 False韆 FN)r7   r   r   r?   s     r   5test_is_code_analysis_mode_returns_false_unknown_chatzWTestDiscussionManagerCodeAnalysis.test_is_code_analysis_mode_returns_false_unknown_chat  s)      "((/5888r   c                     | j                         }d}d}|j                  }|j                  |d       |j                  |dz   k(  sJ |j                          |j                  |d       |j                  |dz   k(  sJ y)u4   _start_index가 코드 분석과 무관하게 증가i0  i1  r   rP   r   rQ   N)r7   _start_indexr=   ru   )r   r?   r   r   initial_indexs        r   3test_code_analysis_mode_does_not_change_start_indexzUTestDiscussionManagerCodeAnalysis.test_code_analysis_mode_does_not_change_start_index  s      "		((I'FG=1#4444I'>?=1#4444r   N)r*   r+   r,   r-   r7   r   r   r   r   r   r  r.   r   r   r   r     s(    :#
701:95r   r   c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestDiscussionPhaseu/   DiscussionPhase + get_current_phase() 테스트c                     ddl m}  |       S r2   r5   r6   s     r   r7   z!TestDiscussionPhase._make_manager/  r8   r   c                 v    ddl m} |j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ y )Nr   DiscussionPhasedivergeconverge	consensus)r   r
  DIVERGECONVERGE	CONSENSUS)r   r
  s     r   test_phase_enum_valuesz*TestDiscussionPhase.test_phase_enum_values4  sA    6&&)333'':555((K777r   c                     | j                         }d}|j                  |d       ddlm} |j	                  |      |j
                  k(  sJ y)u   idle 모드 시작 시 DIVERGErn   rO   r   r	  N)r7   r=   r   r
  get_current_phaser  r   r?   r@   r
  s       r   'test_initial_phase_is_diverge_idle_modez;TestDiscussionPhase.test_initial_phase_is_diverge_idle_mode;  sG      "G^46$$W-1H1HHHHr   c                     | j                         }d}|j                  |d       d|j                  |   _        ddlm} |j                  |      |j                  k(  sJ y)u&   idle 모드: 4라운드에서 CONVERGEi  rO      r   r	  N)r7   r=   rE   round_countr   r
  r  r  r  s       r   "test_idle_mode_converge_at_round_4z6TestDiscussionPhase.test_idle_mode_converge_at_round_4D  sX      "G^4+,G(6$$W-1I1IIIIr   c                     | j                         }d}|j                  |d       d|j                  |   _        ddlm} |j                  |      |j                  k(  sJ y)u'   idle 모드: 7라운드에서 CONSENSUSi  rO      r   r	  N)r7   r=   rE   r  r   r
  r  r  r  s       r   #test_idle_mode_consensus_at_round_7z7TestDiscussionPhase.test_idle_mode_consensus_at_round_7N  sX      "G^4+,G(6$$W-1J1JJJJr   c                     ddl }| j                         }d}|j                  |d       ddlm} |j                  |      |j                  k(  sJ y)u'   시간 모드: 초기(0~60%)에 DIVERGEr   Ni     10분간 토론해줘r	  )r]   r7   r=   r   r
  r  r  r   r]   r?   r@   r
  s        r   test_timed_mode_diverge_earlyz1TestDiscussionPhase.test_timed_mode_diverge_earlyX  sK      "G%<=6$$W-1H1HHHHr   c                     ddl }| j                         }d}|j                  |d        |j                          dz
  |j                  |   _        ddlm} |j                  |      |j                  k(  sJ y)u!   시간 모드: 70%에서 CONVERGEr   Ni  r  i  r	  )	r]   r7   r=   rE   rj   r   r
  r  r  r  s        r   &test_timed_mode_converge_at_70_percentz:TestDiscussionPhase.test_timed_mode_converge_at_70_percentd  si      "G%<=*3$))+*;G'6$$W-1I1IIIIr   c                     ddl }| j                         }d}|j                  |d        |j                          dz
  |j                  |   _        ddlm} |j                  |      |j                  k(  sJ y)u"   시간 모드: 95%에서 CONSENSUSr   Ni  r  i:  r	  )	r]   r7   r=   rE   rj   r   r
  r  r  r  s        r   'test_timed_mode_consensus_at_95_percentz;TestDiscussionPhase.test_timed_mode_consensus_at_95_percentq  si      "G%<=*3$))+*;G'6$$W-1J1JJJJr   c                    | j                         }d}|j                  |d       |j                  |   j                  }|j	                  |      }|j                  |   j
                  dk(  sJ |j	                  |      }|j                  |   j
                  dk(  sJ |j	                  |       |j                  |   j
                  dk(  sJ |j                  |   j                  dk(  sJ y)u'   3봇 응답 후 round_count가 1 증가i  rO   r   rP   N)r7   r=   rE   rS   rT   r  bot_response_count)r   r?   r@   rU   bot2bot3s         r   1test_round_count_increments_after_3_bot_responseszETestDiscussionPhase.test_round_count_increments_after_3_bot_responses~  s      "G^4KK(55	 ""9-{{7#//1444""4({{7#//1444D!{{7#//1444{{7#66!;;;r   c                 4   | j                         }d}|j                  |d       d|j                  |   _        d|j                  |   _        |j                          |j                  |   j                  dk(  sJ |j                  |   j                  dk(  sJ y)u-   stop_discussion()은 round_count도 초기화i  rO      rQ   r   N)r7   r=   rE   r  r&  ru   r>   s      r   'test_stop_discussion_resets_round_countz;TestDiscussionPhase.test_stop_discussion_resets_round_count  s      "G^4+,G(23G/{{7#//1444{{7#66!;;;r   c                 p    | j                         }ddlm} |j                  d      |j                  k(  sJ y)u0   비활성 chat에서도 기본값 DIVERGE 반환r   r	  r   N)r7   r   r
  r  r  )r   r?   r
  s      r   "test_inactive_chat_returns_divergez6TestDiscussionPhase.test_inactive_chat_returns_diverge  s2      "6$$S)_-D-DDDDr   N)r*   r+   r,   r-   r7   r  r  r  r  r   r"  r$  r)  r,  r.  r.   r   r   r  r  ,  sC    9#
8IJK
IJK<$	<Er   r  c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestDiscussionManagerChainGuardu0   DiscussionManager 체인 중복 방지 테스트c                     ddl m}  |       S r2   r5   r6   s     r   r7   z-TestDiscussionManagerChainGuard._make_manager  r8   r   c                 N    | j                         }|j                  d      du sJ y)u   기본값은 Falser:   FN)r7   is_chain_runningr   s     r    test_chain_running_default_falsez@TestDiscussionManagerChainGuard.test_chain_running_default_false  s)      "##C(E111r   c                 r    | j                         }|j                  dd       |j                  d      du sJ y)u1   set_chain_running(True) 후 is_chain_running Truer:   TNr7   set_chain_runningr3  r   s     r   test_set_chain_running_truez;TestDiscussionManagerChainGuard.test_set_chain_running_true  s9      "c4(##C(D000r   c                     | j                         }|j                  dd       |j                  dd       |j                  d      du sJ y)u3   set_chain_running(False) 후 is_chain_running Falser:   TFNr6  r   s     r   test_set_chain_running_falsez<TestDiscussionManagerChainGuard.test_set_chain_running_false  sI      "c4(c5)##C(E111r   c                     | j                         }d}|j                  |d       |j                  |d       |j                          |j	                  |      du sJ y)u0   stop_discussion() 시 chain_running도 초기화i  rO   TFN)r7   r=   r7  ru   r3  r>   s      r   )test_stop_discussion_resets_chain_runningzITestDiscussionManagerChainGuard.test_stop_discussion_resets_chain_running  sZ      "G^4gt,##G,555r   c                 T    | j                         }|j                  dd      }|du sJ y)u4   새 토론 시작 시 on_user_message는 True 반환r:   rO   TNr7   r=   r   r?   r#   s      r   4test_on_user_message_returns_true_for_new_discussionzTTestDiscussionManagerChainGuard.test_on_user_message_returns_true_for_new_discussion  s.      "$$S.9~~r   c                 x    | j                         }|j                  dd       |j                  dd      }|du sJ y)u:   이미 활성 토론 중 유저 메시지 시 False 반환r:   rO   u   계속해줘FNr>  r?  s      r   8test_on_user_message_returns_false_for_active_discussionzXTestDiscussionManagerChainGuard.test_on_user_message_returns_false_for_active_discussion  s>      "C0$$S.9r   N)r*   r+   r,   r-   r7   r4  r8  r:  r<  r@  rB  r.   r   r   r0  r0    s(    :#
2
126r   r0  c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)TestDeepModeu%   --deep 모드 + codex_model 테스트c                     ddl m}  |       S r2   r5   r6   s     r   r7   zTestDeepMode._make_manager  r8   r   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ y)u(   기본 codex_model은 gpt-5.1-codex-miniiX  rO   gpt-5.1-codex-miniNr7   r=   rE   codex_modelr>   s      r    test_default_codex_model_is_miniz-TestDeepMode.test_default_codex_model_is_mini  sC      "G^4{{7#//3GGGGr   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ y)u8   --deep 포함 시 codex_model이 gpt-5.2-codex로 설정iY  u!   --deep 이 주제를 토론해줘gpt-5.2-codexNrH  r>   s      r   test_deep_flag_sets_codex_modelz,TestDeepMode.test_deep_flag_sets_codex_model  sC      "G%HI{{7#//?BBBr   c                     | j                         }d}|j                  |d       |j                  |   j                  J y)uS   --deep 플래그가 제거된 후 duration 파싱 및 코드분석 감지에 사용iZ  u   --deep 일반 토론N)r7   r=   rE   rF   r>   s      r   $test_deep_flag_stripped_from_messagez1TestDeepMode.test_deep_flag_stripped_from_message  sA      "G%;<{{7#44<<<r   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ |j                  |   j                  dk(  sJ y)u(   --deep과 시간 키워드 동시 사용i[  u   --deep 30분간 토론해줘rL  r
   N)r7   r=   rE   rI  rF   r>   s      r   test_deep_flag_with_durationz)TestDeepMode.test_deep_flag_with_duration  s`      "G%CD{{7#//?BBB{{7#44:::r   c                 x    | j                         }d}|j                  |d       |j                  |      dk(  sJ y)u,   get_codex_model()이 올바른 모델 반환i\     --deep 토론rL  Nr7   r=   get_codex_modelr>   s      r   "test_get_codex_model_returns_modelz/TestDeepMode.test_get_codex_model_returns_model  s>      "G_5""7+>>>r   c                 x    | j                         }d}|j                  |d       |j                  |      dk(  sJ y)u%   get_codex_model()이 기본값 반환i]  u   일반 토론rG  NrT  r>   s      r   test_get_codex_model_defaultz)TestDeepMode.test_get_codex_model_default  s?      "G_5""7+/CCCCr   c                 P    | j                         }|j                  d      dk(  sJ y)u6   존재하지 않는 chat_id에 대해 기본값 반환r   rG  N)r7   rU  r   s     r   !test_get_codex_model_unknown_chatz.TestDeepMode.test_get_codex_model_unknown_chat  s*      """5)-AAAAr   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ |j	                          |j                  |   j                  dk(  sJ y)u+   stop_discussion() 시 codex_model 초기화i^  rS  rL  rG  N)r7   r=   rE   rI  ru   r>   s      r   'test_stop_discussion_resets_codex_modelz4TestDeepMode.test_stop_discussion_resets_codex_model  sl      "G_5{{7#//?BBB{{7#//3GGGGr   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ y)u   --deep만 있는 경우i_  z--deeprL  NrH  r>   s      r   !test_deep_flag_without_extra_textz.TestDeepMode.test_deep_flag_without_extra_text   sB      "GX.{{7#//?BBBr   c                     | j                         }d}|j                  |d       |j                  |   j                  dk(  sJ y)u%   --deep 없으면 기본 모델 유지i`  u   보험에 대해 토론해줘rG  NrH  r>   s      r   test_no_deep_flag_keeps_defaultz,TestDeepMode.test_no_deep_flag_keeps_default'  sD      "G%DE{{7#//3GGGGr   c                     | j                         }d}|j                  |d       |j                  |      du sJ |j                  |      du sJ y)u1   should_announce_deep_mode() 한번만 True 반환ia  rS  TFN)r7   r=   should_announce_deep_moder>   s      r   test_deep_mode_announced_flagz*TestDeepMode.test_deep_mode_announced_flag.  sW      "G_5,,W5===,,W5>>>r   N)r*   r+   r,   r-   r7   rJ  rM  rO  rQ  rV  rX  rZ  r\  r^  r`  rc  r.   r   r   rD  rD    sH    /#
HC=;?DB
HCH?r   rD  )ossyspathinsertjoindirname__file__r]   r   r   pytestr   r0   r   r   r   r  r0  rD  r.   r   r   <module>rl     s    	 
 277<< 94@ A   D* D*Xd9 d9Xj jd%S %SZ=5 =5JtE tEx. .lV? V?r   