
    it&                         d Z ddlZddlZddlZddlmZ ej                  j                  dd       ddlm	Z	m
Z
mZmZmZ d Zd Zd Zd	 Zd
 Zedk(  rddlZ ej*                  eddg       yy)u   
pytest 테스트: select_single_topic() 함수 테스트

작업: task-353.1 - 단일 토픽 선택 + used_count 정확성 검증
    N)Pathz/home/jay/projects/ThreadAuto)load_topicssave_topicsselect_single_topicselect_from_pool	DAILY_MIXc            	         t        j                         5 } t        |       dz  }ddddddddd	dddd
dddddg}t        |dd      5 }t	        j
                  ||       ddd       ddlm} |j                  }||_        	 t               }t        |t              sJ d       |d   dv sJ d       t               }t        d |D        d      }t        d |D        d      }	t        d |D        d      }
|d   dk(  r?|d   dk(  sJ d|d           |	d   dk(  sJ d|	d           |
d   dk(  sJ d|
d           |d   dk(  r?|d   dk(  sJ d|d           |	d   dk(  sJ d|	d           |
d   dk(  sTJ d|
d           |d   d
k(  r?|d   dk(  sJ d|d           |	d   dk(  sJ d|	d           |
d   dk(  sJ d|
d           t        d       ||_        	 ddd       y# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   yxY w) uM   기본 테스트: 1개 토픽만 선택하고 used_count 갱신 여부 확인test_topics.json1   고민공감
   테스트1r   Nidcategorytitle
used_count	last_used2u
   테스트23   정보제공u
   테스트3wutf-8encodingu   반환값은 dict여야 함r   )r   r   r   u   유효한 ID여야 함c              3   2   K   | ]  }|d    dk(  s|  ywr   r   N .0ts     I/home/jay/workspace/.worktrees/task-2116-dev1/teams/dev8/test_task3531.py	<genexpr>z1test_select_single_topic_basic.<locals>.<genexpr>5        Fqw#~1F   c              3   2   K   | ]  }|d    dk(  s|  ywr   r   Nr   r   s     r!   r"   z1test_select_single_topic_basic.<locals>.<genexpr>6   r#   r$   c              3   2   K   | ]  }|d    dk(  s|  ywr   r   Nr   r   s     r!   r"   z1test_select_single_topic_basic.<locals>.<genexpr>7   r#   r$   r      u1   토픽1의 used_count는 1이어야 함, 현재: u1   토픽2의 used_count는 0이어야 함, 현재: u1   토픽3의 used_count는 0이어야 함, 현재: u1   토픽1의 used_count는 0이어야 함, 현재: u1   토픽2의 used_count는 1이어야 함, 현재: u1   토픽3의 used_count는 1이어야 함, 현재: uO   ✓ 기본 테스트 통과: 1개 토픽 선택 및 used_count 정확한 갱신)tempfileTemporaryDirectoryr   openjsondumpcontent.topic_selectortopic_selectorTOPICS_PATHr   
isinstancedictr   nextprinttmpdirtopics_pathtest_topicsftsoriginal_pathselectedloaded_topicstopic1topic2topic3s              r!   test_select_single_topic_basicrB      s   		$	$	& 1+&6l%77 N\YZimnN\YZimnN\YZimn
 +sW5 	&IIk1%	& 	,$	+*,H h-L/LL-D>_4N6NN4 (MMFmFMFFmFMFFmFMF ~$l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0$3&l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0$3&l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0l+q0|4eflmyfze{2||0cd +BNc1+ 1+	& 	&N +BNc1+ 1+s<   4G>	G% !G>EG2G>%G/	*G>2	G;;G>>Hc            	         t        j                         5 } t        |       dz  }ddddddddd	dddd
dddddg}t        |dd      5 }t	        j
                  ||       ddd       ddlm} |j                  }||_        	 t        d      }|d   dk(  sJ d|d           |d   dv sJ d|d           t               }t        d |D        d      }t        d |D        d      }	t        d |D        d      }
|d   dk(  r|d   dk(  sJ |	d   dk(  sJ |
d   dk(  s(J |d   dk(  r|d   dk(  sJ |	d   dk(  sJ |
d   dk(  sJ t        d       ||_        	 ddd       y# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   yxY w)uU   카테고리 지정 테스트: 지정된 카테고리에서만 선택되는지 확인r
   r   r      고민1r   Nr   r      고민2r   r      정보1r   r   r   r   r   3   카테고리는 고민공감이어야 함, 현재: r   )r   r   u$   ID는 1 또는 2여야 함, 현재: c              3   2   K   | ]  }|d    dk(  s|  ywr   r   r   s     r!   r"   z9test_select_single_topic_with_category.<locals>.<genexpr>l   r#   r$   c              3   2   K   | ]  }|d    dk(  s|  ywr&   r   r   s     r!   r"   z9test_select_single_topic_with_category.<locals>.<genexpr>m   r#   r$   c              3   2   K   | ]  }|d    dk(  s|  ywr(   r   r   s     r!   r"   z9test_select_single_topic_with_category.<locals>.<genexpr>n   r#   r$   r   r)   uS   ✓ 카테고리 지정 테스트 통과: 지정된 카테고리에서만 선택됨)r*   r+   r   r,   r-   r.   r/   r0   r1   r   r   r4   r5   r6   s              r!   &test_select_single_topic_with_categoryrL   M   s   		$	$	& -+&6l%77 NYVWfjkNYVWfjkNYVWfjk
 +sW5 	&IIk1%	& 	,$	+*NCH J'>9  H=pqy  {E  rF  qG  <H  H9 D>Z/h3WX`aeXfWg1hh/ (MMFmFMFFmFMFFmFMF~$l+q000l+q000l+q000$3&l+q000l+q000l+q000gh +BN[-+ -+	& 	&F +BN[-+ -+s<   4E;	E" !E;CE/E;"E,	'E;/	E88E;;Fc                  v   t        j                         5 } t        |       dz  }ddddddddd	dddd
dddddddddddddddddg}t        |dd      5 }t	        j
                  ||       ddd       ddlm} |j                  }||_        	 t               }t        d      D ]"  }t        d      }|j                  |d          $ t        |      dkD  sJ d       d|vst        |      dkD  sJ d       t        d|        ||_        	 ddd       y# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   yxY w)uH   category=None 테스트: DAILY_MIX 비율에 따라 가중 랜덤 선택r
   r   r   rD   r   Nr   r   rE   r   r   rF   4u   사회적증거u   증거15u   업계동향u   동향1r   r   r   
   rG   r   u4   최소 하나의 카테고리가 선택되어야 함u7   업계동향 카테고리가 선택되었을 수 있음u<   ✓ category=None 테스트 통과: 선택된 카테고리: )r*   r+   r   r,   r-   r.   r/   r0   r1   setranger   addlenr5   )	r7   r8   r9   r:   r;   r<   selected_categories_r=   s	            r!   $test_select_single_topic_no_categoryrW      s   		$	$	& !+&6l%77 NYVWfjkNYVWfjkNYVWfjk$5	YZimnNYVWfjk
 +sW5 	&IIk1%	& 	,$	+"%%2Y >.=#''(<=>
 *+a/g1gg/!)<<DW@X[\@\  X  _X  X\PQdPefg +BNC!+ !+	& 	&* +BNC!+ !+s=   AD/D.!D/A6D#D/D 	D/#	D,,D//D8c                     t        j                         5 } t        |       dz  }ddddddg}t        |dd	
      5 }t	        j
                  ||       ddd       ddlm} |j                  }||_        	 t               }t        |t              sJ dt        |              d|v sJ d       d|v sJ d       d|v sJ d       t        d       ||_        	 ddd       y# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   yxY w)u2   반환 타입 테스트: dict 형식 반환 여부r
   r   r   r   r   Nr   r   r   r   u%   반환값은 dict여야 함, 현재: r   u&   반환값에 'id' 키가 있어야 함r   u,   반환값에 'category' 키가 있어야 함r   u)   반환값에 'title' 키가 있어야 함u@   ✓ 반환 타입 테스트 통과: 올바른 dict 형식 반환)r*   r+   r   r,   r-   r.   r/   r0   r1   r   r2   r3   typer5   )r7   r8   r9   r:   r;   r<   r=   s          r!   $test_select_single_topic_return_typerZ      s&   		$	$	& +&6l%77 N\YZimn
 +sW5 	&IIk1%	& 	,$	+*,H h-g1VW[\dWeVf/gg-8#M%MM#)Y+YY)h&S(SS&TU +BN5+ +	& 	&& +BN5+ +s;   &C6C!C64AC*C6C'	#C6*	C33C66C?c                     t        j                         5 } t        |       dz  }t        |dd      5 }t	        j
                  g |       ddd       ddlm} |j                  }||_        	 t        d      }|d	   j                  d
      sJ d|d	           |d   dk(  sJ d|d           t        d       ||_        	 ddd       y# 1 sw Y   xY w# ||_        w xY w# 1 sw Y   yxY w)uJ   빈 풀 테스트: 토픽이 없을 때 fallback 플레이스홀더 반환r
   r   r   r   Nr   r   rG   r   zeg-fallback-u!   Fallback ID 형식이어야 함: r   rH   uG   ✓ 빈 풀 테스트 통과: fallback 플레이스홀더 정상 반환)r*   r+   r   r,   r-   r.   r/   r0   r1   r   
startswithr5   )r7   r8   r:   r;   r<   r=   s         r!   #test_select_single_topic_empty_poolr]      s   		$	$	& +&6l%77 +sW5 	IIb!	 	,$
	+*NCH D>,,^<r@abjkobpaq>rr<J'>9  H=pqy  {E  rF  qG  <H  H9[\ +BN++ +	 	" +BN++ +s;   C!C		!C!+AC8C!	C	C!	CC!!C*__main__z-vz-s)__doc__sysr-   r*   pathlibr   pathinsertr/   r   r   r   r   r   rB   rL   rW   rZ   r]   __name__pytestmain__file__r       r!   <module>ri      sx        2 3 3+l/+d#+L+>+4 zFKK4&' rh   