
    %<im                     :   d Z ddlZddlmZmZmZ ddlZddedee	   fdZ
dee   defdZ	 	 	 	 	 dd	ed
e	dedededefdZ	 	 	 	 	 	 dd	ed
e	de	dedededefdZ ej                   d      d        Z G d d      Z G d d      Z G d d      Z G d d      Zy)u   
Tests for search.py

TDD: 테스트 먼저 작성, 구현은 이후
모든 외부 의존성(embedding_service, supabase)은 mock으로 처리.
    N)	MagicMockcallpatchdimreturnc                     dg| z  S )u#   dim 차원의 더미 벡터 반환.g? )r   s    G/home/jay/workspace/.worktrees/task-2057-dev2/libs/tests/test_search.py_make_vectorr      s    53;    rowsc                 (    t               }| |_        |S )u;   Supabase RPC 반환값을 흉내 내는 mock 객체 생성.)r   data)r   responses     r
   _make_rpc_responser      s    {HHMOr   content
similaritysourcetitledocument_idc                     | ||||dS )u*   semantic/keyword_search 결과 행 생성.r   r   r   r   r   r	   r   s        r
   _make_semantic_rowr      s      " r   combined_scorec                     | |||||dS )u    hybrid_search 결과 행 생성.r   r   r   r   r   r   r	   r   s         r
   _make_hybrid_rowr   /   s       (" r   T)autousec                 p    | j                  dd       | j                  dd       | j                  dd       y)u8   모든 테스트에서 필요한 환경변수를 설정.OPENAI_API_KEYztest-openai-keyINSURO_SUPABASE_URLzhttps://test.supabase.co INSURO_SUPABASE_SERVICE_ROLE_KEYztest-service-role-keyN)setenv)monkeypatchs    r
   set_env_varsr%   G   s:     '):;,.HI9;RSr   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestSemanticSearchu   semantic_search() 테스트.c                 r   ddl m} t               }t        t	               g      }t        |      }t        d|      5 }t        d      5 }t               }||_        ||j                  j                  _	         |d       ddd       ddd       j                  d       y# 1 sw Y   #xY w# 1 sw Y   'xY w)uQ   semantic_search() 호출 시 get_embedding()이 쿼리 텍스트로 호출된다.r   semantic_searchreturn_valuesearch.get_embeddingsearch._get_supabase_client   보험 약관 검색N)searchr*   r   r   r   r   r   r,   rpcexecuteassert_called_once_with)selfr*   mock_vectormock_rpc_responsemock_execute
mock_embedmock_client_factorymock_clients           r
   test_calls_get_embeddingz+TestSemanticSearch.test_calls_get_embeddingW   s    *"n.0B0D/EF .?@ ({C		4GQ/0		44G $+K/:,3?KOO((023		4 		4 	**+AB		4 		4 		4 		4#   B-
5B!?B-!B*	&B--B6c                    ddl m} t               }t        t	               g      }t        |      }t        d|      5  t        d      5 }t               }||_        ||j                  j                  _	         |d       ddd       ddd       j                  j                  sJ y# 1 sw Y   *xY w# 1 sw Y   .xY w)u:   semantic_search() 호출 시 Supabase RPC가 호출된다.r   r)   r+   r-   r.   r/   N)r0   r*   r   r   r   r   r   r,   r1   r2   called)r4   r*   r5   r6   r7   r9   r:   s          r
   test_calls_supabase_rpcz*TestSemanticSearch.test_calls_supabase_rpcl   s    *"n.0B0D/EF .?@ ({C		4/0		44G $+K/:,3?KOO((023		4 		4 %%%%		4 		4 		4 		4s#   B4
5B(?B4(B1	-B44B=c                    ddl m} t               }t        ddddd      }t	        |g      }t        |	      }t        d
|	      5  t        d      5 }t               }||_        ||j                  j                  _	         |d      }ddd       ddd       t        t              sJ t        |      dk(  sJ |d   }	t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ |	d   dk(  sJ |	d   dk(  sJ |	d   dk(  sJ |	d   dk(  sJ |	d   dk(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w)u:   semantic_search() 결과가 올바른 형식을 가진다.r   r)   u   보험 내용gq=
ףp?insurou   약관 제목zdoc-abcr   r+   r-   r.   u   보험N   r   r   r   r   r   )r0   r*   r   r   r   r   r   r,   r1   r2   
isinstancelistlenstrfloat)
r4   r*   r5   rowr6   r7   r9   r:   resultsitems
             r
   test_returns_correct_formatz.TestSemanticSearch.test_returns_correct_format   s   *"n #!!
 /u5 .?@ ({C		0/0		04G $+K/:,3?KOO((0%h/G		0 		0 '4(((7|q   qz$y/3///$|,e444$x.#...$w----$}-s333I/111L!T)))H~)))G}///M"i////		0 		0 		0 		0s$   E&5EE&E#	E&&E/c                 L   ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |d      }ddd       ddd       g k(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w)3   결과가 없을 때 빈 리스트를 반환한다.r   r)   r+   r-   r.   u   존재하지 않는 내용N)	r0   r*   r   r   r   r   r,   r1   r2   )r4   r*   r5   r6   r7   r9   r:   rI   s           r
   $test_empty_result_returns_empty_listz7TestSemanticSearch.test_empty_result_returns_empty_list   s    *"n.r2 .?@ ({C		D/0		D4G $+K/:,3?KOO((0%&BCG		D 		D "}}		D 		D 		D 		D#   B5B6BB	BB#c                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |dd       d	d	d	       d	d	d	       j                  j                  }|d   r|d   d
   n|d
   }|j                  d      dk(  s|j                  d      dk(  sJ y	y	# 1 sw Y   exY w# 1 sw Y   ixY w)1   limit 파라미터가 RPC 호출에 전달된다.r   r)   r+   r-   r.   	   테스트   limitNrB   match_countrU   r0   r*   r   r   r   r   r,   r1   r2   	call_argsget	r4   r*   r5   r6   r7   r9   r:   rpc_call_argsparamss	            r
   test_limit_parameter_passedz.TestSemanticSearch.test_limit_parameter_passed   s    *"n.r2 .?@ ({C		2/0		24G $+K/:,3?KOO((0Kq1		2 		2 $11(5a(8q!!$mA>Nzz-(A-G1D1III1I-		2 		2 		2 		2s#   C(7C8C(C%	!C((C1c                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |dd       d	d	d	       d	d	d	       j                  j                  }|d   r|d   d
   n|d
   }|j                  d      dk(  sJ y	# 1 sw Y   PxY w# 1 sw Y   TxY w)9   source_filter 파라미터가 RPC 호출에 전달된다.r   r)   r+   r-   r.   rR   rA   source_filterNrB   ra   rW   rZ   s	            r
   #test_source_filter_parameter_passedz6TestSemanticSearch.test_source_filter_parameter_passed   s    *"n.r2 .?@ ({C		A/0		A4G $+K/:,3?KOO((0Kx@		A 		A $11(5a(8q!!$mA>Nzz/*h666		A 		A 		A 		As#   C7C8CC	CCc                    ddl m} t               }t        dd      t        dd      t        dd	      g}t	        |      }t        |
      }t        d|
      5  t        d      5 }t               }||_        ||j                  j                  _	         |d      }ddd       ddd       D 	cg c]  }	|	d   	 }
}	|
t        |
d      k(  sJ y# 1 sw Y   6xY w# 1 sw Y   :xY wc c}	w )u5   결과가 similarity 내림차순으로 정렬된다.r   r)   u   낮은 유사도      ?r   r   u   높은 유사도ffffff?u   중간 유사도ffffff?r+   r-   r.   rR   Nr   Treverse)r0   r*   r   r   r   r   r   r,   r1   r2   sorted)r4   r*   r5   r   r6   r7   r9   r:   rI   rsimilaritiess              r
   &test_results_sorted_by_similarity_descz9TestSemanticSearch.test_results_sorted_by_similarity_desc   s    *"n'9cJ'9dK'9cJ

 /t4 .?@ ({C		3/0		34G $+K/:,3?KOO((0%k2G		3 		3 299A,99vlDAAAA		3 		3 		3 		3 :*   C'5CC0C)C	CC&N)__name__
__module____qualname____doc__r;   r?   rK   rN   r]   rb   rm   r	   r   r
   r'   r'   T   s,    &C*&,&0P*J07.Br   r'   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestKeywordSearchu   keyword_search() 테스트.c                 (   ddl m} t        t               g      }t	        |      }t        d      5 }t	               }||_        ||j                  j                  _         |d       ddd       j                  j                  sJ y# 1 sw Y   "xY w)u9   keyword_search() 호출 시 Supabase RPC가 호출된다.r   keyword_searchr+   r.   	   보험료N)
r0   rw   r   r   r   r   r,   r1   r2   r>   )r4   rw   r6   r7   r9   r:   s         r
   r?   z)TestKeywordSearch.test_calls_supabase_rpc  s    ).0B0D/EF .?@01 	(5H#+K/:,3?KOO((0;'	( %%%%	( 	(s   5BBc                 F   ddl m} t        g       }t        |      }t	        d      5 }t	        d      5 }t               }||_        ||j                  j
                  _         |d       ddd       ddd       j                          y# 1 sw Y   "xY w# 1 sw Y   &xY w)u>   keyword_search()는 get_embedding()을 호출하지 않는다.r   rv   r+   r-   r.   rx   N)	r0   rw   r   r   r   r,   r1   r2   assert_not_called)r4   rw   r6   r7   r8   r9   r:   s          r
    test_does_not_call_get_embeddingz2TestKeywordSearch.test_does_not_call_get_embedding"  s    ).r2 .?@)* 	(j%@]:^ 	(bu#+K/:,3?KOO((0;'	( 	( 	$$&	( 	( 	( 	(s"   B5B*BB	BB c                    ddl m} t        ddddd      }t        |g      }t	        |	      }t        d
      5 }t	               }||_        ||j                  j                  _         |d      }ddd       t        t              sJ t        |      dk(  sJ |d   }d|v sJ d|v sJ d|v sJ d|v sJ y# 1 sw Y   IxY w)u9   keyword_search() 결과가 올바른 형식을 가진다.r   rv   u   키워드 내용皙?rA   u   키워드 제목z
doc-kw-001r   r+   r.   rx   NrB   r   r   r   r   )r0   rw   r   r   r   r   r,   r1   r2   rC   rD   rE   )	r4   rw   rH   r6   r7   r9   r:   rI   rJ   s	            r
   rK   z-TestKeywordSearch.test_returns_correct_format3  s    ) &$$
 /u5 .?@01 	25H#+K/:,3?KOO((0$[1G	2 '4(((7|q   qzD   4$$$$	2 	2s   5B77C c                     ddl m} t        g       }t        |      }t	        d      5 }t               }||_        ||j                  j
                  _         |d      }ddd       g k(  sJ y# 1 sw Y   xY w)rM   r   rv   r+   r.   u   존재하지 않는 키워드N)r0   rw   r   r   r   r,   r1   r2   )r4   rw   r6   r7   r9   r:   rI   s          r
   rN   z6TestKeywordSearch.test_empty_result_returns_empty_listP  s{    ).r2 .?@01 	F5H#+K/:,3?KOO((0$%DEG	F "}}	F 	Fs   5A..A7c                    ddl m} t        g       }t        |      }t	        d      5 }t               }||_        ||j                  j
                  _         |dd       ddd       j                  j                  }|d   r|d   d	   n|d	   }|j                  d
      dk(  s|j                  d      dk(  sJ yy# 1 sw Y   ]xY w)rQ   r   rv   r+   r.   rR      rT   NrB   rV   rU   
r0   rw   r   r   r   r,   r1   r2   rX   rY   r4   rw   r6   r7   r9   r:   r[   r\   s           r
   r]   z-TestKeywordSearch.test_limit_parameter_passed`  s    ).r2 .?@01 	15H#+K/:,3?KOO((0;a0	1 $11(5a(8q!!$mA>Nzz-(A-G1D1III1I-	1 	1s   7B<<Cc                 f   ddl m} t        g       }t        |      }t	        d      5 }t               }||_        ||j                  j
                  _         |dd       ddd       j                  j                  }|d   r|d   d	   n|d	   }|j                  d
      dk(  sJ y# 1 sw Y   HxY w)r_   r   rv   r+   r.   rR   rA   r`   NrB   ra   r   r   s           r
   rb   z5TestKeywordSearch.test_source_filter_parameter_passedr  s    ).r2 .?@01 	@5H#+K/:,3?KOO((0;h?	@ $11(5a(8q!!$mA>Nzz/*h666	@ 	@s   7B''B0N)
ro   rp   rq   rr   r?   r{   rK   rN   r]   rb   r	   r   r
   rt   rt     s$    %& '"%: J$7r   rt   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)TestHybridSearchu   hybrid_search() 테스트.c                 r   ddl m} t               }t        t	               g      }t        |      }t        d|      5 }t        d      5 }t               }||_        ||j                  j                  _	         |d       ddd       ddd       j                  d       y# 1 sw Y   #xY w# 1 sw Y   'xY w)uO   hybrid_search() 호출 시 get_embedding()이 쿼리 텍스트로 호출된다.r   hybrid_searchr+   r-   r.      복합 검색 쿼리N)r0   r   r   r   r   r   r   r,   r1   r2   r3   )r4   r   r5   r6   r7   r8   r9   r:   s           r
   r;   z)TestHybridSearch.test_calls_get_embedding  s    ("n.0@0B/CD .?@ ({C		2GQ/0		24G $+K/:,3?KOO((001		2 		2 	**+AB		2 		2 		2 		2r<   c                    ddl m} t               }t        t	               g      }t        |      }t        d|      5  t        d      5 }t               }||_        ||j                  j                  _	         |d       ddd       ddd       j                  j                  }|d   r|d   d   n|d   j                  d	      }|d
k(  sJ y# 1 sw Y   PxY w# 1 sw Y   TxY w)uI   hybrid_search() 호출 시 Supabase RPC('hybrid_search')가 호출된다.r   r   r+   r-   r.   r   NrB   fnr   )r0   r   r   r   r   r   r   r,   r1   r2   rX   rY   )	r4   r   r5   r6   r7   r9   r:   r[   rpc_names	            r
   test_calls_hybrid_search_rpcz-TestHybridSearch.test_calls_hybrid_search_rpc  s    ("n.0@0B/CD .?@ ({C		2/0		24G $+K/:,3?KOO((001		2 		2 $11*7*:=#A&a@P@T@TUY@Z?***		2 		2 		2 		2s#   C
5C?CC	CC#c                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |d       ddd       ddd       j                  j                  }|d   r|d   d   n|d   }|d	   dk(  sJ |d
   |k(  sJ y# 1 sw Y   NxY w# 1 sw Y   RxY w)uI   hybrid_search() 호출 시 query_text와 query_embedding이 전달된다.r   r   r+   r-   r.   u   복합 검색NrB   
query_textquery_embedding
r0   r   r   r   r   r   r,   r1   r2   rX   	r4   r   r5   r6   r7   r9   r:   r[   r\   s	            r
   $test_passes_query_text_and_embeddingz5TestHybridSearch.test_passes_query_text_and_embedding  s    ("n.r2 .?@ ({C		+/0		+4G $+K/:,3?KOO((0/*		+ 		+ $11(5a(8q!!$mA>Nl#666'(K777		+ 		+ 		+ 		+#   C5C6CC	CCc                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |d       ddd       ddd       j                  j                  }|d   r|d   d   n|d   }|d	   d
k(  sJ |d   dk(  sJ y# 1 sw Y   NxY w# 1 sw Y   RxY w)uB   기본 가중치가 semantic_weight=0.7, keyword_weight=0.3이다.r   r   r+   r-   r.   rR   NrB   semantic_weightrg   keyword_weightg333333?r   r   s	            r
   test_default_weightsz%TestHybridSearch.test_default_weights  s    ("n.r2 .?@ ({C		'/0		'4G $+K/:,3?KOO((0+&		' 		' $11(5a(8q!!$mA>N'(C///&'3...		' 		' 		' 		'r   c                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |ddd       d	d	d	       d	d	d	       j                  j                  }|d   r|d   d
   n|d
   }|d   dk(  sJ |d   dk(  sJ y	# 1 sw Y   NxY w# 1 sw Y   RxY w)uJ   커스텀 가중치 (0.5, 0.5)가 RPC 호출에 올바르게 전달된다.r   r   r+   r-   r.   rR   rd   )r   r   NrB   r   r   r   r   s	            r
   test_custom_weightsz$TestHybridSearch.test_custom_weights  s    ("n.r2 .?@ ({C		P/0		P4G $+K/:,3?KOO((0+s3O		P 		P $11(5a(8q!!$mA>N'(C///&'3...		P 		P 		P 		Ps#   C8C9CC	CCc                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |dd       d	d	d	       d	d	d	       j                  j                  }|d   r|d   d
   n|d
   }|d   dk(  sJ y	# 1 sw Y   DxY w# 1 sw Y   HxY w)r_   r   r   r+   r-   r.   rR   rA   r`   NrB   ra   r   r   s	            r
   rb   z4TestHybridSearch.test_source_filter_parameter_passed  s    ("n.r2 .?@ ({C		?/0		?4G $+K/:,3?KOO((0+X>		? 		? $11(5a(8q!!$mA>No&(222		? 		? 		? 		?#   C7B;8C;C	 CCc                    ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |dd       d	d	d	       d	d	d	       j                  j                  }|d   r|d   d
   n|d
   }|d   dk(  sJ y	# 1 sw Y   DxY w# 1 sw Y   HxY w)u@   limit 파라미터가 match_count로 RPC 호출에 전달된다.r   r   r+   r-   r.   rR      rT   NrB   rV   r   r   s	            r
   r]   z,TestHybridSearch.test_limit_parameter_passed  s    ("n.r2 .?@ ({C		1/0		14G $+K/:,3?KOO((0+R0		1 		1 $11(5a(8q!!$mA>Nm$***		1 		1 		1 		1r   c                 L   ddl m} t               }t        g       }t	        |      }t        d|      5  t        d      5 }t	               }||_        ||j                  j                  _         |d      }ddd       ddd       g k(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w)rM   r   r   r+   r-   r.   u   없는 내용N)	r0   r   r   r   r   r   r,   r1   r2   )r4   r   r5   r6   r7   r9   r:   rI   s           r
   rN   z5TestHybridSearch.test_empty_result_returns_empty_list0  s    ("n.r2 .?@ ({C		5/0		54G $+K/:,3?KOO((0#O4G		5 		5 "}}		5 		5 		5 		5rO   c                    ddl m} t               }t        dd      t        dd      t        dd	      g}t	        |      }t        |
      }t        d|
      5  t        d      5 }t               }||_        ||j                  j                  _	         |d      }ddd       ddd       D 	cg c]  }	|	d   	 }
}	|
t        |
d      k(  sJ y# 1 sw Y   6xY w# 1 sw Y   :xY wc c}	w )u9   결과가 combined_score 내림차순으로 정렬된다.r   r   u   낮은 점수g?)r   r   u   높은 점수?u   중간 점수g?r+   r-   r.   rR   Nr   Trh   )r0   r   r   r   r   r   r   r,   r1   r2   rj   )r4   r   r5   r   r6   r7   r9   r:   rI   rk   combined_scoress              r
   *test_results_sorted_by_combined_score_descz;TestHybridSearch.test_results_sorted_by_combined_score_descE  s    ("n_SI_SI_TJ

 /t4 .?@ ({C		1/0		14G $+K/:,3?KOO((0#K0G		1 		1 9@@11-.@@&$"GGGG		1 		1 		1 		1 Arn   c                    ddl m} t               }t        dddddd	      }t	        |g      }t        |
      }t        d|
      5  t        d      5 }t               }||_        ||j                  j                  _	         |d      }ddd       ddd       t        t              sJ t        |      dk(  sJ |d   }	t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ t        |	d   t              sJ |	d   dk(  sJ |	d   dk(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w)u8   hybrid_search() 결과가 올바른 형식을 가진다.r   r   u   혼합 내용g)\(?g=
ףp=?rA   u   혼합 제목zdoc-hyb-001r   r+   r-   r.   rR   NrB   r   r   r   r   r   r   )r0   r   r   r   r   r   r   r,   r1   r2   rC   rD   rE   rF   rG   )
r4   r   r5   rH   r6   r7   r9   r:   rI   rJ   s
             r
   rK   z,TestHybridSearch.test_returns_correct_format`  s   ("n#!%
 /u5 .?@ ({C		1/0		14G $+K/:,3?KOO((0#K0G		1 		1 '4(((7|q   qz$y/3///$|,e444$/0%888$x.#...$w----$}-s333I/111$%---+		1 		1 		1 		1s$   E5EEE	EE'N)ro   rp   rq   rr   r;   r   r   r   r   rb   r]   rN   r   rK   r	   r   r
   r   r     s9    $C*+080/0/03.+.*H6%.r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestKoreanKeywordSearchu@   한국어 키워드 검색 테스트 (trigram + ILIKE fallback).c                 @   ddl m} t        ddddd      }t        |g      }t	        |	      }t        d
      5 }t	               }||_        ||j                  j                  _         |d      }ddd       t              dk(  sJ d|d   d   v sJ y# 1 sw Y   &xY w)uK   한국어 키워드 '보험설계사'로 검색 시 결과가 반환된다.r   rv   u4   보험설계사의 역할과 책임에 대한 안내r}   rA   u   보험설계사 가이드z
doc-kr-001r   r+   r.   u   보험설계사NrB   r   
r0   rw   r   r   r   r   r,   r1   r2   rE   r4   rw   rH   r6   r7   r9   r:   rI   s           r
   test_korean_keyword_basicz1TestKoreanKeywordSearch.test_korean_keyword_basic  s    ) J-$
 /u5 .?@01 	85H#+K/:,3?KOO((0$%67G	8 7|q    GAJy$9999	8 	8   5BBc                 @   ddl m} t        ddddd      }t        |g      }t	        |	      }t        d
      5 }t	               }||_        ||j                  j                  _         |d      }ddd       t              dk(  sJ d|d   d   v sJ y# 1 sw Y   &xY w)u'   '금소법' 키워드 검색 테스트.r   rv   u:   금소법(금융소비자보호법)에 따른 설명의무g      ?rA   u   금소법 안내z
doc-kr-002r   r+   r.   u	   금소법NrB   r   r   r   s           r
   test_korean_keyword_geumsobeobz6TestKoreanKeywordSearch.test_korean_keyword_geumsobeob  s    ) P$$
 /u5 .?@01 	25H#+K/:,3?KOO((0$[1G	2 7|q   gaj3333	2 	2r   c                 "   ddl m} t        g       }t        |      }t               }ddddg|_        t        d      5 }t               }||_        ||j                  j                  _        t               }||j                  _        ||j                  _        ||j                  _        ||j                  _        ||j                  _         |d	      }d
d
d
       t              dk(  sJ d	|d   d   v sJ |d   d   dk(  sJ y
# 1 sw Y   3xY w)u=   RPC 결과가 비어있으면 ILIKE fallback이 실행된다.r   rv   r+   z	chunk-001z
doc-fb-001u   청약철회 관련 안내)idr   r   r.   u   청약철회NrB   r   r   rd   )r0   rw   r   r   r   r   r,   r1   r2   from_selectilikerU   rE   )	r4   rw   r6   r7   fallback_responser9   r:   	mock_fromrI   s	            r
   5test_korean_keyword_empty_rpc_triggers_ilike_fallbackzMTestKoreanKeywordSearch.test_korean_keyword_empty_rpc_triggers_ilike_fallback  s   ) /r2 .?@ &K)4\^z"{!|01 	55H#+K/:,3?KOO((0 "I-6K*,5I)+4IOO(+4IOO(->I*$^4G	5 7|q   I!6666qz,'3...#	5 	5s   BDDc                 V   ddl m} t        dd      }t        |g      }t	        |      }t        d      5 }t	               }||_        ||j                  j                  _         |d      }d	d	d	       t              d
k(  sJ j                  j                          y	# 1 sw Y   4xY w)uA   RPC 결과가 있으면 ILIKE fallback이 실행되지 않는다.r   rv   u   보험료 납입 안내r   re   r+   r.   rx   NrB   )r0   rw   r   r   r   r   r,   r1   r2   rE   r   rz   r   s           r
   4test_korean_keyword_no_fallback_when_rpc_has_resultszLTestKoreanKeywordSearch.test_korean_keyword_no_fallback_when_rpc_has_results  s    ) )BsS.u5 .?@01 	25H#+K/:,3?KOO((0$[1G	2 7|q   ++-	2 	2s   5BB(N)ro   rp   rq   rr   r   r   r   r   r	   r   r
   r   r     s    J:040/>.r   r   )i   )   테스트 내용rf   test_source   테스트 제목doc-001)r   r   g333333?r   r   r   )rr   osunittest.mockr   r   r   pytestintrD   rG   r   dictr   rF   r   r   fixturer%   r'   rt   r   r   r	   r   r
   <module>r      sE   
 0 0 c T%[ 
T$Z I  &#   	
  
$ & #   	
   
0 T TsB sBvs7 s7v{. {.Fc. c.r   